pinkmine/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts

71 lines
2.4 KiB
TypeScript

import axios from 'axios';
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { RedmineTypes } from '../models/redmine-types';
import { EnhancerService } from '../issue-enhancers/enhancer.service';
@Injectable()
export class RedmineDataLoader {
urlPrefix: string;
private logger = new Logger(RedmineDataLoader.name);
constructor(
private configService: ConfigService,
private enhancerService: EnhancerService,
) {
this.urlPrefix = this.configService.get<string>('redmineUrlPrefix');
}
async loadIssues(issues: number[]): Promise<(RedmineTypes.Issue | null)[]> {
const promises = issues.map((issue) => this.loadIssue(issue));
return Promise.all(promises);
}
async loadIssue(issueNumber: number): Promise<RedmineTypes.Issue | null> {
const url = this.getIssueUrl(issueNumber);
const resp = await axios.get(url);
if (!resp || !resp.data || !resp.data.issue) {
this.logger.error(
`Failed to load issue from redmine, issueNumber = ${issueNumber}`,
);
return null;
}
this.logger.debug(
`Loaded issue, issueNumber = ${issueNumber}, subject = ${resp.data.issue.subject}`,
);
return await this.enhancerService.enhanceIssue(resp.data.issue);
}
async loadUsers(users: number[]): Promise<(RedmineTypes.User | null)[]> {
const promises = users.map((user) => this.loadUser(user));
return Promise.all(promises);
}
async loadUser(userNumber: number): Promise<RedmineTypes.User | null> {
const url = this.getUserUrl(userNumber);
const resp = await axios.get(url);
if (!resp || !resp.data?.user) {
this.logger.error(
`Failed to load user from redmine, userNumber = ${userNumber}`,
);
return null;
}
const user: RedmineTypes.User = resp.data.user;
this.logger.debug(
`Loaded user, userNumber = ${userNumber}, login = ${user.login}, firstname = ${user.firstname}, lastname = ${user.lastname}`,
);
return RedmineTypes.CreateUser(user);
}
private getIssueUrl(issueNumber: number): string {
if (typeof this.urlPrefix !== 'string' || this.urlPrefix.length === 0) {
throw 'REDMINE_URL_PREFIX is undefined';
}
return `${this.urlPrefix}/issues/${issueNumber}.json?include=children,journals,relations`;
}
private getUserUrl(userNumber: number): string {
return `${this.urlPrefix}/users/${userNumber}.json`;
}
}