From 1d11de8cec5cda2317f566adb194363c452b9b24 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Thu, 27 Aug 2026 12:03:40 -0500 Subject: [PATCH] Refactor admin to shared generic CRUD; restructure proclamation categories/groups and APIs - Replace per-model admin forms with the shared generic AdminTable/AdminModal CRUD - Add ProclamationGroup model and admin + API v2 routes (replaces subscription levels) - Drop subscription levels and flatten proclamation categories - Update v2 serializers and seed data accordingly --- prisma/seed.ts | 69 ++-- src/lib/components/admin/AdminModal.svelte | 36 +- src/lib/components/admin/AdminTable.svelte | 63 +--- src/lib/components/admin/Toast.svelte | 24 +- src/lib/components/tiptap/TipTap.svelte | 103 ------ src/lib/server/v2-serializers.spec.ts | 69 ++-- src/lib/server/v2-serializers.ts | 49 +-- src/lib/server/v2-signature.spec.ts | 2 +- src/lib/svelte-admin/crud.spec.ts | 4 +- src/lib/svelte-admin/crud.ts | 2 +- src/lib/svelte-admin/registry.ts | 99 ++---- src/lib/svelte-admin/schemas.ts | 46 +-- src/routes/(protected)/admin/+error.svelte | 13 +- src/routes/(protected)/admin/+page.svelte | 13 +- .../(protected)/admin/api-keys/+page.svelte | 79 ++--- .../admin/license-keys/+page.server.ts | 36 +- .../admin/license-keys/+page.svelte | 109 +++--- .../admin/license-keys/LicenseKeyForm.svelte | 91 ----- .../admin/license-keys/page.server.spec.ts | 55 +-- .../proclamation-categories/+page.server.ts | 98 ++---- .../proclamation-categories/+page.svelte | 56 +++- .../CategoryForm.svelte | 124 ------- .../admin/proclamation-groups/+page.server.ts | 107 ++++++ .../+page.svelte | 66 +++- .../admin/proclamations/+page.server.ts | 15 +- .../admin/proclamations/+page.svelte | 211 +++++++++++- .../proclamations/ProclamationForm.svelte | 237 ------------- .../ProclamationForm.svelte.spec.ts | 152 --------- .../admin/proclamations/page.server.spec.ts | 15 +- .../admin/proclamations/page.svelte.spec.ts | 174 ++++++++++ .../(protected)/admin/profiles/+page.svelte | 314 +++++------------- .../admin/solfeggio-frequencies/+page.svelte | 65 +++- .../solfeggio-frequencies/FreqForm.svelte | 96 ------ .../admin/subscription-levels/+page.server.ts | 18 - .../subscription-levels/LevelForm.svelte | 95 ------ .../(protected)/admin/user-roles/+page.svelte | 54 ++- .../admin/user-roles/UserRoleForm.svelte | 73 ---- .../(protected)/admin/users/+page.svelte | 9 +- .../(protected)/admin/users/UserForm.svelte | 30 +- .../v1/automations/create/account/+server.ts | 13 +- src/routes/api/v1/license/+server.ts | 3 +- .../v2/automations/create/account/+server.ts | 13 +- .../automations/create/account/server.spec.ts | 47 +-- src/routes/api/v2/groups/+server.ts | 11 + src/routes/api/v2/groups/server.spec.ts | 47 +++ src/routes/api/v2/license/+server.ts | 8 +- src/routes/api/v2/license/server.spec.ts | 36 +- src/routes/api/v2/proclamations/+server.ts | 1 + .../api/v2/proclamations/server.spec.ts | 7 +- .../api/v2/subscription-levels/+server.ts | 11 - 50 files changed, 1168 insertions(+), 2000 deletions(-) delete mode 100644 src/lib/components/tiptap/TipTap.svelte delete mode 100644 src/routes/(protected)/admin/license-keys/LicenseKeyForm.svelte delete mode 100644 src/routes/(protected)/admin/proclamation-categories/CategoryForm.svelte create mode 100644 src/routes/(protected)/admin/proclamation-groups/+page.server.ts rename src/routes/(protected)/admin/{subscription-levels => proclamation-groups}/+page.svelte (58%) delete mode 100644 src/routes/(protected)/admin/proclamations/ProclamationForm.svelte delete mode 100644 src/routes/(protected)/admin/proclamations/ProclamationForm.svelte.spec.ts create mode 100644 src/routes/(protected)/admin/proclamations/page.svelte.spec.ts delete mode 100644 src/routes/(protected)/admin/solfeggio-frequencies/FreqForm.svelte delete mode 100644 src/routes/(protected)/admin/subscription-levels/+page.server.ts delete mode 100644 src/routes/(protected)/admin/subscription-levels/LevelForm.svelte delete mode 100644 src/routes/(protected)/admin/user-roles/UserRoleForm.svelte create mode 100644 src/routes/api/v2/groups/+server.ts create mode 100644 src/routes/api/v2/groups/server.spec.ts delete mode 100644 src/routes/api/v2/subscription-levels/+server.ts diff --git a/prisma/seed.ts b/prisma/seed.ts index fffd785..56f11e5 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -72,43 +72,26 @@ const colorPalettes: { solfeggioFrequencyId: number; colors: string[] }[] = [ } ]; -const subscriptionLevels = [ - { id: 1, name: 'Basic', description: 'General only' }, - { id: 2, name: 'Advanced', description: 'General + Specific' }, - { id: 3, name: 'Elite', description: 'General + Specific + Precise' } +const proclamationGroups = [ + { name: 'General', sortOrder: 0 }, + { name: 'Specific', sortOrder: 1 }, + { name: 'Precise', sortOrder: 2 }, + { name: 'Prayers', sortOrder: 3 }, + { name: 'Scripture', sortOrder: 4 } ]; +// Flat category list (formerly hierarchical parents). const proclamationCategories = [ - { id: 4, name: 'Spiritual', parentId: null }, - { id: 5, name: 'General', parentId: 4 }, - { id: 9, name: 'Specific', parentId: 4 }, - { id: 40, name: 'Precise', parentId: 4 }, - { id: 2, name: 'Physical', parentId: null }, - { id: 3, name: 'General', parentId: 2 }, - { id: 10, name: 'Specific', parentId: 2 }, - { id: 32, name: 'Precise', parentId: 2 }, - { id: 16, name: 'Mental', parentId: null }, - { id: 30, name: 'General', parentId: 16 }, - { id: 31, name: 'Specific', parentId: 16 }, - { id: 38, name: 'Precise', parentId: 16 }, - { id: 17, name: 'Custom (Client Specific)', parentId: null }, - { id: 19, name: 'Financial', parentId: null }, - { id: 28, name: 'General', parentId: 19 }, - { id: 29, name: 'Specific', parentId: 19 }, - { id: 37, name: 'Precise', parentId: 19 }, - { id: 20, name: 'Emotional', parentId: null }, - { id: 24, name: 'General', parentId: 20 }, - { id: 26, name: 'Specific', parentId: 20 }, - { id: 45, name: 'Precise', parentId: 20 }, - { id: 21, name: 'Social', parentId: null }, - { id: 22, name: 'General', parentId: 21 }, - { id: 23, name: 'Specific', parentId: 21 }, - { id: 39, name: 'Precise', parentId: 21 }, - { id: 41, name: 'Biblical', parentId: null }, - { id: 42, name: 'Personal Growth & Development', parentId: null }, - { id: 43, name: 'Prayers', parentId: 41 }, - { id: 44, name: 'Scripture', parentId: 41 }, - { id: 46, name: 'Sports', parentId: null } + { id: 4, name: 'Spiritual' }, + { id: 2, name: 'Physical' }, + { id: 16, name: 'Mental' }, + { id: 17, name: 'Custom (Client Specific)' }, + { id: 19, name: 'Financial' }, + { id: 20, name: 'Emotional' }, + { id: 21, name: 'Social' }, + { id: 41, name: 'Biblical' }, + { id: 42, name: 'Personal Growth & Development' }, + { id: 46, name: 'Sports' } ]; async function main() { @@ -130,6 +113,15 @@ async function main() { }); } + console.log('Seeding ProclamationGroup...'); + for (const group of proclamationGroups) { + await prisma.proclamationGroup.upsert({ + where: { name: group.name }, + create: group, + update: group + }); + } + console.log('Seeding ProclamationCategory...'); for (const cat of proclamationCategories) { await prisma.proclamationCategory.upsert({ @@ -139,15 +131,6 @@ async function main() { }); } - console.log('Seeding SubscriptionLevel...'); - for (const level of subscriptionLevels) { - await prisma.subscriptionLevel.upsert({ - where: { id: level.id }, - create: level, - update: level - }); - } - console.log('Seeding ColorPalette...'); for (const palette of colorPalettes) { await prisma.colorPalette.upsert({ diff --git a/src/lib/components/admin/AdminModal.svelte b/src/lib/components/admin/AdminModal.svelte index 4c4e06e..d4de85c 100644 --- a/src/lib/components/admin/AdminModal.svelte +++ b/src/lib/components/admin/AdminModal.svelte @@ -43,38 +43,18 @@ {#if open} -