From 693acc4cbcdf66bb2cdd621c3b18df35e06cb580 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Wed, 3 Apr 2024 15:21:47 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20=D0=B2=20work=20getAll=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D1=80=20=D0=BF=D0=BE=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8.?= =?UTF-8?q?=20ApplicationController=20GetAll=20+=20filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 6 +- .../V1/Requests/Queries/ApplicationQuery.cs | 18 +++++ .../V1/Requests/Queries/WorkGetAllQuery.cs | 5 ++ .../Controllers/V1/ApplicationController.cs | 74 +++++++++++++++++++ PARR.API/Controllers/V1/WorkController.cs | 10 ++- 5 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 PARR.API/Contracts/V1/Requests/Queries/ApplicationQuery.cs create mode 100644 PARR.API/Controllers/V1/ApplicationController.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 21636611..f869c6c8 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -209,7 +209,6 @@ #endregion - #region Наряды public static class Order @@ -222,7 +221,6 @@ #endregion - #region TNK public static class Process @@ -298,6 +296,10 @@ } #endregion + public static class Application + { + public const string GetAll = Base + "/applications/"; + } public static class EkStatus { diff --git a/PARR.API/Contracts/V1/Requests/Queries/ApplicationQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/ApplicationQuery.cs new file mode 100644 index 00000000..0a395837 --- /dev/null +++ b/PARR.API/Contracts/V1/Requests/Queries/ApplicationQuery.cs @@ -0,0 +1,18 @@ +using PARR.DAL.Contracts; + +namespace PARR.API.Contracts.V1.Requests.Queries +{ + public class ApplicationQuery + { + /// + /// Поиск по имени. Например: "tomcat" + /// + public string? Name { get; set; } + + + /// + /// Поиск по типу: 0 - APP, 1 - OS, 2 - DB + /// + public ApplicationTypesEnum? Type { get; set; } + } +} diff --git a/PARR.API/Contracts/V1/Requests/Queries/WorkGetAllQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/WorkGetAllQuery.cs index 57f1fd1b..e6c82d2d 100644 --- a/PARR.API/Contracts/V1/Requests/Queries/WorkGetAllQuery.cs +++ b/PARR.API/Contracts/V1/Requests/Queries/WorkGetAllQuery.cs @@ -6,5 +6,10 @@ /// С иерархией до процесса /// public bool AllParents { get; set; } = false; + + /// + /// Поиск по имени. Например: "прочее" + /// + public string? Name { get; set; } } } diff --git a/PARR.API/Controllers/V1/ApplicationController.cs b/PARR.API/Controllers/V1/ApplicationController.cs new file mode 100644 index 00000000..3db63e5b --- /dev/null +++ b/PARR.API/Controllers/V1/ApplicationController.cs @@ -0,0 +1,74 @@ +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Cors.Infrastructure; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using PARR.API.Contracts.V1; +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.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 ApplicationController : BaseApiController + { + private readonly ILogger logger; + private readonly IMapper mapper; + private readonly IApplicationService applicationService; + + public ApplicationController( + ILogger logger, + IMapper mapper, + IApplicationService applicationService + ) + { + this.logger = logger; + this.mapper = mapper; + this.applicationService = applicationService; + } + + + /// + /// Список приложений постранично + /// + /// + /// + [HttpGet(ApiRoutes.Application.GetAll)] + public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] ApplicationQuery filter) + { + var paginationFilter = mapper.Map(paginationQuery); + + IQueryable query = applicationService.Get() + .Include(t => t.ApplicationType) + .OrderBy(t => t.Name); + + if (!string.IsNullOrWhiteSpace(filter.Name)) + query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower())); + + if (filter.Type.HasValue) + query = query.Where(t => t.ApplicationType!.Name == filter.Type.Value.ToString()); + + + var apps = await applicationService.GetPage(query, paginationFilter).ToListAsync(); + + if (!apps.Any()) + return NoContent(); + + var appsResponse = mapper.Map>(apps); + var paginationResponse = new PagedResponse(appsResponse, true).GetPaginatedProps(paginationFilter, query); + + return Ok(paginationResponse); + } + } +} diff --git a/PARR.API/Controllers/V1/WorkController.cs b/PARR.API/Controllers/V1/WorkController.cs index 01e3e724..c00e9fee 100644 --- a/PARR.API/Controllers/V1/WorkController.cs +++ b/PARR.API/Controllers/V1/WorkController.cs @@ -52,22 +52,26 @@ namespace PARR.API.Controllers.V1 /// /// [HttpGet(ApiRoutes.Work.GetAll)] - public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] WorkGetAllQuery requestQuery) + public async Task GetAll([FromQuery] PaginationQuery paginationQuery, [FromQuery] WorkGetAllQuery filter) { var paginationFilter = mapper.Map(paginationQuery); IQueryable query = workService.Get() .OrderBy(t => t.Name); - if (requestQuery.AllParents) + if (filter.AllParents) query = query.Include(t => t.Tnk).ThenInclude(s => s.Subprocess).ThenInclude(p => p.Process); + if (!string.IsNullOrWhiteSpace(filter.Name)) + query = query.Where(t => t.Name.ToLower().Contains(filter.Name.ToLower())); + + var works = await workService.GetPage(query, paginationFilter).ToListAsync(); if (!works.Any()) return NoContent(); - if (requestQuery.AllParents) + if (filter.AllParents) { //todo: тут бесконечность в маппинге // респонс с иерархией вверх до процесса