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,
) {}
// Creation and deletion
public async create(
username: string,
password: string,
@@ -63,6 +65,8 @@ export class UsersService {
}
}
// Authentication
async authenticate(
username: string,
password: string,
@@ -76,6 +80,8 @@ export class UsersService {
return await this.findOne(username);
}
// Permissions and roles
public async getPermissions(
user: string | EUserBackend,
): AsyncFailable<Permissions> {
@@ -130,6 +136,8 @@ export class UsersService {
}
}
// Listing
public async findOne<B extends true | undefined = undefined>(
username: string,
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 {
return await this.usersRepository.find();
return await this.usersRepository.find({
take: count,
skip: count * page,
});
} catch (e: any) {
return Fail(e?.message);
}
@@ -163,6 +180,8 @@ export class UsersService {
return HasSuccess(await this.findOne(username));
}
// Internal resolver
private async resolve(
user: string | EUserBackend,
): AsyncFailable<EUserBackend> {

View File

@@ -7,10 +7,13 @@ import {
Post
} from '@nestjs/common';
import {
UserCreateRequest,
UserCreateResponse,
UserDeleteRequest,
UserDeleteResponse,
UserInfoRequest,
UserInfoResponse,
UserListRequest,
UserListResponse,
UserUpdateRolesRequest,
UserUpdateRolesResponse
@@ -29,7 +32,18 @@ export class UserManageController {
@Get('list')
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)) {
this.logger.warn(users.getReason());
throw new InternalServerErrorException('Could not list users');
@@ -37,10 +51,27 @@ export class UserManageController {
return {
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')
async delete(
@Body() deleteData: UserDeleteRequest,
@@ -54,6 +85,18 @@ export class UserManageController {
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')
async setPermissions(
@Body() body: UserUpdateRolesRequest,
@@ -70,16 +113,4 @@ export class UserManageController {
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',
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],
canActivateChild: [PermissionGuard],

View File

@@ -1,8 +1,53 @@
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 { 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
export class UserDeleteRequest {
@IsString()
@@ -21,20 +66,6 @@ export class UserInfoRequest {
export class UserInfoResponse extends EUser {}
// UserList
export class UserListResponse {
@IsArray()
@IsDefined()
@ValidateNested()
@Type(() => EUser)
users: EUser[];
@IsInt()
@IsPositive()
@IsDefined()
total: number;
}
// UserUpdateRoles
export class UserUpdateRolesRequest {
@IsString()