diff --git a/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts b/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts index 320001b..7992e6f 100644 --- a/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts +++ b/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts @@ -119,11 +119,19 @@ export class RedmineDataLoader { skip_empty_lines: true, }; } - const resp = await fetch(urlQuery, { - headers: { - 'X-Redmine-API-Key': this.redmineToken, - }, - }); + let resp; + try { + resp = await fetch(urlQuery, { + headers: { + 'X-Redmine-API-Key': this.redmineToken, + }, + }); + } catch (err) { + this.logger.error( + `Failed to fetch data from Redmine by url ${urlQuery}: ${err}`, + ); + return null; + } const rawData = await resp.text(); let res; try { diff --git a/src/app.module.ts b/src/app.module.ts index c784480..08c1510 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -57,6 +57,7 @@ import { TelegramBotController } from './telegram-bot/telegram-bot.controller'; import { DailyEccmV2ReportTaskRunnerService } from './reports/daily-eccm-v2-report-task-runner.service'; import { DashboardsService } from '@app/event-emitter/dashboards/dashboards.service'; import { DailyEccmReportsV2Datasource } from './couchdb-datasources/daily-eccm-reports-v2.datasource'; +import { DailyEccmReportsV2DataLoaderService } from './eccm-statistic/dashboards/widget-data-loader/daily-eccm-v2.widget-data-loader.service'; @Module({ imports: [ @@ -121,6 +122,7 @@ import { DailyEccmReportsV2Datasource } from './couchdb-datasources/daily-eccm-r DashboardsService, DailyEccmReportsV2Datasource, DailyEccmV2ReportTaskRunnerService, + DailyEccmReportsV2DataLoaderService, ], }) export class AppModule implements OnModuleInit { diff --git a/src/dashboards/dashboard-init.service.ts b/src/dashboards/dashboard-init.service.ts index cb3e7f1..a5daefe 100644 --- a/src/dashboards/dashboard-init.service.ts +++ b/src/dashboards/dashboard-init.service.ts @@ -2,11 +2,14 @@ import { Injectable } from '@nestjs/common'; import { WidgetsCollectionService } from '@app/event-emitter/dashboards/widgets-collection.service'; import { IssuesByTagsWidgetDataLoaderService } from './widget-data-loader/issues-by-tags.widget-data-loader.service'; import { createInteractiveWidget } from '@app/event-emitter/dashboards/interactive-widget-factory'; +import { DailyEccmReportsV2DataLoaderService } from 'src/eccm-statistic/dashboards/widget-data-loader/daily-eccm-v2.widget-data-loader.service'; +import { WIDGET_TYPE as DAILY_ECCM_V2_WIDGET_TYPE } from 'src/reports/daily-eccm-v2-report-task-runner.service'; @Injectable() export class DashboardInitService { constructor( private issuesByTagsWidgetDataLoaderService: IssuesByTagsWidgetDataLoaderService, + private dailyEccmReportsV2DataLoaderService: DailyEccmReportsV2DataLoaderService, private widgetsCollectionService: WidgetsCollectionService, ) {} @@ -20,6 +23,10 @@ export class DashboardInitService { this.issuesByTagsWidgetDataLoaderService, 'issues_list_by_tags', ), + createInteractiveWidget( + this.dailyEccmReportsV2DataLoaderService, + DAILY_ECCM_V2_WIDGET_TYPE, + ), ]; collection.forEach((w) => this.widgetsCollectionService.appendWidget(w)); } diff --git a/src/eccm-statistic/dashboards/widget-data-loader/daily-eccm-v2.widget-data-loader.service.ts b/src/eccm-statistic/dashboards/widget-data-loader/daily-eccm-v2.widget-data-loader.service.ts new file mode 100644 index 0000000..6393785 --- /dev/null +++ b/src/eccm-statistic/dashboards/widget-data-loader/daily-eccm-v2.widget-data-loader.service.ts @@ -0,0 +1,41 @@ +import { WidgetDataLoaderInterface } from '@app/event-emitter/dashboards/widget-data-loader-interface'; +import { + AppError, + createAppError, + fail, + Result, + success, +} from '@app/event-emitter/utils/result'; +import { Injectable } from '@nestjs/common'; +import { DailyEccmReportsV2Datasource } from 'src/couchdb-datasources/daily-eccm-reports-v2.datasource'; + +@Injectable() +export class DailyEccmReportsV2DataLoaderService + implements WidgetDataLoaderInterface +{ + isMyConfig(): boolean { + return true; + } + + async load( + dataLoaderParams: any, + dashboardParams: any, + dashboardId: string, + widgetId: string, + ): Promise> { + const ds = await DailyEccmReportsV2Datasource.getDatasource(); + const response = await ds.find({ + selector: { + dashboardId: dashboardId, + widgetId: widgetId, + latest: true, + }, + limit: 1, + }); + const data = response.docs[0]; + if (!data) { + return fail(createAppError('No data found')); + } + return success(data); + } +}