2024-03-06 14:09:59 +10:00
using AutoMapper ;
using FluentValidation ;
using Microsoft.AspNetCore.Authorization ;
using Microsoft.AspNetCore.Mvc ;
2024-03-06 15:09:48 +10:00
using Microsoft.EntityFrameworkCore ;
2024-03-06 14:09:59 +10:00
using PARR.API.Contracts.V1 ;
using PARR.API.Contracts.V1.Requests ;
using PARR.API.Contracts.V1.Requests.Queries ;
using PARR.API.Contracts.V1.Responses ;
2024-03-06 15:09:48 +10:00
using PARR.API.Contracts.V1.Responses.Base ;
2024-03-06 14:09:59 +10:00
using PARR.API.Controllers.V1.Base ;
2024-03-06 15:09:48 +10:00
using PARR.API.Extensions ;
2024-03-06 14:09:59 +10:00
using PARR.API.Services.Interfaces ;
using PARR.Constants ;
using PARR.DAL.DomainModels ;
using PARR.DAL.Models ;
2024-03-06 15:09:48 +10:00
using PARR.DAL.Services.Interfaces ;
2024-03-06 14:09:59 +10:00
namespace PARR.API.Controllers.V1
{
/// <summary>
/// Управление Т Н К
/// </summary>
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class TnkController : BaseApiController
{
private readonly ILogger < TnkController > logger ;
private readonly IMapper mapper ;
private readonly ITnkService tnkService ;
private readonly IValidator < TnkRequest > validator ;
private readonly IUriService uriService ;
public TnkController (
ILogger < TnkController > logger ,
IMapper mapper ,
ITnkService tnkService ,
IValidator < TnkRequest > validator ,
IUriService uriService
)
{
this . logger = logger ;
this . mapper = mapper ;
this . tnkService = tnkService ;
this . validator = validator ;
this . uriService = uriService ;
}
/// <summary>
/// Список Т Н К постранично
/// </summary>
/// <param name="paginationQuery"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Tnk.GetAll)]
2024-05-16 11:58:56 +10:00
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery , [ FromQuery ] TnkQuery filter )
2024-03-06 14:09:59 +10:00
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
IQueryable < Tnk > query = tnkService . Get ( )
. OrderBy ( t = > t . Name ) ;
2025-09-11 16:45:33 +10:00
if ( ! string . IsNullOrEmpty ( filter . Name ) )
query = query . Where ( t = > t . Name . ToLower ( ) . Contains ( filter . Name . ToLower ( ) ) ) ;
2024-05-16 11:58:56 +10:00
if ( filter . SubprocessId . HasValue )
query = query . Where ( t = > t . SubprocessId = = filter . SubprocessId ) ;
2024-03-06 14:09:59 +10:00
var tnks = await tnkService . GetPage ( query , paginationFilter ) . ToListAsync ( ) ;
if ( ! tnks . Any ( ) )
return NoContent ( ) ;
var tnkResponse = mapper . Map < List < TnkResponse > > ( tnks ) ;
var paginationResponse = new PagedResponse < TnkResponse > ( tnkResponse , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationResponse ) ;
}
/// <summary>
/// Получить Т Н К по id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Tnk.Get)]
public async Task < IActionResult > GetById ( [ FromRoute ] Guid id )
{
var tnk = await tnkService . Get ( )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( tnk = = null )
return NotFound ( ) ;
var response = mapper . Map < TnkResponse > ( tnk ) ;
return Ok ( new Response < TnkResponse > ( response , true ) ) ;
}
/// <summary>
/// Получить связанные с Т Н К работы
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
2025-12-09 16:00:38 +10:00
[HttpGet(ApiRoutes.Tnk.GetJobs)]
2024-03-06 14:09:59 +10:00
public async Task < IActionResult > Get ( [ FromRoute ] Guid id )
{
var tnk = await tnkService . Get ( )
2025-12-09 16:00:38 +10:00
. Include ( w = > w . Jobs )
2024-03-06 14:09:59 +10:00
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( tnk = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Н е найдена Т Н К с id: {id}" } } ) ) ;
2025-12-09 16:00:38 +10:00
var response = mapper . Map < List < JobBaseResponse > > ( tnk . Jobs . OrderBy ( t = > t . Name ) . ToList ( ) ) ;
2024-03-06 14:09:59 +10:00
2025-12-09 16:00:38 +10:00
return Ok ( new Response < List < JobBaseResponse > > ( response , true ) ) ;
2024-03-06 14:09:59 +10:00
}
2024-05-16 11:58:56 +10:00
/// <summary>
/// Создать Т Н К
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Tnk.Create)]
public async Task < IActionResult > Create ( [ FromBody ] TnkRequest 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 tnkService . Get ( ) . FirstOrDefaultAsync ( t = > t . Name . ToLower ( ) = = request . Name . Trim ( ) . ToLower ( ) ) ;
2024-05-16 11:58:56 +10:00
if ( existName ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { FieldName = nameof ( request . Name ) , Message = $"Вид работы с именем \" { request . Name } \ " уже существует." } } ) ) ;
2025-12-09 10:25:41 +10:00
//var existEsppId = await tnkService.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-05-20 11:38:48 +10:00
2024-05-16 11:58:56 +10:00
var tnk = new Tnk
{
Id = Guid . NewGuid ( ) ,
2024-05-20 11:38:48 +10:00
Name = request . Name . Trim ( ) ,
2024-05-16 11:58:56 +10:00
EsppId = request . EsppId ,
2025-12-09 10:25:41 +10:00
ShortName = request . ShortName ? . Trim ( ) ,
SubprocessId = request . SubprocessId
2024-05-16 11:58:56 +10:00
} ;
if ( ! await tnkService . CreateAsync ( tnk ) | | ! await tnkService . CommitAsync ( ) )
2024-05-20 11:38:48 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка добавлении Т Н К ." } } ) ) ;
2024-05-16 11:58:56 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} добавил Т Н К : {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}" ) ;
var locationUri = uriService . GetUri ( ApiRoutes . Tnk . Get , ApiRoutes . Tnk . getParam , tnk . Id ) ;
return Created ( locationUri , new Response < TnkResponse > ( mapper . Map < TnkResponse > ( tnk ) , true ) ) ;
}
2024-03-06 14:09:59 +10:00
/// <summary>
/// Обновить Т Н К
/// </summary>
/// <param name="id"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpPut(ApiRoutes.Tnk.Update)]
public async Task < IActionResult > Update ( [ FromRoute ] Guid id , [ FromBody ] TnkRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
2025-12-09 10:25:41 +10:00
////проверка на уникальность esppId
//var existEsppId = await tnkService.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-05-20 11:38:48 +10:00
2024-03-06 14:09:59 +10:00
var orig = await tnkService . Get ( )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( orig = = null )
2024-05-20 11:38:48 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при изменении Т Н К ." } } ) ) ;
2024-03-06 14:09:59 +10:00
2024-05-20 11:38:48 +10:00
orig . Name = request . Name . Trim ( ) ;
2024-03-06 14:09:59 +10:00
orig . EsppId = request . EsppId ;
orig . SubprocessId = request . SubprocessId ;
2025-12-09 10:25:41 +10:00
orig . ShortName = request . ShortName ? . Trim ( ) ;
2024-05-20 14:56:24 +10:00
orig . DateModified = DateTimeOffset . UtcNow ;
2024-03-06 14:09:59 +10:00
if ( ! await tnkService . CommitAsync ( ) )
2024-05-20 11:38:48 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при изменении Т Н К ." } } ) ) ;
2024-03-06 14:09:59 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} обновил Т Н К : {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.SubprocessId}" ) ;
return Ok ( new Response < TnkResponse > ( mapper . Map < TnkResponse > ( orig ) , true ) ) ;
}
/// <summary>
2024-05-20 11:38:48 +10:00
/// Удалить Т Н К (если у него нет работ)
2024-03-06 14:09:59 +10:00
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
2024-05-20 11:38:48 +10:00
[HttpDelete(ApiRoutes.Tnk.Delete)]
public async Task < IActionResult > Delete ( [ FromRoute ] Guid id )
{
2025-12-09 16:00:38 +10:00
var tnk = await tnkService . Get ( ) . Include ( t = > t . Jobs ) . FirstOrDefaultAsync ( t = > t . Id = = id ) ;
2024-03-06 14:09:59 +10:00
2024-05-20 11:38:48 +10:00
if ( tnk = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении Т Н К ." } } ) ) ;
2025-12-09 16:00:38 +10:00
if ( tnk . Jobs . Any ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении Т Н К . У данного Т Н К есть работы ({tnk.Jobs.Count()} шт.)" } } ) ) ;
2024-03-06 14:09:59 +10:00
2024-05-20 11:38:48 +10:00
if ( ! tnkService . Delete ( tnk ) | | ! await tnkService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при удалении Т Н К ." } } ) ) ;
2024-03-06 14:09:59 +10:00
2024-05-20 11:38:48 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} удалил Т Н К : {tnk.Id}, {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}" ) ;
2024-03-06 14:09:59 +10:00
2024-05-20 11:38:48 +10:00
return NoContent ( ) ;
}
2024-03-06 14:09:59 +10:00
}
}