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

224 lines
9.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
{
/// <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);
if (filter.TnkId.HasValue)
query = query.Where(t => t.TnkId == filter.TnkId.Value);
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>
/// Получить работу по 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="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.ToLower() == request.Name.Trim().ToLower());
if (existName != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } }));
var existEsppId = await workService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Вид работы с EsppId: {request.EsppId} уже существует." } }));
var work = new Work
{
Id = Guid.NewGuid(),
Name = request.Name.Trim(),
TemplateNameMask = request.TemplateNameMask,
EsppId = request.EsppId,
TnkId = request.TnkId,
TemplateSuffix = request.TemplateSuffix
};
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>
/// Обновить вид работ
/// </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));
//проверка на уникальность esppId
var existEsppId = await workService.Get().FirstOrDefaultAsync(t => t.Id != id && t.EsppId == request.EsppId);
if (existEsppId != null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть вид работ с EsppId: {request.EsppId}" } }));
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.Trim();
orig.TemplateNameMask = request.TemplateNameMask.Trim();
orig.EsppId = request.EsppId;
orig.TnkId = request.TnkId;
orig.DateModified = DateTimeOffset.UtcNow;
orig.TemplateSuffix = request.TemplateSuffix;
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>
/// Удалить вид работ (если у него нет заданий (AppInWork))
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete(ApiRoutes.Work.Delete)]
public async Task<IActionResult> Delete([FromRoute] Guid id)
{
var work = await workService.Get().Include(t => t.ApplicationsInWorks).FirstOrDefaultAsync(t => t.Id == id);
if (work == null)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ." } }));
if (work.ApplicationsInWorks.Any())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении вида работ. У данной работы есть задания ({work.ApplicationsInWorks.Count()} шт.)" } }));
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();
}
}
}