update status route
This commit is contained in:
parent
8750c2ed82
commit
1c87e93d2f
@ -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({
|
||||
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);
|
||||
};
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user