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
{
/// <summary>
/// ApplicationInWork
/// </summary>
[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>
/// Создать задание на выполнение работ(ApplicationInWork)
/// </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-03-27 11:44:15 +10:00
var existSameAiW = await applicationsInWorkService . GetAsync ( request . ApplicationId , request . WorkId ) ;
2024-03-27 11:13:52 +10:00
if ( existSameAiW ! = null )
return BadRequest ( new Response ( false , new List < ErrorModel > {
new ErrorModel { Message = $"Уже существует задание на выполнение работ для программного обеспечения id(\" { request . ApplicationId } \ ") и работой id({request.WorkId})." } }
) ) ;
var applicationInWork = new ApplicationsInWork
{
Id = Guid . NewGuid ( ) ,
WorkId = request . WorkId ,
ApplicationId = request . ApplicationId ,
TemplateDuration = request . TemplateDuration ,
ShortDescription = request . ShortDescription ,
FullDescription = request . FullDescription ,
Solution = request . Solution ,
NextRun = request . NextRun ,
IsAgent = request . IsAgent ,
AgentName = request . AgentName ,
AgentTimeOutSec = request . AgentTimeOutSec ,
AgentScript = request . AgentScript
} ;
if ( ! await applicationsInWorkService . CreateAsync ( applicationInWork ) | | ! await applicationsInWorkService . CommitAsync ( ) )
return BadRequest ( new Response ( false , new List < ErrorModel > { new ErrorModel { Message = "Ошибка при записи нового задания на выполнение работ в базу данных" } } ) ) ;
logger . LogInformation ( $"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {applicationInWork.ShortDescription}, {applicationInWork.Solution}, {applicationInWork.NextRun}" ) ;
var locationUri = uriService . GetUri ( ApiRoutes . Job . Get , ApiRoutes . Job . getParam , applicationInWork . Id ) ;
return Created ( locationUri , new Response < ApplicationInWorkResponse > ( mapper . Map < ApplicationInWorkResponse > ( applicationInWork ) , true ) ) ;
2024-03-12 15:09:12 +10:00
}
/// <summary>
2024-03-27 11:44:15 +10:00
/// Получить список заданий на выполнение работ(ApplicationInWork) постранично
2024-03-12 15:09:12 +10:00
/// </summary>
/// <returns></returns>
[HttpGet(ApiRoutes.Job.GetAll)]
2024-03-12 16:01:55 +10:00
public async Task < IActionResult > GetAll ( [ FromQuery ] PaginationQuery paginationQuery , [ FromQuery ] ApplicationInWorkQuery filter )
2024-03-12 15:09:12 +10:00
{
var paginationFilter = mapper . Map < PaginationFilter > ( paginationQuery ) ;
IQueryable < ApplicationsInWork > query = applicationsInWorkService . Get ( )
. Include ( t = > t . Application )
. Include ( t = > t . Work )
. OrderBy ( t = > t . ShortDescription ) ;
2024-03-12 16:01:55 +10:00
if ( ! string . IsNullOrEmpty ( filter . ShortDescription ) )
query = query . Where ( t = > t . ShortDescription . ToLower ( ) . Contains ( filter . ShortDescription . ToLower ( ) ) ) ;
2024-03-12 15:09:12 +10:00
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 ) ;
}
2024-03-27 11:44:15 +10:00
/// <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 ( )
. FirstOrDefaultAsync ( t = > t . Id = = id ) ;
if ( applicationInWork = = null )
return NotFound ( ) ;
var response = mapper . Map < ApplicationInWorkResponse > ( applicationInWork ) ;
return Ok ( new Response < ApplicationInWorkResponse > ( response , true ) ) ;
}
2024-03-12 15:09:12 +10:00
}
}