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

204 lines
8.2 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
{
/// <summary>
/// Управление работами
/// </summary>
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class WorkController : BaseApiController
{
private readonly ILogger<WorkController> logger;
private readonly IMapper mapper;
private readonly IWorkService workService;
private readonly IValidator<WorkRequest> validator;
private readonly IUriService uriService;
public WorkController(
ILogger<WorkController> logger,
IMapper mapper,
IWorkService workService,
IValidator<WorkRequest> validator,
IUriService uriService
)
{
this.logger = logger;
this.mapper = mapper;
this.workService = workService;
this.validator = validator;
this.uriService = uriService;
}
/// <summary>
/// Список видов работ постранично
/// </summary>
/// <param name="paginationQuery"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Work.GetAll)]
public async Task<IActionResult> GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] WorkGetAllQuery filter)
{
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
IQueryable<Work> query = workService.Get()
.OrderBy(t => t.Name);
if (filter.AllParents)
query = query.Include(t => t.Tnk).ThenInclude(s => s.Subprocess).ThenInclude(p => p.Process);
if (!string.IsNullOrWhiteSpace(filter.Name))
query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower()));
if (filter.Id.HasValue)
query = query.Where(t => t.Id == filter.Id);
var works = await workService.GetPage(query, paginationFilter).ToListAsync();
if (!works.Any())
return NoContent();
if (filter.AllParents)
{
//todo: тут бесконечность в маппинге
// респонс с иерархией вверх до процесса
var allResponse = mapper.Map<List<WorkWithTnkResponse>>(works);
var paginationAllResponse = new PagedResponse<WorkWithTnkResponse>(allResponse, true).GetPaginatedProps(paginationFilter, query);
return Ok(paginationAllResponse);
}
var workResponse = mapper.Map<List<WorkResponse>>(works);
var paginationResponse = new PagedResponse<WorkResponse>(workResponse, true).GetPaginatedProps(paginationFilter, query);
return Ok(paginationResponse);
}
/// <summary>
/// Создать вид работы
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Work.Create)]
public async Task<IActionResult> Create([FromBody] WorkRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existName = await workService.Get().FirstOrDefaultAsync(t => t.Name == request.Name);
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
var work = new Work
{
Id = Guid.NewGuid(),
Name = request.Name,
EsppId = request.EsppId,
TnkId = request.TnkId,
};
if (!await workService.CreateAsync(work) || !await workService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при создании вида работ." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил вид работ: {work.Name}, {work.EsppId}, {work.TnkId}");
var locationUri = uriService.GetUri(ApiRoutes.Work.Get, ApiRoutes.Work.getParam, work.Id);
return Created(locationUri, new Response<WorkResponse>(mapper.Map<WorkResponse>(work), true));
}
/// <summary>
/// Получить работу по id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Work.Get)]
public async Task<IActionResult> GetById([FromRoute] Guid id)
{
var work = await workService.Get()
.FirstOrDefaultAsync(t => t.Id == id);
if (work == null)
return NotFound();
var response = mapper.Map<WorkResponse>(work);
return Ok(new Response<WorkResponse>(response, true));
}
/// <summary>
/// Обновить вид работ
/// </summary>
/// <param name="id"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpPut(ApiRoutes.Work.Update)]
public async Task<IActionResult> Update([FromRoute] Guid id, [FromBody] WorkRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var orig = await workService.Get()
.FirstOrDefaultAsync(t => t.Id == id);
if (orig == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении вида работ. Не найдена работа Id: {id}" } }));
orig.Name = request.Name;
orig.EsppId = request.EsppId;
orig.TnkId = request.TnkId;
if (!await workService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка записи в базу данных изменений вида работ." } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} обновил работу: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.TnkId}");
return Ok(new Response<WorkResponse>(mapper.Map<WorkResponse>(orig), true));
}
/// <summary>
/// Удалить вид работ
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
//[HttpDelete(ApiRoutes.Work.Delete)]
//public async Task<IActionResult> Delete([FromRoute] Guid id)
//{
// var work = await workService.GetAsync(id);
// if (work == null)
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ. Не найдена работа, Id: {id}" } }));
// if (!workService.Delete(work) || !await workService.CommitAsync())
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}");
// return NoContent();
//}
}
}