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
{
///
/// ApplicationInWork
///
[Authorize(Roles = ParrRoles.Administrator.Role)]
public class ApplicationInWorkController : BaseApiController
{
private readonly ILogger logger;
private readonly IMapper mapper;
private readonly IApplicationsInWorkService applicationsInWorkService;
private readonly IValidator validator;
private readonly IUriService uriService;
public ApplicationInWorkController(
ILogger logger,
IMapper mapper,
IApplicationsInWorkService applicationsInWorkService,
IValidator validator,
IUriService uriService
)
{
this.logger = logger;
this.mapper = mapper;
this.applicationsInWorkService = applicationsInWorkService;
this.validator = validator;
this.uriService = uriService;
}
///
/// Создать задание на выполнение работ(ApplicationInWork)
///
///
///
[HttpPost(ApiRoutes.Job.Create)]
public async Task Create([FromBody] ApplicationInWorkRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var existSameAiW = await applicationsInWorkService.GetAsync(request.ApplicationId, request.WorkId);
if (existSameAiW != null)
return BadRequest(new Response(false, new List {
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
};
//Добавляем настройки планировщика
foreach (var esppSchValue in request.Schedule.EsppSchValues)
{
applicationInWork.EsppSchValues.Add(new EsppSchValue
{
ApplicationsInWorkId = applicationInWork.Id,
TypeConfigId = esppSchValue.TypeConfigId,
TypeValueId = esppSchValue.TypeValueId
});
}
if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync())
return BadRequest(new Response(false, new List { 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(mapper.Map(applicationInWork), true));
}
///
/// Получить список заданий на выполнение работ(ApplicationInWork) постранично
///
///
[HttpGet(ApiRoutes.Job.GetAll)]
public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] ApplicationInWorkQuery filter)
{
var paginationFilter = mapper.Map(paginationQuery);
IQueryable query = applicationsInWorkService.Get()
.Include(t => t.Application)
.Include(t => t.Work)
.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>(appInWorks);
var paginationResponse = new PagedResponse(response, true).GetPaginatedProps(paginationFilter, query);
return Ok(paginationResponse);
}
///
/// Получить задание на выполнение работ по id
///
///
///
[HttpGet(ApiRoutes.Job.Get)]
public async Task GetById([FromRoute] Guid id)
{
var applicationInWork = await applicationsInWorkService.Get()
.Include(t => t.Application)
.Include(t => t.Work)
.FirstOrDefaultAsync(t => t.Id == id);
if (applicationInWork == null)
return NotFound();
var response = mapper.Map(applicationInWork);
return Ok(new Response(response, true));
}
///
/// Обновить задание на выполнение работ
///
///
///
///
[HttpPut(ApiRoutes.Job.Update)]
public async Task Update([FromRoute] Guid id, [FromBody] ApplicationInWorkRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var orig = await applicationsInWorkService.GetAsync(id);
if (orig == null)
return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при изменении задания на выполнение работ. Не найдено задание на выполнение работ Id: {id}" } }));
orig.WorkId = request.WorkId;
orig.ApplicationId = request.ApplicationId;
orig.TemplateDuration = request.TemplateDuration;
orig.ShortDescription = request.ShortDescription;
orig.FullDescription = request.FullDescription;
orig.Solution = request.Solution;
orig.NextRun = request.NextRun;
orig.IsAgent = request.IsAgent;
orig.AgentName = request.AgentName;
orig.AgentTimeOutSec = request.AgentTimeOutSec;
orig.AgentScript = request.AgentScript;
if (!await applicationsInWorkService.CommitAsync())
return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка записи в базу данных изменений задания на выполнение работ." } }));
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}");
return Ok(new Response(mapper.Map(orig), true));
}
///
/// Удалить задание на выполнение работ
///
///
///
//[HttpDelete(ApiRoutes.Job.Delete)]
//public async Task Delete([FromRoute] Guid id)
//{
// var applicationsInWork = await applicationsInWorkService.GetAsync(id);
// if (applicationsInWork == null)
// return BadRequest(new Response(false, new List { new ErrorModel {
// Message = $"Ошибка при удалении задания на выполнение работ. Не найдено задание на выполнение работ Id: {id}"
// } }));
// if (!applicationsInWorkService.Delete(applicationsInWork) || !await applicationsInWorkService.CommitAsync())
// return BadRequest(new Response(false, new List { 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();
//}
}
}