Files
parr_api/PARR.API/Controllers/V1/RobotHistoryController.cs
2024-07-23 09:15:35 +10:00

153 lines
6.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using FluentValidation;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests;
using PARR.API.Contracts.V1.Requests.Queries;
using PARR.API.Contracts.V1.Responses;
using PARR.API.Contracts.V1.Responses.Base;
using PARR.API.Controllers.V1.Base;
using PARR.API.Extensions;
using PARR.API.Services.Interfaces;
using PARR.Constants;
using PARR.DAL.DomainModels;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
namespace PARR.API.Controllers.V1
{
[Authorize(Roles = ParrRoles.EsppRobot.RoleOrAdmin)]
public class RobotHistoryController : BaseApiController
{
private readonly IValidator<RobotHistoryRequest> validator;
private readonly IMapper mapper;
private readonly IUriService uriService;
private readonly IRobotHistoryService robotHistoryService;
private readonly IRobotConfigurationService robotConfigurationService;
private readonly IClientService clientService;
private readonly IUserService userService;
public RobotHistoryController(
IValidator<RobotHistoryRequest> validator,
IMapper mapper,
IUriService uriService,
IRobotHistoryService robotHistoryService,
IRobotConfigurationService robotConfigurationService,
IClientService clientService,
IUserService userService
)
{
this.validator = validator;
this.mapper = mapper;
this.uriService = uriService;
this.robotHistoryService = robotHistoryService;
this.robotConfigurationService = robotConfigurationService;
this.clientService = clientService;
this.userService = userService;
}
/// <summary>
/// Просмотр истории работы робота
/// </summary>
/// <param name="paginationQuery"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.RobotHistory.GetAll)]
public async Task<IActionResult> GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] RobotHistoryQuery request)
{
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
IQueryable<RobotHistory> query = robotHistoryService.Get()
.Include(t => t.RobotConfiguration)
.ThenInclude(t => t!.Template)
.Include(t => t.RobotConfiguration)
.ThenInclude(t => t!.Robot)
.Include(t => t.RobotHistoryLevel)
.Include(t => t.StatusTask)
.OrderByDescending(t => t.DateCreated);
if (request.TemplateId.HasValue)
query = query.Where(t => t.RobotConfiguration!.TemplateId == request.TemplateId.Value);
if (request.RobotCode.HasValue)
query = query.Where(t => t.RobotConfiguration!.RobotCode == (int)request.RobotCode);
if (request.HistoryLevel.HasValue)
query = query.Where(t => t.HistoryLevel == (int)request.HistoryLevel);
var history = await robotHistoryService.GetPage(query, paginationFilter).ToListAsync();
if (!history.Any())
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 response = mapper.Map<List<RobotHistoryResponse>>(history);
response.ForEach(item =>
{
item.User = mapper.Map<UserBaseResponse>(users.FirstOrDefault(t => t.Ip == item.RobotIp));
});
var paginationResponse = new PagedResponse<RobotHistoryResponse>(response, true).GetPaginatedProps(paginationFilter, query);
return Ok(paginationResponse);
}
/// <summary>
/// Добавить историю работы робота
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.RobotHistory.Create)]
public async Task<IActionResult> Create([FromBody] RobotHistoryRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var config = await robotConfigurationService.GetAsync(request.TaskId);
if (config == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Не найдено задание с id: {request.TaskId}" } }));
var history = new RobotHistory
{
Id = Guid.NewGuid(),
HistoryLevel = (int)request.HistoryLevel,
RobotMessage = request.RobotMessage,
EsppMessage = request.EsppMessage,
TaskStatusCode = config.TaskStatusCode,
RobotConfigurationId = request.TaskId,
RobotIp = clientService.GetClientIp()?.ToString()
};
if (!await robotHistoryService.CreateAsync(history) || !await robotHistoryService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при добавлении записи в историю" } }));
var createdObj = await robotHistoryService.Get()
.Include(t => t.RobotConfiguration)
.ThenInclude(t => t!.Template)
.Include(t => t.RobotConfiguration)
.ThenInclude(t => t!.Robot)
.Include(t => t.RobotHistoryLevel)
.Include(t => t.StatusTask)
.FirstOrDefaultAsync(t => t.Id == history.Id);
var response = mapper.Map<RobotHistoryResponse>(createdObj);
response.User = mapper.Map<UserBaseResponse>(await userService.Get().FirstOrDefaultAsync(t => t.Ip == response.RobotIp));
//todo: createdUri
//var createdUri = uriService.GetAllUri(ApiRoutes.RobotTemplateHistory.GetAll) + $"?{nameof(RobotTemplateHistoryQuery.IdSeries)}={createdObj!.IdSeries}";
var createdUri = "";
return Created(createdUri, new Response<RobotHistoryResponse>(response, true));
}
}
}