Promote uat → main (PROD): GRO-2359 OOBE portal-creation routing (web) #79
Open
Flea Flicker
wants to merge 1 commits from
flea/uat-to-main-gro-2359-web into main
pull from: flea/uat-to-main-gro-2359-web
merge into: groombook:main
groombook:main
groombook:uat
groombook:promote/GRO-2373-dev-to-uat
groombook:dev
groombook:feature/gro-2373-chrome-signout
groombook:promote/GRO-2358-dev-to-uat
groombook:release/main-GRO-2319-web
groombook:promote/GRO-2319-web-to-uat
groombook:feat/GRO-2319-live-statusbadge-palette
groombook:flea/uat-to-main-gro-2160
groombook:promote/GRO-2160-dev-to-uat
groombook:flea/uat-to-main-gro-2159
groombook:promote/GRO-2159-dev-to-uat
groombook:feat/GRO-2159-route-drag-reorder
groombook:flea/uat-to-main-gro-2158
groombook:flea/dev-to-uat-gro-2158
groombook:feat/GRO-2158-route-planner
groombook:flea/dev-to-uat-gro-2236
groombook:flea/gro-2236-portal-service-cards
groombook:flea/uat-to-main-gro-2234-web
groombook:flea/promote-uat-gro-2234
groombook:flea-flicker/gro-2234-portal-waitlist-remint-on-401
groombook:fix/gro-2207-portal-pet-readview-fields
groombook:flea/gro-2218-playbook-512e
groombook:flea/gro-2213-portal-preferredtime
groombook:flea/gro-2180-appointments-starttime-shape
groombook:fix/gro-2094-react-blank-mount
groombook:flea/gro-2099-fix-authed-portal-nav
groombook:flea/gro-2089-fix-authentik-credential-source
groombook:flea/gro-2012-portal-sessionid-fallback
groombook:flea/gro-2011-login-blank
groombook:gro-1867-portal-better-auth
groombook:gro-1829-swpwa-fix
groombook:ccfa5281-2076-40c2-87a9-bf2dbcf98d22/gro-1822-role-based-redirect
groombook:fix/gro-1822-role-based-redirect
groombook:feature/gro-1165e-booking-status-badge
groombook:feature/gro-1165d-booking-analytics
groombook:feature/gro-1165b-error-recovery
groombook:flea-flicker/pet-profile-editor
groombook:fix/gro-1757-uat-playbook
groombook:fix/gro-1633-web-ci-buildx
groombook:promote-uat-gro1592
groombook:fix/gro-1592-sso-session-cookie
groombook:pr-13
groombook:fix/gro-1414-pet-size-enum
groombook:pr-1
groombook:fix/ci-registry-auth
groombook:fix/GRO-1289-uat-playbook-web
groombook:add-renovate-config
groombook:docs/GRO-1099-uat-playbook-web
No Reviewers
Labels
Clear labels
bug
documentation
duplicate
enhancement
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
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
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: groombook/web#79
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 "flea/uat-to-main-gro-2359-web"
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?
Promote uat → main (PROD): GRO-2359 — OOBE portal-creation routing (web)
Carries the deployed + UAT-validated GRO-2359 P2 web commit
(
2069b133, frozen onmainbase661bd4f9) to main (PROD).What's in this PR
2069b133Diff scope (5 files, 699+/36-)
src/App.tsx— new/onboardingdeep-link routesrc/portal/CustomerPortal.tsx— SSO-bridge 404 mounts OOBE inline; deleted-portal path still reaches no-access screen with sharedsignOut()src/portal/OOBE.tsx— new OOBE component (auth-gated, shared signOut, name prefilled from session, 409/network-error handling)src/__tests__/portal.test.tsx— OOBE render + 201/409 + signOut pathsUAT_PLAYBOOK.md— TC-WEB-7.* OOBE acceptanceSDLC gates already passed
web:2026.06.11-a7f2e2e+api:2026.06.11-a629331)d5d598f3comment with full findings + LOW notesP1 pre-requisite satisfied
661bd4f9) — the no-access screen has a workingsignOut()(sharedlib/auth-client.ts).No-access screen preserved
?noAccess=deleted-portal) still renders the no-access screen — P2 only removes the new-user path to that screen, not all paths to it.signOut()works there.Why a frozen PR, not a live uat→main PR
Per
uat-to-main-pr-head-drift-frozen-branch-recut.md(GRO-2244 #185):a7f2e2e6is the GRO-2359 uat tip, then the GRO-2373 dev→uat followed it).2069b133(1 commit ahead ofmain661bd4f9) keeps the PR to exactly the GRO-2359 files.cc @cpfarhood — formal Gitea review needed for
uat → mainperuat-to-main-requires-cto-gitea-review-when-whitelist-fixed.md.Refs GRO-2359 / GRO-2357 / GRO-2355.
The post-auth handler in CustomerPortal previously rendered the "Portal access not configured" card when the SSO bridge returned 404 (no client row for the user's email). That trapped first-time SSO users on a dead-end screen with no path to portal creation. This change routes the 404 to a new OOBE component (src/portal/OOBE.tsx) that drives portal creation: * Mounts inline inside CustomerPortal so the post-auth flow stays inside the portal render tree (no App-level router needed). * Also reachable as a direct deep-link via the new /onboarding route in App.tsx (for grooming admins or recovery flows). * Submits to a new POST /api/portal/clients-from-auth endpoint in groombook-api (companion commit) that creates a fresh client row bound to the Better Auth email. 409 means the email already has a portal record — the OOBE shows a portal-selection message. * Uses the canonical shared signOut() from lib/auth-client (GRO-2358 invariant) for the Sign out button. * Full window.location.href reload on submit success to reset the bridge's cached state and land the user in their portal. The no-access card itself is preserved for the deep-link deleted-portal case (a customer whose portal was disabled/deleted), signalled via ?noAccess=deleted-portal on a portal sub-route. The OOBE handles the first-time-creation case; the no-access card handles the "had a portal but lost it" case. Test coverage: * "routes to /onboarding when session-from-auth returns 404 (GRO-2359)" — proves the post-auth 404 mounts the OOBE inline, not the legacy no-access card. * 6 new OOBE tests: render from direct link, name prefill, form submission, 409 portal-selection, required-name validation, shared signOut(), redirect on no-session. * P1 no-access tests reworked to use ?noAccess=deleted-portal so the GRO-2358 signOut invariant is still verified on the only surviving path to the no-access card. UAT_PLAYBOOK §5.25.5–6e rewritten to cover the OOBE flow (form submit, 409, deep-link mount, deleted-portal no-access card). Paired with the api PR on feature/2357-p2-portal-clients-from-auth. Co-Authored-By: Paperclip <noreply@paperclip.ing> (cherry picked from commit250c7a5ac9)View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.