using Amazon.S3; using Hangfire; using Hangfire.PostgreSql; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Musify.Application.Configuration; using Musify.Infrastructure.Configuration; using Musify.Infrastructure.Jobs; using Musify.Application.Contracts; namespace Musify.Infrastructure.Services { public static class ServicesDependencyInjection { public static IServiceCollection AddStorageService(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors .AddOptionsWithValidateOnStart() .Bind(configuration.GetRequiredSection(InfrastructureStorageConfiguration.SectionName)) .ValidateDataAnnotations(); serviceDescriptors.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); serviceDescriptors.AddSingleton(serviceProvider => { var configuration = serviceProvider.GetRequiredService(); var s3Configuration = new AmazonS3Config { ServiceURL = configuration.Address, ForcePathStyle = configuration.ForcePathStyle, UseHttp = configuration.UseHttp, }; return new AmazonS3Client(configuration.AccessKey, configuration.SecretAccessKey, s3Configuration); } ); serviceDescriptors.AddScoped(); return serviceDescriptors; } public static IServiceCollection AddPictureService(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors.AddScoped(); return serviceDescriptors; } public static IServiceCollection AddUploadIntentConfiguration(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors.AddValidatedOptions(configuration, UploadIntentConfiguration.SectionName); return serviceDescriptors; } public static IServiceCollection AddUploadIntentJobs(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors.AddUploadIntentConfiguration(configuration); serviceDescriptors.AddHostedService(); serviceDescriptors.AddHostedService(); return serviceDescriptors; } public static IServiceCollection AddDailyMixGenerationJob(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors.AddHangfire((serviceProvider, hangfireConfiguration) => { var databaseConfiguration = serviceProvider.GetRequiredService(); hangfireConfiguration.UsePostgreSqlStorage(options => options.UseNpgsqlConnection(databaseConfiguration.ConnectionString)); }); serviceDescriptors.AddHangfireServer(); serviceDescriptors.AddScoped(); return serviceDescriptors; } public static IServiceCollection AddStreamTicketService(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors .AddOptionsWithValidateOnStart() .Bind(configuration.GetRequiredSection(StreamTicketConfiguration.SectionName)) .ValidateDataAnnotations(); serviceDescriptors.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); serviceDescriptors.AddSingleton(); return serviceDescriptors; } public static IServiceCollection AddYouTubeMusicService(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors.AddValidatedOptions(configuration, YouTubeConfiguration.SectionName); serviceDescriptors.AddMemoryCache(); serviceDescriptors.AddSingleton(); return serviceDescriptors; } public static IServiceCollection AddYouTubeDownloader(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors.AddValidatedOptions(configuration, YtDlpConfiguration.SectionName); serviceDescriptors.AddScoped(); return serviceDescriptors; } public static IServiceCollection AddAudioTranscoder(this IServiceCollection serviceDescriptors, IConfiguration configuration) { serviceDescriptors .AddOptionsWithValidateOnStart() .Bind(configuration.GetRequiredSection(AudioConfiguration.SectionName)) .ValidateDataAnnotations(); serviceDescriptors.AddSingleton(serviceProvider => serviceProvider.GetRequiredService>().Value); serviceDescriptors.AddScoped(); return serviceDescriptors; } } }