using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using SurrealDb.Net; using TarninaHub.Application.Abstractions; using TarninaHub.Application.Matchmaking; using TarninaHub.Infrastructure.Auth; using TarninaHub.Infrastructure.Assist; using TarninaHub.Infrastructure.Events; using TarninaHub.Infrastructure.Llm; using TarninaHub.Infrastructure.Persistence; using TarninaHub.Infrastructure.Settings; namespace TarninaHub.Infrastructure; public static class DependencyInjection { public static IServiceCollection AddInfrastructure( this IServiceCollection services, IConfiguration configuration) { services.Configure(configuration.GetSection("SurrealDb")); services.Configure(configuration.GetSection("Auth")); var llmSettings = configuration.GetSection("Llm").Get() ?? new LlmSettings(); services.Configure(configuration.GetSection("Llm")); services.AddSingleton( new InMemoryLlmRequestLimiter(llmSettings.MaxRequestsPerMinute)); if (llmSettings.IsConfigured) { services.AddHttpClient( client => client.Timeout = TimeSpan.FromSeconds(llmSettings.TimeoutSeconds)); services.AddSingleton( provider => provider.GetRequiredService()); } else { services.AddSingleton(); } var settings = configuration.GetSection("SurrealDb").Get() ?? new SurrealDbSettings(); var options = new SurrealDbOptions { Endpoint = SurrealDbEndpoint.Build(settings), Namespace = settings.Namespace, Database = settings.Database, }; if (string.IsNullOrWhiteSpace(settings.RemoteUrl)) { // Embedded RocksDB, persisted next to the running app (./data), never in memory. var dataDirectory = Path.Combine(AppContext.BaseDirectory, settings.DataDirectory); Directory.CreateDirectory(dataDirectory); services .AddSurreal(options, ServiceLifetime.Singleton) .AddRocksDbProvider(); } else { // Remote SurrealDB server on its own dedicated port (used for sync with the frontend). options.Username = settings.Username; options.Password = settings.Password; services.AddSurreal(options, ServiceLifetime.Singleton); } services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); return services; } }