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.

Merge request reports

Loading