fix: отображение количества участников лекции
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 11s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 6m5s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 29s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 9s
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 11s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 6m5s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 29s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 9s
This commit is contained in:
@@ -27,6 +27,9 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
try
|
||||
{
|
||||
var events = await _modeus.SearchEventsAsync(request);
|
||||
var embeddedRoomCapacityById = BuildRoomCapacityLookup(events.Embedded?.Rooms);
|
||||
IReadOnlyDictionary<string, int>? syncedRoomCapacityById = null;
|
||||
|
||||
foreach (var ev in events.EventItems)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(ev.Id) || string.IsNullOrWhiteSpace(ev.Name))
|
||||
@@ -41,8 +44,15 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
var courseExternalId = courseUnit?.Id ?? ev.TypeId ?? ev.Id;
|
||||
var courseName = courseUnit?.Name ?? ev.Name;
|
||||
var location = await UpsertEventLocationAsync(events, ev.Id);
|
||||
var maxEnrollments = events.Embedded?.EventTeams?
|
||||
.FirstOrDefault(team => team.EventId == ev.Id)?.Size ?? 0;
|
||||
var roomId = GetEventRoomId(events, ev.Id);
|
||||
var maxEnrollments = GetRoomCapacity(embeddedRoomCapacityById, roomId);
|
||||
if (maxEnrollments is null && !string.IsNullOrWhiteSpace(roomId))
|
||||
{
|
||||
syncedRoomCapacityById ??= await LoadRoomCapacityLookupAsync();
|
||||
maxEnrollments = GetRoomCapacity(syncedRoomCapacityById, roomId);
|
||||
}
|
||||
|
||||
var lectureCapacity = maxEnrollments ?? GetEventTeamSize(events, ev.Id) ?? 0;
|
||||
var startsAt = EnsureUtc(ev.StartsAt);
|
||||
var endsAt = EnsureUtc(ev.EndsAt);
|
||||
|
||||
@@ -54,7 +64,7 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
existing.StartsAt = startsAt;
|
||||
existing.EndsAt = endsAt;
|
||||
existing.LocationId = location?.Id;
|
||||
existing.MaxEnrollments = maxEnrollments;
|
||||
existing.MaxEnrollments = lectureCapacity;
|
||||
existing.UpdatedAt = DateTime.UtcNow;
|
||||
updated++;
|
||||
}
|
||||
@@ -77,7 +87,7 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
ExternalId = ev.Id,
|
||||
StartsAt = startsAt,
|
||||
EndsAt = endsAt,
|
||||
MaxEnrollments = maxEnrollments
|
||||
MaxEnrollments = lectureCapacity
|
||||
});
|
||||
created++;
|
||||
}
|
||||
@@ -182,14 +192,7 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
|
||||
private async Task<Location?> UpsertEventLocationAsync(ModeusEventsResponse events, string eventId)
|
||||
{
|
||||
var roomId = events.Embedded?.EventRooms?
|
||||
.Select(eventRoom => new
|
||||
{
|
||||
EventId = GetHrefId(eventRoom.Links?.Event?.Href),
|
||||
RoomId = GetHrefId(eventRoom.Links?.Room?.Href)
|
||||
})
|
||||
.FirstOrDefault(link => link.EventId == eventId)
|
||||
?.RoomId;
|
||||
var roomId = GetEventRoomId(events, eventId);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(roomId))
|
||||
return null;
|
||||
@@ -222,6 +225,55 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
return location;
|
||||
}
|
||||
|
||||
private static string? GetEventRoomId(ModeusEventsResponse events, string eventId) =>
|
||||
events.Embedded?.EventRooms?
|
||||
.Select(eventRoom => new
|
||||
{
|
||||
EventId = GetHrefId(eventRoom.Links?.Event?.Href),
|
||||
RoomId = GetHrefId(eventRoom.Links?.Room?.Href)
|
||||
})
|
||||
.FirstOrDefault(link => link.EventId == eventId)
|
||||
?.RoomId;
|
||||
|
||||
private async Task<IReadOnlyDictionary<string, int>> LoadRoomCapacityLookupAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var rooms = await _modeus.SearchRoomsAsync();
|
||||
return BuildRoomCapacityLookup(rooms.RoomItems);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogWarning(ex, "Could not load room capacities from Modeus rooms search.");
|
||||
return new Dictionary<string, int>();
|
||||
}
|
||||
}
|
||||
|
||||
private static IReadOnlyDictionary<string, int> BuildRoomCapacityLookup(IEnumerable<ModeusRoom>? rooms)
|
||||
{
|
||||
var result = new Dictionary<string, int>();
|
||||
foreach (var room in rooms ?? [])
|
||||
{
|
||||
var capacity = NormalizeCapacity(room.WorkingCapacity) ?? NormalizeCapacity(room.TotalCapacity);
|
||||
if (!string.IsNullOrWhiteSpace(room.Id) && capacity.HasValue)
|
||||
result.TryAdd(room.Id, capacity.Value);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int? GetRoomCapacity(IReadOnlyDictionary<string, int> roomCapacityById, string? roomId) =>
|
||||
!string.IsNullOrWhiteSpace(roomId) && roomCapacityById.TryGetValue(roomId, out var capacity)
|
||||
? capacity
|
||||
: null;
|
||||
|
||||
private static int? GetEventTeamSize(ModeusEventsResponse events, string eventId) =>
|
||||
NormalizeCapacity(events.Embedded?.EventTeams?
|
||||
.FirstOrDefault(team => team.EventId == eventId)?.Size);
|
||||
|
||||
private static int? NormalizeCapacity(int? capacity) =>
|
||||
capacity is > 0 ? capacity : null;
|
||||
|
||||
private static IReadOnlyList<string> BuildErrorDetails(
|
||||
Exception exception,
|
||||
string stage,
|
||||
|
||||
Reference in New Issue
Block a user