From 1c87e93d2feedb76f6a5fb7c4b74f4eca39d6cae Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Sat, 7 Jun 2025 16:37:01 -0700 Subject: [PATCH] update status route --- .../src/functions/api/door/status.ts | 65 +++++++++---------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/packages/doorman-api/src/functions/api/door/status.ts b/packages/doorman-api/src/functions/api/door/status.ts index 37ad87c..2d13c29 100644 --- a/packages/doorman-api/src/functions/api/door/status.ts +++ b/packages/doorman-api/src/functions/api/door/status.ts @@ -4,34 +4,35 @@ import { ServerlessFunctionSignature, ServerlessEventObject } from "@twilio-labs/serverless-runtime-types/types"; import { TwilioContext } from "../../../types/TwilioContext"; -import { shouldBlockRequest } from "../../../utils/blockUserAgent"; +import { UserAgentHeader } from "../../../utils/blockUserAgent"; import { createDynaBridgeClient } from "../../../utils/ddb"; import { DoorStatus } from "../../../types/DoorStatus"; import { getLockStatusID, isLockOpen } from "../../../schema/LockStatus"; +import { withMetrics } from "../../../common/DoormanHandler"; +import { z } from "zod"; +import { setResponseJson } from "../../../utils/responseUtils"; +import zu from "zod_utilz"; -export interface StatusRequest extends ServerlessEventObject { - door: string; -} +export const StatusRequestSchema = z.object({ + door: z.string(), +}); -export interface StatusResponse { - status: DoorStatus, - fingerprint: any; -} +export type StatusRequest = z.infer; -export const handler: ServerlessFunctionSignature = async function(context, event, callback) { +export interface StatusRequestTwilio extends ServerlessEventObject { } + +export const StatusResponseSchema = z.object({ + status: z.nativeEnum(DoorStatus), + fingerprint: zu.json().optional(), +}) + +export type StatusResponse = z.infer; + +export const handler: ServerlessFunctionSignature = withMetrics('status', async (context, event, callback) => { const response = new Twilio.Response(); - if (shouldBlockRequest(event)) { - response.setStatusCode(200); - return callback(null, response); - } - - const door = event.door; - - if (!door) { - response.setStatusCode(400); - return callback(null, response); - } + const req = StatusRequestSchema.parse(event); + const door = req.door; const db = createDynaBridgeClient(context); const lock = await db.entities.lockStatus.findById(getLockStatusID(door)); @@ -41,26 +42,24 @@ export const handler: ServerlessFunctionSignature if (isOpen && lock) { const fingerprint = JSON.parse(lock.fingerprint); - response - .setStatusCode(200) - .appendHeader('Content-Type', 'application/json') - .setBody({ - status: DoorStatus.OPEN, - fingerprint, - }); + const body = StatusResponseSchema.parse({ + status: DoorStatus.OPEN, + fingerprint, + }); + + setResponseJson(response, 200, body); await db.entities.lockStatus.deleteById(getLockStatusID(door)); } else { - response - .setStatusCode(200) - .appendHeader('Content-Type', 'application/json') - .setBody({ - status: DoorStatus.CLOSED, + const body = StatusResponseSchema.parse({ + status: DoorStatus.CLOSED, }); + + setResponseJson(response, 200, body); } // destroy the internal client after // @ts-ignore db.ddbClient.destroy(); return callback(null, response); -}; +});