using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Qualifier; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace GB5Shared.GOP.Qualifier.Executors { // ============================================================ // ServiceExecutor — ExecutionMode 3 (IQualifierService registry) // // Dispatches to a feature-module-registered IQualifierService // keyed by SnapshotMethod.ServiceCode. // // Feature modules register their services as: // services.AddKeyedScoped("MY_SERVICE_CODE"); // // If no service is registered for the given ServiceCode, an // Error finding is emitted (this is a configuration error). // ============================================================ public class ServiceExecutor : IQualifierMethodExecutor { private readonly IServiceProvider _ServiceProvider; private readonly ILogger _Logger; public ServiceExecutor( IServiceProvider serviceProvider, ILogger logger) { _ServiceProvider = serviceProvider; _Logger = logger; } public string ExecutionModeKey => "Service"; public async Task> ExecuteAsync( SnapshotMethod method, QualifierExecutionContext ctx, LoginDTO loginDTO, CancellationToken ct) { if (string.IsNullOrWhiteSpace(method.ServiceCode)) { return [ new QualifierFinding { Severity = FindingSeverity.Error, Code = "SERVICE_CODE_MISSING", Message = $"Method {method.QualifierMethodId} has ExecutionMode=Service but no ServiceCode.", QualifierId = 0, QualifierCode = string.Empty } ]; } var service = _ServiceProvider.GetKeyedService(method.ServiceCode); if (service is null) { _Logger.LogError( "ServiceExecutor: no IQualifierService registered for ServiceCode '{ServiceCode}'", method.ServiceCode); return [ new QualifierFinding { Severity = FindingSeverity.Error, Code = "SERVICE_NOT_REGISTERED", Message = $"No IQualifierService registered for ServiceCode '{method.ServiceCode}'.", QualifierId = 0, QualifierCode = string.Empty } ]; } return await service.ExecuteAsync(ctx, ct); } } // ============================================================ // IQualifierService — contract for feature-module services // // Feature modules implement this interface and register with: // services.AddKeyedScoped("MY_SERVICE_CODE"); // ============================================================ public interface IQualifierService { Task> ExecuteAsync( QualifierExecutionContext ctx, CancellationToken ct); } }