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 { 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<typeof StatusRequestSchema>;
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();
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<TwilioContext, StatusRequest>
if (isOpen && lock) {
const fingerprint = JSON.parse(lock.fingerprint);
response
.setStatusCode(200)
.appendHeader('Content-Type', 'application/json')
.setBody({
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({
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);
};
});