Добавлены функции для работы с issue

This commit is contained in:
Pavel Gnedov 2022-07-19 04:07:36 +07:00
parent 6078507240
commit d8b2851366
4 changed files with 48 additions and 7 deletions

1
.gitignore vendored
View file

@ -35,3 +35,4 @@ lerna-debug.log*
!.vscode/extensions.json
configs/main-config.jsonc
configs/issue-event-emitter-config.jsonc
tmp/*

View file

@ -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],
};
}

View file

@ -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<RedmineTypes.Issue> {
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),
};
}
}

View file

@ -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<number, RedmineTypes.Issue>(
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<RedmineTypes.Issue | null> {
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<RedmineTypes.Issue | null> {
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;
}