From 44ff06876bba639264558a18b1220742fb587443 Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Tue, 10 Jun 2025 17:32:08 -0700 Subject: [PATCH] add local DDB run option --- bun.lockb | Bin 433888 -> 437480 bytes packages/doorman-api/.env.example | 1 + packages/doorman-api/package.json | 7 +- packages/doorman-api/src/local/localDdb.ts | 91 +++++++++++++++++++++ packages/doorman-api/src/utils/ddb.ts | 24 ++++-- 5 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 packages/doorman-api/src/local/localDdb.ts diff --git a/bun.lockb b/bun.lockb index 44db4f860a82da72cec41daffd295c760390a93a..3e694fddf0d115e3177e3bd7d6203d6d1c35b948 100755 GIT binary patch delta 27338 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 A8UO$Q delta 25402 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 K`e|vvFaHBMr!F@D diff --git a/packages/doorman-api/.env.example b/packages/doorman-api/.env.example index 7971b45..b88411b 100644 --- a/packages/doorman-api/.env.example +++ b/packages/doorman-api/.env.example @@ -5,6 +5,7 @@ AUTH_TOKEN= # aws stuff AWS_ACCESS_KEY= AWS_SECRET_ACCESS_KEY= +# AWS_ENDPOINT for local dev # discord notifs DISCORD_BOT_TOKEN= diff --git a/packages/doorman-api/package.json b/packages/doorman-api/package.json index df280a5..ab42150 100644 --- a/packages/doorman-api/package.json +++ b/packages/doorman-api/package.json @@ -8,6 +8,8 @@ "start-twilio": "twilio-run --load-local-env --live --port 8080", "watch-build": "bun run --watch src/index.ts", "start": "concurrently \"bun run watch-build\" \"bun run start-twilio\"", + "local-db": "bun run --watch src/local/localDdb.ts", + "start:local-db": "concurrently \"bun run local-db\" \"bun run start\"", "build": "bun run src/index.ts", "deploy": "twilio-run promote --from=staging --to=prod --load-system-env --env .env.example", "deploy:staging": "twilio-run deploy --load-system-env --env .env.example --service-name doorman --environment=staging --override-existing-project" @@ -30,8 +32,9 @@ "zod_utilz": "^0.8.4" }, "devDependencies": { - "twilio-run": "^3.5.4", - "concurrently": "^9.1.2" + "concurrently": "^9.1.2", + "dynamodb-local": "^0.0.35", + "twilio-run": "^3.5.4" }, "engines": { "node": "22" diff --git a/packages/doorman-api/src/local/localDdb.ts b/packages/doorman-api/src/local/localDdb.ts new file mode 100644 index 0000000..34f0a9c --- /dev/null +++ b/packages/doorman-api/src/local/localDdb.ts @@ -0,0 +1,91 @@ +import { CreateTableCommand, DynamoDBClient, KeyType, PutItemCommand, ScalarAttributeType } from "@aws-sdk/client-dynamodb"; +import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb"; +import { DoorAlias, DoorAliasEntity, DoorAliasSchema, getDoorAliasID } from "../schema/DoorAlias"; +import { DoorConfig } from "../schema/DoorConfig"; + +import DynamoDbLocal from "dynamodb-local"; +import { sleep } from "bun"; + +console.log("starting local DDB"); + +const localDdb = await DynamoDbLocal.launch(5000, null, [], true, true); + +process.on("SIGINT", async code => { + console.log("exiting DDB local"); + await DynamoDbLocal.stopChild(localDdb); +}); + +// wait 5s so we are available +await sleep(5_000); + +// seed ddb +const client = new DynamoDBClient({ + endpoint: 'http://localhost:5000', +}); + +const tableName = "doorman"; + +const createTableCommand = new CreateTableCommand({ + TableName: tableName, + KeySchema: [ + { AttributeName: 'PK', KeyType: KeyType.HASH }, + { AttributeName: 'SK', KeyType: KeyType.RANGE } + ], + AttributeDefinitions: [ + { AttributeName: 'PK', AttributeType: ScalarAttributeType.S }, + { AttributeName: 'SK', AttributeType: ScalarAttributeType.S } + ], + ProvisionedThroughput: { + ReadCapacityUnits: 5, + WriteCapacityUnits: 5 + }, +}); + +try { + await client.send(createTableCommand); +} catch (e) { + console.error("failed creating table", e); +} + +const document = DynamoDBDocument.from(client, { + marshallOptions: { + removeUndefinedValues: true, + } +}); + +const testDoorBuzzer = "6133163433"; +const testDoorName = "test"; +const testDoorPin = "1234"; + +const doorAlias: DoorAlias = { + PK: testDoorBuzzer, + SK: "alias", + name: testDoorName, +}; + +const doorConfig: DoorConfig = { + PK: "door-test", + SK: "config", + buzzer: testDoorBuzzer, + pressKey: "4", + discordUsers: [], + fallbackNumbers: [], + pin: testDoorPin, + buzzerCode: testDoorPin, + timeout: 60, + greeting: "test door", +}; + +try { + await document.put({ + TableName: tableName, + Item: doorConfig, + }); + + await document.put({ + TableName: tableName, + Item: doorAlias, + }); +} catch (e) { + console.error("failed seeding table", e); +} diff --git a/packages/doorman-api/src/utils/ddb.ts b/packages/doorman-api/src/utils/ddb.ts index d23c970..b8d5854 100644 --- a/packages/doorman-api/src/utils/ddb.ts +++ b/packages/doorman-api/src/utils/ddb.ts @@ -3,8 +3,24 @@ import { DynaBridge } from "dynabridge"; import { DoorConfigEntity, EditDoorConfigEntity, OnboardDoorConfigEntity } from "../schema/DoorConfig"; import { DoorAliasEntity } from "../schema/DoorAlias"; import { LockStatusEntity } from "../schema/LockStatus"; +import { DynamoDBClientConfig } from "@aws-sdk/client-dynamodb"; export const createDynaBridgeClient = (context: TwilioContext) => { + let config: DynamoDBClientConfig = { + region: "us-east-1", + credentials: { + accessKeyId: context.AWS_ACCESS_KEY, + secretAccessKey: context.AWS_SECRET_ACCESS_KEY, + }, + }; + + // for local DDB + if (context.AWS_ENDPOINT) { + config = { + endpoint: context.AWS_ENDPOINT, + } + } + // register all entities here return new DynaBridge({ doorConfig: DoorConfigEntity, @@ -26,11 +42,5 @@ export const createDynaBridgeClient = (context: TwilioContext) => { ); return convertedObj; } - }, { - region: "us-east-1" , - credentials: { - accessKeyId: context.AWS_ACCESS_KEY, - secretAccessKey: context.AWS_SECRET_ACCESS_KEY, - }, - }); + }, config); };