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.Core.Repositories.Interfaces; using PARR.Domain.Common.Pagination; using PARR.Domain.Common.Roles; using PARR.Domain.Entities; namespace PARR.API.Controllers.V1 { /// /// Управление ТНК /// [Authorize(Roles = ParrRoles.Administrator.Role)] public class TnkController : BaseApiController { private readonly ILogger logger; private readonly IMapper mapper; private readonly ITnkRepository tnkService; //private readonly IValidator validator; private readonly IUriService uriService; public TnkController( ILogger logger, IMapper mapper, ITnkRepository tnkService, //IValidator validator, IUriService uriService ) { this.logger = logger; this.mapper = mapper; this.tnkService = tnkService; //this.validator = validator; this.uriService = uriService; } /// /// Список ТНК постранично /// /// /// [HttpGet(ApiRoutes.Tnk.GetAll)] public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] TnkQuery filter) { var paginationFilter = mapper.Map(paginationQuery); IQueryable query = tnkService.Get() .OrderBy(t => t.Name); if (!string.IsNullOrEmpty(filter.Name)) query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower())); if (filter.SubprocessId.HasValue) query = query.Where(t => t.SubprocessId == filter.SubprocessId); var tnks = await tnkService.GetPage(query, paginationFilter).ToListAsync(); if (!tnks.Any()) return NoContent(); var tnkResponse = mapper.Map>(tnks); var paginationResponse = new PagedResponse(tnkResponse, true).GetPaginatedProps(paginationFilter, query); return Ok(paginationResponse); } /// /// Получить ТНК по id /// /// /// [HttpGet(ApiRoutes.Tnk.Get)] public async Task GetById([FromRoute] Guid id) { var tnk = await tnkService.Get() .FirstOrDefaultAsync(t => t.Id == id); if (tnk == null) return NotFound(); var response = mapper.Map(tnk); return Ok(new Response(response, true)); } /// /// Получить связанные с ТНК работы /// /// /// [HttpGet(ApiRoutes.Tnk.GetJobs)] public async Task Get([FromRoute] Guid id) { var tnk = await tnkService.Get() .Include(w => w.Jobs) .FirstOrDefaultAsync(t => t.Id == id); if (tnk == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не найдена ТНК с id: {id}" } })); var response = mapper.Map>(tnk.Jobs.OrderBy(t => t.Name).ToList()); return Ok(new Response>(response, true)); } /// /// Создать ТНК /// /// /// [HttpPost(ApiRoutes.Tnk.Create)] public async Task Create([FromBody] TnkRequest request) { //var resultValidate = await validator.ValidateAsync(request); //if (!resultValidate.IsValid) // return BadRequest(new Response(resultValidate.Errors)); var existName = await tnkService.Get().FirstOrDefaultAsync(t => t.Name.ToLower() == request.Name.Trim().ToLower()); if (existName != null) return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } })); //var existEsppId = await tnkService.Get().FirstOrDefaultAsync(t => t.EsppId == request.EsppId); //if (existEsppId != null) // return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"ТНК с EsppId: {request.EsppId} уже существует." } })); var tnk = new Tnk { Id = Guid.NewGuid(), Name = request.Name.Trim(), EsppId = request.EsppId, ShortName = request.ShortName?.Trim(), SubprocessId = request.SubprocessId }; if (!await tnkService.CreateAsync(tnk) || !await tnkService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка добавлении ТНК." } })); 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(mapper.Map(tnk), true)); } /// /// Обновить ТНК /// /// /// /// [HttpPut(ApiRoutes.Tnk.Update)] public async Task Update([FromRoute] Guid id, [FromBody] TnkRequest request) { //var resultValidate = await validator.ValidateAsync(request); //if (!resultValidate.IsValid) // return BadRequest(new Response(resultValidate.Errors)); ////проверка на уникальность 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 { new ErrorModel { FieldName = nameof(request.EsppId), Message = $"Уже есть ТНК с EsppId: {request.EsppId}" } })); var orig = await tnkService.Get() .FirstOrDefaultAsync(t => t.Id == id); if (orig == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при изменении ТНК." } })); orig.Name = request.Name.Trim(); orig.EsppId = request.EsppId; orig.SubprocessId = request.SubprocessId; orig.ShortName = request.ShortName?.Trim(); orig.DateModified = DateTimeOffset.UtcNow; if (!await tnkService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при изменении ТНК." } })); logger.LogInformation($"Пользователь {User.Identity?.Name} обновил ТНК: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.SubprocessId}"); return Ok(new Response(mapper.Map(orig), true)); } /// /// Удалить ТНК (если у него нет работ) /// /// /// [HttpDelete(ApiRoutes.Tnk.Delete)] public async Task Delete([FromRoute] Guid id) { var tnk = await tnkService.Get().Include(t => t.Jobs).FirstOrDefaultAsync(t => t.Id == id); if (tnk == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при удалении ТНК." } })); if (tnk.Jobs.Any()) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при удалении ТНК. У данного ТНК есть работы ({tnk.Jobs.Count()} шт.)" } })); if (!tnkService.Delete(tnk) || !await tnkService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при удалении ТНК." } })); logger.LogInformation($"Пользователь {User.Identity?.Name} удалил ТНК: {tnk.Id}, {tnk.Name}, {tnk.EsppId}, {tnk.SubprocessId}"); return NoContent(); } } }