Добавлены дополнительные ендпоинты для загрузки данных из кеша

* добавлен ендпоинт find-from-root - для рекурсивной загрузки подзадач от корневой задачи
* добавлен ендпоинт find-from-merged-trees-and-query - для гибридной загрузки задач от корневых + с помощью find запроса для couchdb
This commit is contained in:
Pavel Gnedov 2024-04-05 18:55:13 +07:00
parent 6df04c8e6d
commit 9bffaec6cf
2 changed files with 62 additions and 0 deletions

View file

@ -11,6 +11,22 @@ export class IssuesController {
return await this.issuesService.find(params); return await this.issuesService.find(params);
} }
@Get('find-from-root/:id')
async getIssuesFromRoot(
@Param('id') id: number,
): Promise<RedmineTypes.Issue[]> {
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<RedmineTypes.Issue[]> {
return await this.issuesService.mergedTreesAndFind(params);
}
@Get(':id') @Get(':id')
async getIssue(@Param('id') id: number): Promise<RedmineTypes.Issue> { async getIssue(@Param('id') id: number): Promise<RedmineTypes.Issue> {
return await this.issuesService.getIssue(id); return await this.issuesService.getIssue(id);

View file

@ -10,6 +10,7 @@ import nano from 'nano';
import { UNLIMITED } from '../consts/consts'; import { UNLIMITED } from '../consts/consts';
import { GetParentsHint } from '../utils/get-parents-hint'; import { GetParentsHint } from '../utils/get-parents-hint';
import { TreeIssuesStore } from '../utils/tree-issues-store'; import { TreeIssuesStore } from '../utils/tree-issues-store';
import { FlatIssuesStore } from '../utils/flat-issues-store';
export const ISSUE_MEMORY_CACHE_LIFETIME = 30 * 1000; export const ISSUE_MEMORY_CACHE_LIFETIME = 30 * 1000;
const ISSUE_MEMORY_CACHE_AUTOCLEAN_INTERVAL = 1000 * 60 * 5; const ISSUE_MEMORY_CACHE_AUTOCLEAN_INTERVAL = 1000 * 60 * 5;
@ -18,6 +19,12 @@ export namespace IssuesServiceNs {
export type IssuesLoader = ( export type IssuesLoader = (
ids: number[], ids: number[],
) => Promise<Record<number, RedmineTypes.Issue | null>>; ) => Promise<Record<number, RedmineTypes.Issue | null>>;
export type TreesAndQuery = {
rootIds?: number[];
rootIssues?: RedmineTypes.Issue[];
query?: nano.MangoQuery;
};
} }
@Injectable() @Injectable()
@ -176,4 +183,43 @@ export class IssuesService {
await treeIssuesStore.fillData(loader); await treeIssuesStore.fillData(loader);
return treeIssuesStore.getIssuesWithChildren(); return treeIssuesStore.getIssuesWithChildren();
} }
async getIssuesFromRoot(
rootIssue: RedmineTypes.Issue,
): Promise<RedmineTypes.Issue[]> {
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<RedmineTypes.Issue[]> {
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();
}
} }