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 { ServerlessEventObject, ServerlessFunctionSignature } from "@twilio-labs/serverless-runtime-types/types";
|
||||||
import { TwilioContext } from "../../../types/TwilioContext";
|
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 { DoorStatus } from "../../../types/DoorStatus";
|
||||||
import { getDoorConfigID } from "../../../schema/DoorConfig";
|
import { getDoorConfigID } from "../../../schema/DoorConfig";
|
||||||
import { getDoorAliasID } from "../../../schema/DoorAlias";
|
import { getDoorAliasID } from "../../../schema/DoorAlias";
|
||||||
|
import { getLockStatusID, isLockOpen } from "../../../schema/LockStatus";
|
||||||
|
|
||||||
export interface InfoRequest extends ServerlessEventObject {
|
export interface InfoRequest extends ServerlessEventObject {
|
||||||
door?: string;
|
door?: string;
|
||||||
@ -38,7 +39,6 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
|
|||||||
return callback(null, response);
|
return callback(null, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
const client = createDDBClient(context);
|
|
||||||
const db = createDynaBridgeClient(context);
|
const db = createDynaBridgeClient(context);
|
||||||
|
|
||||||
if (buzzer) {
|
if (buzzer) {
|
||||||
@ -77,36 +77,31 @@ export const handler: ServerlessFunctionSignature<TwilioContext, InfoRequest> =
|
|||||||
discordUsers: config.discordUsers,
|
discordUsers: config.discordUsers,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
await client.send(getLockStatusCommand(door))
|
const lock = await db.entities.lockStatus.findById(getLockStatusID(door));
|
||||||
.then(async (lock) => {
|
const status = isLockOpen(lock) ? DoorStatus.OPEN: DoorStatus.CLOSED;
|
||||||
const status = isLockOpen(lock) ? DoorStatus.OPEN: DoorStatus.CLOSED;
|
|
||||||
|
|
||||||
// respond to UI
|
// respond to UI
|
||||||
response
|
response
|
||||||
.setStatusCode(200)
|
.setStatusCode(200)
|
||||||
.appendHeader('Content-Type', 'application/json')
|
.appendHeader('Content-Type', 'application/json')
|
||||||
.setBody({
|
.setBody({
|
||||||
id: door,
|
id: door,
|
||||||
timeout: config.timeout,
|
timeout: config.timeout,
|
||||||
buzzer: config.buzzer,
|
buzzer: config.buzzer,
|
||||||
status,
|
status,
|
||||||
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 || "",
|
||||||
});
|
|
||||||
|
|
||||||
}).catch((e) => {
|
|
||||||
console.log(e);
|
|
||||||
response
|
|
||||||
.setStatusCode(500)
|
|
||||||
.appendHeader('Content-Type', 'application/json')
|
|
||||||
.setBody({ err: e });
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await client.destroy();
|
|
||||||
|
// destroy the internal client after
|
||||||
|
// @ts-ignore
|
||||||
|
db.ddbClient.destroy();
|
||||||
|
|
||||||
return callback(null, response);
|
return callback(null, response);
|
||||||
};
|
};
|
||||||
@ -1,5 +1,5 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { DynaBridge, DynaBridgeEntity } from 'dynabridge';
|
import { DynaBridgeEntity } from 'dynabridge';
|
||||||
|
|
||||||
export const DOOR_ALIAS_SK = "alias";
|
export const DOOR_ALIAS_SK = "alias";
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { DynaBridge, DynaBridgeEntity } from 'dynabridge';
|
import { DynaBridgeEntity } from 'dynabridge';
|
||||||
|
|
||||||
export const DOOR_CONFIG_SK = "config";
|
export const DOOR_CONFIG_SK = "config";
|
||||||
export const EDIT_DOOR_CONFIG_SK = "config-update";
|
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 { DynaBridge } from "dynabridge";
|
||||||
import { DoorConfigEntity, EditDoorConfigEntity } from "../schema/DoorConfig";
|
import { DoorConfigEntity, EditDoorConfigEntity } from "../schema/DoorConfig";
|
||||||
import { DoorAliasEntity } from "../schema/DoorAlias";
|
import { DoorAliasEntity } from "../schema/DoorAlias";
|
||||||
|
import { LockStatusEntity } from "../schema/LockStatus";
|
||||||
|
|
||||||
export const createDDBClient = (context: TwilioContext) => {
|
export const createDDBClient = (context: TwilioContext) => {
|
||||||
return new DynamoDBClient({
|
return new DynamoDBClient({
|
||||||
@ -22,6 +23,7 @@ export const createDynaBridgeClient = (context: TwilioContext) => {
|
|||||||
doorConfig: DoorConfigEntity,
|
doorConfig: DoorConfigEntity,
|
||||||
editDoorConfig: EditDoorConfigEntity,
|
editDoorConfig: EditDoorConfigEntity,
|
||||||
doorAlias: DoorAliasEntity,
|
doorAlias: DoorAliasEntity,
|
||||||
|
lockStatus: LockStatusEntity,
|
||||||
}, {
|
}, {
|
||||||
serialize: (entity) => entity,
|
serialize: (entity) => entity,
|
||||||
deserialize: (entity) => {
|
deserialize: (entity) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user