Архивация списков (#13)
Tests / frontend-test (push) Successful in 44s
Tests / backend-test (push) Failing after 17m4s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/13
This commit was merged in pull request #13.
This commit is contained in:
2026-08-19 09:08:36 +00:00
parent a2672042d7
commit 82512eb1db
56 changed files with 2587 additions and 51 deletions
@@ -20,15 +20,32 @@ public static class InfrastructureServiceCollectionExtensions
opt.UseNpgsql(configuration.GetConnectionString("Postgres"))
.UseSnakeCaseNamingConvention());
services.AddAsyncInitializer<DatabaseMigrationInitializer>();
services.AddScoped<ListPartitioningLock>();
services.Configure<SharePointOptions>(configuration.GetSection("SharePoint"));
// Провайдер сертификата — синглтон: разобранный .pfx кешируется на всё
// время жизни процесса (см. DbCertificateProvider).
services.AddSingleton<ICertificateProvider, DbCertificateProvider>();
services.AddHttpClient<ISharePointClient, SharePointClient>();
services.AddScoped<ISharePointListProvisioner, SharePointListProvisioner>();
services.Configure<TnsuPortalOptions>(configuration.GetSection("TnsuPortal"));
services.AddHttpClient<TnsuPortalTokenProvider>();
// Токен вызывающего и общая авторизация запросов к порталу — одни на всех
// его клиентов (см. TnsuPortalCallerToken/TnsuPortalAuthorizer). Именно
// Scoped: Hangfire даёт задаче свою область DI, и положенный в задаче токен
// не должен протекать в соседние.
services.AddScoped<TnsuPortalCallerToken>();
services.AddScoped<TnsuPortalAuthorizer>();
// Подписка новых списков на уведомления SharePoint. Клиент отдельный от
// ITnsuPortalClient: там кешируемые чтения справочника, здесь команда.
// Своих опций нет — адрес приёмника лежит в SharePoint:NotificationUrl.
services.AddHttpClient<ISharePointWebhookSubscriber, HttpSharePointWebhookSubscriber>((sp, client) =>
{
var options = sp.GetRequiredService<IOptions<TnsuPortalOptions>>().Value;
client.BaseAddress = new Uri(options.BaseUrl);
});
// ITnsuPortalClient резолвится в CachingTnsuPortalClient (кеш на 5 минут,
// см. её комментарий) — сам HttpTnsuPortalClient регистрируем по
// конкретному типу, а не по интерфейсу, чтобы декоратор мог его получить