2024-03-06 12:10:12 +10:00
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)]
2024-04-03 15:21:47 +10:00
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery , [ FromQuery ] WorkGetAllQuery filter )
2024-03-06 12:10:12 +10:00
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
IQueryable < Work > query = workService . Get ( )
. OrderBy ( t = > t . Name ) ;
2024-04-03 15:21:47 +10:00
if ( filter . AllParents )
2024-04-03 14:12:59 +10:00
query = query . Include ( t = > t . Tnk ) . ThenInclude ( s = > s . Subprocess ) . ThenInclude ( p = > p . Process ) ;
2024-04-03 15:21:47 +10:00
if ( ! string . IsNullOrWhiteSpace ( filter . Name ) )
query = query . Where ( t = > t . Name . ToLower ( ) . Contains ( filter . Name . ToLower ( ) ) ) ;
2024-04-03 16:07:41 +10:00
if ( filter . Id . HasValue )
query = query . Where ( t = > t . Id = = filter . Id ) ;
2024-05-16 11:58:56 +10:00
if ( filter . TnkId . HasValue )
query = query . Where ( t = > t . TnkId = = filter . TnkId . Value ) ;
2024-04-03 15:21:47 +10:00
2024-03-06 12:10:12 +10:00
var works = await workService . GetPage ( query , paginationFilter ) . ToListAsync ( ) ;
if ( ! works . Any ( ) )
return NoContent ( ) ;
2024-04-03 15:21:47 +10:00
if ( filter . AllParents )
2024-04-03 14:12:59 +10:00
{
//todo: тут бесконечность в маппинге
// респонс с иерархией вверх до процесса
var allResponse = mapper . Map < List < WorkWithTnkResponse > > ( works ) ;
var paginationAllResponse = new PagedResponse < WorkWithTnkResponse > ( allResponse , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationAllResponse ) ;
}
2024-03-06 12:10:12 +10:00
var workResponse = mapper . Map < List < WorkResponse > > ( works ) ;
var paginationResponse = new PagedResponse < WorkResponse > ( workResponse , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationResponse ) ;
}
2024-05-20 11:38:48 +10:00
/// <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 ) ) ;
}
2024-03-06 12:10:12 +10:00
/// <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 ) ) ;
2024-05-20 11:38:48 +10:00
var existName = await workService . Get ( ) . FirstOrDefaultAsync ( t = > t . Name . ToLower ( ) = = request . Name . Trim ( ) . ToLower ( ) ) ;
2024-03-06 12:10:12 +10:00
if ( existName ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { FieldName = nameof ( request . Name ) , Message = $"Вид работы с именем \" { request . Name } \ " уже существует." } } ) ) ;
2024-05-20 11:38:48 +10:00
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} уже существует." } } ) ) ;
2024-03-06 12:10:12 +10:00
var work = new Work
{
Id = Guid . NewGuid ( ) ,
2024-05-20 11:38:48 +10:00
Name = request . Name . Trim ( ) ,
2025-04-17 16:38:35 +10:00
TemplateNameMask = request . TemplateNameMask ,
2024-03-06 12:10:12 +10:00
EsppId = request . EsppId ,
TnkId = request . TnkId ,
2024-06-14 14:27:37 +10:00
TemplateSuffix = request . TemplateSuffix
2024-03-06 12:10:12 +10:00
} ;
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 ) ) ;
2024-05-20 11:38:48 +10:00
//проверка на уникальность 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}" } } ) ) ;
2024-03-06 12:10:12 +10:00
var orig = await workService . Get ( )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( orig = = null )
2024-03-06 14:09:59 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при изменении вида работ. Н е найдена работа Id: {id}" } } ) ) ;
2024-03-06 12:10:12 +10:00
2024-05-20 11:38:48 +10:00
orig . Name = request . Name . Trim ( ) ;
2025-04-17 16:38:35 +10:00
orig . TemplateNameMask = request . TemplateNameMask . Trim ( ) ;
2024-03-06 12:10:12 +10:00
orig . EsppId = request . EsppId ;
orig . TnkId = request . TnkId ;
2024-05-20 14:56:24 +10:00
orig . DateModified = DateTimeOffset . UtcNow ;
2024-06-14 14:27:37 +10:00
orig . TemplateSuffix = request . TemplateSuffix ;
2024-03-06 12:10:12 +10:00
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>
2024-05-20 11:38:48 +10:00
/// Удалить вид работ (если у него нет заданий (AppInWork))
2024-03-06 12:10:12 +10:00
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
2024-05-20 11:38:48 +10:00
[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 ) ;
2024-03-06 12:10:12 +10:00
2024-05-20 11:38:48 +10:00
if ( work = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении вида работ." } } ) ) ;
2024-03-06 12:10:12 +10:00
2024-05-20 11:38:48 +10:00
if ( work . ApplicationsInWorks . Any ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении вида работ. У данной работы есть задания ({work.ApplicationsInWorks.Count()} шт.)" } } ) ) ;
2024-03-06 12:10:12 +10:00
2024-05-20 11:38:48 +10:00
if ( ! workService . Delete ( work ) | | ! await workService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении вида работ." } } ) ) ;
2024-03-06 12:10:12 +10:00
2024-05-20 11:38:48 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}" ) ;
return NoContent ( ) ;
}
2024-03-06 12:10:12 +10:00
}
}