fix(GRO-765): portal appointments crash — incomplete service data + response shape #322
Closed
groombook-engineer[bot] wants to merge 3 commits from
fix/gro-765-portal-appointments-service into main
pull from: fix/gro-765-portal-appointments-service
merge into: groombook:main
groombook:main
groombook:dev
groombook:flea/gro-1636-better-auth-seed
groombook:pr-434
groombook:uat
groombook:docs/GRO-1502-uat-mcp-migration
groombook:flea/gro-1496-e2e-err-connection-refused
groombook:flea-flicker/gro-1489-lint-fixes
groombook:cpfarhood/gro-1162-pet-buffer
groombook:flea-flicker/gro-1162-pet-buffer
groombook:fix/gro-1368-consent-ts
groombook:fix/ci-e2e-dind-networking-registry-auth
groombook:fix/gro-1369-types-sync
groombook:fix/ci-registry-auth-main
groombook:gitea/migrate-workflows
groombook:flea-flicker/gro-1162-pet-buffer-time
groombook:feat/GRO-106-portal-communication-real
groombook:archived-readme
groombook:feat/GRO-106-stop-help
groombook:fix/gro-1248-path-prefixes
groombook:fix/GRO-1212-portal-test-mock-imports
groombook:fix/GRO-1108-test-mocks
groombook:feat/GRO-106-stop-help-v2
groombook:docs/GRO-1099-uat-playbook-app
groombook:fleaflicker/deploy-telnyx-webhook-secret
groombook:fix/gro-1024-clean
groombook:fix/gro-1021-auth-rate-limit
groombook:fix/gro-1021-auth-rate-limit-v2
groombook:feat/GRO-984-outbound-sms-persistence
groombook:fix/GRO-980-indentation
groombook:docs/GRO-106-10dlc-runbook
groombook:fix/gro-898-demo-sso-env-vars
groombook:fix/gro-609-cherry-pick
groombook:fix/gro-866-uat-seed-personas
groombook:fix/gro-867-logo-proxy
groombook:fix/gro-816-portal-pets-crash
groombook:fix/gro-844-network-policy
groombook:fix/gro-820-e2e-invoices-mock
groombook:feature/gro-609-refund-payment-stats
groombook:fix/gro-805-allow-groomer-invoices
groombook:fix/gro-720-gitignore-hardening
groombook:fix/gro-721-harden-gitignore
groombook:feature/gro-633-db-indexes-constraints
groombook:fix/gro-639-n-plus-one-reminder-scheduler
groombook:ci-dev-trigger2
groombook:fix/gro-624-input-validation
groombook:feature/gro-653-portal-session-middleware
groombook:fix/gro-640-n-plus-one-email
groombook:clean-gro-639
groombook:fix/gro-637-invoice-refund-fixes
groombook:fix/gro-665-staff-auto-link
groombook:fix/gro-636-input-validation-v3
groombook:fix-gro-624-input-validation
groombook:fix/gro-655-corepack-only
groombook:feature/gro-597-payment-admin
groombook:feature/gro-631-graceful-shutdown
groombook:fix/gro-660-uat-seed-manager-superuser
groombook:fix/gro-655-corepack-enoent
groombook:feature/gro-623-groomer-isolation
groombook:feature/gro-632-impersonation-session-hardening
groombook:feature/gro-607-payment-ui
groombook:feature/gro-597-payment-backend
groombook:feature/gro-597-payment-ui
groombook:feature/gro-597-stripe-webhooks
groombook:feature/gro-597-payment-api
groombook:GRO-574-rate-limit-migration
groombook:chore/gro-575-promote-gro-574-to-uat
groombook:fix/gro-566-skip-oobe
groombook:fix/gro-557-e2e-stability
groombook:chore/gro-558-agents-instructions
groombook:fix/gro-531-social-login
groombook:fix/gro-545-social-providers-config
groombook:fix/gro-540-prod-oidc-env-vars
groombook:feat/gro-526-seed-profile-param
No Reviewers
Labels
Clear labels
bug
documentation
duplicate
enhancement
feature
good first issue
help wanted
invalid
question
wontfix
Something isn't working
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
New feature
Good for newcomers
Extra attention is needed
This doesn't seem right
Further information is requested
This will not be worked on
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
ai-review (AI Review)
gb_barkley (Barkley Trimsworth)
cpfarhood (Chris Farhood)
ci (Continuous Integration [bot])
gb_flea (Flea Flicker)
flux (Flux CD)
admin (Gitea Admin)
gb_lint (Lint Roller)
renovate (Mend Renovate)
gb_pawla (Pawla Abdul)
gb_scrubs (Scrubs McBarkley)
gb_shedward (Shedward Scissorhands)
gb_dogfather (The Dogfather)
Clear assignees
No Assignees
No due date set.
Dependencies
No dependencies set.
Reference: groombook/app#322
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "fix/gro-765-portal-appointments-service"
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?
What
Two bugs in portal Appointments that cause crashes in impersonation mode:
Bug 1 — Missing service name in API response
GET /api/portal/appointmentsreturned{ upcoming, past }but the service sub-object only had{ id }. The client tried to renderservice.name→ crash.Fix: Added a service JOIN to the query so the API now returns full service objects
{ id, name, duration, price }. Also simplified the response to{ appointments: [] }.Bug 2 — Client components expected the wrong response shape
The API returned
{ upcoming, past }but client components looked fordata.appointmentsand expecteddate/timefields directly on each appointment (notstartTime).Fix: Updated all three consumer components (Appointments, ReportCards, Dashboard) to transform the new response format: parse
startTimeintodate+time, extractserviceName/petName/groomerNamefrom nested sub-objects.Changes
apps/api/src/routes/portal.ts{ appointments }instead of{ upcoming, past }apps/web/src/portal/sections/Appointments.tsxapps/web/src/portal/sections/ReportCards.tsxapps/web/src/portal/sections/Dashboard.tsxTest plan
cc @cpfarhood
QA Review — FAIL
CI Status: ❌ Lint failed (2 errors)
Lint error in :
upcomingis assigned but never usedpastis assigned but never usedThe GRO-765 server fix changed the API response from
{ upcoming, past }to{ appointments: [] }but left the intermediate filtering variables as dead code.Fix needed: Remove the now-dead
upcoming/pastfilter lines, or prefix with underscore if intentionally kept for future use.Please fix and re-push. cc @cpfarhood
Lint fix applied
Removed the dead
upcoming/pastfilter variables (lines 86–87) and the unusednowdate variable. The response shape was already updated to{ appointments: appts }in commit0ace23d, so these lines were redundant.Pushed to
fix/gro-765-portal-appointments-service. QA please re-verify.cc @cpfarhood
Deployed to groombook-dev
Images:
pr-322URL: https://dev.groombook.farh.net
Ready for UAT validation.
QA Review — APPROVE
CI Status: ✓ All checks passing (Lint, Test, Build, E2E, Build & Push)
Bug 1 — Incomplete service data ✓
Bug 2 — Retry exits impersonation ✓
Additional fixes verified ✓
Previous CHANGES_REQUESTED was incorrect — the / variables in client code ARE used in subsequent filter operations; the dead code removal was in server-side only.
Recommendation: Approve and merge to . cc @cpfarhood
QA Review — APPROVE
CI Status: All checks passing (Lint, Test, Build, E2E, Build and Push)
Bug 1 — Incomplete service data
Bug 2 — Retry exits impersonation
Additional fixes verified
Previous CHANGES_REQUESTED was incorrect — the upcoming/past variables in client code ARE used in subsequent filter operations; the dead code removal was in server-side portal.ts only.
Recommendation: Approve and merge to dev. cc @cpfarhood
Closing stale PR — GRO-765 fix was included in PR #330. The dead code removal commit (
dcb929b) is on the feature branch and will land via the dev promotion.Deployed to groombook-dev
Images:
pr-322URL: https://dev.groombook.farh.net
Ready for UAT validation.