From 63256b8bc0d4f981e17875fb11e8c37ef2c08c25 Mon Sep 17 00:00:00 2001 From: Flea Flicker Date: Thu, 9 Apr 2026 22:33:15 +0000 Subject: [PATCH] feat: implement SEED_ADMIN_EMAIL support in seedKnownUsers and full seed - Add admin upsert to seedKnownUsers() for prod path - Add admin upsert to seed() for UAT path - Idempotent: skips if SEED_ADMIN_EMAIL not set Co-Authored-By: Paperclip --- infra | 2 +- packages/db/src/seed.ts | 47 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/infra b/infra index fd164f5..d43a016 160000 --- a/infra +++ b/infra @@ -1 +1 @@ -Subproject commit fd164f52319750df6468b40c6df35f198289bf43 +Subproject commit d43a016f3f304d34bdbda82a48a8865399d420fd diff --git a/packages/db/src/seed.ts b/packages/db/src/seed.ts index 706b69e..09351bb 100644 --- a/packages/db/src/seed.ts +++ b/packages/db/src/seed.ts @@ -294,6 +294,32 @@ async function seedKnownUsers() { console.log("✓ Created staff 'Demo Manager' (oidcSub: demo-manager-001)"); } + // ── Staff: SEED_ADMIN_EMAIL admin ── + const adminEmail = process.env.SEED_ADMIN_EMAIL; + if (adminEmail) { + const adminName = process.env.SEED_ADMIN_NAME ?? "Admin"; + const ADMIN_STAFF_ID = "00000000-0000-0000-0000-000000000002"; + const [existingAdmin] = await db + .select() + .from(schema.staff) + .where(eq(schema.staff.email, adminEmail)) + .limit(1); + + if (existingAdmin) { + console.log(`✓ Staff admin '${existingAdmin.name}' already exists — skipping`); + } else { + await db.insert(schema.staff).values({ + id: ADMIN_STAFF_ID, + name: adminName, + email: adminEmail, + role: "manager", + isSuperUser: true, + active: true, + }); + console.log(`✓ Created staff admin '${adminName}' (${adminEmail})`); + } + } + // ── Services: idempotent upsert using name as unique key ───────────────────── // UNIQUE constraint on services.name (migration 0020) must exist first. // Uses b0000001-... IDs to match main seed servicesDef for same-named services. @@ -447,6 +473,27 @@ async function seed() { } console.log(`✓ Created ${allStaff.length} staff (1 manager, 1 receptionist, 3 groomers, 3 bathers)`); + // ── SEED_ADMIN_EMAIL admin ── + const adminEmail = process.env.SEED_ADMIN_EMAIL; + if (adminEmail) { + const adminName = process.env.SEED_ADMIN_NAME ?? "Admin"; + const ADMIN_STAFF_ID = "00000000-0000-0000-0000-000000000002"; + await db.insert(schema.staff) + .values({ + id: ADMIN_STAFF_ID, + name: adminName, + email: adminEmail, + role: "manager", + isSuperUser: true, + active: true, + }) + .onConflictDoUpdate({ + target: schema.staff.email, + set: { id: ADMIN_STAFF_ID, name: adminName, role: "manager", isSuperUser: true, active: true }, + }); + console.log(`✓ Upserted admin staff '${adminName}' (${adminEmail})`); + } + // ── Services ── // Upsert services using name as unique key. With deterministic IDs in // servicesDef and TRUNCATE clearing downstream tables first, this is -- 2.52.0