using AutoMapper; using DigitalData.Core.Abstractions; using DigitalData.Core.Abstractions.Application; using DigitalData.Core.Abstractions.Infrastructure; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; namespace DigitalData.Core.Application { /// /// Provides extension methods to for registering Clean Architecture CRUD related services and repositories. /// public static class DIExtensions { /// /// Adds a basic CRUD service for a specific DTO and entity type to the service collection. /// /// The DTO type the service operates on. /// The entity type corresponding to the DTO. /// The type of the entity's identifier. /// The AutoMapper profile type for configuring mappings between the DTO and the entity. /// The to add the service to. /// An optional action to configure additional services for the CRUD service. /// The original instance, allowing further configuration. public static IServiceCollection AddCleanBasicCRUDService(this IServiceCollection services, Action? configureService = null) where TCRUDRepository : ICRUDRepository where TDto : class, IUnique where TEntity : class, IUnique where TProfile : Profile { services.AddScoped, BasicCRUDService>(); configureService?.Invoke(services); services.AddAutoMapper(typeof(TProfile).Assembly); return services; } /// /// Adds a CRUD service for managing create, read, update, and delete operations for a specific set of DTOs and an entity type to the service collection. /// /// The repository type that provides CRUD operations for entities of type TEntity. /// The DTO type used for create operations. /// The DTO type used for read operations. /// The DTO type used for update operations. /// The entity type corresponding to the DTOs. /// The type of the entity's identifier. /// The AutoMapper profile type for configuring mappings between the DTOs and the entity. /// The to add the service to. /// An optional action to configure additional services for the CRUD service. /// The original instance, allowing further configuration. public static IServiceCollection AddCleanCRUDService(this IServiceCollection services, Action? configureService = null) where TCRUDRepository : ICRUDRepository where TCreateDto : class where TReadDto : class where TUpdateDto : class, IUnique where TEntity : class, IUnique where TProfile : Profile { services.AddScoped, CRUDService>(); configureService?.Invoke(services); services.AddAutoMapper(typeof(TProfile).Assembly); return services; } /// /// Adds the directory search service to the . /// /// The to add services to. /// /// Optional. An instance of to configure the directory search service. /// If not provided, the options need to be configured separately. /// /// The updated . /// /// This method adds the necessary services for directory search functionality, including memory caching. /// If is not provided, ensure to configure the options separately /// using the pattern. /// public static IServiceCollection AddDirectorySearchService(this IServiceCollection service, DirectorySearchOptions? directorySearchOptions = null) { if(directorySearchOptions is not null) service.AddSingleton(Options.Create(directorySearchOptions)); return service .AddMemoryCache() .AddScoped(); } /// /// Adds the JWT service to the . /// /// The type of the claim value used in the JWT token. /// The to add the service to. /// A function that takes a claim value of type and returns a used to configure the JWT token. /// The original instance, allowing further configuration. /// /// This method adds the necessary services for handling JWT tokens. The function is used to generate the which is essential for creating the JWT tokens. /// public static IServiceCollection AddJWTService(this IServiceCollection services, Func tokenDescriptorFactory) { return services.AddScoped, JWTService>(provider => new (tokenDescriptorFactory)); } } }