package tv.miracle.backend.graphql import scala.util.{ Failure, Success } import sangria.execution.deferred.DeferredResolver import sangria.execution.{ ErrorWithResolver, Executor, QueryAnalysisError } import sangria.slowlog.SlowLog import org.apache.pekko.actor.ActorSystem import org.apache.pekko.http.scaladsl.Http import org.apache.pekko.http.scaladsl.model.StatusCodes._ import org.apache.pekko.http.scaladsl.server.Directives._ import org.apache.pekko.http.scaladsl.server._ import sangria.marshalling.circe._ // This is the trait that makes `graphQLPlayground and prepareGraphQLRequest` available import sangria.http.circe.CirceHttpSupport import tv.miracle.backend.db.DB import scala.concurrent.ExecutionContext import org.apache.pekko.http.scaladsl.marshalling.ToResponseMarshallable import io.getquill.PostgresJdbcContext import io.getquill.SnakeCase import io.getquill._ case class Test(name: String, sexy: Option[Boolean]) case class RejectionError(message: String) object GraphQL extends App with CirceHttpSupport with CorsSupport { def main = () => {} def handleGraphQL()(implicit ec: ExecutionContext, ctx: PostgresJdbcContext[SnakeCase]): Route = { optionalHeaderValueByName { "X-Apollo-Tracing" } { (tracing) => graphQLPlayground ~ prepareGraphQLRequest { case Success(req) => import ctx._ val users = run(query[Test]) println(users) val middleware = if (tracing.isDefined) SlowLog.apolloTracing :: Nil else Nil val deferredResolver = DeferredResolver.fetchers(SchemaDefinition.characters) val res = Executor.execute( schema = SchemaDefinition.StarWarsSchema, queryAst = req.query, userContext = new CharacterRepo, variables = req.variables, operationName = req.operationName, middleware = middleware, deferredResolver = deferredResolver) .map(OK -> _) .recover { case error: QueryAnalysisError => BadRequest -> { println(error.resolveError) error.resolveError } case error: ErrorWithResolver => InternalServerError -> { println(error.resolveError) error.resolveError } } complete(res) case Failure(preparationError) => complete(BadRequest, formatError(preparationError)) } } } }