diff options
Diffstat (limited to 'Homework/cs5260/widgetrequesthandler/handler.ts')
| -rw-r--r-- | Homework/cs5260/widgetrequesthandler/handler.ts | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/Homework/cs5260/widgetrequesthandler/handler.ts b/Homework/cs5260/widgetrequesthandler/handler.ts new file mode 100644 index 0000000..6afb05c --- /dev/null +++ b/Homework/cs5260/widgetrequesthandler/handler.ts @@ -0,0 +1,89 @@ +import type { Server } from "bun"; +import { ConsoleTracingLogger, TracingLogger } from "@/shared/log"; +import { WidgetRequest } from "@/shared/schema"; +import { + ProcessorResponse, + SQSWidgetRequestProcessor, + WidgetRequestProcessor, +} from "./processors"; +import { SQSClient } from "@aws-sdk/client-sqs"; + +export class WidgetRequestHandler { + private processor: WidgetRequestProcessor; + private logger: TracingLogger; + + constructor(processor: WidgetRequestProcessor, logger: TracingLogger) { + this.processor = processor; + this.logger = logger; + } + + public async handleRequest(request: Request): Promise<Response> { + let headers = new Headers({ + "Content-Type": "application/json", + }); + let response: ProcessorResponse = { success: true, message: "success" }; + let status = 200; + + let widgetRequest; + + if (request.body) { + const body = (await request.json()) as { event: any }; + if (body) { + const event = body.event!; + this.logger.info(`received Body=(${JSON.stringify(event)})`); + widgetRequest = WidgetRequest.safeParse(event); + } + } + + if (!widgetRequest || !widgetRequest.success) { + status = 400; + response = { + success: false, + message: widgetRequest?.error + ? widgetRequest.error.toString() + : "invalid request body", + }; + } else { + try { + response = await this.processor.handle(widgetRequest.data); + } catch (e) { + status = 500; + response = { + success: false, + message: e?.toString() ?? "failed to process", + }; + } + } + + return new Response(JSON.stringify(response), { + status, + headers, + }); + } +} + +const lambdaHandler = async ( + request: Request, + _server: Server +): Promise<Response> => { + const logger = new ConsoleTracingLogger("handler"); + const sourceQueueUrl = process.env.SOURCE_QUEUE!; + const sqsClient = new SQSClient({ + region: process.env.AWS_REGION!, + }); + + const processor = new SQSWidgetRequestProcessor( + sqsClient, + sourceQueueUrl, + logger.createChild("WidgetRequestProcessor") + ); + + const handler = new WidgetRequestHandler( + processor, + logger.createChild("WidgetRequestHandler") + ); + + return await handler.handleRequest(request); +}; + +export default lambdaHandler; |
