Files
Rafał Tyński fa1199539b feat(backend): add communication, tester, admin and middleman modules
Implement step 17 modules: threads/messages, notifications with automation (submission.created, idea.created, grant_call.opened), innovation test feedback, admin panel (submissions, verify, metrics, grant call status), Middleman adaptation and partnerships. Split multi-type files into one type per file and replace object-valued dictionaries with string-valued maps in data contracts (migrations 0006/0007).
2026-10-04 03:49:45 +02:00

98 lines
4.3 KiB
C#

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<SurrealDbSettings>(configuration.GetSection("SurrealDb"));
services.Configure<AuthSettings>(configuration.GetSection("Auth"));
var llmSettings = configuration.GetSection("Llm").Get<LlmSettings>() ?? new LlmSettings();
services.Configure<LlmSettings>(configuration.GetSection("Llm"));
services.AddSingleton<ILlmRequestLimiter>(
new InMemoryLlmRequestLimiter(llmSettings.MaxRequestsPerMinute));
if (llmSettings.IsConfigured)
{
services.AddHttpClient<OpenAiCompatibleLlmProvider>(
client => client.Timeout = TimeSpan.FromSeconds(llmSettings.TimeoutSeconds));
services.AddSingleton<ILlmProvider>(
provider => provider.GetRequiredService<OpenAiCompatibleLlmProvider>());
}
else
{
services.AddSingleton<ILlmProvider, NullLlmProvider>();
}
var settings = configuration.GetSection("SurrealDb").Get<SurrealDbSettings>()
?? 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<IStorageService, StorageService>();
services.AddSingleton<IMigrationRunner, MigrationRunner>();
services.AddSingleton<ITokenService, TokenService>();
services.AddSingleton<IUserService, UserService>();
services.AddSingleton<IConsentService, ConsentService>();
services.AddSingleton<IAuditLogService, AuditLogService>();
services.AddSingleton<ISubmissionEventPublisher, LoggingSubmissionEventPublisher>();
services.AddSingleton<ISubmissionService, SubmissionService>();
services.AddSingleton<IChallengeService, ChallengeService>();
services.AddSingleton<IKnowledgeItemService, KnowledgeItemService>();
services.AddSingleton<IInnovationService, InnovationService>();
services.AddSingleton<ITrendService, TrendService>();
services.AddSingleton<IEmbeddingProvider, HashingEmbeddingProvider>();
services.AddSingleton<IMatchmakingService, MatchmakingService>();
services.AddSingleton<IIdeaService, IdeaService>();
services.AddSingleton<IGrantCallService, GrantCallService>();
services.AddSingleton<IApplicationService, ApplicationService>();
services.AddSingleton<IIdeaAssistant, IdeaAssistant>();
services.AddSingleton<INotificationService, NotificationService>();
services.AddSingleton<IThreadService, ThreadService>();
services.AddSingleton<ITestFeedbackService, TestFeedbackService>();
services.AddSingleton<IAdminService, AdminService>();
services.AddSingleton<IMiddlemanService, MiddlemanAssistant>();
services.AddSingleton<IPartnershipService, PartnershipService>();
return services;
}
}