Добавлен data-loader для нового виджета на backend-е

This commit is contained in:
Pavel Gnedov 2025-02-07 19:11:46 +07:00
parent 20b70c5799
commit 77352a497b
4 changed files with 63 additions and 5 deletions

View file

@ -119,11 +119,19 @@ export class RedmineDataLoader {
skip_empty_lines: true,
};
}
const resp = await fetch(urlQuery, {
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 {

View file

@ -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 {

View file

@ -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));
}

View file

@ -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<any, any, any>
{
isMyConfig(): boolean {
return true;
}
async load(
dataLoaderParams: any,
dashboardParams: any,
dashboardId: string,
widgetId: string,
): Promise<Result<any, AppError>> {
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);
}
}