From d8b28513660108288f9c0f8fcef1c303c130194a Mon Sep 17 00:00:00 2001 From: Pavel Gnedov Date: Tue, 19 Jul 2022 04:07:36 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../event-emitter/src/event-emitter.module.ts | 6 ++++- .../src/issues/issues.controller.ts | 22 ++++++++++++++-- .../src/issues/issues.service.ts | 26 ++++++++++++++++--- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 11ad4d5..e637fba 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ lerna-debug.log* !.vscode/extensions.json configs/main-config.jsonc configs/issue-event-emitter-config.jsonc +tmp/* diff --git a/libs/event-emitter/src/event-emitter.module.ts b/libs/event-emitter/src/event-emitter.module.ts index 51f022b..ced2c9b 100644 --- a/libs/event-emitter/src/event-emitter.module.ts +++ b/libs/event-emitter/src/event-emitter.module.ts @@ -16,6 +16,8 @@ import { RedmineUserCacheWriterService } from './user-cache-writer/user-cache-wr import { UsersController } from './users/users.controller'; import { RedmineTypes } from './models/redmine-types'; import { UsersService } from './users/users.service'; +import { IssuesService } from './issues/issues.service'; +import { IssuesController } from './issues/issues.controller'; @Module({}) export class EventEmitterModule implements OnModuleInit { @@ -38,6 +40,7 @@ export class EventEmitterModule implements OnModuleInit { Issues, RedmineUserCacheWriterService, UsersService, + IssuesService, ], exports: [ EventEmitterService, @@ -49,8 +52,9 @@ export class EventEmitterModule implements OnModuleInit { Issues, RedmineUserCacheWriterService, UsersService, + IssuesService, ], - controllers: [MainController, UsersController], + controllers: [MainController, UsersController, IssuesController], }; } diff --git a/libs/event-emitter/src/issues/issues.controller.ts b/libs/event-emitter/src/issues/issues.controller.ts index f443873..4020a6a 100644 --- a/libs/event-emitter/src/issues/issues.controller.ts +++ b/libs/event-emitter/src/issues/issues.controller.ts @@ -1,4 +1,22 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, Param } from '@nestjs/common'; +import { RedmineTypes } from '../models/redmine-types'; +import { IssuesService } from './issues.service'; @Controller('issues') -export class IssuesController {} +export class IssuesController { + constructor(private issuesService: IssuesService) {} + + @Get(':id') + async getIssue(@Param('id') id: number): Promise { + return await this.issuesService.getIssue(id); + } + + @Get(':id/json') + async getIssueLikeRedmine( + @Param('id') id: number, + ): Promise<{ issue: RedmineTypes.Issue }> { + return { + issue: await this.issuesService.getIssue(id), + }; + } +} diff --git a/libs/event-emitter/src/issues/issues.service.ts b/libs/event-emitter/src/issues/issues.service.ts index 9fe48f6..6f50d51 100644 --- a/libs/event-emitter/src/issues/issues.service.ts +++ b/libs/event-emitter/src/issues/issues.service.ts @@ -1,5 +1,5 @@ import { RedmineTypes } from '../models/redmine-types'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { Issues } from '../couchdb-datasources/issues'; import { RedmineEventsGateway } from '../events/redmine-events.gateway'; import { RedmineIssuesCacheWriterService } from '../issue-cache-writer/redmine-issues-cache-writer.service'; @@ -11,6 +11,8 @@ const ISSUE_MEMORY_CACHE_AUTOCLEAN_INTERVAL = 1000 * 60 * 5; @Injectable() export class IssuesService { + private logger = new Logger(IssuesService.name); + private memoryCache = new MemoryCache( ISSUE_MEMORY_CACHE_LIFETIME, ISSUE_MEMORY_CACHE_AUTOCLEAN_INTERVAL, @@ -56,19 +58,35 @@ export class IssuesService { } getIssueFromMemoryCache(issueId: number): RedmineTypes.Issue | null { - return this.memoryCache.get(issueId); + const issue = this.memoryCache.get(issueId); + if (issue) { + this.logger.debug( + `Get issue from memory cache: id = ${issueId}, subject = ${issue.subject}`, + ); + } + return issue; } async getIssueFromRedmine( issueId: number, ): Promise { - return await this.redmineDataLoader.loadIssue(issueId); + const issue = await this.redmineDataLoader.loadIssue(issueId); + if (issue) { + this.logger.debug( + `Get issue from redmine: id = ${issueId}, subject = ${issue.subject}`, + ); + } + return issue; } async getIssueFromCache(issueId: number): Promise { const issueDb = await this.issues.getDatasource(); try { - return (await issueDb.get(String(issueId))) as any; + const issue = (await issueDb.get(String(issueId))) as any; + this.logger.debug( + `Get issue from couchdb: id = ${issueId}, subject = ${issue.subject}`, + ); + return issue; } catch (ex) { return null; }