fix(GRO-2342): portal waitlist card populates service {id, name} #208

Merged
Flea Flicker merged 1 commits from feat/GRO-2342-portal-waitlist-servicename into dev 2026-06-10 09:13:55 +00:00
Member

GRO-2342 (Phase 1: feature → dev) — Portal: waitlist card service {id, name}

Cosmetic follow-up to GRO-2319 (Phase 4 CTO review). The synthetic waitlist card on GET /api/portal/appointments returned service: {id} only, so the portal fell back to the literal 'Service' label. CMPO spec did not call for a service name on the waitlist card; populating the real name is non-urgent but closes the cosmetic gap.

Changes

  • src/routes/portal.ts GET /portal/appointments — include a services SELECT (in addition to pets and staff) covering both appointment and waitlist serviceId. A new serviceMap feeds a service.name lookup. The synthetic waitlist card's service object is now {id, name} — same shape the appointments join returns. The appointments join also gains a name (consistent shape, no regression for the existing path; the web portal's serviceName: raw.service?.name ?? raw.serviceName mapping is unchanged).
  • src/__tests__/portal.test.ts — mock the services table and assert service: {id, name} on both the synthetic waitlist card and the appointment card (TC-API-8.20 GRO-2342).
  • UAT_PLAYBOOK.md — TC-API-8.20 covering the waitlist card service name. TC-API-8.19 (GRO-2319 surfacing contract) retained verbatim.

Why this is a follow-up and not a blocker

Per the GRO-2319 thread, the waitlist card's primary signals are the Waitlisted badge + the waitlist subtext (CMPO spec). Falling back to 'Service' is a cosmetic gap, not a functional regression. UAT regression GRO-2341 (PASS 5/5) didn't cover this because the CMPO sign-off excluded the service name.

Out of scope

  • Additional waitlist-card fields (preferred-stylist, requested date/time) — only service.name.
  • Re-litigating the CMPO spec for the waitlist card UX.

Standard SDLC follow-up

  • Phase 1 (this PR): feature → dev (CI gate)
  • Phase 2: dev → uat via promotion branch (QA / Lint Roller)
  • Phase 3: Shedward post-deploy UAT regression covering TC-API-8.20
  • Phase 4: uat → main via FROZEN-branch pattern (CTO / The Dogfather)
  • Phase 5: prod overlay newTag bump in groombook/infra (4-line kustomization edit)

🪒 Self-merge after CI passes (Phase 1, no reviewer required).

## GRO-2342 (Phase 1: feature → dev) — Portal: waitlist card service {id, name} Cosmetic follow-up to [GRO-2319](/GRO/issues/GRO-2319) (Phase 4 CTO review). The synthetic waitlist card on `GET /api/portal/appointments` returned `service: {id}` only, so the portal fell back to the literal 'Service' label. CMPO spec did not call for a service name on the waitlist card; populating the real name is non-urgent but closes the cosmetic gap. ### Changes - **`src/routes/portal.ts`** `GET /portal/appointments` — include a `services` SELECT (in addition to `pets` and `staff`) covering both appointment and waitlist `serviceId`. A new `serviceMap` feeds a `service.name` lookup. The synthetic waitlist card's `service` object is now `{id, name}` — same shape the appointments join returns. The appointments join also gains a name (consistent shape, no regression for the existing path; the web portal's `serviceName: raw.service?.name ?? raw.serviceName` mapping is unchanged). - **`src/__tests__/portal.test.ts`** — mock the `services` table and assert `service: {id, name}` on both the synthetic waitlist card and the appointment card (TC-API-8.20 GRO-2342). - **`UAT_PLAYBOOK.md`** — TC-API-8.20 covering the waitlist card service name. TC-API-8.19 (GRO-2319 surfacing contract) retained verbatim. ### Why this is a follow-up and not a blocker Per the GRO-2319 thread, the waitlist card's primary signals are the **Waitlisted** badge + the waitlist subtext (CMPO spec). Falling back to 'Service' is a cosmetic gap, not a functional regression. UAT regression [GRO-2341](/GRO/issues/GRO-2341) (PASS 5/5) didn't cover this because the CMPO sign-off excluded the service name. ### Out of scope - Additional waitlist-card fields (preferred-stylist, requested date/time) — only `service.name`. - Re-litigating the CMPO spec for the waitlist card UX. ### Standard SDLC follow-up - **Phase 1 (this PR)**: feature → dev (CI gate) - **Phase 2**: dev → uat via promotion branch (QA / Lint Roller) - **Phase 3**: Shedward post-deploy UAT regression covering TC-API-8.20 - **Phase 4**: uat → main via FROZEN-branch pattern (CTO / The Dogfather) - **Phase 5**: prod overlay newTag bump in `groombook/infra` (4-line kustomization edit) 🪒 Self-merge after CI passes (Phase 1, no reviewer required).
Flea Flicker added 1 commit 2026-06-10 09:11:35 +00:00
fix(GRO-2342): portal waitlist card populates service {id, name}
CI / Test (pull_request) Successful in 26s
CI / Lint & Typecheck (pull_request) Successful in 29s
CI / Build & Push Docker Images (pull_request) Successful in 1m15s
277f459237
Cosmetic follow-up to GRO-2319 (Phase 4 review by CTO). The synthetic
waitlist card on GET /portal/appointments returned service: {id} only,
so the portal fell back to the literal 'Service' label. CMPO spec did
not call for a service name on the waitlist card, but populating the
real name is non-urgent and closes the cosmetic gap.

- src/routes/portal.ts: include a services SELECT (in addition to
  pets and staff) covering both appointment and waitlist serviceIds.
  serviceMap feeds a service.name lookup. The synthetic waitlist
  card's service object is now {id, name} — same shape the
  appointments join returns — so the portal renders the real name.
  The appointments join also gains a name (consistent shape, no
  regression for the existing path).
- src/__tests__/portal.test.ts: mock the services table and assert
  service: {id, name} on both the synthetic waitlist card and the
  appointment card.
- UAT_PLAYBOOK.md: TC-API-8.20 covering the waitlist card service
  name (TC-API-8.19 retained verbatim for the original GRO-2319
  surfacing contract).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Flea Flicker merged commit 1d6b906202 into dev 2026-06-10 09:13:55 +00:00
Flea Flicker deleted branch feat/GRO-2342-portal-waitlist-servicename 2026-06-10 09:13:56 +00:00
Sign in to join this conversation.