migrate door alias

This commit is contained in:
Martin Dimitrov 2025-05-31 14:26:47 -07:00
parent 73e98c0508
commit 9f1a05acf8
4 changed files with 32 additions and 8 deletions

View File

@ -6,8 +6,8 @@ import { ServerlessEventObject, ServerlessFunctionSignature } from "@twilio-labs
import { TwilioContext } from "../../../types/TwilioContext"; import { TwilioContext } from "../../../types/TwilioContext";
import { createDDBClient, createDynaBridgeClient, ddbItemToJSON, getDoorAliasCommand, getDoorConfigCommand, getLockStatusCommand, isLockOpen } from "../../../utils/ddb"; import { createDDBClient, createDynaBridgeClient, ddbItemToJSON, getDoorAliasCommand, getDoorConfigCommand, getLockStatusCommand, isLockOpen } from "../../../utils/ddb";
import { DoorStatus } from "../../../types/DoorStatus"; import { DoorStatus } from "../../../types/DoorStatus";
import { DoorConfig } from "../../../types/DoorConfig"; import { getDoorConfigID } from "../../../schema/DoorConfig";
import { DOOR_CONFIG_SK, getDoorConfigID } from "../../../schema/DoorConfig"; import { getDoorAliasID } from "../../../schema/DoorAlias";
export interface InfoRequest extends ServerlessEventObject { export interface InfoRequest extends ServerlessEventObject {
door?: string; door?: string;
@ -42,16 +42,16 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
const db = createDynaBridgeClient(context); const db = createDynaBridgeClient(context);
if (buzzer) { if (buzzer) {
door = await client.send(getDoorAliasCommand(buzzer)) door = await db.entities.doorAlias.findById(getDoorAliasID(buzzer))
.then(async (alias) => { .then(async (alias) => {
if (!alias.Item) { if (!alias) {
response response
.setStatusCode(404) .setStatusCode(404)
.appendHeader('Content-Type', 'application/json') .appendHeader('Content-Type', 'application/json')
.setBody({ err: "This buzzer is not registered" }); .setBody({ err: "This buzzer is not registered" });
return undefined; return undefined;
} }
return alias.Item.name.S; return alias.name;
}); });
} }
@ -74,7 +74,7 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
door, door,
fallbackNumbers: config.fallbackNumbers, fallbackNumbers: config.fallbackNumbers,
pressKey: config.pressKey, pressKey: config.pressKey,
discordUsers: config.discordUsers || [], discordUsers: config.discordUsers,
}); });
} else { } else {
await client.send(getLockStatusCommand(door)) await client.send(getLockStatusCommand(door))
@ -93,7 +93,7 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
buzzerCode: config.buzzerCode, buzzerCode: config.buzzerCode,
fallbackNumbers: config.fallbackNumbers, fallbackNumbers: config.fallbackNumbers,
pressKey: config.pressKey, pressKey: config.pressKey,
discordUsers: config.discordUsers || [], discordUsers: config.discordUsers,
greeting: config.greeting || "", greeting: config.greeting || "",
}); });

View File

@ -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<typeof DoorAliasSchema>;
export const DoorAliasEntity: DynaBridgeEntity<DoorAlias> = {
tableName: "doorman",
id: ["PK", "SK"],
};

View File

@ -15,7 +15,7 @@ export const DoorConfigSchema = z.object({
fallbackNumbers: z.array(z.string()), fallbackNumbers: z.array(z.string()),
pin: z.string(), pin: z.string(),
pressKey: z.string(), pressKey: z.string(),
greeting: z.string(), greeting: z.string().optional(),
timeout: z.number(), timeout: z.number(),
}); });

View File

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