From b1a80f85c97b420a77162b19a93548a3c1dd0ae5 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Thu, 26 Feb 2026 10:44:04 +0100 Subject: [PATCH] Squash merge develop into master (feat #25 API users/pending, dashboards, login) Made-with: Cursor --- .../gestionnaires/gestionnaires.service.ts | 6 ----- backend/src/routes/user/user.controller.ts | 12 ++++++++- backend/src/routes/user/user.service.ts | 8 ++++++ .../lib/widgets/admin/dashboard_admin.dart | 25 +++++++++++++++++++ 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/backend/src/routes/user/gestionnaires/gestionnaires.service.ts b/backend/src/routes/user/gestionnaires/gestionnaires.service.ts index 25b48cc..efa795d 100644 --- a/backend/src/routes/user/gestionnaires/gestionnaires.service.ts +++ b/backend/src/routes/user/gestionnaires/gestionnaires.service.ts @@ -91,12 +91,6 @@ export class GestionnairesService { gestionnaire.password = await bcrypt.hash(dto.password, salt); } - // if (dto.date_consentement_photo !== undefined) { - // gestionnaire.date_consentement_photo = dto.date_consentement_photo - // ? new Date(dto.date_consentement_photo) - // : undefined; - // } - const { password, ...rest } = dto; Object.entries(rest).forEach(([key, value]) => { if (value !== undefined) { diff --git a/backend/src/routes/user/user.controller.ts b/backend/src/routes/user/user.controller.ts index f5fc93f..84682bc 100644 --- a/backend/src/routes/user/user.controller.ts +++ b/backend/src/routes/user/user.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Patch, Post, UseGuards } from '@nestjs/common'; +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 { Roles } from 'src/common/decorators/roles.decorator'; @@ -38,6 +38,16 @@ export class UserController { 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 tous les utilisateurs (super_admin uniquement) @Get() @Roles(RoleType.SUPER_ADMIN, RoleType.ADMINISTRATEUR) diff --git a/backend/src/routes/user/user.service.ts b/backend/src/routes/user/user.service.ts index b8a88e0..69ccaac 100644 --- a/backend/src/routes/user/user.service.ts +++ b/backend/src/routes/user/user.service.ts @@ -132,6 +132,14 @@ export class UserService { return this.usersRepository.save(entity); } + async findPendingUsers(role?: RoleType): Promise { + const where: any = { statut: StatutUtilisateurType.EN_ATTENTE }; + if (role) { + where.role = role; + } + return this.usersRepository.find({ where }); + } + async findAll(): Promise { return this.usersRepository.find(); } diff --git a/frontend/lib/widgets/admin/dashboard_admin.dart b/frontend/lib/widgets/admin/dashboard_admin.dart index 5a7bf32..55c99be 100644 --- a/frontend/lib/widgets/admin/dashboard_admin.dart +++ b/frontend/lib/widgets/admin/dashboard_admin.dart @@ -73,6 +73,31 @@ class DashboardUserManagementSubBar extends StatelessWidget { ), ); } + + Widget _pillField({required double width, required Widget child}) { + return Container( + width: width, + height: 34, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(18), + border: Border.all(color: Colors.black26), + ), + alignment: Alignment.centerLeft, + child: child, + ); + } + + Widget _buildAddButton() { + return ElevatedButton.icon( + onPressed: onAddPressed, + icon: const Icon(Icons.add), + label: Text(addLabel), + ); + } + + Widget _buildSubNavItem(BuildContext context, String title, int index) { + final bool isActive = index == selectedSubIndex; return InkWell( onTap: () => onSubTabChange(index), child: Container(