2023-09-15 16:32:46 +10:00
|
|
|
|
using AutoMapper;
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using PARR.API.Contracts.V1;
|
|
|
|
|
|
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;
|
2023-09-26 12:26:37 +10:00
|
|
|
|
using PARR.BLL.Helpers;
|
2023-09-15 16:32:46 +10:00
|
|
|
|
using PARR.DAL.Contracts;
|
|
|
|
|
|
using PARR.DAL.DomainModels;
|
|
|
|
|
|
using PARR.DAL.Models;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PARR.API.Controllers.V1
|
|
|
|
|
|
{
|
|
|
|
|
|
public class TemplateController : BaseApiController
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IMapper mapper;
|
|
|
|
|
|
private readonly ITemplateService templateService;
|
2023-10-04 12:00:43 +10:00
|
|
|
|
private readonly SettingsFromDb settingsFromDb;
|
2023-09-15 16:32:46 +10:00
|
|
|
|
|
|
|
|
|
|
public TemplateController(
|
|
|
|
|
|
IMapper mapper,
|
2023-10-04 12:00:43 +10:00
|
|
|
|
ITemplateService templateService,
|
|
|
|
|
|
SettingsFromDb settingsFromDb
|
2023-09-15 16:32:46 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.mapper = mapper;
|
|
|
|
|
|
this.templateService = templateService;
|
2023-10-04 12:00:43 +10:00
|
|
|
|
this.settingsFromDb = settingsFromDb;
|
2023-09-15 16:32:46 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Получить список всех шаблонов постранично
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="paginationQuery"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpGet(ApiRoutes.Template.GetAll)]
|
|
|
|
|
|
public async Task<IActionResult> GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] TemplateQuery filter)
|
|
|
|
|
|
{
|
|
|
|
|
|
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
|
|
|
|
|
|
|
2023-09-19 16:42:06 +10:00
|
|
|
|
IQueryable<Template> query = templateService.GetWithIncludes()
|
2023-09-26 12:26:37 +10:00
|
|
|
|
.OrderBy(t => t.Name)
|
|
|
|
|
|
.AsSplitQuery();
|
2023-09-15 16:32:46 +10:00
|
|
|
|
|
|
|
|
|
|
if (filter.StatusCode.HasValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (filter.StatusCode.Value)
|
|
|
|
|
|
{
|
2023-10-05 16:56:02 +10:00
|
|
|
|
case (int)TaskStatusEnum.Ok:
|
|
|
|
|
|
query = query.Where(t => t.StatusCode == (int)TaskStatusEnum.Ok);
|
2023-09-15 16:32:46 +10:00
|
|
|
|
break;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
case (int)TaskStatusEnum.Creating:
|
|
|
|
|
|
query = query.Where(t => t.StatusCode == (int)TaskStatusEnum.Creating);
|
2023-09-15 16:32:46 +10:00
|
|
|
|
break;
|
2023-10-05 16:56:02 +10:00
|
|
|
|
case (int)TaskStatusEnum.Updating:
|
|
|
|
|
|
query = query.Where(t => t.StatusCode == (int)TaskStatusEnum.Updating);
|
2023-09-15 16:32:46 +10:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-26 12:26:37 +10:00
|
|
|
|
if (!string.IsNullOrEmpty(filter.Mask))
|
|
|
|
|
|
query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(filter.Mask)));
|
|
|
|
|
|
|
2023-09-15 16:32:46 +10:00
|
|
|
|
var templates = await templateService.GetPage(query, paginationFilter).ToListAsync();
|
|
|
|
|
|
|
|
|
|
|
|
if (!templates.Any())
|
|
|
|
|
|
return NoContent();
|
|
|
|
|
|
|
|
|
|
|
|
var templateResponse = mapper.Map<List<TemplateResponse>>(templates);
|
|
|
|
|
|
var paginationResponse = new PagedResponse<TemplateResponse>(templateResponse, true).GetPaginatedProps(paginationFilter, query);
|
|
|
|
|
|
|
|
|
|
|
|
return Ok(paginationResponse);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Получить шаблон по id
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpGet(ApiRoutes.Template.Get)]
|
|
|
|
|
|
public async Task<IActionResult> GetById([FromRoute] Guid id)
|
|
|
|
|
|
{
|
2023-09-19 16:42:06 +10:00
|
|
|
|
var template = await templateService.GetWithIncludes()
|
|
|
|
|
|
.AsSplitQuery()
|
|
|
|
|
|
.FirstOrDefaultAsync(t => t.Id == id);
|
2023-09-15 16:32:46 +10:00
|
|
|
|
|
|
|
|
|
|
if (template == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
|
|
|
|
|
var response = mapper.Map<TemplateResponse>(template);
|
|
|
|
|
|
|
|
|
|
|
|
return Ok(new Response<TemplateResponse>(response, true));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Получить один шаблон по заданному статусу
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="statusCode"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpGet(ApiRoutes.Template.GetByStatusCode)]
|
2023-09-18 12:08:40 +10:00
|
|
|
|
public async Task<IActionResult> GetByStatus([FromRoute] int statusCode, [FromQuery] RobinQuery query)
|
2023-09-15 16:32:46 +10:00
|
|
|
|
{
|
2023-10-03 16:54:01 +10:00
|
|
|
|
Template? template = null;
|
|
|
|
|
|
|
2023-10-04 12:00:43 +10:00
|
|
|
|
//1.Ищем `RobotStatusCode` = 22 и `RobotLastStatusUpdated` истекло и `RobotAttemptsNumber` >= допустимого значения из настроек,
|
|
|
|
|
|
//ставим всем этим записям `RobotStatusCode`= 33
|
|
|
|
|
|
//2.Поиск шаблонов со `StatusCode` 10 или 20 и `RobotStatusCode` = 11.Находим, **выбрали эту запись, конец**.
|
|
|
|
|
|
//3.Поиск шаблонов со `StatusCode` 10 или 20 и `RobotStatusCode` = 22.
|
|
|
|
|
|
//Далее проверяется `RobotLastStatusUpdated`, что время последнего смены статуса не превышает допустимого(берется из настроек, поле `RobotWaitTime`)
|
|
|
|
|
|
//и что текущая попытка не больше разрешенной(берется из настроек, поле `RobotAttemptsNumber`) - если это так, берется эта запись.
|
2023-10-03 16:54:01 +10:00
|
|
|
|
|
|
|
|
|
|
//1.
|
2023-10-04 12:00:43 +10:00
|
|
|
|
await templateService.CheckAndSetErrorRobotStatusAsync(settingsFromDb.RobotAttemptsNumber, settingsFromDb.RobotWaitTime);
|
2023-10-03 16:54:01 +10:00
|
|
|
|
|
|
|
|
|
|
|
2023-10-04 12:00:43 +10:00
|
|
|
|
//2.
|
|
|
|
|
|
template = await templateService.GetWithIncludes()
|
|
|
|
|
|
.AsSplitQuery()
|
|
|
|
|
|
.FirstOrDefaultAsync(t => t.StatusCode == statusCode && t.RobotStatusCode == (int)RobotStatusEnum.Wait);
|
2023-10-03 16:54:01 +10:00
|
|
|
|
|
2023-10-04 12:00:43 +10:00
|
|
|
|
//3.
|
|
|
|
|
|
if (template == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var endDate = DateTimeOffset.UtcNow.Add(-settingsFromDb.RobotWaitTime);
|
|
|
|
|
|
template = await templateService.GetWithIncludes()
|
|
|
|
|
|
.AsSplitQuery()
|
|
|
|
|
|
.FirstOrDefaultAsync(t =>
|
|
|
|
|
|
t.StatusCode == statusCode
|
|
|
|
|
|
&& t.RobotStatusCode == (int)RobotStatusEnum.InProgress
|
|
|
|
|
|
&& t.RobotAttemptsNumber < settingsFromDb.RobotAttemptsNumber
|
|
|
|
|
|
&& t.RobotLastStatusUpdated < endDate
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2023-10-03 16:54:01 +10:00
|
|
|
|
|
2023-09-15 16:32:46 +10:00
|
|
|
|
|
|
|
|
|
|
if (template == null)
|
|
|
|
|
|
return NotFound();
|
|
|
|
|
|
|
|
|
|
|
|
var response = mapper.Map<TemplateResponse>(template);
|
|
|
|
|
|
|
2023-09-20 09:13:46 +10:00
|
|
|
|
if (query.Robin == true)
|
2023-09-18 12:08:40 +10:00
|
|
|
|
{
|
|
|
|
|
|
var stringResponse = mapper.Map<TemplateStringResponse>(response);
|
|
|
|
|
|
return Ok(stringResponse);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-09-15 16:32:46 +10:00
|
|
|
|
return Ok(new Response<TemplateResponse>(response, true));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Установить статус ОК для шаблона с id
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="id"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[HttpPut(ApiRoutes.Template.SetOkStatus)]
|
|
|
|
|
|
public async Task<IActionResult> SetOkStatus([FromRoute] Guid id)
|
|
|
|
|
|
{
|
2023-09-19 16:42:06 +10:00
|
|
|
|
var template = await templateService.GetWithIncludes()
|
|
|
|
|
|
.AsSplitQuery()
|
|
|
|
|
|
.FirstOrDefaultAsync(t => t.Id == id);
|
2023-09-15 16:32:46 +10:00
|
|
|
|
|
|
|
|
|
|
if (template == null)
|
|
|
|
|
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Не найден шаблон с id: {id}" } }));
|
|
|
|
|
|
|
2023-10-05 16:56:02 +10:00
|
|
|
|
template.StatusCode = (int)TaskStatusEnum.Ok;
|
2023-09-15 16:32:46 +10:00
|
|
|
|
|
|
|
|
|
|
if (!await templateService.CommitAsync())
|
|
|
|
|
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении статуса у шаблона с id: {id}" } }));
|
|
|
|
|
|
|
|
|
|
|
|
var response = mapper.Map<TemplateResponse>(template);
|
|
|
|
|
|
|
|
|
|
|
|
return Ok(new Response<TemplateResponse>(response, true));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|