From 6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 Mon Sep 17 00:00:00 2001 From: Elizabeth Alexander Hunt Date: Thu, 2 Jul 2026 11:55:17 -0700 Subject: Init --- .../consumer/dao/keys/S3WidgetKeyGenerator.ts | 43 ++++++++++++++++++++++ Homework/cs5260/consumer/dao/keys/index.ts | 1 + 2 files changed, 44 insertions(+) create mode 100644 Homework/cs5260/consumer/dao/keys/S3WidgetKeyGenerator.ts create mode 100644 Homework/cs5260/consumer/dao/keys/index.ts (limited to 'Homework/cs5260/consumer/dao/keys') diff --git a/Homework/cs5260/consumer/dao/keys/S3WidgetKeyGenerator.ts b/Homework/cs5260/consumer/dao/keys/S3WidgetKeyGenerator.ts new file mode 100644 index 0000000..2e4c254 --- /dev/null +++ b/Homework/cs5260/consumer/dao/keys/S3WidgetKeyGenerator.ts @@ -0,0 +1,43 @@ +import { WidgetT } from "@/shared/schema"; + +export class S3WidgetKeyGenerator { + private prefix: string = ""; + private owner: string = ""; + private widgetId: string = ""; + + public withPrefix(prefix: string): S3WidgetKeyGenerator { + this.prefix = prefix; + return this; + } + + public withOwner(owner: string): S3WidgetKeyGenerator { + this.owner = owner; + return this; + } + + public withWidgetId(widgetId: string): S3WidgetKeyGenerator { + this.widgetId = widgetId; + return this; + } + + public build(): string { + const parts = [ + this.prefix, + this.owner.replaceAll(" ", "-").toLowerCase(), + this.widgetId, + ]; + if (parts.some((part) => !part || !part.match(/^[a-zA-Z0-9!\-_.*'()]+$/))) { + throw new Error("Invalid Key Specification"); + } + return parts.join("/"); + } + + public fromWidget(widget: WidgetT) { + const keyBuilder = new S3WidgetKeyGenerator(); + return keyBuilder + .withPrefix(this.prefix) + .withOwner(widget.owner) + .withWidgetId(widget.id) + .build(); + } +} diff --git a/Homework/cs5260/consumer/dao/keys/index.ts b/Homework/cs5260/consumer/dao/keys/index.ts new file mode 100644 index 0000000..c7c8467 --- /dev/null +++ b/Homework/cs5260/consumer/dao/keys/index.ts @@ -0,0 +1 @@ +export * from "./S3WidgetKeyGenerator"; -- cgit v1.3