From 33cc7a91915407229fd85613fbfeb9243916838e Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Tue, 24 Feb 2026 11:07:14 +0100 Subject: [PATCH] feat(backend): add create admin API and update docs Co-authored-by: Cursor --- .../src/routes/user/dto/create_admin.dto.ts | 10 ++- backend/src/routes/user/user.controller.ts | 12 ++++ backend/src/routes/user/user.service.ts | 26 ++++++++ docs/23_LISTE-TICKETS.md | 62 +++++++++++++++++-- 4 files changed, 102 insertions(+), 8 deletions(-) diff --git a/backend/src/routes/user/dto/create_admin.dto.ts b/backend/src/routes/user/dto/create_admin.dto.ts index f35f781..b902948 100644 --- a/backend/src/routes/user/dto/create_admin.dto.ts +++ b/backend/src/routes/user/dto/create_admin.dto.ts @@ -1,4 +1,10 @@ -import { OmitType } from "@nestjs/swagger"; +import { PickType } from "@nestjs/swagger"; import { CreateUserDto } from "./create_user.dto"; -export class CreateAdminDto extends OmitType(CreateUserDto, ['role'] as const) {} +export class CreateAdminDto extends PickType(CreateUserDto, [ + 'nom', + 'prenom', + 'email', + 'password', + 'telephone' +] as const) {} diff --git a/backend/src/routes/user/user.controller.ts b/backend/src/routes/user/user.controller.ts index 54caa8a..af65ff1 100644 --- a/backend/src/routes/user/user.controller.ts +++ b/backend/src/routes/user/user.controller.ts @@ -6,6 +6,7 @@ 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'; @ApiTags('Utilisateurs') @@ -15,6 +16,17 @@ import { UpdateUserDto } from './dto/update_user.dto'; 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) diff --git a/backend/src/routes/user/user.service.ts b/backend/src/routes/user/user.service.ts index db775fb..08017f7 100644 --- a/backend/src/routes/user/user.service.ts +++ b/backend/src/routes/user/user.service.ts @@ -3,6 +3,7 @@ import { InjectRepository } from "@nestjs/typeorm"; import { RoleType, StatutUtilisateurType, Users } from "src/entities/users.entity"; import { In, Repository } from "typeorm"; import { CreateUserDto } from "./dto/create_user.dto"; +import { CreateAdminDto } from "./dto/create_admin.dto"; import { UpdateUserDto } from "./dto/update_user.dto"; import * as bcrypt from 'bcrypt'; import { StatutValidationType, Validation } from "src/entities/validations.entity"; @@ -106,6 +107,31 @@ export class UserService { return this.findOne(saved.id); } + async createAdmin(dto: CreateAdminDto, currentUser: Users): Promise { + if (currentUser.role !== RoleType.SUPER_ADMIN) { + throw new ForbiddenException('Seuls les super administrateurs peuvent créer un administrateur'); + } + + const exist = await this.usersRepository.findOneBy({ email: dto.email }); + if (exist) throw new BadRequestException('Email déjà utilisé'); + + const salt = await bcrypt.genSalt(); + const hashedPassword = await bcrypt.hash(dto.password, salt); + + const entity = this.usersRepository.create({ + email: dto.email, + password: hashedPassword, + prenom: dto.prenom, + nom: dto.nom, + role: RoleType.ADMINISTRATEUR, + statut: StatutUtilisateurType.ACTIF, + telephone: dto.telephone, + changement_mdp_obligatoire: true, + }); + + return this.usersRepository.save(entity); + } + async findAll(): Promise { return this.usersRepository.find(); } diff --git a/docs/23_LISTE-TICKETS.md b/docs/23_LISTE-TICKETS.md index 3251059..16edd1e 100644 --- a/docs/23_LISTE-TICKETS.md +++ b/docs/23_LISTE-TICKETS.md @@ -1,9 +1,9 @@ # 🎫 Liste Complète des Tickets - Projet P'titsPas **Version** : 1.5 -**Date** : 17 Février 2026 +**Date** : 24 Février 2026 **Auteur** : Équipe PtitsPas -**Estimation totale** : ~184h +**Estimation totale** : ~208h --- @@ -33,6 +33,9 @@ | 93 | [Frontend] Panneau Admin - Homogeneiser la presentation des onglets | Ouvert | | 94 | [Backend] Relais - modele, API CRUD et liaison gestionnaire | ✅ Terminé | | 95 | [Frontend] Admin - gestion des relais et rattachement gestionnaire | Ouvert | +| 96 | [Frontend] Admin - Création administrateur via modale (sans relais) | Ouvert | +| 97 | [Backend] Harmoniser API création administrateur avec le contrat frontend | ✅ Terminé | +| 89 | Log des appels API en mode debug | Ouvert | *Gitea #1 et #2 = anciens tickets de test (fermés). Liste complète : https://git.ptits-pas.fr/jmartin/petitspas/issues* @@ -662,6 +665,21 @@ Le back-office admin doit gérer des Relais avec des données réelles en base, --- +### Ticket #97 : [Backend] Harmoniser API création administrateur avec le contrat frontend +**Estimation** : 3h +**Labels** : `backend`, `p2`, `auth`, `admin` + +**Description** : +Rendre l'API de création administrateur cohérente et stable avec le besoin frontend (modale simplifiée), en définissant un contrat clair et minimal. + +**Tâches** : +- [ ] Introduire un DTO dédié `CreateAdministrateurDto` +- [ ] Champs autorisés : nom, prenom, email, password, telephone +- [ ] Champs exclus : adresse, ville, photo, etc. +- [ ] Rôle forcé à `ADMINISTRATEUR` +- [ ] Validation stricte + +--- ## 🟢 PRIORITÉ 3 : Frontend - Interfaces ### Ticket #35 : [Frontend] Écran Création Gestionnaire @@ -1085,6 +1103,24 @@ Interface de gestion des Relais dans le dashboard admin et rattachement des gest --- +<<<<<<< HEAD +======= +### Ticket #96 : [Frontend] Admin - Création administrateur via modale (sans relais) +**Estimation** : 3h +**Labels** : `frontend`, `p3`, `admin` + +**Description** : +Permettre la création d'un administrateur via une modale simple depuis le dashboard admin. + +**Tâches** : +- [ ] Bouton "Créer administrateur" dans l'onglet Administrateurs +- [ ] Modale avec formulaire simplifié (Nom, Prénom, Email, MDP, Téléphone) +- [ ] Appel API `POST /users` (ou endpoint dédié si #97 implémenté) +- [ ] Gestion succès/erreur et rafraîchissement liste + +--- + +>>>>>>> develop ## 🔵 PRIORITÉ 4 : Tests & Documentation ### Ticket #52 : [Tests] Tests unitaires Backend @@ -1200,6 +1236,20 @@ Mettre en place un système de logs centralisé avec Winston pour faciliter le d --- +### Ticket #89 : Log des appels API en mode debug +**Estimation** : 2h +**Labels** : `backend`, `monitoring` + +**Description** : +Ajouter des logs détaillés pour les appels API en mode debug pour faciliter le diagnostic. + +**Tâches** : +- [ ] Middleware ou Intercepteur pour logger les requêtes entrantes (méthode, URL, body) +- [ ] Logger les réponses (status, temps d'exécution) +- [ ] Activable via variable d'environnement `DEBUG=true` ou niveau de log + +--- + ### Ticket #51 (réf.) : [Frontend] Écran Logs Admin (optionnel v1.1) **Estimation** : 4h **Labels** : `frontend`, `p3`, `monitoring`, `admin` @@ -1302,8 +1352,8 @@ Rédiger les documents légaux génériques (CGU et Politique de confidentialit ## 📊 Résumé final -**Total** : 69 tickets -**Estimation** : ~200h de développement +**Total** : 72 tickets +**Estimation** : ~208h de développement ### Par priorité - **P0 (Bloquant BDD)** : 7 tickets (~5h) @@ -1338,7 +1388,7 @@ Rédiger les documents légaux génériques (CGU et Politique de confidentialit --- -**Dernière mise à jour** : 9 Février 2026 -**Version** : 1.4 +**Dernière mise à jour** : 24 Février 2026 +**Version** : 1.6 **Statut** : ✅ Aligné avec le dépôt Gitea