Move business logic out of App Router into module packages, add boundary validation scripts, and keep all routes as thin re-exports without changing URLs or API behavior. Co-authored-by: Cursor <cursoragent@cursor.com>
319 lines
12 KiB
Markdown
319 lines
12 KiB
Markdown
# TorbatYar Frontend — Refactor Risk Analysis
|
||
|
||
**Date:** 2026-07-26
|
||
**Scope:** Risk assessment for proposed architectural improvements
|
||
**Audience:** Engineering leads planning frontend refactors
|
||
|
||
---
|
||
|
||
## 1. Risk Matrix Overview
|
||
|
||
| Refactor area | Impact | Effort | Risk | Priority |
|
||
|---------------|--------|--------|------|----------|
|
||
| Fix Button type error | Low | S | 🟢 Low | P0 — immediate |
|
||
| Delete dead files | Low | S | 🟢 Low | P0 |
|
||
| Remove unused npm deps | Low | S | 🟢 Low | P0 |
|
||
| ESLint boundary rules | Medium | M | 🟢 Low | P1 |
|
||
| Unify ui/ → ds/ | Medium | M | 🟡 Medium | P1 |
|
||
| Merge beauty owner routes | Medium | M | 🟡 Medium | P1 |
|
||
| Extract portal infrastructure | High | L | 🟡 Medium | P2 |
|
||
| Split API client monoliths | High | L | 🟡 Medium | P2 |
|
||
| Extract accounting route logic | High | XL | 🔴 High | P3 |
|
||
| Add middleware.ts | Medium | M | 🟡 Medium | P3 |
|
||
| Split accounting screen aggregators | High | L | 🔴 High | P3 |
|
||
| Adopt TanStack Table | Medium | M | 🟡 Medium | P4 — defer |
|
||
| Implement Recharts analytics | Medium | L | 🟢 Low | P4 — defer |
|
||
| Extract module to separate app | Very High | XL | 🔴 Very High | Defer |
|
||
|
||
**Legend:** S = days, M = 1–2 weeks, L = 2–4 weeks, XL = 1–2 months
|
||
|
||
---
|
||
|
||
## 2. P0 — Stabilization Risks
|
||
|
||
### 2.1 Fix DS Button `loading` prop
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Change** | Add `loading?: boolean` to `ds/Button.tsx` OR replace `loading` with `disabled` + spinner in accounting |
|
||
| **Files affected** | 1–5 (grep for `loading=` on Button) |
|
||
| **Regression risk** | 🟢 Low — localized UI change |
|
||
| **Test coverage** | None — manual verify submit buttons |
|
||
| **Rollback** | Trivial |
|
||
|
||
**Recommendation:** Add `loading` prop to DS Button (matches ui/Button API). Lower risk than changing all accounting call sites.
|
||
|
||
### 2.2 Delete dead files
|
||
|
||
| File | Risk if deleted |
|
||
|------|-----------------|
|
||
| `lib/api-client.ts` | 🟢 None — zero imports |
|
||
| `lib/optional-sso.ts` | 🟢 None — zero imports |
|
||
| `lib/beauty-business-nav.ts` | 🟢 None — superseded |
|
||
| `components/HealthStatus.tsx` | 🟢 None — zero imports |
|
||
| `components/beauty/pages/mobile.tsx` | 🟢 None — zero imports |
|
||
|
||
**Caution:** Run full grep before delete — dynamic imports would not appear in static analysis.
|
||
|
||
### 2.3 Remove unused npm packages
|
||
|
||
| Package | Risk |
|
||
|---------|------|
|
||
| `@tanstack/react-table` | 🟢 Safe if zero imports confirmed |
|
||
| `recharts` | 🟡 Check if planned for current sprint |
|
||
|
||
---
|
||
|
||
## 3. P1 — Boundary & UI Unification Risks
|
||
|
||
### 3.1 ESLint cross-domain import rules
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Regression risk** | 🟢 Low — additive enforcement |
|
||
| **False positives** | Platform admin importing admin components — needs override config |
|
||
| **Migration** | Zero code changes if currently compliant |
|
||
|
||
### 3.2 Unify `components/ui/` → `components/ds/`
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Files to migrate** | ~10 |
|
||
| **Risk** | 🟡 Medium — visual regression on marketing pages |
|
||
| **Button API diff** | ui uses `variant`; ds uses CVA variants — prop mapping needed |
|
||
| **Mitigation** | Migrate one page at a time; visual QA on login/dashboard/home |
|
||
|
||
### 3.3 Merge beauty `(owner)/` and `owner/` routes
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Current state** | Two URL trees for same portal |
|
||
| **Risk** | 🟡 Medium — bookmark/URL breakage |
|
||
| **Affected URLs** | `/beauty/owner/analytics` vs `/beauty/organizations` (different trees) |
|
||
| **Mitigation** | Add redirects from old paths; merge into single `(owner)/` group |
|
||
| **SEO impact** | Low — authenticated app routes |
|
||
|
||
**Note:** These are NOT duplicate URLs — they serve different pages. The issue is organizational (two folders for one portal), not URL collision. Risk is developer confusion, not user-facing breakage.
|
||
|
||
---
|
||
|
||
## 4. P2 — Infrastructure Extraction Risks
|
||
|
||
### 4.1 Shared portal infrastructure
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Scope** | Merge 2× createPortalLayout, 2× portal shell, 2× public layout, 2× shared.tsx |
|
||
| **Regression risk** | 🟡 Medium — touches all beauty AND healthcare portals (~200 routes) |
|
||
| **Testing burden** | High — 7 beauty portals + 8 healthcare portals |
|
||
| **Mitigation** | Extract base first without changing behavior; swap one portal at a time |
|
||
| **Rollback** | Keep old files until all portals migrated |
|
||
|
||
**Highest-risk portal migrations:**
|
||
1. Healthcare patient portal (uses `useHealthcarePatientContext`)
|
||
2. Healthcare doctor portal (uses `useHealthcareDoctorContext`)
|
||
3. Beauty owner portal (split across two route trees)
|
||
|
||
### 4.2 API client decomposition
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Scope** | 3 files, ~4,600 lines, ~470 methods, 72 import sites |
|
||
| **Regression risk** | 🟡 Medium — import path changes only if barrel maintained |
|
||
| **Strategy risk** | 🟢 Low if deprecated barrels re-export everything |
|
||
| **Mitigation** | One subdomain per PR; keep `accountingApi.method()` surface stable |
|
||
|
||
**Danger:** Partial migration leaving two import paths for same method.
|
||
|
||
---
|
||
|
||
## 5. P3 — Accounting Refactor Risks
|
||
|
||
### 5.1 Extract route logic to components
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Scope** | ~130 route files, many 200–660 lines |
|
||
| **Regression risk** | 🔴 High — accounting is largest module with complex forms |
|
||
| **Business criticality** | 🔴 Very high — financial data |
|
||
| **Test coverage** | None — no frontend test suite detected |
|
||
| **Mitigation** | Extract one page at a time; start with read-only pages (reports, monitoring) |
|
||
|
||
**Safest extraction order:**
|
||
1. Monitoring pages (read-only, ~22 lines each)
|
||
2. Compliance pages (delegate to DomainScreens already)
|
||
3. Integration pages (delegate to DomainScreens already)
|
||
4. Settings pages (moderate complexity)
|
||
5. Core CRUD (chart-of-accounts, vouchers, treasury) — last
|
||
|
||
**Most dangerous extractions:**
|
||
1. `vouchers/[id]/page.tsx` (550 lines, useFieldArray, posting logic)
|
||
2. `chart-of-accounts/page.tsx` (644 lines, tree manipulation)
|
||
3. `purchase/returns/page.tsx` (417 lines, current build failure location)
|
||
|
||
### 5.2 Split screen aggregators
|
||
|
||
| File | Lines | Split risk |
|
||
|------|------:|------------|
|
||
| `BusinessDocsPage.tsx` | 1,328 | 🔴 High — many document types interleaved |
|
||
| `WorkflowScreens.tsx` | 1,132 | 🔴 High — shared state between workflows |
|
||
| `DomainScreens.tsx` | 652 | 🟡 Medium — already parameterized |
|
||
| `OperationalDocumentPage.tsx` | 996 | 🔴 High — voucher editing core |
|
||
|
||
**Recommendation:** Split DomainScreens first (lowest coupling); defer BusinessDocsPage until accounting tests exist.
|
||
|
||
### 5.3 Add middleware.ts
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Risk** | 🟡 Medium — can break auth flows if misconfigured |
|
||
| **Complexity** | Public routes (`/beauty/site/*`, `/healthcare/site/*`, `/login`) need allowlist |
|
||
| **Duplication** | Currently AuthGuard in layouts — middleware replaces client-side redirect with edge redirect |
|
||
| **Mitigation** | Start with logging-only middleware; enable redirects after validation |
|
||
|
||
---
|
||
|
||
## 6. P4 — Deferred Changes
|
||
|
||
### 6.1 Adopt TanStack Table
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Need** | Current DataTable lacks sorting, filtering, pagination |
|
||
| **Risk** | 🟡 Medium — visual/behavior change across 50+ tables |
|
||
| **Recommendation** | Defer until explicit product requirement for sortable columns |
|
||
|
||
### 6.2 Implement Recharts
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Need** | Analytics routes exist without charts |
|
||
| **Risk** | 🟢 Low — additive feature |
|
||
| **Recommendation** | Implement per-page when analytics data available |
|
||
|
||
### 6.3 Module extraction to separate Next.js app
|
||
|
||
| Factor | Assessment |
|
||
|--------|-------------|
|
||
| **Risk** | 🔴 Very High |
|
||
| **Reasons to defer** | Shared auth, tenant, theme, DS; build already monolithic; team size |
|
||
| **Trigger to revisit** | Build > 3 min, independent release cycles needed, 5+ modules |
|
||
|
||
---
|
||
|
||
## 7. Risk by Module
|
||
|
||
| Module | Refactor sensitivity | Reason |
|
||
|--------|---------------------|--------|
|
||
| **Accounting** | 🔴 Very High | Financial data, complex forms, no tests, inline route logic |
|
||
| **Healthcare patient/doctor** | 🟡 Medium | Context hooks, PHI display |
|
||
| **Beauty owner CRUD** | 🟡 Medium | Active development, form mutations |
|
||
| **Beauty/healthcare portals (display)** | 🟢 Low | Thin routes, TanStack Query |
|
||
| **Platform admin** | 🟡 Medium | Tenant management |
|
||
| **Public sites** | 🟢 Low | Mostly static display |
|
||
|
||
---
|
||
|
||
## 8. Regression Testing Gaps
|
||
|
||
| Area | Current state | Risk implication |
|
||
|------|---------------|------------------|
|
||
| Unit tests | None detected in frontend | All refactors are manual QA |
|
||
| Integration tests | None | API client splits untested |
|
||
| E2E tests | None | Portal extraction untested |
|
||
| Visual regression | None | UI unification untested |
|
||
| Type checking | Failing | Cannot catch prop mismatches in CI |
|
||
|
||
**Recommendation:** Before P3 accounting refactors, establish at minimum:
|
||
1. Green `npm run build`
|
||
2. Smoke test checklist per module (manual)
|
||
3. Consider Playwright for top 10 critical flows
|
||
|
||
---
|
||
|
||
## 9. Change Blast Radius
|
||
|
||
### Single PR safe changes (< 10 files, low risk)
|
||
|
||
- Button loading prop fix
|
||
- Dead file deletion
|
||
- Unused npm removal
|
||
- ESLint config addition
|
||
- Single accounting page extraction (read-only)
|
||
|
||
### Multi-PR required (medium risk)
|
||
|
||
- Portal infrastructure extraction
|
||
- API client splitting
|
||
- ui/ → ds/ migration
|
||
- Middleware addition
|
||
|
||
### Program-level effort (high risk — dedicated sprint)
|
||
|
||
- Full accounting route extraction
|
||
- Screen aggregator splitting
|
||
- Beauty owner route consolidation
|
||
|
||
---
|
||
|
||
## 10. Decision Framework
|
||
|
||
Before any refactor, answer:
|
||
|
||
```
|
||
1. Does it fix a build blocker or security issue?
|
||
→ YES: Do immediately (P0)
|
||
|
||
2. Does it reduce duplication without changing behavior?
|
||
→ YES: Extract with snapshot tests / manual QA (P2)
|
||
|
||
3. Does it move business logic between layers?
|
||
→ YES: One file at a time, start with read-only (P3)
|
||
|
||
4. Does it change user-visible URLs or auth flows?
|
||
→ YES: Add redirects, test all portals (P1–P3)
|
||
|
||
5. Does it introduce new abstractions?
|
||
→ YES: Wait until 3rd module needs it (Rule of Three)
|
||
```
|
||
|
||
---
|
||
|
||
## 11. Recommended Execution Order (Risk-Adjusted)
|
||
|
||
```
|
||
Week 1: P0 fixes (build green, dead code removed)
|
||
Week 2: P1 ESLint boundaries + Button unification
|
||
Week 3: P1 beauty owner organization (no URL changes)
|
||
Week 4–6: P2 portal base extraction (beauty admin first — simplest)
|
||
Week 7–8: P2 portal extraction (remaining portals, one per PR)
|
||
Week 9–12: P2 API client split (accounting vouchers first)
|
||
Week 13+: P3 accounting extraction (monitoring → settings → core CRUD)
|
||
Ongoing: P3 middleware + error boundaries
|
||
Defer: P4 table/charts, module extraction
|
||
```
|
||
|
||
---
|
||
|
||
## 12. Summary
|
||
|
||
| Category | Count |
|
||
|----------|------:|
|
||
| 🔴 High/Very High risk refactors | 4 |
|
||
| 🟡 Medium risk refactors | 7 |
|
||
| 🟢 Low risk refactors | 5 |
|
||
| Current build blockers | 1 |
|
||
| Dead files safe to delete | 5 |
|
||
| Modules with zero test coverage | All |
|
||
|
||
The codebase is **safe to maintain and extend** within existing patterns. **Large-scale refactoring** (especially accounting) carries significant regression risk without automated tests. Prioritize stabilization (P0) and boundary enforcement (P1) before structural changes (P2–P3).
|
||
|
||
---
|
||
|
||
## Related Documents
|
||
|
||
- [frontend-migration-plan.md](./frontend-migration-plan.md)
|
||
- [frontend-architecture-audit.md](./frontend-architecture-audit.md)
|
||
- [module-boundaries.md](./module-boundaries.md)
|
||
- [dependency-report.md](./dependency-report.md)
|