2024-03-12 15:09:12 +10:00
using AutoMapper ;
2024-03-27 11:13:52 +10:00
using FluentValidation ;
2024-03-12 15:09:12 +10:00
using Microsoft.AspNetCore.Authorization ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.EntityFrameworkCore ;
using PARR.API.Contracts.V1 ;
2024-03-27 11:13:52 +10:00
using PARR.API.Contracts.V1.Requests ;
2024-03-12 15:09:12 +10:00
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 ;
2024-03-27 11:13:52 +10:00
using PARR.API.Services.Interfaces ;
2024-03-12 15:09:12 +10:00
using PARR.Constants ;
using PARR.DAL.DomainModels ;
using PARR.DAL.Models ;
using PARR.DAL.Services.Interfaces ;
namespace PARR.API.Controllers.V1
{
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class ApplicationInWorkController : BaseApiController
{
2024-03-27 11:13:52 +10:00
private readonly ILogger < ApplicationInWorkController > logger ;
2024-03-12 15:09:12 +10:00
private readonly IMapper mapper ;
private readonly IApplicationsInWorkService applicationsInWorkService ;
2024-03-27 11:13:52 +10:00
private readonly IValidator < ApplicationInWorkRequest > validator ;
private readonly IUriService uriService ;
2024-03-12 15:09:12 +10:00
public ApplicationInWorkController (
2024-03-27 11:13:52 +10:00
ILogger < ApplicationInWorkController > logger ,
2024-03-12 15:09:12 +10:00
IMapper mapper ,
2024-03-27 11:13:52 +10:00
IApplicationsInWorkService applicationsInWorkService ,
IValidator < ApplicationInWorkRequest > validator ,
IUriService uriService
2024-03-12 15:09:12 +10:00
)
{
2024-03-27 11:13:52 +10:00
this . logger = logger ;
2024-03-12 15:09:12 +10:00
this . mapper = mapper ;
this . applicationsInWorkService = applicationsInWorkService ;
2024-03-27 11:13:52 +10:00
this . validator = validator ;
this . uriService = uriService ;
}
/// <summary>
2024-04-10 11:54:54 +10:00
/// Получить список заданий на выполнение работ(ApplicationInWork) постранично
/// </summary>
/// <returns></returns>
[HttpGet(ApiRoutes.Job.GetAll)]
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery , [ FromQuery ] ApplicationInWorkQuery filter )
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
IQueryable < ApplicationsInWork > query = applicationsInWorkService . Get ( )
. Include ( t = > t . Application ) . ThenInclude ( t = > t ! . ApplicationType )
. Include ( t = > t . Work )
. Include ( t = > t . Templates )
. OrderBy ( t = > t . ShortDescription ) ;
if ( ! string . IsNullOrEmpty ( filter . ShortDescription ) )
query = query . Where ( t = > t . ShortDescription . ToLower ( ) . Contains ( filter . ShortDescription . ToLower ( ) ) ) ;
var appInWorks = await applicationsInWorkService . GetPage ( query , paginationFilter ) . ToListAsync ( ) ;
if ( ! appInWorks . Any ( ) )
return NoContent ( ) ;
var response = mapper . Map < List < ApplicationInWorkResponse > > ( appInWorks ) ;
var paginationResponse = new PagedResponse < ApplicationInWorkResponse > ( response , true ) . GetPaginatedProps ( paginationFilter , query ) ;
return Ok ( paginationResponse ) ;
}
/// <summary>
/// Получить задание на выполнение работ по id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Job.Get)]
public async Task < IActionResult > GetById ( [ FromRoute ] Guid id )
{
var applicationInWork = await applicationsInWorkService . Get ( )
. Include ( t = > t . Application ) . ThenInclude ( t = > t ! . ApplicationType )
. Include ( t = > t . Work )
. Include ( t = > t . Templates )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( applicationInWork = = null )
return NotFound ( ) ;
var response = mapper . Map < ApplicationInWorkResponse > ( applicationInWork ) ;
return Ok ( new Response < ApplicationInWorkResponse > ( response , true ) ) ;
}
/// <summary>
/// Создать задание на выполнение работ (ApplicationInWork)
2024-03-27 11:13:52 +10:00
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Job.Create)]
public async Task < IActionResult > Create ( [ FromBody ] ApplicationInWorkRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
2024-04-17 09:07:46 +10:00
//уникальная запись по полям ApplicationId, WorkId
var existSameAiW = await applicationsInWorkService . GetAsync ( request . ApplicationId , request . WorkId ) ;
if ( existSameAiW ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Задание на выполнение работ с такими ПО и работой уже существует" } } ) ) ;
2024-03-27 11:13:52 +10:00
var applicationInWork = new ApplicationsInWork
{
Id = Guid . NewGuid ( ) ,
WorkId = request . WorkId ,
ApplicationId = request . ApplicationId ,
TemplateDuration = request . TemplateDuration ,
2024-04-18 16:03:04 +10:00
ShortDescription = request . ShortDescription . Trim ( ) ,
FullDescription = request . FullDescription . Trim ( ) ,
Solution = request . Solution . Trim ( ) ,
2024-03-27 11:13:52 +10:00
NextRun = request . NextRun ,
IsAgent = request . IsAgent ,
2024-04-18 16:03:04 +10:00
AgentName = request . AgentName ? . Trim ( ) ,
2024-03-27 11:13:52 +10:00
AgentTimeOutSec = request . AgentTimeOutSec ,
2024-04-18 16:03:04 +10:00
AgentScript = request . AgentScript ? . Trim ( )
2024-03-27 11:13:52 +10:00
} ;
2024-03-29 11:36:39 +10:00
//Добавляем настройки планировщика
2024-04-16 11:08:25 +10:00
request . Schedule . ForEach ( item = >
2024-03-29 11:36:39 +10:00
{
applicationInWork . EsppSchValues . Add ( new EsppSchValue
{
ApplicationsInWorkId = applicationInWork . Id ,
2024-04-16 11:08:25 +10:00
TypeConfigId = item . TypeConfigId ,
TypeValueId = item . TypeValueId
2024-03-29 11:36:39 +10:00
} ) ;
2024-04-16 11:08:25 +10:00
} ) ;
2024-03-28 16:21:22 +10:00
2024-03-27 11:13:52 +10:00
if ( ! await applicationsInWorkService . CreateAsync ( applicationInWork ) | | ! await applicationsInWorkService . CommitAsync ( ) )
2024-04-10 11:54:54 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } } ) ) ;
2024-03-27 11:13:52 +10:00
2024-04-10 11:54:54 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {applicationInWork.Id}, {applicationInWork.ShortDescription}, {applicationInWork.Solution}, {applicationInWork.NextRun}" ) ;
2024-03-27 11:13:52 +10:00
2024-04-10 11:54:54 +10:00
var createdApplicationInWork = await applicationsInWorkService . Get ( )
. Include ( t = > t . Application ) . ThenInclude ( t = > t ! . ApplicationType )
. Include ( t = > t . Work )
. Include ( t = > t . Templates )
. FirstAsync ( t = > t . Id = = applicationInWork . Id ) ;
2024-03-12 15:09:12 +10:00
2024-04-10 11:54:54 +10:00
var locationUri = uriService . GetUri ( ApiRoutes . Job . Get , ApiRoutes . Job . getParam , createdApplicationInWork . Id ) ;
2024-03-12 15:09:12 +10:00
2024-04-10 11:54:54 +10:00
return Created ( locationUri , new Response < ApplicationInWorkResponse > ( mapper . Map < ApplicationInWorkResponse > ( createdApplicationInWork ) , true ) ) ;
2024-03-12 15:09:12 +10:00
}
2024-03-27 11:44:15 +10:00
/// <summary>
2024-04-10 11:54:54 +10:00
/// Обновить задание на выполнение работ (ApplicationInWork)
2024-03-27 12:42:58 +10:00
/// </summary>
/// <param name="id"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpPut(ApiRoutes.Job.Update)]
public async Task < IActionResult > Update ( [ FromRoute ] Guid id , [ FromBody ] ApplicationInWorkRequest request )
{
var resultValidate = await validator . ValidateAsync ( request ) ;
if ( ! resultValidate . IsValid )
return BadRequest ( new Response ( resultValidate . Errors ) ) ;
2024-04-17 09:07:46 +10:00
//уникальная запись по полям ApplicationId, WorkId у которой id!=[FromRoute]id
var existSameAiW = await applicationsInWorkService . Get ( ) . FirstOrDefaultAsync ( t = > t . Id ! = id & & t . ApplicationId = = request . ApplicationId & & t . WorkId = = request . WorkId ) ;
if ( existSameAiW ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Задание на выполнение работ с такими ПО и работой уже существует" } } ) ) ;
2024-03-27 12:42:58 +10:00
var orig = await applicationsInWorkService . GetAsync ( id ) ;
if ( orig = = null )
2024-04-10 11:54:54 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = $"Ошибка при изменении задания на выполнение работ. Н е найдено задание с Id: {id}" } } ) ) ;
2024-03-27 12:42:58 +10:00
orig . WorkId = request . WorkId ;
orig . ApplicationId = request . ApplicationId ;
orig . TemplateDuration = request . TemplateDuration ;
2024-04-18 16:03:04 +10:00
orig . ShortDescription = request . ShortDescription . Trim ( ) ;
orig . FullDescription = request . FullDescription . Trim ( ) ;
orig . Solution = request . Solution . Trim ( ) ;
2024-03-27 12:42:58 +10:00
orig . NextRun = request . NextRun ;
orig . IsAgent = request . IsAgent ;
2024-04-18 16:03:04 +10:00
orig . AgentName = request . AgentName ? . Trim ( ) ;
2024-03-27 12:42:58 +10:00
orig . AgentTimeOutSec = request . AgentTimeOutSec ;
2024-04-18 16:03:04 +10:00
orig . AgentScript = request . AgentScript ? . Trim ( ) ;
2024-04-10 11:54:54 +10:00
orig . DateModified = DateTimeOffset . UtcNow ;
//обновляем планировщик
orig . EsppSchValues . Clear ( ) ;
request . Schedule . ForEach ( item = >
{
orig . EsppSchValues . Add ( new EsppSchValue
{
ApplicationsInWorkId = orig . Id ,
TypeConfigId = item . TypeConfigId ,
TypeValueId = item . TypeValueId
} ) ;
} ) ;
2024-03-27 12:42:58 +10:00
if ( ! await applicationsInWorkService . CommitAsync ( ) )
2024-04-10 11:54:54 +10:00
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при изменении задания на выполнение работ." } } ) ) ;
2024-03-27 12:42:58 +10:00
logger . LogInformation ( $"Пользователь {User.Identity?.Name} обновил задание на выполнение работ: {orig.Id}," +
$" {orig.WorkId}, {orig.ApplicationId}, {orig.TemplateDuration}, {orig.ShortDescription}," +
$" {orig.FullDescription}, {orig.Solution}, {orig.NextRun}, {orig.IsAgent}, {orig.AgentName}, {orig.AgentTimeOutSec}, {orig.AgentScript}" ) ;
2024-04-10 11:54:54 +10:00
var updatedApplicationInWork = await applicationsInWorkService . Get ( )
. Include ( t = > t . Application ) . ThenInclude ( t = > t ! . ApplicationType )
. Include ( t = > t . Work )
. Include ( t = > t . Templates )
. FirstAsync ( t = > t . Id = = orig . Id ) ;
return Ok ( new Response < ApplicationInWorkResponse > ( mapper . Map < ApplicationInWorkResponse > ( updatedApplicationInWork ) , true ) ) ;
2024-03-27 12:42:58 +10:00
}
2024-03-27 13:56:12 +10:00
/// <summary>
2024-04-10 11:54:54 +10:00
/// Удалить задание на выполнение работ (только если нет связанных шаблонов)
2024-03-27 13:56:12 +10:00
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
2024-04-10 11:54:54 +10:00
[HttpDelete(ApiRoutes.Job.Delete)]
public async Task < IActionResult > Delete ( [ FromRoute ] Guid id )
{
var applicationsInWork = await applicationsInWorkService . Get ( )
. Include ( t = > t . Templates )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( applicationsInWork = = null )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel {
Message = $"Ошибка при удалении задания на выполнение работ. Н е найдено задание на выполнение работ Id: {id}"
} } ) ) ;
if ( applicationsInWork . Templates . Any ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel {
Message = $"Ошибка при удалении задания на выполнение работ. С данным заданием связаны шаблоны: {applicationsInWork.Templates.Count()} шт."
} } ) ) ;
if ( ! applicationsInWorkService . Delete ( applicationsInWork ) | | ! await applicationsInWorkService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel {
Message = $"Ошибка при удалении задания на выполнение работ"
} } ) ) ;
logger . LogInformation ( $"Пользователь {User.Identity?.Name} удалил задание на выполнение работ: {applicationsInWork.Id},{applicationsInWork.WorkId}," +
$" {applicationsInWork.ApplicationId}, {applicationsInWork.TemplateDuration}, {applicationsInWork.ShortDescription}," +
$" {applicationsInWork.FullDescription}, {applicationsInWork.Solution}, {applicationsInWork.NextRun}, {applicationsInWork.IsAgent}," +
$" {applicationsInWork.AgentName}, {applicationsInWork.AgentTimeOutSec}, {applicationsInWork.AgentScript}" ) ;
return NoContent ( ) ;
}
2024-03-12 15:09:12 +10:00
}
}