migrate rest of info route to dynabridge

This commit is contained in:
Martin Dimitrov 2025-05-31 14:36:19 -07:00
parent 9f1a05acf8
commit ff2b5f9b9e
5 changed files with 57 additions and 30 deletions

View File

@ -4,10 +4,11 @@
import { ServerlessEventObject, ServerlessFunctionSignature } from "@twilio-labs/serverless-runtime-types/types";
import { TwilioContext } from "../../../types/TwilioContext";
import { createDDBClient, createDynaBridgeClient, ddbItemToJSON, getDoorAliasCommand, getDoorConfigCommand, getLockStatusCommand, isLockOpen } from "../../../utils/ddb";
import { createDynaBridgeClient } from "../../../utils/ddb";
import { DoorStatus } from "../../../types/DoorStatus";
import { getDoorConfigID } from "../../../schema/DoorConfig";
import { getDoorAliasID } from "../../../schema/DoorAlias";
import { getLockStatusID, isLockOpen } from "../../../schema/LockStatus";
export interface InfoRequest extends ServerlessEventObject {
door?: string;
@ -38,7 +39,6 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
return callback(null, response);
}
const client = createDDBClient(context);
const db = createDynaBridgeClient(context);
if (buzzer) {
@ -77,36 +77,31 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
discordUsers: config.discordUsers,
});
} else {
await client.send(getLockStatusCommand(door))
.then(async (lock) => {
const status = isLockOpen(lock) ? DoorStatus.OPEN: DoorStatus.CLOSED;
const lock = await db.entities.lockStatus.findById(getLockStatusID(door));
const status = isLockOpen(lock) ? DoorStatus.OPEN: DoorStatus.CLOSED;
// respond to UI
response
.setStatusCode(200)
.appendHeader('Content-Type', 'application/json')
.setBody({
id: door,
timeout: config.timeout,
buzzer: config.buzzer,
status,
buzzerCode: config.buzzerCode,
fallbackNumbers: config.fallbackNumbers,
pressKey: config.pressKey,
discordUsers: config.discordUsers,
greeting: config.greeting || "",
});
}).catch((e) => {
console.log(e);
response
.setStatusCode(500)
.appendHeader('Content-Type', 'application/json')
.setBody({ err: e });
// respond to UI
response
.setStatusCode(200)
.appendHeader('Content-Type', 'application/json')
.setBody({
id: door,
timeout: config.timeout,
buzzer: config.buzzer,
status,
buzzerCode: config.buzzerCode,
fallbackNumbers: config.fallbackNumbers,
pressKey: config.pressKey,
discordUsers: config.discordUsers,
greeting: config.greeting || "",
});
}
}
}
await client.destroy();
// destroy the internal client after
// @ts-ignore
db.ddbClient.destroy();
return callback(null, response);
};

View File

@ -1,5 +1,5 @@
import { z } from "zod";
import { DynaBridge, DynaBridgeEntity } from 'dynabridge';
import { DynaBridgeEntity } from 'dynabridge';
export const DOOR_ALIAS_SK = "alias";

View File

@ -1,5 +1,5 @@
import { z } from "zod";
import { DynaBridge, DynaBridgeEntity } from 'dynabridge';
import { DynaBridgeEntity } from 'dynabridge';
export const DOOR_CONFIG_SK = "config";
export const EDIT_DOOR_CONFIG_SK = "config-update";

View File

@ -0,0 +1,30 @@
import { z } from "zod";
import { DynaBridgeEntity } from 'dynabridge';
export const LOCK_STATUS_SK = "lock";
export const LockStatusSchema = z.object({
// keys
PK: z.string(), // phone number (buzzer number)
SK: z.literal(LOCK_STATUS_SK).default(LOCK_STATUS_SK),
TTL: z.number(),
fingerprint: z.string(),
});
export const getLockStatusID = (buzzer: string): string[] => {
return [buzzer, LOCK_STATUS_SK];
}
export type LockStatus = z.infer<typeof LockStatusSchema>;
export const LockStatusEntity: DynaBridgeEntity<LockStatus> = {
tableName: "doorman",
id: ["PK", "SK"],
};
export const isLockOpen = (lock?: LockStatus) => {
// ttl is a UTC ms time for how long it is unlocked
const ttl = lock?.TTL || 0;
return parseInt("" + ttl) > Date.now();
};

View File

@ -5,6 +5,7 @@ import { DoorConfig } from "../types/DoorConfig";
import { DynaBridge } from "dynabridge";
import { DoorConfigEntity, EditDoorConfigEntity } from "../schema/DoorConfig";
import { DoorAliasEntity } from "../schema/DoorAlias";
import { LockStatusEntity } from "../schema/LockStatus";
export const createDDBClient = (context: TwilioContext) => {
return new DynamoDBClient({
@ -22,6 +23,7 @@ export const createDynaBridgeClient = (context: TwilioContext) => {
doorConfig: DoorConfigEntity,
editDoorConfig: EditDoorConfigEntity,
doorAlias: DoorAliasEntity,
lockStatus: LockStatusEntity,
}, {
serialize: (entity) => entity,
deserialize: (entity) => {