From 206f47aa7e872a3dca2104b5a953a03d23283038 Mon Sep 17 00:00:00 2001 From: Jonathon Herbert Date: Fri, 10 May 2024 16:31:44 +0100 Subject: [PATCH] Add lambda handler --- build.sbt | 4 +- cdk/lib/__snapshots__/cql-lambda.test.ts.snap | 2 +- cdk/lib/cql-lambda.ts | 2 +- src/main/scala/Handler.scala | 57 +++++++++++++++++++ src/main/scala/HttpServer.scala | 2 +- src/main/scala/util/Logging.scala | 5 ++ 6 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/main/scala/Handler.scala create mode 100644 src/main/scala/util/Logging.scala diff --git a/build.sbt b/build.sbt index ae9ae28..0f1cfc3 100644 --- a/build.sbt +++ b/build.sbt @@ -35,7 +35,9 @@ lazy val cql = project.in(file(".")) "org.scalatest" %% "scalatest" % "3.2.9" % "test", "com.gu" % "content-api-client-default_2.13" % "20.0.2", "com.amazonaws" % "aws-lambda-java-core" % "1.2.3", - "com.amazonaws" % "aws-lambda-java-events" % "3.11.4" + "com.amazonaws" % "aws-lambda-java-events" % "3.11.4", + "ch.qos.logback" % "logback-classic" % "1.4.7", + "com.typesafe.scala-logging" %% "scala-logging" % "3.9.5", ) ) diff --git a/cdk/lib/__snapshots__/cql-lambda.test.ts.snap b/cdk/lib/__snapshots__/cql-lambda.test.ts.snap index 3646e9d..fd38171 100644 --- a/cdk/lib/__snapshots__/cql-lambda.test.ts.snap +++ b/cdk/lib/__snapshots__/cql-lambda.test.ts.snap @@ -37,7 +37,7 @@ exports[`The CqlLambda stack matches the snapshot 1`] = ` }, }, "FunctionName": "cql-lambda-TEST", - "Handler": "cql.Handler::apply", + "Handler": "cql.Handler::handleRequest", "MemorySize": 1024, "Role": { "Fn::GetAtt": [ diff --git a/cdk/lib/cql-lambda.ts b/cdk/lib/cql-lambda.ts index ed22c60..088167e 100644 --- a/cdk/lib/cql-lambda.ts +++ b/cdk/lib/cql-lambda.ts @@ -10,7 +10,7 @@ export class CqlLambda extends GuStack { new GuLambdaFunction(this, 'cql-lambda', { app: 'cql-lambda', - handler: 'cql.Handler::apply', + handler: 'cql.Handler::handleRequest', functionName: `cql-lambda-${this.stage}`, runtime: Runtime.JAVA_11, fileName: "cql-lambda.jar" diff --git a/src/main/scala/Handler.scala b/src/main/scala/Handler.scala new file mode 100644 index 0000000..fbdad9f --- /dev/null +++ b/src/main/scala/Handler.scala @@ -0,0 +1,57 @@ +package cql + +import com.amazonaws.services.lambda.runtime.{Context, RequestHandler} +import com.amazonaws.services.lambda.runtime.events.{ + APIGatewayProxyRequestEvent, + APIGatewayProxyResponseEvent +} +import io.circe.generic.auto._ +import io.circe.syntax._ +import util.Logging +import cql.lang.Cql +import scala.util.Try +import scala.concurrent.Await +import scala.concurrent.duration.DurationInt + +class Handler + extends RequestHandler[ + APIGatewayProxyRequestEvent, + APIGatewayProxyResponseEvent + ] + with Logging with QueryJson { + implicit val ec: scala.concurrent.ExecutionContext = + scala.concurrent.ExecutionContext.global + val cql = new Cql() + + def handleRequest( + event: APIGatewayProxyRequestEvent, + context: Context + ): APIGatewayProxyResponseEvent = { + logger.info("Received request with body: " + event.getBody) + + val eventualResult = cql + .run(event.getBody) + .map(r => + Try { + (200, r.asJson.spaces2) + }.recover { e => + logger.error("Server error", e) + (500, e.getMessage()) + }.get + ) + .recover { e => + logger.error("Bad request", e) + (400, e.getMessage()) + } + + val (statusCode, responseBody) = Await.result(eventualResult, 5.seconds) + + logger.info(s"Responding with status ${statusCode}: ${responseBody}") + + new APIGatewayProxyResponseEvent() + .withStatusCode(statusCode) + .withBody( + responseBody + ) + } +} diff --git a/src/main/scala/HttpServer.scala b/src/main/scala/HttpServer.scala index d8d29c2..6f7ad77 100644 --- a/src/main/scala/HttpServer.scala +++ b/src/main/scala/HttpServer.scala @@ -10,7 +10,7 @@ import io.circe.syntax.* import com.github.pjfanning.pekkohttpcirce.* import scala.io.StdIn import scala.util.{Failure, Success, Try} -import cql.lang.{Cql} +import cql.lang.Cql object HttpServer extends QueryJson { val cql = new Cql() diff --git a/src/main/scala/util/Logging.scala b/src/main/scala/util/Logging.scala new file mode 100644 index 0000000..6cb1998 --- /dev/null +++ b/src/main/scala/util/Logging.scala @@ -0,0 +1,5 @@ +package cql.util + +import com.typesafe.scalalogging.LazyLogging + +trait Logging extends LazyLogging