Refactor Member::CreateService to improve maintainability and testability
Problem
The current Member::CreateService had grown to over 200 lines and violated the Single Responsibility Principle by handling multiple concerns:
- Parameter processing and validation
- Permission checking
- Member creation orchestration
- Error handling and formatting
- Event publishing
- Tracking and analytics
This made the service difficult to test, maintain, extend, and debug.
Solution
This MR refactors the service using the Command Pattern and extracts responsibilities into focused, single-purpose classes:
🔧 Changes Made
1. Extracted Validation Logic
-
Members::Validators::InviteValidator- Handles invite-specific validations -
Members::PermissionValidator- Handles permission checks
2. Extracted Parameter Processing
-
Members::InviteParamsBuilder- Handles parameter conversion and defaults
3. Extracted Member Creation Logic
-
Members::CreateMembersCommand- Orchestrates member creation and result processing
4. Extracted Event Handling
-
Members::EventPublisher- Handles event publishing -
Members::MemberTracker- Handles member tracking
5. Simplified Main Service
The main CreateService is now a coordinator that:
- Validates permissions and invites
- Executes the creation command
- Publishes events on success
- Handles errors consistently
📊 Impact
- Lines of Code: Reduced main service from 200+ lines to ~100 lines
- Maintainability: Each class has a single, clear responsibility
- Testability: Smaller, focused classes are easier to unit test
- Extensibility: Easy to add new validation rules or creation strategies
- Backward Compatibility: All existing functionality preserved
🧪 Testing
-
All existing tests pass -
No breaking changes to public API -
Error classes re-exported for backward compatibility -
Performance characteristics maintained
📋 Checklist
-
Extract validation logic into separate classes -
Extract parameter processing logic -
Extract member creation orchestration -
Extract event publishing logic -
Refactor main service to use new components -
Maintain backward compatibility -
Update/add tests for new class structure -
Verify no performance regressions
This refactoring supports the ongoing work on DAP permissions (Epic #19601) by making the member creation system more modular and easier to extend with new permission logic.