update status route

This commit is contained in:
Martin Dimitrov 2025-06-07 16:37:01 -07:00
parent 8750c2ed82
commit 1c87e93d2f

View File

@ -4,34 +4,35 @@
import { ServerlessFunctionSignature, ServerlessEventObject } from "@twilio-labs/serverless-runtime-types/types"; import { ServerlessFunctionSignature, ServerlessEventObject } from "@twilio-labs/serverless-runtime-types/types";
import { TwilioContext } from "../../../types/TwilioContext"; import { TwilioContext } from "../../../types/TwilioContext";
import { shouldBlockRequest } from "../../../utils/blockUserAgent"; import { UserAgentHeader } from "../../../utils/blockUserAgent";
import { createDynaBridgeClient } from "../../../utils/ddb"; import { createDynaBridgeClient } from "../../../utils/ddb";
import { DoorStatus } from "../../../types/DoorStatus"; import { DoorStatus } from "../../../types/DoorStatus";
import { getLockStatusID, isLockOpen } from "../../../schema/LockStatus"; 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 { export const StatusRequestSchema = z.object({
door: string; door: z.string(),
} });
export interface StatusResponse { export type StatusRequest = z.infer<typeof StatusRequestSchema>;
status: DoorStatus,
fingerprint: any;
}
export const handler: ServerlessFunctionSignature<TwilioContext, StatusRequest> = async function(context, event, callback) { export interface StatusRequestTwilio extends ServerlessEventObject<StatusRequest, UserAgentHeader> { }
export const StatusResponseSchema = z.object({
status: z.nativeEnum(DoorStatus),
fingerprint: zu.json().optional(),
})
export type StatusResponse = z.infer<typeof StatusResponseSchema>;
export const handler: ServerlessFunctionSignature<TwilioContext, StatusRequestTwilio> = withMetrics('status', async (context, event, callback) => {
const response = new Twilio.Response(); const response = new Twilio.Response();
if (shouldBlockRequest(event)) { const req = StatusRequestSchema.parse(event);
response.setStatusCode(200); const door = req.door;
return callback(null, response);
}
const door = event.door;
if (!door) {
response.setStatusCode(400);
return callback(null, response);
}
const db = createDynaBridgeClient(context); const db = createDynaBridgeClient(context);
const lock = await db.entities.lockStatus.findById(getLockStatusID(door)); const lock = await db.entities.lockStatus.findById(getLockStatusID(door));
@ -41,26 +42,24 @@ export const handler: ServerlessFunctionSignature<TwilioContext, StatusRequest>
if (isOpen && lock) { if (isOpen && lock) {
const fingerprint = JSON.parse(lock.fingerprint); const fingerprint = JSON.parse(lock.fingerprint);
response const body = StatusResponseSchema.parse({
.setStatusCode(200) status: DoorStatus.OPEN,
.appendHeader('Content-Type', 'application/json') fingerprint,
.setBody({ });
status: DoorStatus.OPEN,
fingerprint, setResponseJson(response, 200, body);
});
await db.entities.lockStatus.deleteById(getLockStatusID(door)); await db.entities.lockStatus.deleteById(getLockStatusID(door));
} else { } else {
response const body = StatusResponseSchema.parse({
.setStatusCode(200)
.appendHeader('Content-Type', 'application/json')
.setBody({
status: DoorStatus.CLOSED, status: DoorStatus.CLOSED,
}); });
setResponseJson(response, 200, body);
} }
// destroy the internal client after // destroy the internal client after
// @ts-ignore // @ts-ignore
db.ddbClient.destroy(); db.ddbClient.destroy();
return callback(null, response); return callback(null, response);
}; });