import { Body, Controller, Delete, Get, Param, Patch, Post, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; import { AuthGuard } from 'src/common/guards/auth.guard'; import { Roles } from 'src/common/decorators/roles.decorator'; import { User } from 'src/common/decorators/user.decorator'; import { RoleType, Users } from 'src/entities/users.entity'; import { UserService } from './user.service'; import { CreateUserDto } from './dto/create_user.dto'; import { UpdateUserDto } from './dto/update_user.dto'; @ApiTags('Utilisateurs') @ApiBearerAuth('access-token') @UseGuards(AuthGuard) @Controller('users') export class UserController { constructor(private readonly userService: UserService) { } // Création d'un utilisateur (réservée aux super admins) @Post() @Roles(RoleType.SUPER_ADMIN) @ApiOperation({ summary: 'Créer un nouvel utilisateur (super admin seulement)' }) createUser( @Body() dto: CreateUserDto, @User() currentUser: Users ) { return this.userService.createUser(dto, currentUser); } // Lister tous les utilisateurs (super_admin uniquement) @Get() @Roles(RoleType.SUPER_ADMIN) @ApiOperation({ summary: 'Lister tous les utilisateurs' }) findAll() { return this.userService.findAll(); } // Récupérer un utilisateur par son ID @Get(':id') @Roles(RoleType.SUPER_ADMIN, RoleType.GESTIONNAIRE) @ApiOperation({ summary: 'Trouver un utilisateur par son id' }) @ApiParam({ name: 'id', description: "UUID de l'utilisateur" }) findOne(@Param('id') id: string) { return this.userService.findOne(id); } // Modifier un utilisateur (réservé super_admin) @Patch(':id') @Roles(RoleType.SUPER_ADMIN) @ApiOperation({ summary: 'Mettre à jour un utilisateur' }) @ApiParam({ name: 'id', description: "UUID de l'utilisateur" }) updateUser( @Param('id') id: string, @Body() dto: UpdateUserDto, @User() currentUser: Users ) { return this.userService.updateUser(id, dto, currentUser); } @Patch(':id/valider') @Roles(RoleType.SUPER_ADMIN, RoleType.GESTIONNAIRE, RoleType.ADMINISTRATEUR) @ApiOperation({ summary: 'Valider un compte utilisateur' }) @ApiParam({ name: 'id', description: "UUID de l'utilisateur" }) @ApiResponse({ status: 400, description: 'ID invalide' }) @ApiResponse({ status: 403, description: 'Accès refusé' }) @ApiResponse({ status: 200, description: 'Compte validé avec succès' }) validerUtilisateur( @Param('id') id: string, @User() currentUser: Users, @Body('comment') comment?: string, ) { return this.userService.validateUser(id, currentUser, comment); } // Supprimer un utilisateur (super_admin et gestionnaire) @Delete(':id') @Roles(RoleType.SUPER_ADMIN, RoleType.GESTIONNAIRE, RoleType.ADMINISTRATEUR) @ApiOperation({ summary: 'Supprimer un utilisateur' }) @ApiParam({ name: 'id', description: "UUID de l'utilisateur" }) remove(@Param('id') id: string) { return this.userService.remove(id); } }