Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.57 KB | None | 0 0
  1.  
  2.  
  3. object Routes extends ApiProtocol {
  4.   def apply(db: Database)(implicit ec: ExecutionContext) = logRequestResult("akka-http-request") {
  5.     implicit val userFormat = jsonFormat3(User)
  6.     pathPrefix("api") {
  7.       GenericCRUDRoutes.genericCrud[User](TableQuery.apply[Users],db)
  8.     }
  9.   }
  10. }
  11.  
  12.  
  13. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  14. package com.notnamed.commons.macros
  15.  
  16. import akka.http.scaladsl.server.Route
  17. import scala.language.experimental.macros
  18. import scala.reflect.macros.blackbox
  19. import slick.jdbc.MySQLProfile.api._
  20. import slick.lifted.TableQuery
  21.  
  22. object GenericCRUDRoutes {
  23.   def genericCrud[Entity]
  24.   (table: TableQuery[_ <: Table[Entity]], db: Database): Route = macro GenericCRUDRoutes_impl.genericCrud_impl[Entity]
  25. }
  26.  
  27. object GenericCRUDRoutes_impl {
  28.   private case class TypeAndName(theType: String, name: String)
  29.   def genericCrud_impl[Entity: c.WeakTypeTag](c: blackbox.Context)
  30.                                              (table : c.Expr[TableQuery[_ <: Table[Entity]]], db: c.Expr[Database]): c.Expr[Route] = {
  31.     import c.universe._
  32.     val entityType = weakTypeOf[Entity]
  33.  
  34.     val entityName = q"${entityType.toString.toLowerCase.split("\\.").last}"
  35.     val fields = entityType.members.filter {
  36.       case m: TermSymbol if m.isAccessor && m.isPublic =>  true
  37.       case m => false
  38.     }.map(field => TypeAndName(field.typeSignature.finalResultType.toString, field.name.toString))
  39.  
  40.     val copyMethod = scala.util.Try(entityType.member(TermName("copy")).asMethod) match {
  41.       case scala.util.Success(method) => method
  42.       case _ => c.abort(c.enclosingPosition,"entity does not have a copy method")
  43.     }
  44.     val copyMethodParamNames = (copyMethod.paramLists match {
  45.       case params :: Nil => params
  46.       case _ => c.abort(c.enclosingPosition,"entity copy signature should not be curried")
  47.     }).map(parameter => TypeAndName(
  48.       theType = parameter.typeSignatureIn(entityType).toString,
  49.       name = parameter.name.toString
  50.     ))
  51.     val expr = q"""
  52.      (() => {
  53.        import akka.http.scaladsl.model.StatusCodes
  54.        val db = $db
  55.        val tq = $table
  56.        pathPrefix($entityName) {
  57.          pathEnd {
  58.            post{
  59.              entity(as[$entityType]) { e : $entityType =>
  60.                val query = (tq returning tq.map(_.id) into ((entity, id) => entity.copy(id = Some(id))))
  61.                val future = db.run(query += e)
  62.                onComplete(future){
  63.                  case Success(value) => complete(StatusCodes.Created, value)
  64.                  case Failure(e) => complete(StatusCodes.InternalServerError, e.getMessage)
  65.                }
  66.              }
  67.            }
  68.          } ~
  69.          path(IntNumber){ id =>
  70.            delete {
  71.              val query = tq.filter(_.id === id).delete
  72.              val future = db.run(query)
  73.              onComplete(future){
  74.                case Success(value) => complete(StatusCodes.OK,"")
  75.                case Failure(e) => complete(StatusCodes.InternalServerError, e.getMessage)
  76.              }
  77.            } ~
  78.            get {
  79.              val query = tq.filter(_.id === id).result
  80.              val future = db.run(query)
  81.              onComplete(future){
  82.                case Success(value) => complete(StatusCodes.OK,value)
  83.                case Failure(e) => complete(StatusCodes.InternalServerError, e.getMessage)
  84.              }
  85.            }
  86.          }
  87.        }
  88.      })()
  89.      """
  90.     //c.abort(c.enclosingPosition,showCode(expr))
  91.     c.Expr[Route](expr)
  92.   }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement