diff --git a/scripts/seed-fixture.mjs b/scripts/seed-fixture.mjs index 056f12e..4d9144c 100644 --- a/scripts/seed-fixture.mjs +++ b/scripts/seed-fixture.mjs @@ -31,10 +31,31 @@ export const GENERATED_NOTE = export function fixtureFrom(seedModule) { const { ShiftRecord, ...entities } = seedModule.seedData; - /* First key, so it is the first thing anyone opening the file reads. The Go - loader unmarshals into a struct of demoUser + entities and ignores the - rest, so this costs nothing on the reading side. */ - return { _generated: GENERATED_NOTE, demoUser: seedModule.DEMO_USER, entities }; + /* `_generated` first, so it is the first thing anyone opening the file reads. + + `users` is the channel the seeder actually reads — `internal/seeder` + unmarshals into `{demoUser, users, entities}` and writes every account in + `users`, falling back to `demoUser` alone when the key is absent. That + fallback is why `demoUser` stays beside it rather than being replaced: a + fixture written here still seeds correctly against a backend that predates + the list, it simply seeds one account instead of two. + + Emitting only `demoUser` is what this generator used to do, and it was a + version behind: the fixture on disk carries the employer account, the + seeder reads it from `users`, and regenerating without this key would drop + `employer@krow.app` from every fresh seed — leaving nobody to sign in as + to reach the employer console, which is the exact gap the account was + added to close. + + `entities.User` carries the same list. The seeder ignores it, and it is + emitted because `seedData` is copied wholesale; the two are the same array + rather than two places to keep in step. */ + return { + _generated: GENERATED_NOTE, + demoUser: seedModule.DEMO_USER, + users: seedModule.seedData.User, + entities, + }; } /** Serialised exactly as the committed file is: 2-space indent, no trailing newline. */ diff --git a/src/api/demoUser.ts b/src/api/demoUser.ts index 8721818..a5e9846 100644 --- a/src/api/demoUser.ts +++ b/src/api/demoUser.ts @@ -39,3 +39,29 @@ export const DEMO_USER: User = { emailDigest: true, }, }; + +/** + * The employer account, and the reason there is a second one at all. + * + * `policy.go` has always had three roles — admin, employer, talent — and the + * fixture had one administrator, so two thirds of the authorization table was + * never exercised and there was nobody to sign in as to reach the employer + * console. This account is what makes that path reachable. + * + * Unlike `DEMO_USER` this is not a default shape for the first render: nothing + * in the running app reads it. It exists so that `seedData.User` names both + * accounts, which is what the backend seeder writes. See `seed.ts`. + */ +export const EMPLOYER_USER: User = { + id: 'user_employer', + full_name: 'Jordan Blake', + email: 'employer@krow.app', + role: 'employer', + account_type: 'employer', + created_date: '2026-06-01T09:00:00.000Z', + preferences: { + owliverDefault: true, + compactDensity: false, + emailDigest: true, + }, +}; diff --git a/src/api/seed.ts b/src/api/seed.ts index 736d3a7..f2fc442 100644 --- a/src/api/seed.ts +++ b/src/api/seed.ts @@ -9,7 +9,7 @@ */ import { SHIFT_RECORDS } from './attendanceSeed'; -import { DEMO_USER } from './demoUser'; +import { DEMO_USER, EMPLOYER_USER } from './demoUser'; const iso = (date: string) => new Date(`${date}T09:00:00.000Z`).toISOString(); @@ -1990,8 +1990,12 @@ const USER_ACTIVITY = ACTIVITY_EVENTS.map(([event_type, user_email, user_name, a * candidate, interview and shift record below — into the production bundle. * The fixtures here are for the test scripts, and they still read * `seedData.User` and `DEMO_USER` from this module, so both keep working. + * + * `EMPLOYER_USER` travels the same way. It is seeded, never rendered: the + * backend writes both accounts so the employer console has somebody to sign + * in as, and nothing in the running app imports it. */ -export { DEMO_USER } from './demoUser'; +export { DEMO_USER, EMPLOYER_USER } from './demoUser'; /* ── Assignments ─────────────────────────────────────────────────────────── Who is on which position, and until when — the record that turns a hire into @@ -2051,5 +2055,5 @@ export const seedData = { Assignment: ASSIGNMENTS, ShiftRecord: SHIFT_RECORDS, Evidence: EVIDENCE, - User: [DEMO_USER], + User: [DEMO_USER, EMPLOYER_USER], };