import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Request, HttpCode, HttpStatus, } from '@nestjs/common'; import { UserService } from './user.service'; import { CreateUserDto, UpdateUserDto, UserResponseDto, ChangePasswordDto, } from './user.dto'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; import { RolesGuard } from '../auth/roles.guard'; import { Roles } from '../auth/roles.decorator'; import { UserRole } from '../entities'; import type { RequestWithUser } from '../auth/types'; @Controller('users') export class UserController { constructor(private readonly userService: UserService) {} @Post() @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) async create(@Body() createUserDto: CreateUserDto): Promise { return this.userService.create(createUserDto); } @Get() @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) async findAll(): Promise { return this.userService.findAll(); } @Get('profile') @UseGuards(JwtAuthGuard) async getProfile(@Request() req: RequestWithUser): Promise { return this.userService.findOne(req.user.id); } @Get(':id') @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) async findOne(@Param('id') id: string): Promise { return this.userService.findOne(id); } @Patch(':id') @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) async update( @Param('id') id: string, @Body() updateUserDto: UpdateUserDto, ): Promise { return this.userService.update(id, updateUserDto); } @Delete(':id') @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) @HttpCode(HttpStatus.NO_CONTENT) async remove(@Param('id') id: string): Promise { return this.userService.remove(id); } @Post(':id/change-password') @UseGuards(JwtAuthGuard) @HttpCode(HttpStatus.NO_CONTENT) async changePassword( @Param('id') id: string, @Body() changePasswordDto: ChangePasswordDto, @Request() req: RequestWithUser, ): Promise { // Users can only change their own password, unless they're admin if (req.user.role !== UserRole.ADMIN && req.user.id !== id) { throw new Error('You can only change your own password'); } return this.userService.changePassword(id, changePasswordDto); } @Patch(':id/deactivate') @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) async deactivate(@Param('id') id: string): Promise { return this.userService.update(id, { isActive: false }); } @Patch(':id/activate') @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.ADMIN) async activate(@Param('id') id: string): Promise { return this.userService.update(id, { isActive: true }); } }