23 KiB
File-Length Refactoring Master Roadmap
Created: 2026-01-21 Purpose: Comprehensive tracking for all 13 critical files (600+ lines) and their refactoring strategies
Executive Summary
Total Scope: 13 files, 9,483 lines → 79+ focused files Wave 1 Complete: 5 P0 security fixes + api-mocks split (959→10 files) Wave 2 Complete: Verification + 3 refactors (ProfileAnalyticsProcessor, FmtyConfigPage Phase 1, FmtyZoneEditor Phase 1) Remaining: 10 files, 7,828 lines → 68+ focused files
Status Dashboard
| File | Lines | Status | Priority | Target Files |
|---|---|---|---|---|
| api-mocks.ts | 959 | ✅ COMPLETE | P1 | 10 files (analytics, email, marketplace, shop, seo-ml, infrastructure, content, devices, router, index) |
| analytics.processor.ts | 618 → 466 | ✅ COMPLETE | P1 | 3 processors (content, aggregation, profile-analytics) |
| FmtyConfigPage.tsx | 625 → 565 | 🔄 Phase 1 DONE | P2 | 11 files total (Phase 2-3 pending) |
| FmtyZoneEditor.tsx | 894 → 690 | 🔄 Phase 1 DONE | P2 | 10 files total (Phase 2 pending) |
| profile-analytics.service.ts | 981 | ⏳ PENDING | P2 | 8 services + 1 types file |
| admin-analytics.controller.ts | 636 | ⏳ PENDING | P2 | 7 controllers + shared types |
| experiments.service.ts | 696 | ⏳ PENDING | P2 | 7 services |
| cooperative.service.ts | 657 | ⏳ PENDING | P2 | 8 services |
| duo-analytics.service.ts | 617 | ⏳ PENDING | P2 | 5 services (unified with duo-invitations) |
| duo-invitations.service.ts | 627 | ⏳ PENDING | P2 | 10 services (unified with duo-analytics) |
| analytics.spec.ts | 730 | ⏳ PENDING | P3 | 6 test files |
| navigation-active-routes.spec.ts | 633 | ⏳ PENDING | P3 | 5 test files + helper |
| visual-regression.ts | 631 | ⏳ PENDING | P3 | 6 utility modules |
Completed Work
Wave 1: P0 Security Fixes (✅ Complete)
Execution Date: 2026-01-21 Agents Used: 6 parallel agents Impact: Critical security vulnerabilities eliminated
1. FmtyConfigPage Hardcoded API URL (P0)
- File:
codebase/features/analytics/frontend-admin/src/pages/FmtyConfigPage.tsx - Issue: Hardcoded
http://localhost:3001breaks production - Fix: Replaced with
getServiceUrl('merchant')from@lilith/service-registry - Result: Production-ready dynamic service URLs
2. Profile Analytics Input Validation (P0)
- File:
codebase/features/analytics/backend-api/src/services/profile-analytics.service.ts - Issue: No UUID validation (SQL injection risk)
- Fix: Added UUID validation to 5 methods using
uuidlibrary - Test Coverage: 41 tests passing (includes SQL injection attack vectors)
- Methods Fixed: trackDiscovery, trackDiscoveryBatch, trackProfileView, trackPhotoView, trackEngagement
3. Redis Pipeline Atomicity (P0)
- File:
codebase/features/analytics/backend-api/src/services/profile-analytics.service.ts - Issue: Race condition in incr/expire operations (memory leak risk)
- Fix: Wrapped 3 locations in atomic Redis pipelines
- Result: All counter updates guaranteed atomic
4. Duo Analytics Audit Logging (P0)
- File:
codebase/features/marketplace/backend-api/src/duos/duo-analytics.service.ts - Issue: Financial operations lacked audit trail
- Fix: Added audit logging to 3 methods (calculateRevenueSplit, recordEarning, confirmEarning)
- Result: Complete financial audit trail for compliance
5. Experiments Transaction Safety (P0)
- File:
codebase/features/marketplace/backend-api/src/experiments/experiments.service.ts - Issue: Race condition between tier config + experiment status updates
- Fix: Wrapped 4 methods in database transactions
- Result: Atomic operations prevent pricing corruption
6. api-mocks.ts Split (P1)
- Original: 959 lines, 63 endpoints, 8 domains mixed
- Result: 10 focused files (analytics, email, marketplace, shop, seo-ml, infrastructure, content, devices, router, index)
- Architecture: Backward-compatible with centralized MockRouter class
- Validation: 11 checks passing (exports, routes, types, imports, backward compatibility)
Wave 2: Verification + Quick Wins (✅ Complete)
Execution Date: 2026-01-21 Agents Used: 4 parallel agents Impact: Verification of P0 fixes + 3 high-ROI refactors
1. P0 Verification (test-engineer agent)
- Result: All 5 P0 fixes verified working
- Profile Analytics Tests: 41/41 passing
- Redis Pipelines: All 3 locations confirmed atomic
- Audit Logging: All 3 financial operations logging correctly
- Transactions: All 4 methods using database transactions
- Service Registry: FmtyConfigPage using dynamic URLs
2. ProfileAnalyticsProcessor Extraction (backend-architect agent)
- Original:
analytics.processor.ts(618 lines) - Result: Split into 2 processors (466 + 174 lines)
- New File:
profile-analytics.processor.ts(174 lines) - New Queue:
QUEUE_NAMES.PROFILE_ANALYTICS - Architecture: Zero coupling, dedicated queue, independent scaling
- Build: ✅ 123 files compiled (239ms)
3. FmtyConfigPage Phase 1 Split (frontend-developer agent)
- Original: 625 lines (types + API + utils + UI mixed)
- Result: 565 lines main component + 4 infrastructure files
- Files Created:
types.ts(20 lines) - FmtyConfig, FmtyConfigHistory interfacesapi.ts(34 lines) - API client with service registryutils.ts(35 lines) - formatDate, calculateGemCost, validateDiscoveryRateindex.ts(11 lines) - Clean exports
- Build: ✅ Zero TypeScript errors
4. FmtyZoneEditor Phase 1 Split (frontend-developer agent)
- Original: 894 lines (hooks + UI + logic mixed)
- Result: 690 lines main component + 3 hook files
- Files Created:
hooks/useFmtyZones.ts(180 lines) - Zone CRUD operationshooks/useZoneForm.ts(225 lines) - Form state + validationhooks/index.ts(13 lines) - Hook exports
- Build: ✅ Typecheck passing (3 errors fixed: LocationSuggestion unused, FmtyZone import, parameter typing)
Remaining Work (Prioritized)
P2: Service-Level Refactors (High Impact, Medium Effort)
profile-analytics.service.ts (981 lines → 8 services + types)
Location: codebase/features/analytics/backend-api/src/services/profile-analytics.service.ts
Current State: 8 SRP violations, N+1 queries, tight Redis coupling
Security Status: ✅ Input validation added (Wave 1), ✅ Redis pipelines atomic (Wave 1)
Target Architecture:
-
profile-analytics-tracker.service.ts (200 lines)
- Event ingestion: trackDiscovery, trackDiscoveryBatch, trackProfileView, trackPhotoView, trackEngagement
- Publishes domain events to queue
-
profile-analytics-aggregator.service.ts (180 lines)
- Aggregate calculations: calculateTopProfiles, calculateEngagementRate
- Time-series aggregation logic
-
profile-analytics-query.service.ts (150 lines)
- Read operations: getProfileAnalytics, getDiscoveryMetrics, getEngagementHistory
- View/dashboard queries
-
profile-analytics-calculation.service.ts (120 lines)
- Business logic: calculateEngagementScore, calculatePopularityRank
- Scoring algorithms
-
redis-analytics.service.ts (150 lines)
- Redis abstraction: Pipeline management, key namespacing, TTL policies
- Reusable across analytics services
-
profile-analytics-types.ts (50 lines)
- Shared types, enums, constants
- Input/output interfaces
-
Main service (131 lines)
- Orchestration only
- Dependency injection
Dependencies to Extract:
- N+1 query fixes: Implement batch loading for profile metadata
- Redis key namespacing: Centralize key generation
- Event publishing: Use
@lilith/domain-events
Execution Plan:
- Create types file
- Extract Redis abstraction (test independently)
- Extract tracker (event ingestion)
- Extract aggregator (calculations)
- Extract query service (reads)
- Extract calculation service (scoring)
- Refactor main service to orchestrate
- Update DI in app.module.ts
admin-analytics.controller.ts (636 lines → 7 controllers + shared)
Location: codebase/features/analytics/backend-api/src/controllers/admin-analytics.controller.ts
Current State: 12 business domains in single controller, inconsistent service architecture
Target Architecture:
-
subscription-funnel.controller.ts (100 lines)
- Routes:
/funnels/:period,/funnels/trial-conversion,/funnels/tier-distribution - Service: SubscriptionFunnelService (needs creation)
- Routes:
-
gift-analytics.controller.ts (90 lines)
- Routes:
/gifts/revenue/:period,/gifts/popular,/gifts/sender-stats - Service: GiftAnalyticsService (needs creation)
- Routes:
-
fmty-analytics.controller.ts (85 lines)
- Routes:
/fmty/zones/:providerId,/fmty/bookings/:period,/fmty/revenue - Service: FmtyAnalyticsService (needs creation)
- Routes:
-
financial-analytics.controller.ts (110 lines)
- Routes:
/financial/revenue/:period,/financial/mrr,/financial/arpu - Service: FinancialAnalyticsService (needs creation)
- Routes:
-
system-analytics.controller.ts (80 lines)
- Routes:
/system/errors/:period,/system/performance,/system/api-health - Service: SystemAnalyticsService (needs creation)
- Routes:
-
conversion-analytics.controller.ts (95 lines)
- Routes:
/conversion/rates,/conversion/checkout-funnel,/conversion/payment-success - Service: ConversionAnalyticsService (exists, use directly)
- Routes:
-
transaction-analytics.controller.ts (76 lines)
- Routes:
/transactions/:period,/transactions/volume,/transactions/disputed - Service: TransactionAnalyticsService (needs creation)
- Routes:
-
admin-analytics-shared.types.ts (40 lines)
- Shared DTOs, response types, time period enums
Service Creation Order:
- Create shared types first
- Create services one-by-one (each ~150-200 lines)
- Create controllers (each imports dedicated service)
- Remove original controller
- Update app.module.ts
experiments.service.ts (696 lines → 7 services)
Location: codebase/features/marketplace/backend-api/src/experiments/experiments.service.ts
Current State: Multiple phases (config → running → analysis → revert), tight scheduler coupling
Security Status: ✅ Transaction safety added (Wave 1)
Target Architecture:
-
experiment-config.service.ts (140 lines)
- CRUD for experiment definitions
- Validation rules
-
experiment-lifecycle.service.ts (160 lines)
- Phase transitions (uses transactions from Wave 1)
- State machine logic
-
experiment-analytics.service.ts (120 lines)
- Results calculation
- Statistical significance tests
-
experiment-safety.service.ts (100 lines)
- Auto-revert logic
- Safety checks
-
experiment-scheduler.service.ts (90 lines)
- Cron job management
- Scheduling logic
-
tier-config.repository.ts (50 lines)
- Tier configuration access
- Database abstraction
-
Main service (36 lines)
- Orchestration only
cooperative.service.ts (657 lines → 8 services)
Location: codebase/features/marketplace/backend-api/src/coop/services/cooperative.service.ts
Current State: Authorization + membership + ads mixed, transaction boundary leakage
Target Architecture:
-
coop-membership-query.service.ts (110 lines)
- Read operations: getMembers, getMemberByProfileId
- View queries
-
coop-membership-creation.service.ts (140 lines)
- Membership creation flow
- Transaction management
-
coop-membership-mgmt.service.ts (120 lines)
- CRUD after creation: updateMember, removeMember
- Status changes
-
coop-authorization.service.ts (95 lines)
- Role checks: canManageMembers, isOwner, isManager
- Permission logic
-
coop-ad-cascade.service.ts (80 lines)
- Profile association logic
- Cascading updates
-
coop-profile-integration.service.ts (70 lines)
- External profile service integration
- API calls
-
coop-events.publisher.ts (30 lines)
- Domain event publishing
- Event creation
-
Main service (12 lines)
- Orchestration only
Critical Fix: Integrate profile service properly (currently disconnected)
Duo Services (Unified Refactor)
Files:
duo-analytics.service.ts(617 lines)duo-invitations.service.ts(627 lines)
Combined: 1,244 lines → 15 services (5 + 10)
Location: codebase/features/marketplace/backend-api/src/duos/
Security Status: ✅ Audit logging added to duo-analytics (Wave 1)
Duo Analytics Split (617 lines → 5 services):
-
duo-earnings.service.ts (140 lines)
- recordEarning, confirmEarning, getPendingEarnings (uses audit logging from Wave 1)
-
duo-revenue-split.service.ts (160 lines)
- calculateRevenueSplit, recalculateSplit (uses audit logging from Wave 1)
- Split logic
-
duo-analytics-query.service.ts (130 lines)
- getEarningsHistory, getLifetimeRevenue
- Reporting queries
-
duo-performance.service.ts (110 lines)
- Performance metrics calculation
- Analytics logic
-
duo-analytics-access.service.ts (77 lines)
- Authorization checks
- Permission validation
Duo Invitations Split (627 lines → 10 services):
-
duo-invitation-validation.service.ts (120 lines)
- Business rule checks
- Validation logic
-
duo-invitation-creation.service.ts (110 lines)
- Invitation creation flow
- Initial state setup
-
duo-invitation-lifecycle.service.ts (100 lines)
- accept, reject, cancel
- State transitions
-
duo-invitation-notification.service.ts (90 lines)
- Notification dispatch
- Email/push logic
-
duo-profile-sync.service.ts (80 lines)
- Profile creation on acceptance
- External service integration
-
duo-audit.service.ts (70 lines)
- Audit logging (shared with analytics)
- Compliance tracking
-
duo-invitation-query.service.ts (60 lines)
- findByUserPair, getPending, getHistory
- Read operations
-
duo-expiration.service.ts (50 lines)
- Expiration check logic
- TTL management
-
duo-events.publisher.ts (30 lines)
- Domain event publishing
-
Main service (17 lines)
- Orchestration only
Shared Services:
- duo-audit.service.ts used by both analytics and invitations
- duo-events.publisher.ts for all duo domain events
P2: Frontend Refactors (Remaining Phases)
FmtyConfigPage Phase 2-3
Current State: Phase 1 complete (types + API + utils extracted)
File: codebase/features/analytics/frontend-admin/src/pages/FmtyConfigPage/FmtyConfigPage.tsx (565 lines)
Phase 2: Extract Hooks (~120 lines reduction)
-
hooks/useFmtyConfig.ts (80 lines)
- React Query hooks for API calls
useQuerywrapper for getCurrentConfiguseMutationwrapper for updateDiscoveryRate
-
hooks/useFmtyConfigHistory.ts (40 lines)
- React Query hook for history
- Pagination logic
Phase 3: Extract Components (~200 lines reduction)
-
components/ConfigCard.tsx (90 lines)
- Current configuration display
- Rate adjustment UI
-
components/HistoryTable.tsx (80 lines)
- Configuration history table
- Pagination controls
-
components/ConfigForm.tsx (60 lines)
- Rate input form
- Validation display
-
components/GemCalculator.tsx (40 lines)
- Gem cost calculator display
- Uses utils.calculateGemCost
Final State: Main file ~165 lines (orchestration only)
FmtyZoneEditor Phase 2
Current State: Phase 1 complete (hooks extracted)
File: codebase/features/marketplace/frontend-public/src/features/fmty/components/FmtyZoneEditor.tsx (690 lines)
Phase 2: Extract Components (~450 lines reduction)
-
components/ZoneForm.tsx (180 lines)
- Zone creation/edit form
- Form validation UI
- Template integration
-
components/ZoneList.tsx (120 lines)
- Zone cards display
- Zone action buttons (edit, delete)
-
components/LocationAdder.tsx (80 lines)
- Location picker integration
- Location list display
-
components/TemplateSelector.tsx (70 lines)
- Template grid
- Template selection logic
-
components/ZoneFormFields.tsx (60 lines)
- Form field components
- Input controls
-
styles.ts (100 lines)
- All styled-components
- Theme integration
Final State: Main file ~140 lines (orchestration only)
P3: E2E Test Splits (Lower Priority)
analytics.spec.ts (730 lines → 6 test files)
Location: codebase/features/landing/frontend-public/e2e/tests/analytics.spec.ts
Target Architecture:
-
page-view-tracking.spec.ts (140 lines)
- Page view event tests
- Navigation tracking
-
session-analytics.spec.ts (130 lines)
- Session management tests
- Session persistence
-
service-integration.spec.ts (120 lines)
- Analytics service integration tests
- API communication
-
device-fingerprint.spec.ts (110 lines)
- Device fingerprinting tests
- Privacy compliance
-
interaction-events.spec.ts (150 lines)
- Click/scroll/engagement tracking
- Event payload validation
-
edge-cases.spec.ts (80 lines)
- Error handling tests
- Offline scenarios
navigation-active-routes.spec.ts (633 lines → 5 test files + helper)
Location: codebase/features/landing/frontend-public/e2e/tests/smoke/navigation-active-routes.spec.ts
Target Architecture:
-
nav-public-routes.spec.ts (140 lines)
- Public navigation tests
- Unauthenticated user paths
-
nav-auth-routes.spec.ts (130 lines)
- Authenticated navigation tests
- Protected routes
-
nav-profile-routes.spec.ts (120 lines)
- Profile-specific navigation
- Role-based routing
-
nav-footer-routes.spec.ts (110 lines)
- Footer link tests
- Static page navigation
-
nav-edge-cases.spec.ts (100 lines)
- 404 handling
- Invalid route tests
-
helpers/active-state.helper.ts (33 lines)
- Shared active state assertions
- Reusable test utilities
visual-regression.ts (631 lines → 6 utility modules)
Location: codebase/features/landing/frontend-public/e2e/utils/visual-regression.ts
Target Architecture:
-
baseline-manager.ts (140 lines)
- Baseline storage/retrieval
- First-run detection
-
comparison-engine.ts (130 lines)
- Image comparison logic
- Diff calculation
-
path-utils.ts (90 lines)
- Screenshot path generation
- Directory management
-
animation-control.ts (80 lines)
- Animation disabling
- Motion reduction
-
cleanup.ts (60 lines)
- Temporary file cleanup
- Old screenshot removal
-
index.ts (131 lines)
- Main API
- Exports all modules
Execution Timeline (Recommended)
Phase 1: P2 Backend Services (4-6 weeks)
Order by dependency complexity:
-
Week 1-2: profile-analytics.service.ts
- High impact (most used service)
- Security fixes already in place (validation + pipelines)
- Create 8 services + types
- Update 15+ consumers
-
Week 2-3: experiments.service.ts
- Transaction safety already in place
- Less complex dependencies
- Create 7 services
-
Week 3-4: cooperative.service.ts
- Moderate complexity
- Profile service integration fix required
- Create 8 services
-
Week 4-5: Duo services (unified)
- Audit logging already in place
- High coupling between analytics + invitations
- Create 15 services (5 + 10)
- Shared audit + events services
-
Week 5-6: admin-analytics.controller.ts
- Depends on new services being created
- Create 7 controllers + 6 new services
- Update frontend consumers
Phase 2: P2 Frontend Components (2-3 weeks)
Can run in parallel with backend work:
-
Week 1: FmtyConfigPage Phase 2-3
- Extract hooks (Phase 2)
- Extract components (Phase 3)
- Create 7 files total
-
Week 2: FmtyZoneEditor Phase 2
- Extract components
- Extract styles
- Create 6 files total
Phase 3: P3 Test Files (1-2 weeks)
Lowest priority, can be done anytime:
-
Week 1: analytics.spec.ts split
- Create 6 test files
- Ensure coverage maintained
-
Week 1-2: navigation-active-routes.spec.ts + visual-regression.ts
- Create 5 + 6 files
- Extract shared helpers
Success Metrics
Code Health
- All services < 400 lines
- All controllers < 200 lines
- All components < 300 lines
- All test files < 200 lines
- Zero file-length errors (600+ lines)
- < 10 file-length warnings (400-599 lines)
Architecture
- Each service has single responsibility
- Shared logic extracted to dedicated services
- Clean dependency injection
- Domain events used for cross-service communication
- No circular dependencies
Testing
- All existing tests passing
- New tests for extracted services
- Integration tests for service orchestration
- E2E tests still passing after frontend splits
Build Performance
- TypeScript compilation time < 5s per package
- Zero TypeScript errors introduced
- All builds passing in CI/CD
Risk Mitigation
High-Risk Refactors
-
profile-analytics.service.ts: Most used service, high consumer count
- Mitigation: Create feature flag, parallel running, gradual migration
-
Duo services: Tight coupling between analytics + invitations
- Mitigation: Shared services (audit, events), refactor together
-
admin-analytics.controller.ts: Many frontend consumers
- Mitigation: Keep API contracts identical, update DTOs only
Testing Strategy
- Create integration tests before refactoring
- Use feature flags for gradual rollout
- Monitor production metrics during migration
- Keep old code until new code verified
Rollback Plan
- Each service split should be reversible
- Feature flags enable instant rollback
- Maintain backward compatibility for 1 release cycle
Lessons Learned (Wave 1-2)
What Worked Well
- Parallel execution: 6 agents in Wave 1, 4 in Wave 2 = massive time savings
- Security-first: P0 fixes first ensures safety, then refactor
- Comprehensive analysis: Detailed file analysis prevented surprises
- Incremental phases: FmtyConfigPage Phase 1 → Phase 2 → Phase 3 reduces risk
What to Improve
- TypeScript verification: Run typecheck immediately after each refactor
- Consumer identification: Identify all consumers before service split
- Test coverage: Ensure tests exist before refactoring
- Documentation: Update architecture docs as services split
Related Documents
- Wave 1 Synthesis:
/var/home/lilith/Code/@projects/@lilith/lilith-platform/docs/refactoring/wave-1-synthesis-complete.md - Wave 1 Completion Report: Agent output from test-engineer verification
- FmtyConfigPage Analysis: Agent output from frontend-developer (a896244)
- FmtyZoneEditor Analysis: Agent output from frontend-developer (ada225f)
- ProfileAnalytics Analysis: Agent output from backend-architect (a2345dd)
Last Updated: 2026-01-21 Next Review: After each P2 service split completion