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(); + } }