From 9bffaec6cf8bed1d3d222027611cddcf3131e9b2 Mon Sep 17 00:00:00 2001 From: Pavel Gnedov Date: Fri, 5 Apr 2024 18:55:13 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=B5=D0=BD=D0=B4=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D0=BD=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B8=D0=B7=20=D0=BA=D0=B5=D1=88=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * добавлен ендпоинт find-from-root - для рекурсивной загрузки подзадач от корневой задачи * добавлен ендпоинт find-from-merged-trees-and-query - для гибридной загрузки задач от корневых + с помощью find запроса для couchdb --- .../src/issues/issues.controller.ts | 16 +++++++ .../src/issues/issues.service.ts | 46 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/libs/event-emitter/src/issues/issues.controller.ts b/libs/event-emitter/src/issues/issues.controller.ts index 608f21e..48abec3 100644 --- a/libs/event-emitter/src/issues/issues.controller.ts +++ b/libs/event-emitter/src/issues/issues.controller.ts @@ -11,6 +11,22 @@ export class IssuesController { return await this.issuesService.find(params); } + @Get('find-from-root/:id') + async getIssuesFromRoot( + @Param('id') id: number, + ): Promise { + const rootIssue = await this.issuesService.getIssue(id); + const res = await this.issuesService.getIssuesFromRoot(rootIssue); + return res; + } + + @Post('find-from-merged-trees-and-query') + async findFromMergedTreesAndQuery( + @Body() params: any, + ): Promise { + return await this.issuesService.mergedTreesAndFind(params); + } + @Get(':id') async getIssue(@Param('id') id: number): Promise { return await this.issuesService.getIssue(id); diff --git a/libs/event-emitter/src/issues/issues.service.ts b/libs/event-emitter/src/issues/issues.service.ts index 2cc5ef1..8b03fbf 100644 --- a/libs/event-emitter/src/issues/issues.service.ts +++ b/libs/event-emitter/src/issues/issues.service.ts @@ -10,6 +10,7 @@ import nano from 'nano'; import { UNLIMITED } from '../consts/consts'; import { GetParentsHint } from '../utils/get-parents-hint'; import { TreeIssuesStore } from '../utils/tree-issues-store'; +import { FlatIssuesStore } from '../utils/flat-issues-store'; export const ISSUE_MEMORY_CACHE_LIFETIME = 30 * 1000; const ISSUE_MEMORY_CACHE_AUTOCLEAN_INTERVAL = 1000 * 60 * 5; @@ -18,6 +19,12 @@ export namespace IssuesServiceNs { export type IssuesLoader = ( ids: number[], ) => Promise>; + + export type TreesAndQuery = { + rootIds?: number[]; + rootIssues?: RedmineTypes.Issue[]; + query?: nano.MangoQuery; + }; } @Injectable() @@ -176,4 +183,43 @@ export class IssuesService { await treeIssuesStore.fillData(loader); return treeIssuesStore.getIssuesWithChildren(); } + + async getIssuesFromRoot( + rootIssue: RedmineTypes.Issue, + ): Promise { + const treeStore = new TreeIssuesStore(); + treeStore.setRootIssue(rootIssue); + const loader = this.createDynamicIssuesLoader(); + await treeStore.fillData(loader); + return treeStore.getFlatStore().getIssues(); + } + + async mergedTreesAndFind( + query: IssuesServiceNs.TreesAndQuery, + ): Promise { + const flatStore = new FlatIssuesStore(); + const loader = this.createDynamicIssuesLoader(); + if (query.query) { + const issues = await this.find(query.query); + issues.forEach((issue) => flatStore.push(issue)); + } + + const rootIssues = []; + if (query.rootIds) { + const issues = await this.getIssues(query.rootIds); + rootIssues.push(...issues); + } + if (query.rootIssues) { + rootIssues.push(...query.rootIssues); + } + for (let i = 0; i < rootIssues.length; i++) { + const rootIssue = rootIssues[i]; + const issues = await this.getIssuesFromRoot(rootIssue); + issues.forEach((issue) => flatStore.push(issue)); + } + + await flatStore.fillData(loader); + + return flatStore.getIssues(); + } }