add paged userlist api

This commit is contained in:
rubikscraft
2022-03-19 22:04:55 +01:00
parent 94c2a16bc9
commit 509dda78ea
4 changed files with 124 additions and 43 deletions

View File

@@ -26,6 +26,8 @@ export class UsersService {
private rolesService: RolesService, private rolesService: RolesService,
) {} ) {}
// Creation and deletion
public async create( public async create(
username: string, username: string,
password: string, password: string,
@@ -63,6 +65,8 @@ export class UsersService {
} }
} }
// Authentication
async authenticate( async authenticate(
username: string, username: string,
password: string, password: string,
@@ -76,6 +80,8 @@ export class UsersService {
return await this.findOne(username); return await this.findOne(username);
} }
// Permissions and roles
public async getPermissions( public async getPermissions(
user: string | EUserBackend, user: string | EUserBackend,
): AsyncFailable<Permissions> { ): AsyncFailable<Permissions> {
@@ -130,6 +136,8 @@ export class UsersService {
} }
} }
// Listing
public async findOne<B extends true | undefined = undefined>( public async findOne<B extends true | undefined = undefined>(
username: string, username: string,
getPrivate?: B, getPrivate?: B,
@@ -151,9 +159,18 @@ export class UsersService {
} }
} }
public async findAll(): AsyncFailable<EUserBackend[]> { public async findMany(
count: number,
page: number,
): AsyncFailable<EUserBackend[]> {
if (count < 1 || page < 0) return Fail('Invalid page');
if (count > 100) return Fail('Too many results');
try { try {
return await this.usersRepository.find(); return await this.usersRepository.find({
take: count,
skip: count * page,
});
} catch (e: any) { } catch (e: any) {
return Fail(e?.message); return Fail(e?.message);
} }
@@ -163,6 +180,8 @@ export class UsersService {
return HasSuccess(await this.findOne(username)); return HasSuccess(await this.findOne(username));
} }
// Internal resolver
private async resolve( private async resolve(
user: string | EUserBackend, user: string | EUserBackend,
): AsyncFailable<EUserBackend> { ): AsyncFailable<EUserBackend> {

View File

@@ -7,10 +7,13 @@ import {
Post Post
} from '@nestjs/common'; } from '@nestjs/common';
import { import {
UserCreateRequest,
UserCreateResponse,
UserDeleteRequest, UserDeleteRequest,
UserDeleteResponse, UserDeleteResponse,
UserInfoRequest, UserInfoRequest,
UserInfoResponse, UserInfoResponse,
UserListRequest,
UserListResponse, UserListResponse,
UserUpdateRolesRequest, UserUpdateRolesRequest,
UserUpdateRolesResponse UserUpdateRolesResponse
@@ -29,7 +32,18 @@ export class UserManageController {
@Get('list') @Get('list')
async listUsers(): Promise<UserListResponse> { async listUsers(): Promise<UserListResponse> {
const users = await this.usersService.findAll(); const body = new UserListRequest();
body.count = 20;
body.page = 0;
return this.listUsersPaged(body);
}
@Post('list')
async listUsersPaged(
@Body() body: UserListRequest,
): Promise<UserListResponse> {
const users = await this.usersService.findMany(body.count, body.page);
if (HasFailed(users)) { if (HasFailed(users)) {
this.logger.warn(users.getReason()); this.logger.warn(users.getReason());
throw new InternalServerErrorException('Could not list users'); throw new InternalServerErrorException('Could not list users');
@@ -37,10 +51,27 @@ export class UserManageController {
return { return {
users, users,
total: users.length, count: users.length,
page: body.page,
}; };
} }
@Post('create')
async register(
@Body() create: UserCreateRequest,
): Promise<UserCreateResponse> {
const user = await this.usersService.create(
create.username,
create.password,
);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not create user');
}
return user;
}
@Post('delete') @Post('delete')
async delete( async delete(
@Body() deleteData: UserDeleteRequest, @Body() deleteData: UserDeleteRequest,
@@ -54,6 +85,18 @@ export class UserManageController {
return user; return user;
} }
@Post('info')
async getUser(@Body() body: UserInfoRequest): Promise<UserInfoResponse> {
console.log(body);
const user = await this.usersService.findOne(body.username);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not find user');
}
return user;
}
@Post('roles') @Post('roles')
async setPermissions( async setPermissions(
@Body() body: UserUpdateRolesRequest, @Body() body: UserUpdateRolesRequest,
@@ -70,16 +113,4 @@ export class UserManageController {
return updatedUser; return updatedUser;
} }
@Post('info')
async getUser(@Body() body: UserInfoRequest): Promise<UserInfoResponse> {
console.log(body);
const user = await this.usersService.findOne(body.username);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not find user');
}
return user;
}
} }

View File

@@ -29,18 +29,6 @@ const SettingsRoutes: PRoutes = [
}, },
}, },
}, },
{
path: 'system',
loadChildren: () => SettingsSysprefRouteModule,
data: {
permissions: [Permission.SysPrefManage],
page: {
title: 'System Settings',
icon: 'settings',
category: 'system',
},
},
},
{ {
path: 'users', path: 'users',
loadChildren: () => SettingsUsersRouteModule, loadChildren: () => SettingsUsersRouteModule,
@@ -53,6 +41,18 @@ const SettingsRoutes: PRoutes = [
}, },
}, },
}, },
{
path: 'system',
loadChildren: () => SettingsSysprefRouteModule,
data: {
permissions: [Permission.SysPrefManage],
page: {
title: 'System Settings',
icon: 'tune',
category: 'system',
},
},
},
], ],
canActivate: [PermissionGuard], canActivate: [PermissionGuard],
canActivateChild: [PermissionGuard], canActivateChild: [PermissionGuard],

View File

@@ -1,8 +1,53 @@
import { Type } from 'class-transformer'; import { Type } from 'class-transformer';
import { IsArray, IsDefined, IsInt, IsNotEmpty, IsPositive, IsString, ValidateNested } from 'class-validator'; import { IsArray, IsDefined, IsInt, IsNotEmpty, IsString, Min, ValidateNested } from 'class-validator';
import { EUser } from '../../entities/user.entity'; import { EUser } from '../../entities/user.entity';
import { Roles } from '../roles.dto'; import { Roles } from '../roles.dto';
// UserList
export class UserListRequest {
@IsDefined()
@IsInt()
@Min(0)
count: number;
@IsDefined()
@IsInt()
@Min(0)
page: number;
}
export class UserListResponse {
@IsArray()
@IsDefined()
@ValidateNested()
@Type(() => EUser)
users: EUser[];
@IsDefined()
@IsInt()
@Min(0)
count: number;
@IsDefined()
@IsInt()
@Min(0)
page: number;
}
// UserCreate
export class UserCreateRequest {
@IsString()
@IsNotEmpty()
username: string;
@IsString()
@IsNotEmpty()
password: string;
}
export class UserCreateResponse extends EUser {}
// UserDelete // UserDelete
export class UserDeleteRequest { export class UserDeleteRequest {
@IsString() @IsString()
@@ -21,20 +66,6 @@ export class UserInfoRequest {
export class UserInfoResponse extends EUser {} export class UserInfoResponse extends EUser {}
// UserList
export class UserListResponse {
@IsArray()
@IsDefined()
@ValidateNested()
@Type(() => EUser)
users: EUser[];
@IsInt()
@IsPositive()
@IsDefined()
total: number;
}
// UserUpdateRoles // UserUpdateRoles
export class UserUpdateRolesRequest { export class UserUpdateRolesRequest {
@IsString() @IsString()