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 { 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);
|
||||||
};
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user