From dcdfcdd396a839322240cc07013418ea1b788ba5 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Mon, 28 Sep 2026 06:37:48 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D0=BF=D0=BE=20?= =?UTF-8?q?title=20=D0=B2=20GET=20/api/request-types/lists=20(#24)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Позволяет искать партицию по заголовку списка SharePoint без вхождения на каждый тип заявки отдельно. Co-Authored-By: Claude Sonnet 5 --------- Co-authored-by: gorbenko.pavel Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/24 --- .../Controllers/RequestTypeListsController.cs | 8 ++++++-- .../ListPartitioning/ListPartitionService.cs | 15 ++++++++++++++- .../src/webparts/approvalAdmin/services/api.ts | 4 ++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/backend/Tnsu.ApprovalRoute.Api/Controllers/RequestTypeListsController.cs b/backend/Tnsu.ApprovalRoute.Api/Controllers/RequestTypeListsController.cs index 2e54a01..6a6314f 100644 --- a/backend/Tnsu.ApprovalRoute.Api/Controllers/RequestTypeListsController.cs +++ b/backend/Tnsu.ApprovalRoute.Api/Controllers/RequestTypeListsController.cs @@ -20,10 +20,14 @@ public sealed class RequestTypeListsController(ListPartitionService service) : C /// заявкам сразу во всех партициях (архив + текущая) любого типа, не нужно /// запрашивать серию по каждому типу отдельно. /// + /// + /// Необязательный фильтр по заголовку партиции (Title списка SharePoint), + /// без учёта регистра, по вхождению подстроки. + /// [HttpGet("lists")] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] - public async Task ListAll(CancellationToken ct) => - (await service.ListAllAsync(ct)).ToActionResult(); + public async Task ListAll([FromQuery] string? title, CancellationToken ct) => + (await service.ListAllAsync(title, ct)).ToActionResult(); /// Вся серия партиций одного типа заявок (архив + текущая), от первой к последней. [HttpGet("{requestTypeId:int}/lists")] diff --git a/backend/Tnsu.ApprovalRoute.Application/ListPartitioning/ListPartitionService.cs b/backend/Tnsu.ApprovalRoute.Application/ListPartitioning/ListPartitionService.cs index f7862c9..9a5c12a 100644 --- a/backend/Tnsu.ApprovalRoute.Application/ListPartitioning/ListPartitionService.cs +++ b/backend/Tnsu.ApprovalRoute.Application/ListPartitioning/ListPartitionService.cs @@ -78,7 +78,12 @@ public sealed class ListPartitionService( /// адресов один раз, а не по одному запросу на тип. Типы без настроенного /// списка SharePoint в ответ не попадают — искать там всё равно нечего. /// - public async Task>> ListAllAsync(CancellationToken cancellationToken) + /// + /// Необязательный фильтр по заголовку партиции (Title списка SharePoint), + /// без учёта регистра, по вхождению подстроки. null — фильтр не применяется. + /// + public async Task>> ListAllAsync( + string? title, CancellationToken cancellationToken) { var requestTypes = await db.RequestTypes .Where(x => x.ListId != null && x.SiteUrl != null) @@ -88,6 +93,14 @@ public sealed class ListPartitionService( foreach (var requestType in requestTypes) { var partitions = await BuildSeriesAsync(requestType, cancellationToken); + + if (!string.IsNullOrWhiteSpace(title)) + partitions = partitions + .Where(x => x.Title is not null && x.Title.Contains(title, StringComparison.OrdinalIgnoreCase)) + .ToList(); + + if (partitions.Count == 0) continue; + result.Add(new RequestTypeListSeriesDto(requestType.Id, partitions)); } diff --git a/frontend/src/webparts/approvalAdmin/services/api.ts b/frontend/src/webparts/approvalAdmin/services/api.ts index 05b04de..1c041f1 100644 --- a/frontend/src/webparts/approvalAdmin/services/api.ts +++ b/frontend/src/webparts/approvalAdmin/services/api.ts @@ -72,8 +72,8 @@ export class ApprovalRouteApi { // ListPartitionService.ListAllAsync) — для дашборда (счётчик партиций) и // портала, которому нужен весь список адресов разом, а не по одному запросу // на тип. - listsAll: (): Promise => - this.http.get('/api/request-types/lists'), + listsAll: (title?: string): Promise => + this.http.get('/api/request-types/lists', { title }), // Вся серия партиций ОДНОГО типа заявки (архив + текущая) — нужна экрану // редактирования заявок: заявка может лежать в любой из них, не только в