diff --git a/packages/doorman-api/src/functions/api/door/info.ts b/packages/doorman-api/src/functions/api/door/info.ts index a23992a..66b1e56 100644 --- a/packages/doorman-api/src/functions/api/door/info.ts +++ b/packages/doorman-api/src/functions/api/door/info.ts @@ -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 = return callback(null, response); } - const client = createDDBClient(context); const db = createDynaBridgeClient(context); if (buzzer) { @@ -77,36 +77,31 @@ export const handler: ServerlessFunctionSignature = 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); }; \ No newline at end of file diff --git a/packages/doorman-api/src/schema/DoorAlias.ts b/packages/doorman-api/src/schema/DoorAlias.ts index 047aa71..d0affa8 100644 --- a/packages/doorman-api/src/schema/DoorAlias.ts +++ b/packages/doorman-api/src/schema/DoorAlias.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { DynaBridge, DynaBridgeEntity } from 'dynabridge'; +import { DynaBridgeEntity } from 'dynabridge'; export const DOOR_ALIAS_SK = "alias"; diff --git a/packages/doorman-api/src/schema/DoorConfig.ts b/packages/doorman-api/src/schema/DoorConfig.ts index 7643506..277b907 100644 --- a/packages/doorman-api/src/schema/DoorConfig.ts +++ b/packages/doorman-api/src/schema/DoorConfig.ts @@ -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"; diff --git a/packages/doorman-api/src/schema/LockStatus.ts b/packages/doorman-api/src/schema/LockStatus.ts new file mode 100644 index 0000000..682646c --- /dev/null +++ b/packages/doorman-api/src/schema/LockStatus.ts @@ -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; + +export const LockStatusEntity: DynaBridgeEntity = { + 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(); +}; diff --git a/packages/doorman-api/src/utils/ddb.ts b/packages/doorman-api/src/utils/ddb.ts index 2eafd2d..b72345d 100644 --- a/packages/doorman-api/src/utils/ddb.ts +++ b/packages/doorman-api/src/utils/ddb.ts @@ -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) => {