2024-03-06 15:09:48 +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>
2024-03-06 15:56:52 +10:00
/// Управление подпроцессами
2024-03-06 15:09:48 +10:00
/// </summary>
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class SubprocessController : BaseApiController
{
private readonly ILogger < SubprocessController > logger ;
private readonly IMapper mapper ;
private readonly ISubprocessService subprocessService ;
private readonly IValidator < SubprocessRequest > validator ;
private readonly IUriService uriService ;
public SubprocessController (
ILogger < SubprocessController > logger ,
IMapper mapper ,
ISubprocessService subprocessService ,
IValidator < SubprocessRequest > validator ,
IUriService uriService
)
{
this . logger = logger ;
this . mapper = mapper ;
this . subprocessService = subprocessService ;
this . validator = validator ;
this . uriService = uriService ;
}
/// <summary>
/// Создать подпроцесс
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Subprocess.Create)]
public async Task < IActionResult > Create ( [ FromBody ] SubprocessRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
var existName = await subprocessService . 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 subprocess = new Subprocess
{
Id = Guid . NewGuid ( ) ,
Name = request . Name ,
EsppId = request . EsppId ,
ProcessId = request . ProcessId ,
} ;
if ( ! await subprocessService . CreateAsync ( subprocess ) | | ! await subprocessService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при записи нового подпроцесса в базу данных" } } ) ) ;
logger . LogInformation ( $"Пользователь {User.Identity?.Name} добавил подпроцесс: {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}" ) ;
var locationUri = uriService . GetUri ( ApiRoutes . Subprocess . Get , ApiRoutes . Subprocess . getParam , subprocess . Id ) ;
return Created ( locationUri , new Response < SubprocessResponse > ( mapper . Map < SubprocessResponse > ( subprocess ) , true ) ) ;
}
/// <summary>
/// Список подпроцессов постранично
/// </summary>
/// <param name="paginationQuery"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Subprocess.GetAll)]
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery )
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
IQueryable < Subprocess > query = subprocessService . Get ( )
. OrderBy ( t = > t . Name ) ;
var subprocesses = await subprocessService . GetPage ( query , paginationFilter ) . ToListAsync ( ) ;
if ( ! subprocesses . Any ( ) )
return NoContent ( ) ;
var subprocessesResponse = mapper . Map < List < SubprocessResponse > > ( subprocesses ) ;
var paginationResponse = new PagedResponse < SubprocessResponse > ( subprocessesResponse , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationResponse ) ;
}
/// <summary>
/// Получить подпроцесс по id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Subprocess.Get)]
public async Task < IActionResult > GetById ( [ FromRoute ] Guid id )
{
var subprocess = await subprocessService . Get ( )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( subprocess = = null )
return NotFound ( ) ;
var response = mapper . Map < SubprocessResponse > ( subprocess ) ;
return Ok ( new Response < SubprocessResponse > ( response , true ) ) ;
}
/// <summary>
/// Получить связанные с подпроцессом Т Н К
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Subprocess.GetTnks)]
public async Task < IActionResult > Get ( [ FromRoute ] Guid id )
{
var subprocess = await subprocessService . Get ( )
. Include ( t = > t . Tnks )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( subprocess = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Н е найден подпроцесс с id: {id}" } } ) ) ;
2024-03-06 15:56:52 +10:00
var response = mapper . Map < List < TnkResponse > > ( subprocess . Tnks . OrderBy ( t = > t . Name ) . ToList ( ) ) ;
2024-03-06 15:09:48 +10:00
2024-03-06 15:56:52 +10:00
return Ok ( new Response < List < TnkResponse > > ( response , true ) ) ;
2024-03-06 15:09:48 +10:00
}
/// <summary>
/// Обновить подпроцесс
/// </summary>
/// <param name="id"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpPut(ApiRoutes.Subprocess.Update)]
public async Task < IActionResult > Update ( [ FromRoute ] Guid id , [ FromBody ] SubprocessRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
var orig = await subprocessService . Get ( )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( orig = = null )
2024-03-06 15:56:52 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при изменении подпроцесса. Н е найден подпроцесс Id: {id}" } } ) ) ;
2024-03-06 15:09:48 +10:00
orig . Name = request . Name ;
orig . EsppId = request . EsppId ;
orig . ProcessId = request . ProcessId ;
if ( ! await subprocessService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка записи в базу данных изменений подпроцесса." } } ) ) ;
logger . LogInformation ( $"Пользователь {User.Identity?.Name} обновил подпроцесс: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.ProcessId}" ) ;
return Ok ( new Response < SubprocessResponse > ( mapper . Map < SubprocessResponse > ( orig ) , true ) ) ;
}
/// <summary>
/// Удалить подпроцесс
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
2024-03-06 16:06:07 +10:00
//[HttpDelete(ApiRoutes.Subprocess.Delete)]
//public async Task<IActionResult> Delete([FromRoute] Guid id)
//{
// var subprocess = await subprocessService.GetAsync(id);
2024-03-06 15:09:48 +10:00
2024-03-06 16:06:07 +10:00
// if (subprocess == null)
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса. Н е найден подпроцесс Id: {id}" } }));
2024-03-06 15:09:48 +10:00
2024-03-06 16:06:07 +10:00
// if (!subprocessService.Delete(subprocess) || !await subprocessService.CommitAsync())
// return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при удалении подпроцесса из базы данных" } }));
2024-03-06 15:09:48 +10:00
2024-03-06 16:06:07 +10:00
// logger.LogInformation($"Пользователь {User.Identity?.Name} удалил подпроцесс: {subprocess.Id}, {subprocess.Name}, {subprocess.EsppId}, {subprocess.ProcessId}");
2024-03-06 15:09:48 +10:00
2024-03-06 16:06:07 +10:00
// return NoContent();
//}
2024-03-06 15:09:48 +10:00
}
}