158 lines
5.9 KiB
TypeScript
158 lines
5.9 KiB
TypeScript
import { Body, Controller, Delete, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
|
||
import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||
import { AuthGuard } from 'src/common/guards/auth.guard';
|
||
import { RolesGuard } from 'src/common/guards/roles.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 { CreateAdminDto } from './dto/create_admin.dto';
|
||
import { UpdateUserDto } from './dto/update_user.dto';
|
||
import { AffecterNumeroDossierDto } from './dto/affecter-numero-dossier.dto';
|
||
|
||
@ApiTags('Utilisateurs')
|
||
@ApiBearerAuth('access-token')
|
||
@UseGuards(AuthGuard, RolesGuard)
|
||
@Controller('users')
|
||
export class UserController {
|
||
constructor(private readonly userService: UserService) { }
|
||
|
||
// Création d'un administrateur (réservée aux super admins)
|
||
@Post('admin')
|
||
@Roles(RoleType.SUPER_ADMIN)
|
||
@ApiOperation({ summary: 'Créer un nouvel administrateur (super admin seulement)' })
|
||
createAdmin(
|
||
@Body() dto: CreateAdminDto,
|
||
@User() currentUser: Users
|
||
) {
|
||
return this.userService.createAdmin(dto, currentUser);
|
||
}
|
||
|
||
// 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 les utilisateurs en attente de validation
|
||
@Get('pending')
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR, RoleType.GESTIONNAIRE)
|
||
@ApiOperation({ summary: 'Lister les utilisateurs en attente de validation' })
|
||
findPendingUsers(
|
||
@Query('role') role?: RoleType
|
||
) {
|
||
return this.userService.findPendingUsers(role);
|
||
}
|
||
|
||
// Lister les comptes refusés (à corriger / reprise)
|
||
@Get('reprise')
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR, RoleType.GESTIONNAIRE)
|
||
@ApiOperation({ summary: 'Lister les comptes refusés (reprise)' })
|
||
findRefusedUsers(
|
||
@Query('role') role?: RoleType
|
||
) {
|
||
return this.userService.findRefusedUsers(role);
|
||
}
|
||
|
||
// Lister tous les utilisateurs (super_admin uniquement)
|
||
@Get()
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR)
|
||
@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 et admin)
|
||
@Patch(':id')
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR)
|
||
@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/numero-dossier')
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR, RoleType.GESTIONNAIRE)
|
||
@ApiOperation({
|
||
summary: 'Affecter un numéro de dossier à un utilisateur',
|
||
description: 'Permet de rapprocher deux dossiers ou d’attribuer un numéro existant à un parent/AM. Réservé aux gestionnaires et administrateurs.',
|
||
})
|
||
@ApiParam({ name: 'id', description: "UUID de l'utilisateur (parent ou AM)" })
|
||
@ApiResponse({ status: 200, description: 'Numéro de dossier affecté' })
|
||
@ApiResponse({ status: 400, description: 'Format invalide, rôle non éligible, ou dossier déjà associé à 2 parents' })
|
||
@ApiResponse({ status: 404, description: 'Utilisateur introuvable' })
|
||
affecterNumeroDossier(
|
||
@Param('id') id: string,
|
||
@Body() dto: AffecterNumeroDossierDto,
|
||
) {
|
||
return this.userService.affecterNumeroDossier(id, dto.numero_dossier);
|
||
}
|
||
|
||
@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' })
|
||
validate(
|
||
@Param('id') id: string,
|
||
@User() currentUser: Users,
|
||
@Body('comment') comment?: string,
|
||
) {
|
||
return this.userService.validateUser(id, currentUser, comment);
|
||
}
|
||
|
||
@Patch(':id/refuser')
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.GESTIONNAIRE, RoleType.ADMINISTRATEUR)
|
||
@ApiOperation({ summary: 'Refuser un compte (à corriger)' })
|
||
@ApiParam({ name: 'id', description: "UUID de l'utilisateur" })
|
||
refuse(
|
||
@Param('id') id: string,
|
||
@User() currentUser: Users,
|
||
@Body('comment') comment?: string,
|
||
) {
|
||
return this.userService.refuseUser(id, currentUser, comment);
|
||
}
|
||
|
||
@Patch(':id/suspendre')
|
||
@Roles(RoleType.SUPER_ADMIN, RoleType.GESTIONNAIRE, RoleType.ADMINISTRATEUR)
|
||
@ApiOperation({ summary: 'Suspendre un compte utilisateur' })
|
||
@ApiParam({ name: 'id', description: "UUID de l'utilisateur" })
|
||
suspend(
|
||
@Param('id') id: string,
|
||
@User() currentUser: Users,
|
||
@Body('comment') comment?: string,
|
||
) {
|
||
return this.userService.suspendUser(id, currentUser, comment);
|
||
}
|
||
|
||
// Supprimer un utilisateur (super_admin uniquement)
|
||
@Delete(':id')
|
||
@Roles(RoleType.SUPER_ADMIN)
|
||
@ApiOperation({ summary: 'Supprimer un utilisateur' })
|
||
@ApiParam({ name: 'id', description: "UUID de l'utilisateur" })
|
||
remove(@Param('id') id: string, @User() currentUser: Users) {
|
||
return this.userService.remove(id, currentUser);
|
||
}
|
||
}
|