import { Body, Controller, Get, Logger, Post } from '@nestjs/common'; import { GetSpecialUsersResponse, UserCreateRequest, UserCreateResponse, UserDeleteRequest, UserDeleteResponse, UserInfoRequest, UserInfoResponse, UserListRequest, UserListResponse, UserUpdateRequest, UserUpdateResponse, } from 'picsur-shared/dist/dto/api/user-manage.dto'; import { ThrowIfFailed } from 'picsur-shared/dist/types'; import { UserDbService } from '../../../collections/user-db/user-db.service'; import { RequiredPermissions } from '../../../decorators/permissions.decorator'; import { Returns } from '../../../decorators/returns.decorator'; import { Permission } from '../../../models/constants/permissions.const'; import { ImmutableUsersList, LockedLoginUsersList, UndeletableUsersList, } from '../../../models/constants/special-users.const'; import { EUserBackend2EUser } from '../../../models/transformers/user.transformer'; @Controller('api/user') @RequiredPermissions(Permission.UserAdmin) export class UserAdminController { private readonly logger = new Logger(UserAdminController.name); constructor(private readonly usersService: UserDbService) {} @Post('list') @Returns(UserListResponse) async listUsersPaged( @Body() body: UserListRequest, ): Promise { const found = ThrowIfFailed( await this.usersService.findMany(body.count, body.page), ); found.results = found.results.map(EUserBackend2EUser); return found; } @Post('create') @Returns(UserCreateResponse) async register( @Body() create: UserCreateRequest, ): Promise { const user = ThrowIfFailed( await this.usersService.create( create.username, create.password, create.roles, ), ); return EUserBackend2EUser(user); } @Post('delete') @Returns(UserDeleteResponse) async delete(@Body() body: UserDeleteRequest): Promise { const user = ThrowIfFailed(await this.usersService.delete(body.id)); return EUserBackend2EUser(user); } @Post('info') @Returns(UserInfoResponse) async getUser(@Body() body: UserInfoRequest): Promise { const user = ThrowIfFailed(await this.usersService.findOne(body.id)); return EUserBackend2EUser(user); } @Post('update') @Returns(UserUpdateResponse) async setPermissions( @Body() body: UserUpdateRequest, ): Promise { let user = ThrowIfFailed(await this.usersService.findOne(body.id)); if (body.roles) { user = ThrowIfFailed( await this.usersService.setRoles(body.id, body.roles), ); } if (body.password) { user = ThrowIfFailed( await this.usersService.updatePassword(body.id, body.password), ); } return EUserBackend2EUser(user); } @Get('special') @Returns(GetSpecialUsersResponse) async getSpecial(): Promise { return { ImmutableUsersList, LockedLoginUsersList, UndeletableUsersList, }; } }