using SiteManagementSystem_SoftwareEngineering_.Configuration; using SiteManagementSystem_SoftwareEngineering_.Factory; using SiteManagementSystem_SoftwareEngineering_.Interface; using SiteManagementSystem_SoftwareEngineering_.Model; using SiteManagementSystem_SoftwareEngineering_.Service; using static SiteManagementSystem_SoftwareEngineering_.Service.UserManagerService; namespace SiteManagementSystem_SoftwareEngineering_.Extension { public static class IServiceCollectionExtension { public static IServiceCollection AddTokenFactory( this IServiceCollection services, Action options ) { var config = new TokenFactoryConfiguration(); options(config); if (config.Audience is null) throw new ArgumentNullException(nameof(config.Audience) + "can not be null."); if (config.Issuer is null) throw new ArgumentNullException(nameof(config.Issuer) + "can not be null."); if (config.SigningKey is null) throw new ArgumentNullException(nameof(config.SigningKey) + "can not be null."); services.AddScoped(_ => new TokenFactory(config)); return services; } public static IServiceCollection AddUserManager( this IServiceCollection services, Action options ) { var config = new SecretConfig(); options(config); if (config.HashSalt is null) throw new ArgumentNullException(nameof(config.HashSalt) + "can not be null"); services.AddScoped(services => { var logger = services.GetRequiredService>(); var storageService = services.GetRequiredService(); return new UserManageService(storageService, logger, config.HashSalt); }); return services; } public static IServiceCollection AddRedisUtils( this IServiceCollection services, Action options ) { var config = new RedisConfig(); options(config); if (config.RedisConnectionString is null) throw new ArgumentNullException("Redis ConnectionString is null."); services.AddSingleton(services => new RedisUtils(config.RedisConnectionString, config.RedisDB, services.GetRequiredService>()) ); return services; } } }