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 { /// /// Управление работами /// [Authorize(Roles = ParrRoles.Administrator.Role)] public class WorkController : BaseApiController { private readonly ILogger logger; private readonly IMapper mapper; private readonly IWorkService workService; private readonly IValidator validator; private readonly IUriService uriService; public WorkController( ILogger logger, IMapper mapper, IWorkService workService, IValidator validator, IUriService uriService ) { this.logger = logger; this.mapper = mapper; this.workService = workService; this.validator = validator; this.uriService = uriService; } /// /// Список видов работ постранично /// /// /// [HttpGet(ApiRoutes.Work.GetAll)] public async Task GetAll([FromQuery] PaginationQuery paginationQuery) { var paginationFilter = mapper.Map(paginationQuery); IQueryable query = workService.Get() .OrderBy(t => t.Name); var works = await workService.GetPage(query, paginationFilter).ToListAsync(); if (!works.Any()) return NoContent(); var workResponse = mapper.Map>(works); var paginationResponse = new PagedResponse(workResponse, true).GetPaginatedProps(paginationFilter, query); return Ok(paginationResponse); } /// /// Создать вид работы /// /// /// [HttpPost(ApiRoutes.Work.Create)] public async Task Create([FromBody] WorkRequest request) { var resultValidate = await validator.ValidateAsync(request); if (!resultValidate.IsValid) return BadRequest(new Response(resultValidate.Errors)); var existName = await workService.Get().FirstOrDefaultAsync(t => t.Name == request.Name); if (existName != null) return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(request.Name), Message = $"Вид работы с именем \"{request.Name}\" уже существует." } })); var work = new Work { Id = Guid.NewGuid(), Name = request.Name, EsppId = request.EsppId, TnkId = request.TnkId, }; if (!await workService.CreateAsync(work) || !await workService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при создании вида работ." } })); logger.LogInformation($"Пользователь {User.Identity?.Name} добавил вид работ: {work.Name}, {work.EsppId}, {work.TnkId}"); var locationUri = uriService.GetUri(ApiRoutes.Work.Get, ApiRoutes.Work.getParam, work.Id); return Created(locationUri, new Response(mapper.Map(work), true)); } /// /// Получить работу по id /// /// /// [HttpGet(ApiRoutes.Work.Get)] public async Task GetById([FromRoute] Guid id) { var work = await workService.Get() .FirstOrDefaultAsync(t => t.Id == id); if (work == null) return NotFound(); var response = mapper.Map(work); return Ok(new Response(response, true)); } /// /// Обновить вид работ /// /// /// /// [HttpPut(ApiRoutes.Work.Update)] public async Task Update([FromRoute] Guid id, [FromBody] WorkRequest request) { var resultValidate = await validator.ValidateAsync(request); if (!resultValidate.IsValid) return BadRequest(new Response(resultValidate.Errors)); var orig = await workService.Get() .FirstOrDefaultAsync(t => t.Id == id); if (orig == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при изменении вида работ. Не найдена работа имющая Id {id}" } })); orig.Name = request.Name; orig.EsppId = request.EsppId; orig.TnkId = request.TnkId; if (!await workService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка записи в базу данных изменений вида работ." } })); logger.LogInformation($"Пользователь {User.Identity?.Name} обновил работу: {orig.Id}, {orig.Name}, {orig.EsppId}, {orig.TnkId}"); return Ok(new Response(mapper.Map(orig), true)); } /// /// Удалить вид работ /// /// /// [HttpDelete(ApiRoutes.Work.Delete)] public async Task Delete([FromRoute] Guid id) { var work = await workService.GetAsync(id); if (work == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при удалении вида работ. Не найдена работа с id: {id}" } })); if (!workService.Delete(work) || !await workService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при удалении вида работ." } })); logger.LogInformation($"Пользователь {User.Identity?.Name} удалил вид работ: {work.Id}, {work.Name}, {work.EsppId}, {work.TnkId}"); return NoContent(); } } }