feat(backend): implement create admin API (ticket #97)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
ed18dcab10
commit
537c46127f
@ -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) {}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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<Users> {
|
||||
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<Users[]> {
|
||||
return this.usersRepository.find();
|
||||
}
|
||||
|
||||
@ -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 | Ouvert |
|
||||
| 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,22 @@ 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 +1104,21 @@ Interface de gestion des Relais dans le dashboard admin et rattachement des gest
|
||||
|
||||
---
|
||||
|
||||
### 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
|
||||
|
||||
---
|
||||
|
||||
## 🔵 PRIORITÉ 4 : Tests & Documentation
|
||||
|
||||
### Ticket #52 : [Tests] Tests unitaires Backend
|
||||
@ -1200,6 +1234,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 +1350,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 +1386,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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user