using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.DataProtection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Console; using Microsoft.Extensions.Options; using Moonlight.Api.Configuration; using Moonlight.Shared.Http; using Moonlight.Api.Helpers; using Moonlight.Api.Implementations; using Moonlight.Api.Interfaces; using Moonlight.Api.Services; namespace Moonlight.Api.Startup; public partial class Startup { private static void AddBase(WebApplicationBuilder builder) { // Create the base directory Directory.CreateDirectory("storage"); // Hook up source-generated serialization builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.TypeInfoResolverChain.Add(SerializationContext.Default); }); // Configure logging builder.Logging.ClearProviders(); builder.Logging.AddConsole(options => { options.FormatterName = nameof(AppConsoleFormatter); }); builder.Logging.AddConsoleFormatter(); // Application service builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); // Diagnose builder.Services.AddSingleton(); builder.Services.AddSingleton(); // Frontend builder.Services.AddOptions().BindConfiguration("Moonlight:Frontend"); builder.Services.AddScoped(); // HTTP Client builder.Services.AddHttpClient(); // Version fetching configuration builder.Services.AddOptions().BindConfiguration("Moonlight:Version"); builder.Services.AddSingleton(); // Container Helper Options builder.Configuration.GetSection("Moonlight:ContainerHelper").Bind(builder.Configuration); builder.Services.AddOptions().BindConfiguration("Moonlight:ContainerHelper"); builder.Services.AddSingleton(); builder.Services.AddHttpClient("ContainerHelper", (provider, client) => { var options = provider.GetRequiredService>(); client.BaseAddress = new Uri(options.Value.IsEnabled ? options.Value.Url : "http://you-should-fail.invalid"); }); // User management services builder.Services.AddScoped(); builder.Services.AddScoped(); // Settings options builder.Services.AddOptions().BindConfiguration("Moonlight:Settings"); builder.Services.AddScoped(); // Setup key loading var keysDirectory = new DirectoryInfo(Path.Combine("storage", "keys")); builder.Services.AddDataProtection().PersistKeysToFileSystem(keysDirectory); } private static void UseBase(WebApplication application) { application.UseRouting(); } private static void MapBase(WebApplication application) { application.MapControllers(); var options = application.Services.GetRequiredService>(); if (options.Value.Enabled) application.MapFallbackToFile("index.html"); } }