docs: concept v1.3 config (panneau Paramètres 3 sections, numéros = Gitea)
- 21_CONFIGURATION-SYSTEME: workflow sans /admin/setup, 3 sections, panneau unique - 23_LISTE-TICKETS: numéros de section = numéros Gitea, tickets #14/#15 alignés - 24_DECISIONS-PROJET: config initiale = panneau + navigation bloquée - BRIEFING-FRONTEND: tickets #12/#13 remplacés par panneau Paramètres - Suppression login_screen.dart.bak Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# 🔧 Documentation Technique - Configuration Système On-Premise
|
||||
|
||||
**Version** : 1.0
|
||||
**Date** : 25 Novembre 2025
|
||||
**Version** : 1.1
|
||||
**Date** : 9 Février 2026
|
||||
**Auteur** : Équipe PtitsPas
|
||||
**Référence** : Architecture On-Premise
|
||||
|
||||
@@ -78,7 +78,7 @@ L'application P'titsPas est déployée **on-premise** chez différentes collecti
|
||||
2. **ConfigService** : Cache en mémoire + chiffrement
|
||||
3. **ConfigAPI** : Endpoints REST pour CRUD
|
||||
4. **Guard Setup** : Redirection forcée si config incomplète
|
||||
5. **Interface Admin** : Formulaire de configuration
|
||||
5. **Interface Admin** : Panneau Paramètres (3 sections) dans le dashboard, première config + accès permanent
|
||||
|
||||
---
|
||||
|
||||
@@ -304,93 +304,69 @@ export class ConfigService {
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant SA as Super Admin
|
||||
participant App as Application
|
||||
participant Guard as SetupGuard
|
||||
participant Op as Opérateur
|
||||
participant App as Application (Dashboard)
|
||||
participant API as ConfigAPI
|
||||
participant DB as PostgreSQL
|
||||
participant SMTP as Serveur SMTP
|
||||
|
||||
SA->>App: Première connexion
|
||||
App->>Guard: Vérifier setup_completed
|
||||
Guard->>DB: SELECT valeur FROM configuration<br/>WHERE cle='setup_completed'
|
||||
DB-->>Guard: 'false'
|
||||
Op->>App: Première connexion (admin)
|
||||
App->>API: GET /configuration/setup/status
|
||||
API->>DB: setup_completed ?
|
||||
DB-->>API: false
|
||||
API-->>App: setupCompleted: false
|
||||
|
||||
Guard-->>App: Redirection forcée vers<br/>/admin/setup
|
||||
App->>App: Affiche panneau Configuration<br/>et bloque les autres onglets
|
||||
|
||||
SA->>SA: Remplit formulaire config<br/>(SMTP, app, sécurité)
|
||||
Op->>Op: Remplit les 3 sections<br/>(Email, Personnalisation, Avancé)
|
||||
|
||||
SA->>App: Clic "Tester la connexion SMTP"
|
||||
Op->>App: Clic "Tester la connexion SMTP"
|
||||
App->>API: POST /api/v1/configuration/test-smtp
|
||||
API->>SMTP: Test connexion
|
||||
|
||||
alt Test SMTP OK
|
||||
SMTP-->>API: ✅ Connexion réussie
|
||||
API->>SA: Envoi email de test
|
||||
API->>Op: Envoi email de test
|
||||
API-->>App: ✅ Test réussi
|
||||
App-->>SA: Message: "Email de test envoyé"
|
||||
App-->>Op: Message: "Email de test envoyé"
|
||||
else Test SMTP KO
|
||||
SMTP-->>API: ❌ Erreur connexion
|
||||
API-->>App: ❌ Erreur détaillée
|
||||
App-->>SA: Message: "Erreur: vérifiez les paramètres"
|
||||
App-->>Op: Message: "Erreur: vérifiez les paramètres"
|
||||
end
|
||||
|
||||
SA->>App: Clic "Sauvegarder"
|
||||
Op->>App: Clic "Sauvegarder et terminer la configuration"
|
||||
App->>API: PATCH /api/v1/configuration/bulk<br/>{smtp_host, smtp_port, ...}
|
||||
API->>DB: UPDATE configuration SET valeur=...
|
||||
API-->>App: OK
|
||||
|
||||
API->>DB: BEGIN TRANSACTION
|
||||
API->>DB: UPDATE configuration SET valeur=...<br/>FOR EACH key
|
||||
API->>DB: UPDATE configuration<br/>SET valeur='true'<br/>WHERE cle='setup_completed'
|
||||
API->>DB: COMMIT
|
||||
|
||||
App->>API: POST /api/v1/configuration/setup/complete
|
||||
API->>DB: SET setup_completed = true
|
||||
API->>API: Recharger cache ConfigService
|
||||
API-->>App: OK
|
||||
|
||||
API-->>App: ✅ Configuration sauvegardée
|
||||
App-->>SA: Redirection vers /admin/dashboard
|
||||
|
||||
SA->>App: Accès complet à l'application
|
||||
App->>App: Débloque la navigation<br/>Message succès
|
||||
Op->>App: Accès complet au dashboard
|
||||
```
|
||||
|
||||
### Étapes détaillées
|
||||
|
||||
#### 1. Détection configuration incomplète
|
||||
|
||||
**Guard** : `SetupGuard` (NestJS)
|
||||
**Backend** : Le `SetupGuard` (NestJS) vérifie `setup_completed`. Si false, il autorise l’accès au dashboard et aux APIs configuration (pas de redirection vers une page dédiée). Le **frontend** appelle `GET /configuration/setup/status` au chargement du dashboard admin ; si `setupCompleted === false`, il affiche directement le **panneau Paramètres** et désactive les autres onglets jusqu’à sauvegarde.
|
||||
|
||||
**Guard** (exemple) : exemption des routes login + dashboard + APIs configuration.
|
||||
|
||||
```typescript
|
||||
@Injectable()
|
||||
export class SetupGuard implements CanActivate {
|
||||
constructor(private configService: ConfigService) {}
|
||||
|
||||
canActivate(context: ExecutionContext): boolean {
|
||||
const request = context.switchToHttp().getRequest();
|
||||
const setupCompleted = this.configService.get('setup_completed', false);
|
||||
|
||||
// Exemptions
|
||||
const exemptedRoutes = ['/auth/login', '/admin/setup', '/api/v1/configuration'];
|
||||
if (exemptedRoutes.some(route => request.url.includes(route))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Si setup non complété, bloquer
|
||||
if (!setupCompleted) {
|
||||
throw new HttpException(
|
||||
'Configuration initiale requise',
|
||||
HttpStatus.TEMPORARY_REDIRECT,
|
||||
{ location: '/admin/setup' }
|
||||
);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// Exemptions : /auth/login, /api/v1/configuration, routes dashboard admin
|
||||
// Si setup non complété : pas de redirection HTTP ; le frontend gère l’affichage du panneau Config et le blocage des onglets.
|
||||
```
|
||||
|
||||
#### 2. Formulaire Setup (Frontend)
|
||||
#### 2. Panneau Paramètres (Frontend)
|
||||
|
||||
**3 onglets** :
|
||||
**Une seule page avec 3 sections** (blocs successifs, pas d’onglets dans le formulaire) :
|
||||
|
||||
##### Onglet 1 : Configuration Email 📧
|
||||
##### Section 1 : Configuration Email 📧
|
||||
|
||||
| Champ | Type | Valeur par défaut | Obligatoire |
|
||||
|-------|------|-------------------|-------------|
|
||||
@@ -405,7 +381,7 @@ export class SetupGuard implements CanActivate {
|
||||
|
||||
**Bouton** : "🧪 Tester la connexion SMTP"
|
||||
|
||||
##### Onglet 2 : Personnalisation 🎨
|
||||
##### Section 2 : Personnalisation 🎨
|
||||
|
||||
| Champ | Type | Valeur par défaut | Obligatoire |
|
||||
|-------|------|-------------------|-------------|
|
||||
@@ -413,7 +389,7 @@ export class SetupGuard implements CanActivate {
|
||||
| URL de l'application | URL | `https://app.ptits-pas.fr` | ✅ |
|
||||
| Logo | File (PNG/JPG) | Logo par défaut | ❌ |
|
||||
|
||||
##### Onglet 3 : Paramètres avancés ⚙️
|
||||
##### Section 3 : Paramètres avancés ⚙️
|
||||
|
||||
| Champ | Type | Valeur par défaut | Obligatoire |
|
||||
|-------|------|-------------------|-------------|
|
||||
@@ -421,7 +397,7 @@ export class SetupGuard implements CanActivate {
|
||||
| Durée session JWT (heures) | Number | `24` | ✅ |
|
||||
| Taille max upload (MB) | Number | `5` | ✅ |
|
||||
|
||||
**Bouton** : "💾 Sauvegarder et terminer la configuration"
|
||||
**Bouton** : "💾 Sauvegarder et terminer la configuration" (première config) ou "💾 Enregistrer" (accès permanent).
|
||||
|
||||
---
|
||||
|
||||
@@ -536,60 +512,39 @@ Content-Type: application/json
|
||||
|
||||
## 💻 Interface Admin
|
||||
|
||||
### Écran Setup Initial
|
||||
### Panneau Paramètres / Configuration (unique)
|
||||
|
||||
Un **seul panneau** dans le dashboard admin, avec **3 sections** affichées sur une même page (défilement si besoin). Pas d’onglets dans le formulaire.
|
||||
|
||||
- **Première configuration** (au déploiement, `setup_completed === false`) : l’opérateur arrive sur le dashboard ; le panneau Configuration est affiché par défaut et les **autres onglets sont bloqués** jusqu’à clic sur « Sauvegarder et terminer la configuration » (PATCH bulk + POST setup/complete).
|
||||
- **Accès permanent** : même panneau accessible via l’onglet « Configuration » / « Paramètres » du dashboard ; pas de blocage, simple modification et enregistrement (PATCH bulk).
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ 🚀 Configuration Initiale - P'titsPas │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ Bienvenue ! Configurez votre installation P'titsPas │
|
||||
│ │
|
||||
│ [ 📧 Email ] [ 🎨 Personnalisation ] [ ⚙️ Avancé ] │
|
||||
│ Dashboard Admin [ Gestionnaires ] [ Parents ] ... │
|
||||
│ [ Configuration ] ← onglet actif │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 📧 Configuration Email (SMTP) │
|
||||
│ Serveur SMTP * [_________________________________] │
|
||||
│ Port * [____] Sécurité [▼] ☐ Auth requise │
|
||||
│ Utilisateur [__________] Mot de passe [__________] │
|
||||
│ Nom expéditeur * [__________] Email * [__________] │
|
||||
│ [ 🧪 Tester la connexion SMTP ] │
|
||||
│ │
|
||||
│ Serveur SMTP * │
|
||||
│ [_____________________________________________] │
|
||||
│ Ex: mail.mairie-bezons.fr, smtp.gmail.com │
|
||||
│ │
|
||||
│ Port SMTP * │
|
||||
│ [_____] 25 (standard), 465 (SSL), 587 (STARTTLS) │
|
||||
│ │
|
||||
│ Sécurité * │
|
||||
│ [ ▼ Aucune ] STARTTLS SSL/TLS │
|
||||
│ │
|
||||
│ ☐ Authentification requise │
|
||||
│ │
|
||||
│ Utilisateur SMTP │
|
||||
│ [_____________________________________________] │
|
||||
│ │
|
||||
│ Mot de passe SMTP │
|
||||
│ [_____________________________________________] │
|
||||
│ │
|
||||
│ Nom de l'expéditeur * │
|
||||
│ [_____________________________________________] │
|
||||
│ Ex: P'titsPas - Mairie de Bezons │
|
||||
│ │
|
||||
│ Email expéditeur * │
|
||||
│ [_____________________________________________] │
|
||||
│ Ex: noreply@mairie-bezons.fr │
|
||||
│ │
|
||||
│ [ 🧪 Tester la connexion SMTP ] │
|
||||
│ │
|
||||
│ ───────────────────────────────────────────────── │
|
||||
│ │
|
||||
│ [ ← Précédent ] [ Suivant → ] │
|
||||
│ ───────────────────────────────────────────────── │
|
||||
│ 🎨 Personnalisation │
|
||||
│ Nom application * [__________] URL * [__________] │
|
||||
│ Logo [ Choisir un fichier ] │
|
||||
│ ───────────────────────────────────────────────── │
|
||||
│ ⚙️ Paramètres avancés │
|
||||
│ Durée token MDP (jours) [__] JWT (h) [__] Upload MB [__] │
|
||||
│ │
|
||||
│ [ 💾 Sauvegarder et terminer la configuration ] │
|
||||
│ (ou « Enregistrer » si config déjà complétée) │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Écran Paramètres (accès permanent)
|
||||
|
||||
Identique au Setup Initial, mais accessible depuis le menu admin :
|
||||
- Menu Admin → Paramètres → Configuration Système
|
||||
|
||||
---
|
||||
|
||||
## 📋 Exemples de configuration
|
||||
@@ -706,7 +661,7 @@ PORT=3000
|
||||
|
||||
---
|
||||
|
||||
**Dernière mise à jour** : 25 Novembre 2025
|
||||
**Version** : 1.0
|
||||
**Dernière mise à jour** : 9 Février 2026
|
||||
**Version** : 1.1
|
||||
**Statut** : ✅ Document validé
|
||||
|
||||
|
||||
Reference in New Issue
Block a user