97 lines
3.6 KiB
C#
97 lines
3.6 KiB
C#
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 void AddBase(WebApplicationBuilder builder)
|
|
{
|
|
// Create the base directory
|
|
Directory.CreateDirectory("storage");
|
|
|
|
// Hook up source-generated serialization and add controllers
|
|
builder.Services
|
|
.AddControllers()
|
|
.AddApplicationPart(typeof(Startup).Assembly)
|
|
.AddJsonOptions(options =>
|
|
{
|
|
options.JsonSerializerOptions.TypeInfoResolverChain.Add(SerializationContext.Default);
|
|
});
|
|
|
|
// Configure logging
|
|
builder.Logging.ClearProviders();
|
|
builder.Logging.AddConsole(options => { options.FormatterName = nameof(AppConsoleFormatter); });
|
|
builder.Logging.AddConsoleFormatter<AppConsoleFormatter, ConsoleFormatterOptions>();
|
|
|
|
// Application service
|
|
builder.Services.AddSingleton<ApplicationService>();
|
|
builder.Services.AddHostedService(sp => sp.GetRequiredService<ApplicationService>());
|
|
|
|
// Diagnose
|
|
builder.Services.AddSingleton<DiagnoseService>();
|
|
builder.Services.AddSingleton<IDiagnoseProvider, UpdateDiagnoseProvider>();
|
|
|
|
// Frontend
|
|
builder.Services.AddOptions<FrontendOptions>().BindConfiguration("Moonlight:Frontend");
|
|
builder.Services.AddScoped<FrontendService>();
|
|
|
|
// HTTP Client
|
|
builder.Services.AddHttpClient();
|
|
|
|
// Version fetching configuration
|
|
builder.Services.AddOptions<VersionOptions>().BindConfiguration("Moonlight:Version");
|
|
builder.Services.AddSingleton<VersionService>();
|
|
|
|
// Container Helper Options
|
|
builder.Configuration.GetSection("Moonlight:ContainerHelper").Bind(builder.Configuration);
|
|
|
|
builder.Services.AddOptions<ContainerHelperOptions>().BindConfiguration("Moonlight:ContainerHelper");
|
|
builder.Services.AddSingleton<ContainerHelperService>();
|
|
|
|
builder.Services.AddHttpClient("ContainerHelper", (provider, client) =>
|
|
{
|
|
var options = provider.GetRequiredService<IOptions<ContainerHelperOptions>>();
|
|
client.BaseAddress =
|
|
new Uri(options.Value.IsEnabled ? options.Value.Url : "http://you-should-fail.invalid");
|
|
});
|
|
|
|
// User management services
|
|
builder.Services.AddScoped<UserDeletionService>();
|
|
builder.Services.AddScoped<UserLogoutService>();
|
|
|
|
// Settings options
|
|
builder.Services.AddOptions<SettingsOptions>().BindConfiguration("Moonlight:Settings");
|
|
builder.Services.AddScoped<SettingsService>();
|
|
|
|
// 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<IOptions<FrontendOptions>>();
|
|
|
|
if (options.Value.Enabled)
|
|
application.MapFallbackToFile("index.html");
|
|
}
|
|
} |