ускорение reminders
This commit is contained in:
@@ -38,23 +38,28 @@ public sealed class ReminderService(
|
|||||||
.Where(x => x.SlaHours != null && x.ListId != null && x.SiteUrl != null)
|
.Where(x => x.SlaHours != null && x.ListId != null && x.SiteUrl != null)
|
||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
var reminders = new List<ReminderDto>();
|
// Типы независимы (разные сайты/списки в SharePoint) — их обход
|
||||||
|
// распараллелен, иначе время растёт линейно с числом типов: каждый тип
|
||||||
|
// сам по себе делает несколько последовательных HTTP-запросов.
|
||||||
|
var results = await Task.WhenAll(types.Select(type => GetOverdueForTypeSafeAsync(type, now, cancellationToken)));
|
||||||
|
|
||||||
foreach (var type in types)
|
return Result.Ok<IReadOnlyList<ReminderDto>>(results.SelectMany(r => r).ToList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<IReadOnlyList<ReminderDto>> GetOverdueForTypeSafeAsync(
|
||||||
|
RequestType type, DateTimeOffset now, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
try
|
return await GetOverdueForTypeAsync(type, now, cancellationToken);
|
||||||
{
|
}
|
||||||
reminders.AddRange(await GetOverdueForTypeAsync(type, now, cancellationToken));
|
catch (Exception e)
|
||||||
}
|
{
|
||||||
catch (Exception e)
|
// Недоступный список одного типа не должен обнулять напоминания по
|
||||||
{
|
// всем остальным: Power Automate получит то, что удалось собрать.
|
||||||
// Недоступный список одного типа не должен обнулять напоминания по
|
logger.LogError(e, "Напоминания по типу заявки «{Type}» не собраны", type.Name);
|
||||||
// всем остальным: Power Automate получит то, что удалось собрать.
|
return [];
|
||||||
logger.LogError(e, "Напоминания по типу заявки «{Type}» не собраны", type.Name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result.Ok<IReadOnlyList<ReminderDto>>(reminders);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IReadOnlyList<ReminderDto>> GetOverdueForTypeAsync(
|
private async Task<IReadOnlyList<ReminderDto>> GetOverdueForTypeAsync(
|
||||||
|
|||||||
Reference in New Issue
Block a user