auth-service-nestjs
Version:
Authorization service for lightweight systems
144 lines (138 loc) • 3.67 kB
text/typescript
import {
Body,
Controller,
Delete,
Get,
HttpCode,
Param,
Put,
Post,
Query,
Req,
HttpException,
HttpStatus,
ForbiddenException,
} from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import {
GetAllParam,
RegisterUser,
UserCreate,
UserItem,
UserList,
UserLogin,
UserRoles,
UserUpdate,
} from './users.dto';
import { UsersService } from './users.service';
import { Roles } from '../guard/roles.decorator';
import { ErrorMessage } from '../utils/error';
import type { RequestWU } from './user.types';
import { ALLOW_USER_REGISTRATION, DENY_GET_USER_LIST } from '../utils/const';
export class UsersController {
constructor(private usersService: UsersService) {}
async create( body: UserCreate) {
await this.usersService.create(body);
}
async update(
body: UserUpdate,
{ login }: UserLogin,
request: RequestWU,
): Promise<[number]> {
const { login: tokenLogin, role: tokenRole } = request.user ?? {};
const { locked, role, ...params } = body;
//With rights below admin, you can only change yourself, it is forbidden to change the role and block/unblock
if ([UserRoles.admin].includes(tokenRole as UserRoles)) {
return this.usersService.update(
login,
{ locked, role, ...params },
tokenLogin,
);
}
if (tokenLogin !== login) {
throw new HttpException(
ErrorMessage.NotEnoughAccessRights,
HttpStatus.FORBIDDEN,
);
}
return this.usersService.update(login, params, tokenLogin);
}
async delete( { login }: UserLogin): Promise<void> {
const count = await this.usersService.delete(login);
if (!count) {
throw new HttpException(
ErrorMessage.UserNotFound,
HttpStatus.BAD_REQUEST,
);
}
}
async getAll(
query: GetAllParam,
request: RequestWU,
): Promise<UserList> {
if (+DENY_GET_USER_LIST && request.user.role !== UserRoles.admin) {
throw new ForbiddenException();
}
return this.usersService.getAll(query);
}
async getUserInfo(
{ login }: UserLogin,
request: RequestWU,
): Promise<UserItem> {
if (+DENY_GET_USER_LIST && request.user.role !== UserRoles.admin) {
throw new ForbiddenException();
}
const {
login: loginResult,
role,
locked,
lastName,
firstName,
email,
createdAt,
updatedAt,
} = await this.usersService.getUser(login);
return {
login: loginResult,
role: role as UserRoles,
locked,
lastName,
firstName,
email,
createdAt,
updatedAt,
};
}
async register( body: RegisterUser): Promise<void> {
if (!+ALLOW_USER_REGISTRATION) {
throw new HttpException(
ErrorMessage.NotAcceptable,
HttpStatus.NOT_ACCEPTABLE,
);
}
await this.usersService.register(body);
}
}