Files
Picsur/backend/src/routes/api/user/usermanage.controller.ts

143 lines
3.8 KiB
TypeScript
Raw Normal View History

2022-03-19 21:34:33 +01:00
import {
Body,
Controller,
Get,
InternalServerErrorException,
Logger,
Post
} from '@nestjs/common';
2022-03-24 21:28:52 +01:00
import { plainToClass } from 'class-transformer';
2022-03-19 21:34:33 +01:00
import {
2022-03-24 21:28:52 +01:00
GetSpecialUsersResponse,
2022-03-19 22:04:55 +01:00
UserCreateRequest,
UserCreateResponse,
2022-03-19 21:34:33 +01:00
UserDeleteRequest,
UserDeleteResponse,
UserInfoRequest,
UserInfoResponse,
2022-03-19 22:04:55 +01:00
UserListRequest,
2022-03-19 21:34:33 +01:00
UserListResponse,
2022-03-23 17:17:39 +01:00
UserUpdateRequest,
UserUpdateResponse
2022-03-19 21:34:33 +01:00
} from 'picsur-shared/dist/dto/api/usermanage.dto';
import { HasFailed } from 'picsur-shared/dist/types';
import { UsersService } from '../../../collections/userdb/userdb.service';
import { RequiredPermissions } from '../../../decorators/permissions.decorator';
import { Permission } from '../../../models/dto/permissions.dto';
2022-03-24 21:28:52 +01:00
import { ImmutableUsersList, LockedLoginUsersList, UndeletableUsersList } from '../../../models/dto/specialusers.dto';
2022-03-19 21:34:33 +01:00
@Controller('api/user')
@RequiredPermissions(Permission.UserManage)
export class UserManageController {
private readonly logger = new Logger('UserManageController');
constructor(private usersService: UsersService) {}
@Get('list')
async listUsers(): Promise<UserListResponse> {
2022-03-19 22:04:55 +01:00
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);
2022-03-19 21:34:33 +01:00
if (HasFailed(users)) {
this.logger.warn(users.getReason());
throw new InternalServerErrorException('Could not list users');
}
return {
users,
2022-03-19 22:04:55 +01:00
count: users.length,
page: body.page,
2022-03-19 21:34:33 +01:00
};
}
2022-03-19 22:04:55 +01:00
@Post('create')
async register(
@Body() create: UserCreateRequest,
): Promise<UserCreateResponse> {
const user = await this.usersService.create(
create.username,
create.password,
2022-03-23 17:17:39 +01:00
create.roles,
2022-03-19 22:04:55 +01:00
);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not create user');
}
return user;
}
2022-03-19 21:34:33 +01:00
@Post('delete')
async delete(
@Body() deleteData: UserDeleteRequest,
): Promise<UserDeleteResponse> {
const user = await this.usersService.delete(deleteData.username);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not delete user');
}
return user;
}
2022-03-19 22:04:55 +01:00
@Post('info')
async getUser(@Body() body: UserInfoRequest): Promise<UserInfoResponse> {
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;
}
2022-03-23 17:17:39 +01:00
@Post('update')
2022-03-19 21:34:33 +01:00
async setPermissions(
2022-03-23 17:17:39 +01:00
@Body() body: UserUpdateRequest,
): Promise<UserUpdateResponse> {
let user = await this.usersService.findOne(body.username);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not find user');
}
if (body.roles) {
user = await this.usersService.setRoles(user, body.roles);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not update user');
}
}
2022-03-19 21:34:33 +01:00
2022-03-23 17:17:39 +01:00
if (body.password) {
user = await this.usersService.updatePassword(user, body.password);
if (HasFailed(user)) {
this.logger.warn(user.getReason());
throw new InternalServerErrorException('Could not update user');
}
2022-03-19 21:34:33 +01:00
}
2022-03-23 17:17:39 +01:00
return user;
2022-03-19 21:34:33 +01:00
}
2022-03-24 21:28:52 +01:00
@Get('special')
async getSpecial(): Promise<GetSpecialUsersResponse> {
const result: GetSpecialUsersResponse = {
ImmutableUsersList,
LockedLoginUsersList,
UndeletableUsersList,
};
return plainToClass(GetSpecialUsersResponse, result);
}
2022-03-19 21:34:33 +01:00
}