summaryrefslogtreecommitdiff
path: root/Homework/cs5260/widgetrequesthandler/handler.ts
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-07-02 11:55:17 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2026-07-02 11:55:17 -0700
commit6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 (patch)
treeed97e39ec77c5231ffd2c394493e68d00ddac5a4 /Homework/cs5260/widgetrequesthandler/handler.ts
downloadmisc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.tar.gz
misc-undergrad-6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6.zip
Diffstat (limited to 'Homework/cs5260/widgetrequesthandler/handler.ts')
-rw-r--r--Homework/cs5260/widgetrequesthandler/handler.ts89
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;