import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Query, HttpStatus, HttpCode, SerializeOptions, } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { ApiBearerAuth, ApiParam, ApiTags } from '@nestjs/swagger'; import { Roles } from '../roles/roles.decorator'; import { RoleEnum } from '../roles/roles.enum'; import { AuthGuard } from '@nestjs/passport'; import { RolesGuard } from 'src/roles/roles.guard'; import { infinityPagination } from 'src/utils/infinity-pagination'; import { InfinityPaginationResultType } from '../utils/types/infinity-pagination-result.type'; import { NullableType } from '../utils/types/nullable.type'; import { QueryUserDto } from './dto/query-user.dto'; import { User } from './domain/user'; import { UsersService } from './users.service'; @ApiBearerAuth() @Roles(RoleEnum.admin) @UseGuards(AuthGuard('jwt'), RolesGuard) @ApiTags('Users') @Controller({ path: 'users', version: '1', }) export class UsersController { constructor(private readonly usersService: UsersService) {} @SerializeOptions({ groups: ['admin'], }) @Post() @HttpCode(HttpStatus.CREATED) create(@Body() createProfileDto: CreateUserDto): Promise { return this.usersService.create(createProfileDto); } @SerializeOptions({ groups: ['admin'], }) @Get() @HttpCode(HttpStatus.OK) async findAll( @Query() query: QueryUserDto, ): Promise> { const page = query?.page ?? 1; let limit = query?.limit ?? 10; if (limit > 50) { limit = 50; } return infinityPagination( await this.usersService.findManyWithPagination({ filterOptions: query?.filters, sortOptions: query?.sort, paginationOptions: { page, limit, }, }), { page, limit }, ); } @SerializeOptions({ groups: ['admin'], }) @Get(':id') @HttpCode(HttpStatus.OK) @ApiParam({ name: 'id', type: String, required: true, }) findOne(@Param('id') id: User['id']): Promise> { return this.usersService.findOne({ id }); } @SerializeOptions({ groups: ['admin'], }) @Patch(':id') @HttpCode(HttpStatus.OK) @ApiParam({ name: 'id', type: String, required: true, }) update( @Param('id') id: User['id'], @Body() updateProfileDto: UpdateUserDto, ): Promise { return this.usersService.update(id, updateProfileDto); } @Delete(':id') @ApiParam({ name: 'id', type: String, required: true, }) @HttpCode(HttpStatus.NO_CONTENT) remove(@Param('id') id: User['id']): Promise { return this.usersService.softDelete(id); } }