Исправлена работа с пользователями

This commit is contained in:
Pavel Gnedov 2022-07-20 18:20:02 +07:00
parent acef59a8ad
commit 446e494978
4 changed files with 36 additions and 16 deletions

View file

@ -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,

View file

@ -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 {

View file

@ -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,

View file

@ -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(