76 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using Foxchat.Core.Database;
							 | 
						|||
| 
								 | 
							
								using Foxchat.Core.Federation;
							 | 
						|||
| 
								 | 
							
								using Microsoft.AspNetCore.Builder;
							 | 
						|||
| 
								 | 
							
								using Microsoft.Extensions.Configuration;
							 | 
						|||
| 
								 | 
							
								using Microsoft.Extensions.DependencyInjection;
							 | 
						|||
| 
								 | 
							
								using NodaTime;
							 | 
						|||
| 
								 | 
							
								using Serilog;
							 | 
						|||
| 
								 | 
							
								using Serilog.Events;
							 | 
						|||
| 
								 | 
							
								using Serilog.Sinks.SystemConsole.Themes;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace Foxchat.Core;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								public static class ServiceCollectionExtensions
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    /// <summary>
							 | 
						|||
| 
								 | 
							
								    /// Adds Serilog to this service collection. This method also initializes Serilog so it should be called as early as possible, before any log calls.
							 | 
						|||
| 
								 | 
							
								    /// </summary>
							 | 
						|||
| 
								 | 
							
								    public static IServiceCollection AddSerilog(this IServiceCollection services, LogEventLevel level)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        var logCfg = new LoggerConfiguration()
							 | 
						|||
| 
								 | 
							
								            .Enrich.FromLogContext()
							 | 
						|||
| 
								 | 
							
								            .MinimumLevel.Is(level)
							 | 
						|||
| 
								 | 
							
								            // ASP.NET's built in request logs are extremely verbose, so we use Serilog's instead.
							 | 
						|||
| 
								 | 
							
								            // Serilog doesn't disable the built in logs so we do it here.
							 | 
						|||
| 
								 | 
							
								            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
							 | 
						|||
| 
								 | 
							
								            .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning)
							 | 
						|||
| 
								 | 
							
								            .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning)
							 | 
						|||
| 
								 | 
							
								            .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning)
							 | 
						|||
| 
								 | 
							
								            .WriteTo.Console(theme: AnsiConsoleTheme.Code);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        Log.Logger = logCfg.CreateLogger();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // AddSerilog doesn't seem to add an ILogger to the service collection, so add that manually.
							 | 
						|||
| 
								 | 
							
								        return services.AddSerilog().AddSingleton(Log.Logger);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /// <summary>
							 | 
						|||
| 
								 | 
							
								    /// Adds the core Foxchat services to this service collection.
							 | 
						|||
| 
								 | 
							
								    /// </summary>
							 | 
						|||
| 
								 | 
							
								    public static IServiceCollection AddCoreServices<T>(this IServiceCollection services) where T : IDatabaseContext
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        services.AddDbContext<T>();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // NodaTime recommends only depending on the IClock interface, not the singleton.
							 | 
						|||
| 
								 | 
							
								        services.AddSingleton<IClock>(SystemClock.Instance);
							 | 
						|||
| 
								 | 
							
								        // Some core services rely on an IDatabaseContext, not the server-specific context type.
							 | 
						|||
| 
								 | 
							
								        services.AddScoped<IDatabaseContext, T>();
							 | 
						|||
| 
								 | 
							
								        services.AddSingleton<RequestSigningService>();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        return services;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public static T AddConfiguration<T>(this WebApplicationBuilder builder, string? configFile = null) where T : class, new()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        builder.Configuration.Sources.Clear();
							 | 
						|||
| 
								 | 
							
								        builder.Configuration.AddConfiguration(configFile);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        var config = builder.Configuration.Get<T>() ?? new();
							 | 
						|||
| 
								 | 
							
								        var coreConfig = builder.Configuration.Get<CoreConfig>() ?? new();
							 | 
						|||
| 
								 | 
							
								        builder.Services.AddSingleton(config);
							 | 
						|||
| 
								 | 
							
								        builder.Services.AddSingleton(coreConfig);
							 | 
						|||
| 
								 | 
							
								        return config;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public static IConfigurationBuilder AddConfiguration(this IConfigurationBuilder builder, string? configFile = null)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        var file = Environment.GetEnvironmentVariable("FOXCHAT_CONFIG_FILE") ?? configFile ?? "config.ini";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        return builder
							 | 
						|||
| 
								 | 
							
								            .SetBasePath(Directory.GetCurrentDirectory())
							 | 
						|||
| 
								 | 
							
								            .AddIniFile(file, optional: false, reloadOnChange: true)
							 | 
						|||
| 
								 | 
							
								            .AddEnvironmentVariables();
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |