diff --git a/PARR.API/Contracts/V1/Requests/Queries/RobotHistoryQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/RobotHistoryQuery.cs index d80113fd..36b21b21 100644 --- a/PARR.API/Contracts/V1/Requests/Queries/RobotHistoryQuery.cs +++ b/PARR.API/Contracts/V1/Requests/Queries/RobotHistoryQuery.cs @@ -2,22 +2,31 @@ namespace PARR.API.Contracts.V1.Requests.Queries { - public class RobotHistoryQuery + public record RobotHistoryQuery { /// /// Фильтр по ИД шаблона /// - public Guid? TemplateId { get; set; } + public Guid? TemplateId { get; init; } /// /// Фильтр по ИД робота /// - public RobotsEnum? RobotCode { get; set; } + public RobotsEnum? RobotCode { get; init; } /// /// Фильтр по уровню истории /// - public RobotHistoryLevelEnum? HistoryLevel { get; set; } + public RobotHistoryLevelEnum? HistoryLevel { get; init; } + /// + /// Дата начала + /// + public DateTimeOffset? DateFrom { get; init; } + + /// + /// Дата окончания + /// + public DateTimeOffset? DateTo { get; init; } } } diff --git a/PARR.API/Controllers/V1/RobotHistoryController.cs b/PARR.API/Controllers/V1/RobotHistoryController.cs index e47734e4..ce1a3090 100644 --- a/PARR.API/Controllers/V1/RobotHistoryController.cs +++ b/PARR.API/Controllers/V1/RobotHistoryController.cs @@ -62,6 +62,7 @@ namespace PARR.API.Controllers.V1 var paginationFilter = mapper.Map(paginationQuery); IQueryable query = robotHistoryService.Get() + .AsNoTracking() .Include(t => t.RobotConfiguration) .ThenInclude(t => t!.Template) .Include(t => t.RobotConfiguration) @@ -79,19 +80,38 @@ namespace PARR.API.Controllers.V1 if (request.HistoryLevel.HasValue) query = query.Where(t => t.HistoryLevel == (int)request.HistoryLevel); + if (request.DateFrom.HasValue) + { + var startDateUtc = request.DateFrom.Value.ToUniversalTime(); + query = query.Where(t => t.DateCreated >= startDateUtc); + } + + if (request.DateTo.HasValue) + { + var endDateUtc = request.DateTo.Value.ToUniversalTime(); + query = query.Where(t => t.DateCreated < endDateUtc); + } + var history = await robotHistoryService.GetPage(query, paginationFilter).ToListAsync(); - if (!history.Any()) + if (history.Count == 0) return NoContent(); var robotsIp = history.Where(t => !string.IsNullOrEmpty(t.RobotIp)).Select(t => t.RobotIp).Distinct().ToList(); - var users = await userService.Get().Where(t => robotsIp.Any(x => x == t.Ip)).Distinct().ToListAsync(); + var usersDictionary = await userService.Get() + .AsNoTracking() + .Where(t => robotsIp.Contains(t.Ip)) + .ToDictionaryAsync(t => t.Ip, t => t); var response = mapper.Map>(history); - response.ForEach(item => + foreach (var item in response) { - item.User = mapper.Map(users.FirstOrDefault(t => t.Ip == item.RobotIp)); - }); + if (!string.IsNullOrWhiteSpace(item.RobotIp) && usersDictionary.TryGetValue(item.RobotIp, out var user)) + { + item.User = mapper.Map(user); + } + } + var paginationResponse = new PagedResponse(response, true).GetPaginatedProps(paginationFilter, query); return Ok(paginationResponse);