Appearance
Unified app migration (Admin + Staff)
Goal: One deployable app (Admin/) on beentara.com; role/permission controls access. staff/UI/ retired after parity.
Canonical codebase: Admin/ (superset: SaaS, portal, super-admin, AskDocs).
Backend: Already unified; permissionGuard enforces Staff RBAC. No backend change required for M1.
Milestones
| # | Scope | Done when |
|---|---|---|
| M1 | Staff auth in Admin | Staff sign in at /login (no teams redirect); staff JWT accepted; PermissionContext loads permissions; ProtectedRoute path checks for staff; staff home /dashboard |
| M2 | Route guards for all roles | Layout + ProtectedRoute enforce auth/RBAC; gaps wrapped; access-denied toast |
| M3 | Single menu | config/appMenu.js + filterAppMenu.js; RBAC path filter for all roles |
| M4 | Permission dashboard | UnifiedDashboard + dashboardWidgets.js widget gates |
| M5 | Parity + cutover | Legacy redirects, cutover doc, staff/UI deprecated |
| M6 | API alias cleanup | Task-list + task-history unified; legacy aliases kept; see api-consolidation.md |
| M7 | Post-migration polish | Remove dead dashboard; align legacy staff task API clients; script deprecation notes |
| M8 | Cutover readiness | Admin/.env.example, smoke-unified-workspace.js, cutover env + smoke docs |
| M9 | Browser QA | Playwright unified-app-smoke.mjs, manual checklist doc |
| M10 | Go-live pack | Sign-off doc, verify:unified-cutover, blog audit → unified Admin |
| M11 | CRM/order archive APIs | Shared services; canonical archive routes for Staff + Admin |
| M12 | Remark / order-note APIs | Shared services; Staff on canonical POST/GET; route order fix |
| M13 | Enquiry create + staff/UI retirement doc | POST /leads/admin for all roles; staff-ui-retirement.md |
| M14 | Migration summary | unified-app-summary.md — index for all docs + verify commands |
| M15 | Local verify orchestration | verify-unified-local.mjs + npm run verify:unified-cutover:wait |
| M16 | End-to-end verify | Full API (7) + browser (8) green on fixed Backend + Admin dev |
| M17 | Local dev helper | npm run dev:unified:backend — Backend :5000, workers/redis off |
| M18 | Task API path map | Admin/src/shared/tasks/api/taskApiPaths.js — documents staff vs admin URLs |
| M19 | Production build guard | prebuild-admin.mjs, Admin/.env.production API URL, npm run build:admin |
| M20 | Staging verify + dev noise | verify-unified-staging.mjs, aiRateLimit IPv6 fix |
| M21 | Task API collapse | taskWorkspace.service.js; Staff on canonical /task/*; legacy aliases kept |
| M22 | staff/UI removal | Folder deleted; scripts/docs cleaned; local zip archive |
| M23 | Local dev boot fix | Order/provisioning queues stub when DISABLE_REDIS=1; verify green |
Post-M21 (optional backlog, not scheduled)
- Remove legacy API aliases when traffic is zero
M22 (staff/UI removal)
- Deleted
staff/UI/from repo; archive atBeentara-staff-ui-archive-*.zip(local) - Removed
sync-staff-shared-frontend.js,warn-staff-ui-deprecated.mjs, staff slice fromsync-rbac-catalog.js
Start here: unified-app-summary.md
M7 (polish)
- Removed unused
Admin/src/Components/Dashboard2/StaffDashboard.jsx(replaced byUnifiedDashboard). staff/UItask list + history clients use canonical/task-listand/task-history(requires M6 backend).scripts/sync-staff-shared-frontend.jsmarked deprecated — editAdmin/only for new features.
M8 (cutover readiness)
Admin/.env.example— build-time env for unified deploy.npm run smoke:unified-workspace— post-deploy API checks (seeunified-app-cutover.md§0).
M9 (browser QA)
qa-tests/unified-app-smoke.mjs+npm run unified-app:smoke- Manual checklist:
docs/architecture/unified-app-browser-qa.md
M10 (go-live)
docs/architecture/unified-app-go-live.md— sign-off checklistnpm run verify:unified-cutover— API + browser smokesblog-ui-audit.mjs— staff probes default toADMIN_URL(not:3001)
M11 (CRM / order archive)
enquiryArchive.service.js—/leads/archive-inquiries+ unarchive (tenant from JWT).orderArchive.service.js—/payment/archive-order+ unarchive (staff = assigned orders only).- Legacy staff URL aliases retained;
staff/UIorder archive uses canonical paths.
M12 (remark / order notes)
remarkNotes.service.js,orderNoteAccess.service.js- Staff use same
/noteand/ordernotepaths (assignment checks on order notes) GET /note/allno longer shadowed byGET /note/:id
M13 (enquiry create + retirement)
enquiryCreate.service.js— unifiedPOST /leads/admin(staff auto-assign)EnquiryFormModaluses/leads/adminfor all rolesdocs/architecture/staff-ui-retirement.md— decommission checklist
M14 (summary)
docs/architecture/unified-app-summary.md— single entry point for migration status, doc map, verify commands
M15 (local verify)
scripts/verify-unified-local.mjs— poll/healthz, then API + browser smokesnpm run verify:unified-cutover:wait
M1 file touch list
Backend/utils/rbacCatalog.js—/dashboardon staff path mapscripts/sync-rbac-catalog.js— emit staff path slices into Admin generated catalogAdmin/src/config/permissionMenuMap.js— staffpermissionForPathAdmin/src/context/PermissionContext.jsx— refresh permissions (staff)Admin/src/services/rbacApi.js—fetchMyPermissionsAdmin/src/Components/Login.jsx— in-app staff loginAdmin/src/Components/ProtectedRoute.jsx— accept staff sessions + RBACAdmin/src/modules/saas/utils/session.js—isStaffLoggedIn, redirectsAdmin/src/modules/saas/components/RootHome.jsx— staff → dashboardAdmin/src/App.js— stop clearing staff session on loadAdmin/src/Components/AdminOnlyRoute.jsx— staff portal session check
Rollback
Keep staff/UI deployable until M5 sign-off. M1-only rollback: revert Admin login/session commits; staff portal unchanged.