Refactoring Plan
SmartCrew Admin - Refactoring Plan
SmartCrew Admin Refactoring Plan
Overview
This document outlines a comprehensive refactoring plan for the SmartCrew Admin Flutter application to implement the Repository pattern, optimize services, and consolidate adapters while maintaining all existing functionality.
Current Architecture Analysis
Network Providers (lib/providers/network_data_providers/)
- NetworkDataProvider: Central singleton mixing 15+ domain-specific providers
- Provider Mixins: UsersProvider, ProjectProvider, EquipmentProvider, etc.
- Responsibilities: Firestore CRUD operations, data fetching, local caching, model conversions
- Issues: Complex querying logic mixed with data source operations
Services (lib/services/)
- 45 service files across domains: labor, equipment, project, material, etc.
- Duplicate Logic: Multiple services performing similar calculations (time services, log services)
- Performance Issues: Multiple iterations over same datasets, inefficient data structures
- Examples of Duplication:
- LaborOnsiteLogService vs LaborTravelingLogService (almost identical except filter criteria)
- Multiple time calculation services with similar patterns
Adapters (lib/util/adapter/)
- 17 adapter files for model transformations
- Simple Transformation Logic: Converting domain models to UI models
- Minimal Duplication: Most adapters are domain-specific
Refactoring Strategy
Phase 1: Repository Pattern Implementation
1.1 Create Base Repository Infrastructure
- File:
lib/repositories/base_repository.dart - Purpose: Define common interface and caching functionality
- Features:
- Generic CRUD operations
- Query building capabilities
- Efficient caching with SplayTreeSet and HashMap
- Pattern matching and filtering
1.2 Domain-Specific Repositories
Create repositories for each domain with specialized query methods:
UsersRepository (lib/repositories/users_repository.dart)
- User lookup by ID, phone, role
- Log aggregation and filtering
- Task status updates with optimized queries
ProjectRepository (lib/repositories/project_repository.dart)
- Project queries by name, status, customer
- Field notes aggregation
- Project-specific filtering
EquipmentRepository (lib/repositories/equipment_repository.dart)
- Equipment queries by type, status, availability
- Service record aggregation
- Usage tracking queries
MaterialsRepository (lib/repositories/materials_repository.dart)
- Material queries by vendor, project, type
- Inventory tracking
- Order management queries
CustomersRepository (lib/repositories/customers_repository.dart)
- Customer search and filtering
- Project association queries
VendorsRepository (lib/repositories/vendors_repository.dart)
- Vendor search and filtering
- Material and service associations
ActivityRepository (lib/repositories/activity_repository.dart)
- Activity queries by date, user, project
- Log aggregation and filtering
Phase 2: Provider Refactoring
2.1 Update Provider Mixins
- Maintain existing public APIs
- Delegate complex queries to repositories
- Keep Firestore operations and model conversions
- Use repositories for caching and filtering
Example transformation for UsersProvider:
// Before: Direct SplayTreeSet operations
List<AppUser> getUserSuggestions(String pattern) {
return _users.where((user) =>
user.toString().toLowerCase().contains(pattern.toLowerCase())
).toList();
}
// After: Repository delegation
List<AppUser> getUserSuggestions(String pattern) {
return _usersRepository.getByPattern(pattern, (user, pattern) =>
user.toString().toLowerCase().contains(pattern.toLowerCase())
);
}Phase 3: Service Optimization and Consolidation
3.1 Create Base Service Classes
- BaseLogCalculationService: Common patterns for log-based calculations
- BaseTimeCardService: Shared time card generation logic
- BaseUsageService: Equipment and labor usage calculation patterns
3.2 Consolidate Duplicate Services
Labor Log Services Consolidation:
- Merge
LaborOnsiteLogServiceandLaborTravelingLogService - Create
LaborLogFilterServicewith configurable filters:
enum LogFilter { onsite, traveling, machine, all }
class LaborLogFilterService extends BaseLogCalculationService {
final LogFilter filter;
final DateTime? date;
final Iterable<DailyLog> allUserLogs;
Duration calculate() {
// Unified logic with filter-based job site filtering
}
}Time Calculation Services:
- Create
TimeCalculationServicebase class - Consolidate similar calculation patterns
- Implement memoization for expensive operations
3.3 Performance Optimizations
Algorithm Improvements:
- Replace multiple list iterations with single-pass algorithms
- Use HashMap lookups instead of linear searches
- Implement lazy evaluation for expensive calculations
Data Structure Optimizations:
- Use appropriate collections for specific access patterns
- Implement efficient caching strategies
- Reduce memory allocations in hot paths
Phase 4: Adapter Optimization
4.1 Create Base Adapter Classes
abstract class BaseAdapter<TSource, TTarget> {
TTarget create(TSource source);
List<TTarget> createList(Iterable<TSource> sources);
}
abstract class BaseUIAdapter<TDomain, TUI> extends BaseAdapter<TDomain, TUI> {
// Common UI transformation patterns
}4.2 Consolidate Similar Adapters
- Merge adapters with similar transformation patterns
- Create factory methods for adapter selection
- Implement generic transformation utilities
Implementation Timeline
Week 1: Foundation
- Create base repository infrastructure
- Implement users and projects repositories
- Update corresponding providers to use repositories
Week 2: Core Repositories
- Implement equipment, materials, customers repositories
- Create vendor and activity repositories
- Update all providers to delegate to repositories
Week 3: Service Optimization
- Create base service classes
- Consolidate duplicate labor services
- Optimize time calculation services
- Performance test optimizations
Week 4: Adapter Consolidation & Testing
- Create base adapter classes
- Consolidate similar adapters
- Comprehensive testing of all changes
- Performance benchmarking
Risk Mitigation
Backward Compatibility
- All public APIs maintained unchanged
- Internal implementation changes only
- Gradual migration approach
Testing Strategy
- Unit tests for all new repositories
- Integration tests for provider-repository interactions
- Performance benchmarks before/after
- Comprehensive regression testing
Rollback Plan
- Feature flags for repository usage
- Ability to revert to direct provider implementation
- Staged deployment with monitoring
Success Metrics
Performance Improvements
- Reduced memory allocations: Target 30% reduction in service calculations
- Faster query performance: Target 50% improvement in complex queries
- Reduced code duplication: Target 40% reduction in similar service logic
Code Quality
- Improved maintainability: Clear separation of concerns
- Better testability: Isolated repository layer for testing
- Enhanced extensibility: Easy to add new query types and optimizations
File Structure After Refactoring
lib/
├── repositories/
│ ├── base_repository.dart
│ ├── users_repository.dart
│ ├── project_repository.dart
│ ├── equipment_repository.dart
│ ├── materials_repository.dart
│ ├── customers_repository.dart
│ ├── vendors_repository.dart
│ └── activity_repository.dart
├── providers/network_data_providers/
│ ├── network_data_provider.dart (updated)
│ ├── users_provider.dart (updated)
│ ├── project_provider.dart (updated)
│ └── ... (all updated to use repositories)
├── services/
│ ├── base/
│ │ ├── base_log_calculation_service.dart
│ │ ├── base_time_card_service.dart
│ │ └── base_usage_service.dart
│ ├── labor/
│ │ ├── labor_log_filter_service.dart (consolidated)
│ │ ├── time_calculation_service.dart (consolidated)
│ │ └── ... (optimized services)
│ └── ... (other domain services, optimized)
└── util/adapter/
├── base_adapter.dart
├── ui_adapter.dart (consolidated UI adapters)
└── ... (optimized adapters)Notes
- Zero Breaking Changes: All refactoring maintains existing functionality
- Performance First: Every change is validated for performance improvement
- Incremental Implementation: Each phase can be deployed independently
- Comprehensive Testing: Full regression testing at each phase
- Documentation: All new patterns documented with examples