From a60be8c0a4b874a0962dbb136bc7c4bac1bf24de Mon Sep 17 00:00:00 2001 From: Adrian Bonpin Date: Sat, 25 Apr 2026 18:20:19 +0800 Subject: [PATCH] feat(schema): add settingDefinitions table with input type and impact level enums --- lib/db/schema/settingDefinitions.ts | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/db/schema/settingDefinitions.ts diff --git a/lib/db/schema/settingDefinitions.ts b/lib/db/schema/settingDefinitions.ts new file mode 100644 index 0000000..37f253b --- /dev/null +++ b/lib/db/schema/settingDefinitions.ts @@ -0,0 +1,46 @@ +import { + integer, + jsonb, + pgEnum, + pgTable, + text, + timestamp, + unique, +} from "drizzle-orm/pg-core" +import { settingCategories } from "./settingCategories" + +export const settingInputTypeEnum = pgEnum("setting_input_type", [ + "toggle", + "select", + "range", + "number", +]) + +export const impactLevelEnum = pgEnum("impact_level", [ + "minor", + "moderate", + "major", +]) + +export const settingDefinitions = pgTable( + "setting_definitions", + { + id: text("id") + .primaryKey() + .$defaultFn(() => crypto.randomUUID()), + categoryId: text("category_id") + .notNull() + .references(() => settingCategories.id, { onDelete: "cascade" }), + name: text("name").notNull(), + slug: text("slug").notNull(), + inputType: settingInputTypeEnum("input_type").notNull(), + // For `select`: string[] of option labels + // For `range`: { min: number, max: number, step: number } + // For `toggle`/`number`: null + options: jsonb("options").$type(), + impactLevel: impactLevelEnum("impact_level").default("minor").notNull(), + sortOrder: integer("sort_order").default(0).notNull(), + createdAt: timestamp("created_at").defaultNow().notNull(), + }, + (table) => [unique("setting_category_slug_unique").on(table.categoryId, table.slug)], +)