Promote dev → uat: GRO-2342 portal waitlist service {id, name} #209
Reference in New Issue
Block a user
Delete Branch "promote/dev-to-uat-gro-2342"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
GRO-2342 (Phase 2: dev → uat) — portal waitlist service {id, name}
Carries the Phase 1 merge
1d6b906(feat/GRO-2342-portal-waitlist-servicename) plus the GRO-2139 reset.ts advisory lock + GRO-2294 infra mcp trigger that were merged to dev but not yet promoted to uat.What's in this promotion
GET /portal/appointmentsnow populatesservice: {id, name}on the synthetic waitlist card (was{id}only). The appointments join also gains a name (consistent shape). Same shape the appointments join returns, no portal change required.trigger-uat-*.txtplumbing.Conflict resolution (dev side wins)
UAT_PLAYBOOK.md— TC-API-8.20 (GRO-2342) added; TC-API-8.19 (GRO-2319) retained verbatim.src/routes/portal.ts— dev's{id, name}shape + GRO-2342 comment adopted.src/__tests__/portal.test.ts— dev's services mock + GRO-2342 assertions adopted.Verification
pnpm vitest run src/__tests__/portal.test.ts— 56/56 pass (includes new TC-API-8.20 GRO-2342 assertions).pnpm tsc --noEmit— clean.Next steps
groombook/infra.🪒 Hand-off to Lint Roller (
525c2c39-1196-4682-9cd1-0bcfcb0d0f31). Self-merge after QA approval.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>Resolves conflicts in UAT_PLAYBOOK.md, src/routes/portal.ts, and src/__tests__/portal.test.ts (dev side wins — GRO-2342 changes are the only diff in scope). Carries forward GRO-2139 reset.ts advisory lock + GRO-2294 infra mcp trigger that were merged to dev but not yet promoted to uat. - src/routes/portal.ts: GET /portal/appointments now populates service: {id, name} on both the synthetic waitlist card and the appointment card (was {id} only). Same shape, no portal change required. - src/__tests__/portal.test.ts: services mock + TC-API-8.20 GRO-2342 assertions on the synthetic waitlist card service name. - UAT_PLAYBOOK.md: TC-API-8.20 (GRO-2342) appended; TC-API-8.19 (GRO-2319) retained verbatim. Co-Authored-By: Paperclip <noreply@paperclip.ing>QA approved. CI clean (lint+typecheck, test, build all pass). Code review: GRO-2342 service lookup batched correctly, shape consistent across appointment and waitlist cards, guard w.serviceId correct. Tests cover both card shapes cleanly. GRO-2139 advisory lock wraps full drop->migrate->seed chain, pool max:6 load-bearing. UAT_PLAYBOOK.md TC-API-8.20 present. GRO-2294 carry-forward plumbing in scope. LGTM — self-merge.