feat: улучшил синхронизацию лекций
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Failing after 10m14s
Frontend CI / build-and-check (push) Failing after 16m12s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Failing after 14m7s
🚀 Create and publish a Docker image / Build & publish backend image (push) Failing after 14m59s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Failing after 14m57s
Backend CI / build-and-test (push) Failing after 13m27s

This commit is contained in:
2026-05-24 23:47:23 +03:00
parent a8a20f9b0b
commit 85ef2a1c22
7 changed files with 492 additions and 132 deletions
@@ -104,9 +104,6 @@ public class ScheduleSyncService : IScheduleSyncService
catch (Exception ex)
{
_logger.LogError(ex, "Schedule sync failed");
var specialtyCodes = string.IsNullOrWhiteSpace(request.SpecialtyCode)
? []
: request.SpecialtyCode.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var result = new SyncResultDto(created, updated, skipped, ex.Message, BuildErrorDetails(
ex,
stage,
@@ -114,14 +111,9 @@ public class ScheduleSyncService : IScheduleSyncService
updated,
skipped,
[
"size=900",
$"requestJson={BuildScheduleRequestJson(request)}",
$"specialtyCode=[{string.Join(", ", specialtyCodes)}]",
$"timeMin={request.TimeMin:O}",
$"timeMax={request.TimeMax:O}",
request.TypeId is { Count: > 0 }
? $"typeId=[{string.Join(", ", request.TypeId)}]"
: "typeId=<omitted>"
$"timeMax={request.TimeMax:O}"
]));
_lastStatus = new SyncStatusDto(DateTime.UtcNow, "failed", result);
return result;
@@ -498,24 +490,35 @@ public class ScheduleSyncService : IScheduleSyncService
private static string BuildScheduleRequestJson(SyncScheduleRequest request)
{
var specialtyCodes = string.IsNullOrWhiteSpace(request.SpecialtyCode)
? []
: request.SpecialtyCode.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var body = new Dictionary<string, object?>
{
["size"] = 900,
["size"] = request.Size is > 0 ? request.Size.Value : 900,
["timeMin"] = request.TimeMin,
["timeMax"] = request.TimeMax,
["specialtyCode"] = specialtyCodes
["timeMax"] = request.TimeMax
};
if (request.TypeId is { Count: > 0 })
body["typeId"] = request.TypeId;
AddNonEmpty(body, "roomId", request.RoomId);
AddNonEmpty(body, "attendeePersonId", request.AttendeePersonId);
AddNonEmpty(body, "courseUnitRealizationId", request.CourseUnitRealizationId);
AddNonEmpty(body, "cycleRealizationId", request.CycleRealizationId);
AddNonEmpty(body, "specialtyCode", request.SpecialtyCode);
AddNonEmpty(body, "learningStartYear", request.LearningStartYear);
AddNonEmpty(body, "profileName", request.ProfileName);
AddNonEmpty(body, "curriculumId", request.CurriculumId);
AddNonEmpty(body, "typeId", request.TypeId);
return JsonSerializer.Serialize(body);
}
private static void AddNonEmpty<T>(
IDictionary<string, object?> body,
string key,
IReadOnlyList<T>? values)
{
if (values is { Count: > 0 })
body[key] = values;
}
private static string? GetHrefId(string? href)
{
if (string.IsNullOrWhiteSpace(href))