подписка
Tests / frontend-test (pull_request) Successful in 47s
Tests / backend-test (pull_request) Successful in 2m36s

This commit is contained in:
gorbenko.pavel
2026-08-19 13:30:09 +05:00
parent cf44ae3e2e
commit a1e6c5c8b4
12 changed files with 443 additions and 21 deletions
@@ -1,5 +1,6 @@
using System.Diagnostics;
using Microsoft.Extensions.Logging;
using Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
namespace Tnsu.ApprovalRoute.Infrastructure.SharePoint;
@@ -16,6 +17,7 @@ namespace Tnsu.ApprovalRoute.Infrastructure.SharePoint;
/// </summary>
public sealed class SharePointListProvisioner(
ISharePointClient sharePoint,
ISharePointWebhookSubscriber webhookSubscriber,
ILogger<SharePointListProvisioner> logger) : ISharePointListProvisioner
{
public async Task<ProvisionedList> CreateNextListPairAsync(
@@ -47,6 +49,17 @@ public sealed class SharePointListProvisioner(
"Пара списков №{Number} готова за {ElapsedMs} мс: данные «{Title}» ({ListId}).",
number, stopwatch.ElapsedMilliseconds, newData.Title, newData.ServerRelativeUrl);
// Подписка — ПОСЛЕДНИМ шагом, когда списки уже созданы:
// • подписывать нечего, пока списка нет;
// • только для списка ДАННЫХ — заявки портал отслеживает по нему, списку
// согласования подписка не нужна;
// • в самом конце, а не сразу после создания списка данных: сорвись
// дублирование пары на списке согласования, подписка была бы уже
// заведена, и повтор задачи Hangfire отправил бы второй запрос на ту же
// подписку (идемпотентна ли ручка портала — неизвестно).
// Не бросает и провижининг не рушит (см. ISharePointWebhookSubscriber).
await webhookSubscriber.TrySubscribeAsync(siteUrl, newData.Title, cancellationToken);
return new ProvisionedList(newData.ServerRelativeUrl, newData.Title);
}
@@ -20,4 +20,15 @@ public sealed class SharePointOptions
/// это здесь не стоит — пароль от сертификата в исходниках не место.
/// </summary>
public string CertificatePassword { get; set; } = string.Empty;
/// <summary>
/// Куда SharePoint будет присылать уведомления об изменениях списка — параметр
/// notificationUrl ручки POST /Webhook/Subscribe, которой новый список данных
/// подписывается на уведомления (см. HttpSharePointWebhookSubscriber).
/// Это приёмник на СТОРОНЕ ПОРТАЛА, а не адрес нашего сервиса.
///
/// Пусто — подписывать не будем вовсе: без адреса приёмника подписка
/// бессмысленна, и это же единственный способ её выключить.
/// </summary>
public string NotificationUrl { get; set; } = "https://api.tnsu.kz/Webhook/SharePoint";
}