fix: синхронизации аудиторий
This commit is contained in:
@@ -29,9 +29,34 @@ public class ModeusApiClient : IModeusApiClient
|
||||
|
||||
public async Task<ModeusRoomsResponse> SearchRoomsAsync()
|
||||
{
|
||||
var response = await _http.PostAsJsonAsync("/api/proxy/rooms/search", new { });
|
||||
response.EnsureSuccessStatusCode();
|
||||
return await response.Content.ReadFromJsonAsync<ModeusRoomsResponse>() ?? new(new());
|
||||
const int pageSize = 100;
|
||||
var allRooms = new List<ModeusRoom>();
|
||||
var page = 0;
|
||||
var totalPages = 1;
|
||||
|
||||
do
|
||||
{
|
||||
var body = new
|
||||
{
|
||||
name = "",
|
||||
sort = "+building.name,+name",
|
||||
size = pageSize,
|
||||
page,
|
||||
deleted = false
|
||||
};
|
||||
|
||||
var response = await _http.PostAsJsonAsync("/api/proxy/rooms/search", body);
|
||||
response.EnsureSuccessStatusCode();
|
||||
|
||||
var payload = await response.Content.ReadFromJsonAsync<ModeusRoomsResponse>() ?? new ModeusRoomsResponse();
|
||||
allRooms.AddRange(payload.RoomItems);
|
||||
|
||||
totalPages = payload.Page?.TotalPages ?? page + 1;
|
||||
page++;
|
||||
}
|
||||
while (page < totalPages);
|
||||
|
||||
return new ModeusRoomsResponse { Rooms = allRooms };
|
||||
}
|
||||
|
||||
public async Task<List<ModeusEmployee>> SearchEmployeeAsync(string fullname)
|
||||
|
||||
@@ -53,16 +53,53 @@ public class ScheduleSyncService : IScheduleSyncService
|
||||
|
||||
public async Task<SyncResultDto> SyncRoomsAsync()
|
||||
{
|
||||
int created = 0, updated = 0;
|
||||
var rooms = await _modeus.SearchRoomsAsync();
|
||||
foreach (var room in rooms.Rooms)
|
||||
int created = 0, updated = 0, skipped = 0;
|
||||
try
|
||||
{
|
||||
var existing = await _db.Locations.FirstOrDefaultAsync(l => l.ExternalId == room.Id);
|
||||
if (existing != null) { existing.Name = room.Name; existing.Building = room.Building; updated++; }
|
||||
else { _db.Locations.Add(new Location { Name = room.Name, Building = room.Building, ExternalId = room.Id }); created++; }
|
||||
var rooms = await _modeus.SearchRoomsAsync();
|
||||
foreach (var room in rooms?.RoomItems ?? [])
|
||||
{
|
||||
if (room is null || string.IsNullOrWhiteSpace(room.Id) || string.IsNullOrWhiteSpace(room.Name))
|
||||
{
|
||||
skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
var existing = await _db.Locations.FirstOrDefaultAsync(l => l.ExternalId == room.Id);
|
||||
if (existing != null)
|
||||
{
|
||||
existing.Name = room.Name;
|
||||
existing.Room = room.NameShort;
|
||||
existing.Building = room.Building?.Name ?? room.Building?.NameShort;
|
||||
existing.Address = room.Building?.Address;
|
||||
updated++;
|
||||
}
|
||||
else
|
||||
{
|
||||
_db.Locations.Add(new Location
|
||||
{
|
||||
Name = room.Name,
|
||||
Room = room.NameShort,
|
||||
Building = room.Building?.Name ?? room.Building?.NameShort,
|
||||
Address = room.Building?.Address,
|
||||
ExternalId = room.Id
|
||||
});
|
||||
created++;
|
||||
}
|
||||
}
|
||||
|
||||
await _db.SaveChangesAsync();
|
||||
var result = new SyncResultDto(created, updated, skipped, null);
|
||||
_lastStatus = new SyncStatusDto(DateTime.UtcNow, "completed", result);
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Rooms sync failed");
|
||||
var result = new SyncResultDto(created, updated, skipped, ex.Message);
|
||||
_lastStatus = new SyncStatusDto(DateTime.UtcNow, "failed", result);
|
||||
return result;
|
||||
}
|
||||
await _db.SaveChangesAsync();
|
||||
return new SyncResultDto(created, updated, 0, null);
|
||||
}
|
||||
|
||||
public async Task<List<EmployeeDto>> SearchEmployeesAsync(string fullname)
|
||||
|
||||
Reference in New Issue
Block a user