From 2228c433b2d55e2d1a6c874bccf5f9480c69692a Mon Sep 17 00:00:00 2001 From: Adrian Bonpin Date: Sat, 25 Apr 2026 18:29:00 +0800 Subject: [PATCH] feat(api): add settings categories/definitions CRUD with combined full endpoint --- lib/api/settings.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 lib/api/settings.ts diff --git a/lib/api/settings.ts b/lib/api/settings.ts new file mode 100644 index 0000000..7ba3db7 --- /dev/null +++ b/lib/api/settings.ts @@ -0,0 +1,47 @@ +import { Elysia, t } from "elysia" +import { createCrudRoutes } from "./crud-builder" +import { settingCategories, settingDefinitions } from "@/lib/db/schema" +import { db } from "@/lib/db/index" +import { eq, asc } from "drizzle-orm" + +// ── Setting Categories CRUD ─────────────────────────────────────── +export const settingCategoriesRoutes = createCrudRoutes(settingCategories, { + prefix: "/settings/categories", + name: "Setting Category", + auth: { read: "public", write: "admin", delete: "admin" }, +}) + +// ── Setting Definitions CRUD ────────────────────────────────────── +export const settingDefinitionsRoutes = createCrudRoutes(settingDefinitions, { + prefix: "/settings/definitions", + name: "Setting Definition", + auth: { read: "public", write: "admin", delete: "admin" }, + filter: { fields: ["categoryId", "inputType", "impactLevel"] }, +}) + +// ── Combined endpoint: categories with their definitions ────────── +// This is the main endpoint the frontend uses to render dynamic forms. +export const settingsFullRoutes = new Elysia({ + prefix: "/settings/full", +}).get( + "/", + async () => { + const categories = await db + .select() + .from(settingCategories) + .orderBy(asc(settingCategories.sortOrder)) + + const definitions = await db + .select() + .from(settingDefinitions) + .orderBy(asc(settingDefinitions.sortOrder)) + + // Group definitions by category + const result = categories.map((cat) => ({ + ...cat, + definitions: definitions.filter((d) => d.categoryId === cat.id), + })) + + return result + }, +)