migrate rest of info route to dynabridge
This commit is contained in:
parent
9f1a05acf8
commit
ff2b5f9b9e
@ -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);
|
||||
};
|
||||
@ -1,5 +1,5 @@
|
||||
import { z } from "zod";
|
||||
import { DynaBridge, DynaBridgeEntity } from 'dynabridge';
|
||||
import { DynaBridgeEntity } from 'dynabridge';
|
||||
|
||||
export const DOOR_ALIAS_SK = "alias";
|
||||
|
||||
|
||||
@ -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";
|
||||
|
||||
30
packages/doorman-api/src/schema/LockStatus.ts
Normal file
30
packages/doorman-api/src/schema/LockStatus.ts
Normal 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();
|
||||
};
|
||||
@ -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) => {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user