Files
parr_api/PARR.API/Controllers/V1/TemplateController.cs
Mikhail Trubnikov a8c015ce7b Template Response
2023-09-19 16:42:06 +10:00

155 lines
5.9 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.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;
private readonly SettingsFromDb settingsFromDb;
public TemplateController(
IMapper mapper,
ITemplateService templateService,
SettingsFromDb settingsFromDb
)
{
this.mapper = mapper;
this.templateService = templateService;
this.settingsFromDb = settingsFromDb;
}
/// <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;
}
}
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)
{
//Тут узкое место, так как возвращается первый, елси будет много роботов, то будет возвращаться им один и тот же элемент.
//нужно вводить статус, что эл уже занят
var template = await templateService.GetWithIncludes()
.AsSplitQuery()
.FirstOrDefaultAsync(t => t.StatusCode == statusCode);
if (template == null)
return NotFound();
var response = mapper.Map<TemplateResponse>(template);
if (query.String == 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));
}
}
}