Skip to content

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 ​

#ScopeDone when
M1Staff auth in AdminStaff sign in at /login (no teams redirect); staff JWT accepted; PermissionContext loads permissions; ProtectedRoute path checks for staff; staff home /dashboard
M2Route guards for all rolesLayout + ProtectedRoute enforce auth/RBAC; gaps wrapped; access-denied toast
M3Single menuconfig/appMenu.js + filterAppMenu.js; RBAC path filter for all roles
M4Permission dashboardUnifiedDashboard + dashboardWidgets.js widget gates
M5Parity + cutoverLegacy redirects, cutover doc, staff/UI deprecated
M6API alias cleanupTask-list + task-history unified; legacy aliases kept; see api-consolidation.md
M7Post-migration polishRemove dead dashboard; align legacy staff task API clients; script deprecation notes
M8Cutover readinessAdmin/.env.example, smoke-unified-workspace.js, cutover env + smoke docs
M9Browser QAPlaywright unified-app-smoke.mjs, manual checklist doc
M10Go-live packSign-off doc, verify:unified-cutover, blog audit → unified Admin
M11CRM/order archive APIsShared services; canonical archive routes for Staff + Admin
M12Remark / order-note APIsShared services; Staff on canonical POST/GET; route order fix
M13Enquiry create + staff/UI retirement docPOST /leads/admin for all roles; staff-ui-retirement.md
M14Migration summaryunified-app-summary.md — index for all docs + verify commands
M15Local verify orchestrationverify-unified-local.mjs + npm run verify:unified-cutover:wait
M16End-to-end verifyFull API (7) + browser (8) green on fixed Backend + Admin dev
M17Local dev helpernpm run dev:unified:backend — Backend :5000, workers/redis off
M18Task API path mapAdmin/src/shared/tasks/api/taskApiPaths.js — documents staff vs admin URLs
M19Production build guardprebuild-admin.mjs, Admin/.env.production API URL, npm run build:admin
M20Staging verify + dev noiseverify-unified-staging.mjs, aiRateLimit IPv6 fix
M21Task API collapsetaskWorkspace.service.js; Staff on canonical /task/*; legacy aliases kept
M22staff/UI removalFolder deleted; scripts/docs cleaned; local zip archive
M23Local dev boot fixOrder/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 at Beentara-staff-ui-archive-*.zip (local)
  • Removed sync-staff-shared-frontend.js, warn-staff-ui-deprecated.mjs, staff slice from sync-rbac-catalog.js

Start here: unified-app-summary.md


M7 (polish) ​

  • Removed unused Admin/src/Components/Dashboard2/StaffDashboard.jsx (replaced by UnifiedDashboard).
  • staff/UI task list + history clients use canonical /task-list and /task-history (requires M6 backend).
  • scripts/sync-staff-shared-frontend.js marked deprecated — edit Admin/ 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 (see unified-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 checklist
  • npm run verify:unified-cutover — API + browser smokes
  • blog-ui-audit.mjs — staff probes default to ADMIN_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/UI order archive uses canonical paths.

M12 (remark / order notes) ​

  • remarkNotes.service.js, orderNoteAccess.service.js
  • Staff use same /note and /ordernote paths (assignment checks on order notes)
  • GET /note/all no longer shadowed by GET /note/:id

M13 (enquiry create + retirement) ​

  • enquiryCreate.service.js — unified POST /leads/admin (staff auto-assign)
  • EnquiryFormModal uses /leads/admin for all roles
  • docs/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 smokes
  • npm run verify:unified-cutover:wait

M1 file touch list ​

  • Backend/utils/rbacCatalog.js — /dashboard on staff path map
  • scripts/sync-rbac-catalog.js — emit staff path slices into Admin generated catalog
  • Admin/src/config/permissionMenuMap.js — staff permissionForPath
  • Admin/src/context/PermissionContext.jsx — refresh permissions (staff)
  • Admin/src/services/rbacApi.js — fetchMyPermissions
  • Admin/src/Components/Login.jsx — in-app staff login
  • Admin/src/Components/ProtectedRoute.jsx — accept staff sessions + RBAC
  • Admin/src/modules/saas/utils/session.js — isStaffLoggedIn, redirects
  • Admin/src/modules/saas/components/RootHome.jsx — staff → dashboard
  • Admin/src/App.js — stop clearing staff session on load
  • Admin/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.

Beentara — Business management made simple.