Добавлены дополнительные ендпоинты для загрузки данных из кеша
* добавлен ендпоинт find-from-root - для рекурсивной загрузки подзадач от корневой задачи * добавлен ендпоинт find-from-merged-trees-and-query - для гибридной загрузки задач от корневых + с помощью find запроса для couchdb
This commit is contained in:
parent
6df04c8e6d
commit
9bffaec6cf
2 changed files with 62 additions and 0 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue