mirror of
https://github.com/CaramelFur/Picsur.git
synced 2025-11-13 23:35:39 +01:00
add paged userlist api
This commit is contained in:
@@ -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> {
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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],
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user