Исправлена работа с пользователями
This commit is contained in:
parent
acef59a8ad
commit
446e494978
4 changed files with 36 additions and 16 deletions
|
|
@ -81,7 +81,7 @@ export module RedmineTypes {
|
||||||
|
|
||||||
export const user: User = {
|
export const user: User = {
|
||||||
id: num,
|
id: num,
|
||||||
login: unknownName,
|
login: str,
|
||||||
firstname: unknownName,
|
firstname: unknownName,
|
||||||
lastname: unknownName,
|
lastname: unknownName,
|
||||||
mail: str,
|
mail: str,
|
||||||
|
|
@ -96,11 +96,28 @@ export module RedmineTypes {
|
||||||
mail: string;
|
mail: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function ExtractUser(obj: User): User & { name: string } {
|
export type PublicUser = {
|
||||||
|
id: number;
|
||||||
|
firstname: string;
|
||||||
|
lastname: string;
|
||||||
|
login: string;
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function CreatePublicUserFromUser(obj: User): PublicUser {
|
||||||
return {
|
return {
|
||||||
id: obj.id,
|
id: obj.id,
|
||||||
login: obj.login,
|
login: obj.login,
|
||||||
|
firstname: obj.firstname,
|
||||||
|
lastname: obj.lastname,
|
||||||
name: `${obj.firstname} ${obj.lastname}`,
|
name: `${obj.firstname} ${obj.lastname}`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function CreateUser(obj: User): User {
|
||||||
|
return {
|
||||||
|
id: obj.id,
|
||||||
|
login: obj.login,
|
||||||
firstname: obj.firstname,
|
firstname: obj.firstname,
|
||||||
lastname: obj.lastname,
|
lastname: obj.lastname,
|
||||||
mail: obj.mail,
|
mail: obj.mail,
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ export class RedmineDataLoader {
|
||||||
this.logger.debug(
|
this.logger.debug(
|
||||||
`Loaded user, userNumber = ${userNumber}, login = ${user.login}, firstname = ${user.firstname}, lastname = ${user.lastname}`,
|
`Loaded user, userNumber = ${userNumber}, login = ${user.login}, firstname = ${user.firstname}, lastname = ${user.lastname}`,
|
||||||
);
|
);
|
||||||
return RedmineTypes.ExtractUser(user);
|
return RedmineTypes.CreateUser(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
private getIssueUrl(issueNumber: number): string {
|
private getIssueUrl(issueNumber: number): string {
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,14 @@ export class UsersController {
|
||||||
constructor(private readonly usersService: UsersService) {}
|
constructor(private readonly usersService: UsersService) {}
|
||||||
|
|
||||||
@Get(':id')
|
@Get(':id')
|
||||||
async getUser(@Param('id') id: number): Promise<RedmineTypes.User> {
|
async getUser(@Param('id') id: number): Promise<RedmineTypes.PublicUser> {
|
||||||
return await this.usersService.getUser(id);
|
return await this.usersService.getUser(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get(':id/json')
|
@Get(':id/json')
|
||||||
async getUserLikeRedmine(
|
async getUserLikeRedmine(
|
||||||
@Param('id') id: number,
|
@Param('id') id: number,
|
||||||
): Promise<{ user: RedmineTypes.User }> {
|
): Promise<{ user: RedmineTypes.PublicUser }> {
|
||||||
const user = await this.usersService.getUser(id);
|
const user = await this.usersService.getUser(id);
|
||||||
return {
|
return {
|
||||||
user: user,
|
user: user,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import { Injectable, Logger } from '@nestjs/common';
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
import { Timestamped } from '../models/timestamped';
|
|
||||||
import { Users } from '../couchdb-datasources/users';
|
import { Users } from '../couchdb-datasources/users';
|
||||||
import { RedmineDataLoader } from '../redmine-data-loader/redmine-data-loader';
|
import { RedmineDataLoader } from '../redmine-data-loader/redmine-data-loader';
|
||||||
import { RedmineUserCacheWriterService } from '../user-cache-writer/user-cache-writer.service';
|
import { RedmineUserCacheWriterService } from '../user-cache-writer/user-cache-writer.service';
|
||||||
|
|
@ -23,15 +22,15 @@ export class UsersService {
|
||||||
private redmineUserCacheWriterService: RedmineUserCacheWriterService,
|
private redmineUserCacheWriterService: RedmineUserCacheWriterService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async getUser(userId: number): Promise<RedmineTypes.User> {
|
async getUser(userId: number): Promise<RedmineTypes.PublicUser> {
|
||||||
const userFromMemoryCache = this.getUserFromMemoryCache(userId);
|
const userFromMemoryCache = this.getUserFromMemoryCache(userId);
|
||||||
if (userFromMemoryCache) {
|
if (userFromMemoryCache) {
|
||||||
return userFromMemoryCache;
|
return RedmineTypes.CreatePublicUserFromUser(userFromMemoryCache);
|
||||||
}
|
}
|
||||||
const userFromCache = await this.getUserFromCache(userId);
|
const userFromCache = await this.getUserFromCache(userId);
|
||||||
if (userFromCache) {
|
if (userFromCache) {
|
||||||
this.memoryCache.set(userId, userFromCache);
|
this.memoryCache.set(userId, userFromCache);
|
||||||
return userFromCache;
|
return RedmineTypes.CreatePublicUserFromUser(userFromCache);
|
||||||
}
|
}
|
||||||
let userFromRedmine = await this.getUserFromRedmine(userId);
|
let userFromRedmine = await this.getUserFromRedmine(userId);
|
||||||
if (userFromRedmine) {
|
if (userFromRedmine) {
|
||||||
|
|
@ -39,13 +38,17 @@ export class UsersService {
|
||||||
userFromRedmine,
|
userFromRedmine,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return this.memoryCache.set(
|
return RedmineTypes.CreatePublicUserFromUser(
|
||||||
userId,
|
this.memoryCache.set(
|
||||||
userFromRedmine || RedmineTypes.Unknown.user,
|
userId,
|
||||||
|
userFromRedmine || RedmineTypes.Unknown.user,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getUserFromRedmine(userId: number): Promise<RedmineTypes.User | null> {
|
private async getUserFromRedmine(
|
||||||
|
userId: number,
|
||||||
|
): Promise<RedmineTypes.User | null> {
|
||||||
const user = await this.redmineDataLoader.loadUser(userId);
|
const user = await this.redmineDataLoader.loadUser(userId);
|
||||||
if (user) {
|
if (user) {
|
||||||
this.logger.debug(
|
this.logger.debug(
|
||||||
|
|
@ -55,9 +58,9 @@ export class UsersService {
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getUserFromCache(
|
private async getUserFromCache(
|
||||||
userId: number,
|
userId: number,
|
||||||
): Promise<(RedmineTypes.User & Timestamped) | null> {
|
): Promise<RedmineTypes.User | null> {
|
||||||
const usersDb = await this.users.getDatasource();
|
const usersDb = await this.users.getDatasource();
|
||||||
try {
|
try {
|
||||||
const user = (await usersDb.get(String(userId))) as any;
|
const user = (await usersDb.get(String(userId))) as any;
|
||||||
|
|
@ -70,7 +73,7 @@ export class UsersService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getUserFromMemoryCache(userId: number): RedmineTypes.User | null {
|
private getUserFromMemoryCache(userId: number): RedmineTypes.User | null {
|
||||||
const user = this.memoryCache.get(userId);
|
const user = this.memoryCache.get(userId);
|
||||||
if (user) {
|
if (user) {
|
||||||
this.logger.debug(
|
this.logger.debug(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue