Files
parr_api/PARR.API/Controllers/V1/TemplateController.cs

179 lines
7.7 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 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;
using PARR.BLL.Helpers;
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;
public TemplateController(
IMapper mapper,
ITemplateService templateService
)
{
this.mapper = mapper;
this.templateService = templateService;
}
/// <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);
IQueryable<Template> query = templateService.GetWithIncludes()
.OrderBy(t => t.Name)
.AsSplitQuery();
if (filter.StatusCode.HasValue)
{
switch (filter.StatusCode.Value)
{
case (int)StatusTemplateEnum.Ok:
query = query.Where(t => t.StatusCode == (int)StatusTemplateEnum.Ok);
break;
case (int)StatusTemplateEnum.Creating:
query = query.Where(t => t.StatusCode == (int)StatusTemplateEnum.Creating);
break;
case (int)StatusTemplateEnum.Updating:
query = query.Where(t => t.StatusCode == (int)StatusTemplateEnum.Updating);
break;
default:
break;
}
}
if (!string.IsNullOrEmpty(filter.Mask))
query = query.Where(t => EF.Functions.Like(t.Name.ToLower(), SqlHelpers.RegexToLike(filter.Mask)));
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)
{
var template = await templateService.GetWithIncludes()
.AsSplitQuery()
.FirstOrDefaultAsync(t => t.Id == id);
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)]
public async Task<IActionResult> GetByStatus([FromRoute] int statusCode, [FromQuery] RobinQuery query)
{
Template? template = null;
//1.Поиск шаблонов со `StatusCode` 10 или 20 и `RobotStatusCode` = 11.Находим, **выбрали эту запись, конец**.
//2.Поиск шаблонов со `StatusCode` 10 или 20 и `RobotStatusCode` = 22
//3.Далее проверяется `RobotLastStatusUpdated`, что время последнего смены статуса не превышает допустимого(берется из настроек, поле `RobotWaitTime`) и что текущая попытка не больше разрешенной(берется из настроек, поле `RobotAttemptsNumber`) - если это так, берется эта запись.
//4.Если `RobotStatusCode` = 22 и `RobotLastStatusUpdated` истекло и `RobotAttemptsNumber` >= допустимому, то ставим `RobotStatusCode`= 33
//1.
template = await templateService.GetWithIncludes()
.AsSplitQuery()
.FirstOrDefaultAsync(t => t.StatusCode == statusCode && t.RobotStatusCode ==(int)RobotStatusEnum.Wait);
//if (template == null)
//{
// // переходим к шагам 2,3
// template = await templateService.GetWithIncludes()
// .AsSplitQuery()
// //todo
// .FirstOrDefaultAsync(t => t.StatusCode == statusCode && t.RobotStatusCode == (int)RobotStatusEnum.InProgress);
//}
////Тут узкое место, так как возвращается первый, если будет много роботов, то будет возвращаться им один и тот же элемент.
////нужно вводить статус, что эл уже занят
// template = await templateService.GetWithIncludes()
// .AsSplitQuery()
// .FirstOrDefaultAsync(t => t.StatusCode == statusCode);
if (template == null)
return NotFound();
var response = mapper.Map<TemplateResponse>(template);
if (query.Robin == true)
{
var stringResponse = mapper.Map<TemplateStringResponse>(response);
return Ok(stringResponse);
}
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)
{
var template = await templateService.GetWithIncludes()
.AsSplitQuery()
.FirstOrDefaultAsync(t => t.Id == id);
if (template == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Не найден шаблон с id: {id}" } }));
template.StatusCode = (int)StatusTemplateEnum.Ok;
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));
}
}
}