using System; using System.Collections.Generic; using Autofac; using Autofac.Core; using Autofac.Core.Registration; using Autofac.Extras.AttributeMetadata; using Kyoo.Abstractions; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models.Permissions; using Kyoo.Core.Api; using Kyoo.Core.Controllers; using Kyoo.Core.Models.Options; using Kyoo.Core.Tasks; using Kyoo.Database; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using IMetadataProvider = Kyoo.Abstractions.Controllers.IMetadataProvider; namespace Kyoo.Core { /// /// The core module containing default implementations /// public class CoreModule : IPlugin { /// public string Slug => "core"; /// public string Name => "Core"; /// public string Description => "The core module containing default implementations."; /// public Dictionary Configuration => new() { { BasicOptions.Path, typeof(BasicOptions) }, { TaskOptions.Path, typeof(TaskOptions) }, { MediaOptions.Path, typeof(MediaOptions) }, { "database", null }, { "logging", null } }; /// /// The configuration to use. /// private readonly IConfiguration _configuration; /// /// Create a new core module instance and use the given configuration. /// /// The configuration to use public CoreModule(IConfiguration configuration) { _configuration = configuration; } /// public void Configure(ContainerBuilder builder) { builder.RegisterModule(); builder.RegisterComposite().InstancePerLifetimeScope(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().SingleInstance(); builder.RegisterComposite(); builder.Register(x => (AProviderComposite)x.Resolve()); builder.RegisterTask(); builder.RegisterTask(); builder.RegisterTask(); builder.RegisterTask(); builder.RegisterTask(); static bool DatabaseIsPresent(IComponentRegistryBuilder x) => x.IsRegistered(new TypedService(typeof(DatabaseContext))); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterRepository().OnlyIf(DatabaseIsPresent); builder.RegisterType().As() .IfNotRegistered(typeof(IPermissionValidator)); builder.RegisterType().As().SingleInstance() .OnActivating(x => { x.Instance.Mappings[".data"] = "application/octet-stream"; x.Instance.Mappings[".mkv"] = "video/x-matroska"; x.Instance.Mappings[".ass"] = "text/x-ssa"; x.Instance.Mappings[".srt"] = "application/x-subrip"; x.Instance.Mappings[".m3u8"] = "application/x-mpegurl"; }); } /// public void Configure(IServiceCollection services) { string publicUrl = _configuration.GetPublicUrl(); services.AddMvc().AddControllersAsServices(); services.AddControllers() .AddNewtonsoftJson(x => { x.SerializerSettings.ContractResolver = new JsonPropertyIgnorer(publicUrl); x.SerializerSettings.Converters.Add(new PeopleRoleConverter()); }); services.AddResponseCompression(x => { x.EnableForHttps = true; }); services.AddHttpClient(); } /// public IEnumerable ConfigureSteps => new IStartupAction[] { SA.New((app, env) => { if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); else { app.UseExceptionHandler("/error"); app.UseHsts(); } }, SA.Before), SA.New(app => app.UseSerilogRequestLogging(), SA.Before), SA.New(app => app.UseResponseCompression(), SA.Routing + 1), SA.New(app => app.UseRouting(), SA.Routing), SA.New(app => app.UseEndpoints(x => x.MapControllers()), SA.Endpoint) }; } }