From 27b051a987d0444a0f9c02eca7b65fb5f4c1b9b4 Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Tue, 12 Mar 2024 15:09:12 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20paginationQuery=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D0=B3=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8.=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=BB=D0=B5=D1=80=20ApplicationInWorks=20GetAll.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 15 +++++ .../V1/Requests/Queries/PaginationQuery.cs | 5 ++ .../V1/Responses/ApplicationInWorkResponse.cs | 31 ++++++++++ .../V1/ApplicationInWorkController.cs | 62 +++++++++++++++++++ PARR.API/Extensions/PaginationExtensions.cs | 19 ++++-- .../DomainToResponseProfile.cs | 11 ++-- PARR.DAL/DomainModels/PaginationFilter.cs | 2 + PARR.DAL/Services/Abstracts/BaseService.cs | 4 ++ 8 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs create mode 100644 PARR.API/Controllers/V1/ApplicationInWorkController.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index d0436b9c..41e1d87d 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -283,6 +283,21 @@ namespace PARR.API.Contracts.V1 #endregion + + #region Job + /// + /// Альтернативная сущность AppliationInWork + /// + public static class Job + { + public const string GetAll = Base + "/jobs/"; + //public const string Get = Base + "/jobs/" + getParam; + + public const string getParam = "{id}"; + } + #endregion + + } } diff --git a/PARR.API/Contracts/V1/Requests/Queries/PaginationQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/PaginationQuery.cs index 13134fe6..6ac4e3f4 100644 --- a/PARR.API/Contracts/V1/Requests/Queries/PaginationQuery.cs +++ b/PARR.API/Contracts/V1/Requests/Queries/PaginationQuery.cs @@ -53,5 +53,10 @@ _pageSize = pageSizeDefault; } } + + /// + /// Выключить пагинацию + /// + public bool IsDisabledPagination { get; set; } = false; } } diff --git a/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs b/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs new file mode 100644 index 00000000..5b54af99 --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/ApplicationInWorkResponse.cs @@ -0,0 +1,31 @@ +namespace PARR.API.Contracts.V1.Responses +{ + public class ApplicationInWorkResponse + { + public Guid Id { get; set; } + + public required string TemplateDuration { get; set; } + + public required string ShortDescription { get; set; } + + public required string FullDescription { get; set; } + + public required string Solution { get; set; } + + public DateTimeOffset? LastRun { get; set; } + + public DateTimeOffset NextRun { get; set; } + + public bool IsAgent { get; set; } + + public string? AgentName { get; set; } + + public int? AgentTimeOutSec { get; set; } + + public string? AgentScript { get; set; } + + public WorkResponse? Work { get; set; } + + public ApplicationResponse? Application { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/ApplicationInWorkController.cs b/PARR.API/Controllers/V1/ApplicationInWorkController.cs new file mode 100644 index 00000000..7d70858e --- /dev/null +++ b/PARR.API/Controllers/V1/ApplicationInWorkController.cs @@ -0,0 +1,62 @@ +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +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 +{ + /// + /// ApplicationInWork + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class ApplicationInWorkController : BaseApiController + { + private readonly IMapper mapper; + private readonly IApplicationsInWorkService applicationsInWorkService; + + public ApplicationInWorkController( + IMapper mapper, + IApplicationsInWorkService applicationsInWorkService + ) + { + this.mapper = mapper; + this.applicationsInWorkService = applicationsInWorkService; + } + + + /// + /// Получить список регламентных работ(ApplicationInWork) + /// + /// + [HttpGet(ApiRoutes.Job.GetAll)] + public async Task GetAll([FromQuery] PaginationQuery paginationQuery) + { + var paginationFilter = mapper.Map(paginationQuery); + + IQueryable query = applicationsInWorkService.Get() + .Include(t => t.Application) + .Include(t => t.Work) + .OrderBy(t => t.ShortDescription); + + 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); + } + } +} diff --git a/PARR.API/Extensions/PaginationExtensions.cs b/PARR.API/Extensions/PaginationExtensions.cs index c96cb8e2..cf283d89 100644 --- a/PARR.API/Extensions/PaginationExtensions.cs +++ b/PARR.API/Extensions/PaginationExtensions.cs @@ -12,16 +12,16 @@ namespace PARR.API.Extensions /// /// /// - /// + /// /// public static PagedResponse GetPaginatedProps( this PagedResponse pagedResponse, PaginationFilter paginationFilter, - IQueryable quaryAllItemsApplyFilters + IQueryable queryAllItemsApplyFilters ) { // TODO: CountAsync - подумать и затолкать в Task - int totalItems = quaryAllItemsApplyFilters.Count();//.CountAsync().GetAwaiter().GetResult(); + int totalItems = queryAllItemsApplyFilters.Count();//.CountAsync().GetAwaiter().GetResult(); return CreatePaginatedResponse(totalItems, paginationFilter, pagedResponse); } @@ -46,8 +46,17 @@ namespace PARR.API.Extensions private static PagedResponse CreatePaginatedResponse(int totalItems, PaginationFilter paginationFilter, PagedResponse pagedResponse) { pagedResponse.TotalItems = totalItems; - pagedResponse.PageNumber = paginationFilter.PageNumber >= 1 ? paginationFilter.PageNumber : (int?)null; - pagedResponse.PageSize = paginationFilter.PageSize >= 1 ? paginationFilter.PageSize : (int?)null; + //pagedResponse.PageNumber = paginationFilter.PageNumber >= 1 ? paginationFilter.PageNumber : (int?)null; + //pagedResponse.PageSize = paginationFilter.PageSize >= 1 ? paginationFilter.PageSize : (int?)null; + + pagedResponse.PageNumber = paginationFilter.IsDisabledPagination + ? 1 + : (paginationFilter.PageNumber >= 1 ? paginationFilter.PageNumber : (int?)null); + + pagedResponse.PageSize = paginationFilter.IsDisabledPagination + ? totalItems + : (paginationFilter.PageSize >= 1 ? paginationFilter.PageSize : (int?)null); + pagedResponse.TotalPage = (pagedResponse.TotalItems.HasValue && pagedResponse.PageSize.HasValue) ? (int)Math.Ceiling(pagedResponse.TotalItems.Value / (double)pagedResponse.PageSize.Value) diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 100393e6..cee5f5ef 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -173,10 +173,9 @@ namespace PARR.API.MappingProfiles CreateMap(); CreateMap() - .ForMember(t => t.Date, o => o.MapFrom(s => s.DateCreated)) - .ForMember(t => t.Level, o => o.MapFrom(s => s.AgentHistoryLevel)) - .ForMember(t => t.TemplateName, o => o.MapFrom(s => s.Template!.Name)); - + .ForMember(d => d.Date, o => o.MapFrom(s => s.DateCreated)) + .ForMember(d => d.Level, o => o.MapFrom(s => s.AgentHistoryLevel)) + .ForMember(d => d.TemplateName, o => o.MapFrom(s => s.Template!.Name)); #region User @@ -208,6 +207,10 @@ namespace PARR.API.MappingProfiles #endregion + + CreateMap() + .ForMember(d => d.Work, o => o.MapFrom(s => s.Work)) + .ForMember(d => d.Application, o => o.MapFrom(s => s.Application)); } } } diff --git a/PARR.DAL/DomainModels/PaginationFilter.cs b/PARR.DAL/DomainModels/PaginationFilter.cs index fea6c55b..eec5364c 100644 --- a/PARR.DAL/DomainModels/PaginationFilter.cs +++ b/PARR.DAL/DomainModels/PaginationFilter.cs @@ -4,5 +4,7 @@ { public int PageNumber { get; set; } public int PageSize { get; set; } + + public bool IsDisabledPagination { get; set; } } } diff --git a/PARR.DAL/Services/Abstracts/BaseService.cs b/PARR.DAL/Services/Abstracts/BaseService.cs index b2820652..634e49c2 100644 --- a/PARR.DAL/Services/Abstracts/BaseService.cs +++ b/PARR.DAL/Services/Abstracts/BaseService.cs @@ -112,6 +112,10 @@ namespace PARR.DAL.Services.Abstracts public virtual IQueryable GetPage(IQueryable query, PaginationFilter paginationFilter) { + if (paginationFilter.IsDisabledPagination) + return query; + + int skip = (paginationFilter.PageNumber - 1) * paginationFilter.PageSize; return query.Skip(skip).Take(paginationFilter.PageSize);