My App

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 LaborOnsiteLogService and LaborTravelingLogService
  • Create LaborLogFilterService with 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 TimeCalculationService base 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

On this page