diff --git a/packages/doorman-api/src/functions/api/door/info.ts b/packages/doorman-api/src/functions/api/door/info.ts index d2b844c..a23992a 100644 --- a/packages/doorman-api/src/functions/api/door/info.ts +++ b/packages/doorman-api/src/functions/api/door/info.ts @@ -6,8 +6,8 @@ import { ServerlessEventObject, ServerlessFunctionSignature } from "@twilio-labs import { TwilioContext } from "../../../types/TwilioContext"; import { createDDBClient, createDynaBridgeClient, ddbItemToJSON, getDoorAliasCommand, getDoorConfigCommand, getLockStatusCommand, isLockOpen } from "../../../utils/ddb"; import { DoorStatus } from "../../../types/DoorStatus"; -import { DoorConfig } from "../../../types/DoorConfig"; -import { DOOR_CONFIG_SK, getDoorConfigID } from "../../../schema/DoorConfig"; +import { getDoorConfigID } from "../../../schema/DoorConfig"; +import { getDoorAliasID } from "../../../schema/DoorAlias"; export interface InfoRequest extends ServerlessEventObject { door?: string; @@ -42,16 +42,16 @@ export const handler: ServerlessFunctionSignature = const db = createDynaBridgeClient(context); if (buzzer) { - door = await client.send(getDoorAliasCommand(buzzer)) + door = await db.entities.doorAlias.findById(getDoorAliasID(buzzer)) .then(async (alias) => { - if (!alias.Item) { + if (!alias) { response .setStatusCode(404) .appendHeader('Content-Type', 'application/json') .setBody({ err: "This buzzer is not registered" }); return undefined; } - return alias.Item.name.S; + return alias.name; }); } @@ -74,7 +74,7 @@ export const handler: ServerlessFunctionSignature = door, fallbackNumbers: config.fallbackNumbers, pressKey: config.pressKey, - discordUsers: config.discordUsers || [], + discordUsers: config.discordUsers, }); } else { await client.send(getLockStatusCommand(door)) @@ -93,7 +93,7 @@ export const handler: ServerlessFunctionSignature = buzzerCode: config.buzzerCode, fallbackNumbers: config.fallbackNumbers, pressKey: config.pressKey, - discordUsers: config.discordUsers || [], + discordUsers: config.discordUsers, greeting: config.greeting || "", }); diff --git a/packages/doorman-api/src/schema/DoorAlias.ts b/packages/doorman-api/src/schema/DoorAlias.ts new file mode 100644 index 0000000..047aa71 --- /dev/null +++ b/packages/doorman-api/src/schema/DoorAlias.ts @@ -0,0 +1,22 @@ +import { z } from "zod"; +import { DynaBridge, DynaBridgeEntity } from 'dynabridge'; + +export const DOOR_ALIAS_SK = "alias"; + +export const DoorAliasSchema = z.object({ + // keys + PK: z.string(), // phone number (buzzer number) + SK: z.literal(DOOR_ALIAS_SK).default(DOOR_ALIAS_SK), + name: z.string(), +}); + +export const getDoorAliasID = (buzzer: string): string[] => { + return [buzzer, DOOR_ALIAS_SK]; +} + +export type DoorAlias = z.infer; + +export const DoorAliasEntity: DynaBridgeEntity = { + tableName: "doorman", + id: ["PK", "SK"], +}; diff --git a/packages/doorman-api/src/schema/DoorConfig.ts b/packages/doorman-api/src/schema/DoorConfig.ts index 895976e..7643506 100644 --- a/packages/doorman-api/src/schema/DoorConfig.ts +++ b/packages/doorman-api/src/schema/DoorConfig.ts @@ -15,7 +15,7 @@ export const DoorConfigSchema = z.object({ fallbackNumbers: z.array(z.string()), pin: z.string(), pressKey: z.string(), - greeting: z.string(), + greeting: z.string().optional(), timeout: z.number(), }); diff --git a/packages/doorman-api/src/utils/ddb.ts b/packages/doorman-api/src/utils/ddb.ts index cd6b1d6..2eafd2d 100644 --- a/packages/doorman-api/src/utils/ddb.ts +++ b/packages/doorman-api/src/utils/ddb.ts @@ -4,6 +4,7 @@ import { TwilioContext } from "../types/TwilioContext"; import { DoorConfig } from "../types/DoorConfig"; import { DynaBridge } from "dynabridge"; import { DoorConfigEntity, EditDoorConfigEntity } from "../schema/DoorConfig"; +import { DoorAliasEntity } from "../schema/DoorAlias"; export const createDDBClient = (context: TwilioContext) => { return new DynamoDBClient({ @@ -20,6 +21,7 @@ export const createDynaBridgeClient = (context: TwilioContext) => { return new DynaBridge({ doorConfig: DoorConfigEntity, editDoorConfig: EditDoorConfigEntity, + doorAlias: DoorAliasEntity, }, { serialize: (entity) => entity, deserialize: (entity) => {