Добавлен EnhancerService

This commit is contained in:
Pavel Gnedov 2022-07-19 18:25:39 +07:00
parent 2cf5ccf118
commit 1a80051d43
4 changed files with 44 additions and 33 deletions

View file

@ -1,10 +1,4 @@
import { import { DynamicModule, Logger, Module, OnModuleInit } from '@nestjs/common';
DynamicModule,
Inject,
Logger,
Module,
OnModuleInit,
} from '@nestjs/common';
import { EventEmitterService } from './event-emitter.service'; import { EventEmitterService } from './event-emitter.service';
import { RedmineEventsGateway } from './events/redmine-events.gateway'; import { RedmineEventsGateway } from './events/redmine-events.gateway';
import { ServeStaticModule } from '@nestjs/serve-static'; import { ServeStaticModule } from '@nestjs/serve-static';
@ -24,9 +18,8 @@ import { RedmineTypes } from './models/redmine-types';
import { UsersService } from './users/users.service'; import { UsersService } from './users/users.service';
import { IssuesService } from './issues/issues.service'; import { IssuesService } from './issues/issues.service';
import { IssuesController } from './issues/issues.controller'; import { IssuesController } from './issues/issues.controller';
import { IssueEnhancerInterface } from './issue-enhancers/issue-enhancer-interface';
import { TimestampEnhancer } from './issue-enhancers/timestamps-enhancer'; import { TimestampEnhancer } from './issue-enhancers/timestamps-enhancer';
import { ModuleRef } from '@nestjs/core'; import { EnhancerService } from './issue-enhancers/enhancer.service';
@Module({}) @Module({})
export class EventEmitterModule implements OnModuleInit { export class EventEmitterModule implements OnModuleInit {
@ -55,6 +48,7 @@ export class EventEmitterModule implements OnModuleInit {
provide: 'ENHANCERS', provide: 'ENHANCERS',
useValue: params?.enhancers || null, useValue: params?.enhancers || null,
}, },
EnhancerService,
], ],
exports: [ exports: [
EventEmitterService, EventEmitterService,
@ -68,6 +62,7 @@ export class EventEmitterModule implements OnModuleInit {
UsersService, UsersService,
IssuesService, IssuesService,
TimestampEnhancer, TimestampEnhancer,
EnhancerService,
], ],
controllers: [MainController, UsersController, IssuesController], controllers: [MainController, UsersController, IssuesController],
}; };
@ -78,12 +73,7 @@ export class EventEmitterModule implements OnModuleInit {
constructor( constructor(
private redmineEventsGateway: RedmineEventsGateway, private redmineEventsGateway: RedmineEventsGateway,
private redmineIssuesCacheWriterService: RedmineIssuesCacheWriterService, private redmineIssuesCacheWriterService: RedmineIssuesCacheWriterService,
private moduleRef: ModuleRef, ) {}
@Inject('ENHANCERS')
private enhancers: IssueEnhancerInterface[],
) {
this.enhancers.forEach((e) => e.init(this.moduleRef));
}
onModuleInit() { onModuleInit() {
const queue = this.redmineEventsGateway.getIssuesChangesQueue(); const queue = this.redmineEventsGateway.getIssuesChangesQueue();
@ -92,7 +82,7 @@ export class EventEmitterModule implements OnModuleInit {
this.logger.debug(`Changed issues = ${JSON.stringify(issues)}`); this.logger.debug(`Changed issues = ${JSON.stringify(issues)}`);
for (let i = 0; i < issues.length; i++) { for (let i = 0; i < issues.length; i++) {
const issue: RedmineTypes.Issue = await this.enhanceIssue(issues[i]); const issue: RedmineTypes.Issue = issues[i];
try { try {
this.logger.debug( this.logger.debug(
@ -114,18 +104,4 @@ export class EventEmitterModule implements OnModuleInit {
} }
}); });
} }
private async enhanceIssue(
issue: RedmineTypes.Issue & Record<string, any>,
): Promise<RedmineTypes.Issue & Record<string, any>> {
const enhancers = this.enhancers;
for (let i = 0; i < enhancers.length; i++) {
const enhancer = enhancers[i];
issue = await enhancer.enhance(issue);
this.logger.debug(
`Issue after enhancer: issue = ${JSON.stringify(issue)}`,
);
}
return issue;
}
} }

View file

@ -0,0 +1,30 @@
import { Inject, Injectable, Logger } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { RedmineTypes } from '../models/redmine-types';
import { IssueEnhancerInterface } from './issue-enhancer-interface';
@Injectable()
export class EnhancerService {
private logger = new Logger(EnhancerService.name);
constructor(
private moduleRef: ModuleRef,
@Inject('ENHANCERS')
private enhancers: IssueEnhancerInterface[],
) {
this.enhancers.forEach((e) => e.init(this.moduleRef));
}
async enhanceIssue(
issue: RedmineTypes.Issue & Record<string, any>,
): Promise<RedmineTypes.Issue & Record<string, any>> {
for (let i = 0; i < this.enhancers.length; i++) {
const enhancer = this.enhancers[i];
issue = await enhancer.enhance(issue);
this.logger.debug(
`Issue after enhancer: issue = ${JSON.stringify(issue)}`,
);
}
return issue;
}
}

View file

@ -96,10 +96,11 @@ export module RedmineTypes {
mail: string; mail: string;
}; };
export function ExtractUser(obj: User): User { export function ExtractUser(obj: User): User & { name: string } {
return { return {
id: obj.id, id: obj.id,
login: obj.login, login: obj.login,
name: `${obj.firstname} ${obj.lastname}`,
firstname: obj.firstname, firstname: obj.firstname,
lastname: obj.lastname, lastname: obj.lastname,
mail: obj.mail, mail: obj.mail,

View file

@ -2,6 +2,7 @@ import axios from 'axios';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { RedmineTypes } from '../models/redmine-types'; import { RedmineTypes } from '../models/redmine-types';
import { EnhancerService } from '../issue-enhancers/enhancer.service';
@Injectable() @Injectable()
export class RedmineDataLoader { export class RedmineDataLoader {
@ -9,7 +10,10 @@ export class RedmineDataLoader {
private logger = new Logger(RedmineDataLoader.name); private logger = new Logger(RedmineDataLoader.name);
constructor(private configService: ConfigService) { constructor(
private configService: ConfigService,
private enhancerService: EnhancerService,
) {
this.urlPrefix = this.configService.get<string>('redmineUrlPrefix'); this.urlPrefix = this.configService.get<string>('redmineUrlPrefix');
} }
@ -30,7 +34,7 @@ export class RedmineDataLoader {
this.logger.debug( this.logger.debug(
`Loaded issue, issueNumber = ${issueNumber}, subject = ${resp.data.issue.subject}`, `Loaded issue, issueNumber = ${issueNumber}, subject = ${resp.data.issue.subject}`,
); );
return resp.data.issue; return await this.enhancerService.enhanceIssue(resp.data.issue);
} }
async loadUsers(users: number[]): Promise<(RedmineTypes.User | null)[]> { async loadUsers(users: number[]): Promise<(RedmineTypes.User | null)[]> {