import { DynamicLoader } from '@app/event-emitter/configs/dynamic-loader'; import { RedmineEventsGateway } from '@app/event-emitter/events/redmine-events.gateway'; import { IssuesService } from '@app/event-emitter/issues/issues.service'; import { ListIssuesByFieldsWidgetService } from '@app/event-emitter/project-dashboard/widgets/list-issues-by-fields.widget.service'; import { ListIssuesByUsersLikeJiraWidgetService } from '@app/event-emitter/project-dashboard/widgets/list-issues-by-users-like-jira.widget.service'; import { ListIssuesByUsersWidgetService } from '@app/event-emitter/project-dashboard/widgets/list-issues-by-users.widget.service'; import { RootIssueSubTreesWidgetNs, RootIssueSubTreesWidgetService, } from '@app/event-emitter/project-dashboard/widgets/root-issue-subtrees.widget.service'; import { TreeIssuesStore } from '@app/event-emitter/utils/tree-issues-store'; import { Controller, Get, Logger, Param, Render } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { parse } from 'jsonc-parser'; import { IssuesByTagsWidgetService } from './widgets/issues-by-tags.widget.service'; @Controller('simple-kanban-board') export class SimpleKanbanBoardController { private logger = new Logger(SimpleKanbanBoardController.name); private path: string; constructor( private rootIssueSubTreesWidgetService: RootIssueSubTreesWidgetService, private dynamicLoader: DynamicLoader, private configService: ConfigService, private listIssuesByUsersWidgetService: ListIssuesByUsersWidgetService, private listIssuesByUsersLikeJiraWidgetService: ListIssuesByUsersLikeJiraWidgetService, private issuesByTagsWidgetService: IssuesByTagsWidgetService, private redmineEventsGateway: RedmineEventsGateway, private listIssuesByFieldsWidgetService: ListIssuesByFieldsWidgetService, private issuesService: IssuesService, ) { this.path = this.configService.get('simpleKanbanBoard.path'); } @Get('/tree/:name/raw') async getRawData(@Param('name') name: string): Promise { const cfg = this.dynamicLoader.load(name, { path: this.path, ext: 'jsonc', parser: parse, }); return await this.rootIssueSubTreesWidgetService.render(cfg); } @Get('/tree/:name') @Render('simple-kanban-board') async get(@Param('name') name: string): Promise { return await this.getRawData(name); } @Get('/tree/:name/refresh') async refreshTree(@Param('name') name: string): Promise { const cfg = this.dynamicLoader.load(name, { path: this.path, ext: 'jsonc', parser: parse, }); const rootIssue = await this.issuesService.getIssueFromCache( cfg.rootIssueId, ); const issues = await this.issuesService.getIssuesWithChildren(rootIssue); const issuesIds = issues.map((i) => i.id); this.logger.debug(`Issues for tree refresh - ${issuesIds}`); this.redmineEventsGateway.addIssues(issuesIds); return { success: true }; } @Get('/by-users/:name/raw') async getByUsersRawData(@Param('name') name: string): Promise { const cfg = this.dynamicLoader.load(name, { path: this.path, ext: 'jsonc', parser: parse, }); return await this.listIssuesByUsersWidgetService.render(cfg); } @Get('/by-users/:name') @Render('simple-kanban-board') async getByUsers(@Param('name') name: string): Promise { return await this.getByUsersRawData(name); } @Get('/by-users-like-jira/:name/raw') async getByUsersLikeJiraRawData(@Param('name') name: string): Promise { const cfg = this.dynamicLoader.load(name, { path: this.path, ext: 'jsonc', parser: parse, }); return await this.listIssuesByUsersLikeJiraWidgetService.render(cfg); } @Get('/by-users-like-jira/:name') @Render('simple-kanban-board') async getByUsersLikeJira(@Param('name') name: string): Promise { return await this.getByUsersLikeJiraRawData(name); } @Get('/by-tags/:name/raw') async getByTagsRawData(@Param('name') name: string): Promise { const cfg = this.dynamicLoader.load(name, { path: this.path, ext: 'jsonc', parser: parse, }); return await this.issuesByTagsWidgetService.render(cfg); } @Get('/by-tags/:name') @Render('simple-kanban-board') async getByTags(@Param('name') name: string): Promise { return await this.getByTagsRawData(name); } @Get('/by-fields/:name/raw') async getByFieldsRawData(@Param('name') name: string): Promise { const cfg = this.dynamicLoader.load(name, { path: this.path, ext: 'jsonc', parser: parse, }); return await this.listIssuesByFieldsWidgetService.render(cfg); } @Get('/by-fields/:name') @Render('simple-kanban-board') async getByFields(@Param('name') name: string): Promise { return await this.getByFieldsRawData(name); } }