# Prompt Corrigé - Module lions-user-manager

## Objectif

Générer intégralement (A→Z) un module nommé `lions-user-manager` en Java + Quarkus + PrimeFaces Freya, structuré en 3 sous-modules Maven selon l'architecture existante des projets `unionflow` et `btpxpress` :

1. `lions-user-manager-server-api` (JAR)
2. `lions-user-manager-server-impl-quarkus` (JAR)
3. `lions-user-manager-client-quarkus-primefaces-freya` (JAR)

## Contraintes Globales

### Architecture & Structure

- **Respecter strictement l'architecture existante** :
  - Module parent : `lions-user-manager-parent` (pom.xml avec packaging `pom`)
  - GroupId : `dev.lions.user.manager` (convention : points, comme `dev.lions.unionflow`)
  - Version : `1.0.0`
  - Java 17+ (comme `unionflow`)
  - Quarkus `3.15.1` (version stable utilisée dans `unionflow`)
  - PrimeFaces `14.0.5` avec Quarkus PrimeFaces `3.13.3`

- **Séparation des modules** :
  - `server-api` : Contrats uniquement (DTOs, interfaces service, enums, exceptions, validation)
  - `server-impl` : Implémentation métier, Keycloak Admin Client, Resources REST, Services, Entités/Repositories (si nécessaire)
  - `client` : UI PrimeFaces Freya, Beans JSF, Services REST Client (MicroProfile Rest Client), DTOs client simplifiés

### Keycloak - Contraintes Critiques

- **AUCUNE écriture directe dans la DB Keycloak** : Utiliser uniquement Keycloak Admin REST API (client credentials / service account) pour toutes les opérations CREATE/UPDATE/DELETE.
- **Accès DB Keycloak en lecture** : STRICTEMENT contrôlés (read-only, TLS, IP whitelist, journalisation). Toute méthode qui appellerait directement la DB Keycloak doit être commentée `// DISABLED: direct DB access forbidden in prod` et nulle part activée par défaut.
- **Client Keycloak** : Provisionnement via client Keycloak `lions-user-manager` (service account, client credentials).
- **Appels Admin API** : Doivent passer par une classe `KeycloakAdminClient` centralisée, testable (interface + mock).

### Patterns & Conventions (basés sur unionflow)

#### Packages

- **server-api** : `dev.lions.user.manager.server.api`
  - `dto/` : DTOs avec sous-packages par domaine (ex: `dto/user/`, `dto/role/`, `dto/audit/`)
  - `dto/base/` : `BaseDTO` (comme dans unionflow)
  - `enums/` : Enums métiers
  - `service/` : Interfaces de services (ex: `UserService`, `RoleService`)
  - `validation/` : Constantes de validation

- **server-impl** : `dev.lions.user.manager.server`
  - `resource/` : Resources REST JAX-RS (ex: `UserResource`, `RoleResource`)
  - `service/` : Implémentations des services (ex: `UserServiceImpl`, `RoleServiceImpl`)
  - `client/` : Client Keycloak Admin API (`KeycloakAdminClient`, interface + implémentation)
  - `security/` : Configuration sécurité, KeycloakService
  - `entity/` : Entités JPA (si nécessaire pour audit local)
  - `repository/` : Repositories (si nécessaire)
  - `dto/` : DTOs spécifiques à l'implémentation (si nécessaire)

- **client** : `dev.lions.user.manager.client`
  - `service/` : Services REST Client (MicroProfile Rest Client) avec `@RegisterRestClient(configKey = "lions-user-manager-api")`
  - `dto/` : DTOs client simplifiés (mirroir des DTOs server-api mais adaptés)
  - `view/` : Beans JSF avec `@Named("...")` et `@SessionScoped` ou `@RequestScoped`
  - `security/` : Gestion tokens, OIDC, filtres
  - `validation/` : Validateurs client
  - `exception/` : Handlers d'exceptions JSF
  - `converter/` : Converters JSF

#### Resources REST

- **Path** : Utiliser `/api/...` (comme dans unionflow : `/api/membres`, `/api/cotisations`)
- **Annotations** :
  - `@Path("/api/users")` (pas `/realms/{realm}/users`)
  - `@ApplicationScoped`
  - `@Tag(name = "...", description = "...")` pour OpenAPI
  - `@Operation`, `@APIResponse`, `@SecurityRequirement` pour documentation
  - `@RolesAllowed` pour la sécurité
- **Réponses** : Utiliser `Response` de JAX-RS avec codes HTTP appropriés

#### Services

- **Interfaces** : Dans `server-api/src/main/java/.../service/` (ex: `UserService.java`)
- **Implémentations** : Dans `server-impl/src/main/java/.../service/` (ex: `UserServiceImpl.java`)
- **Annotations** : `@ApplicationScoped`, `@Inject` pour les dépendances
- **Logging** : Utiliser `org.jboss.logging.Logger` (comme dans unionflow)

#### Client REST (MicroProfile Rest Client)

- **Pattern** : Comme `MembreService` dans unionflow
  ```java
  @RegisterRestClient(configKey = "lions-user-manager-api")
  @Path("/api/users")
  @Consumes(MediaType.APPLICATION_JSON)
  @Produces(MediaType.APPLICATION_JSON)
  public interface UserService {
      @GET
      List<UserDTO> listerTous();
      // ...
  }
  ```
- **Configuration** : Dans `application.properties` (comme dans unionflow) :
  ```properties
  lions.user.manager.backend.url=http://localhost:8080
  quarkus.rest-client."lions-user-manager-api".url=${lions.user.manager.backend.url}
  quarkus.rest-client."lions-user-manager-api".scope=jakarta.inject.Singleton
  quarkus.rest-client."lions-user-manager-api".connect-timeout=5000
  quarkus.rest-client."lions-user-manager-api".read-timeout=30000
  ```

#### Beans JSF

- **Pattern** : Comme `MembreRechercheBean` dans unionflow
  - `@Named("userRechercheBean")` (nom en camelCase)
  - `@SessionScoped` ou `@RequestScoped`
  - `@Inject` pour les services REST Client
  - `@PostConstruct` pour l'initialisation
  - `private static final Logger LOGGER = Logger.getLogger(...)`
  - Implémenter `Serializable`

#### DTOs

- **server-api** : Comme `MembreDTO` dans unionflow
  - Étendre `BaseDTO` (avec UUID `id`)
  - Utiliser Lombok `@Getter`, `@Setter`
  - Validation Bean (`@NotBlank`, `@Email`, etc.)
  - Package : `dev.lions.user.manager.server.api.dto.user`

- **client** : DTOs simplifiés (mirroir mais adaptés)
  - Package : `dev.lions.user.manager.client.dto`
  - Peuvent avoir des méthodes supplémentaires pour JSF

#### Configuration

- **application.properties** : Comme dans unionflow
  - Profils : `%dev`, `%test`, `%prod`
  - Variables d'environnement pour prod : `${KEYCLOAK_SERVER_URL:...}`
  - Keycloak OIDC configuré via `quarkus.oidc.*`
  - OpenAPI configuré via `quarkus.smallrye-openapi.*`

### Fonctions Principales à Générer

#### 1. AuthN/AuthZ & Sécurité

- **Provisionnement** : Client Keycloak `lions-user-manager` (service account, client credentials)
- **JWT validation** : Côté service, contrôle RBAC : superadmin global et admin de realm
- **Protection CSRF/XSS** : Pour UI PrimeFaces (via Quarkus/PrimeFaces)
- **KeycloakAdminClient** : Classe centralisée pour tous les appels Admin API, avec interface pour tests

#### 2. Gestion Utilisateurs (CRUD)

- **Endpoints REST** :
  - `GET /api/users` : Liste paginée
  - `POST /api/users` : Création
  - `GET /api/users/{id}` : Détails
  - `PUT /api/users/{id}` : Modification
  - `DELETE /api/users/{id}` : Suppression (soft delete si possible via Admin API)
  - `GET /api/users/search` : Recherche avancée
- **Import/Export** : CSV & JSON, mapping attributs métiers -> Keycloak attributes
- **Service** : `UserService` (interface dans api, impl dans impl)

#### 3. Gestion Rôles & Privileges Métiers

- **Mappage** : Rôles métiers ↔ Keycloak realm roles / client roles
- **Endpoints** :
  - `GET /api/roles` : Liste des rôles
  - `POST /api/users/{userId}/roles` : Assignation
  - `DELETE /api/users/{userId}/roles/{roleId}` : Désassignation
  - `GET /api/users/{userId}/roles` : Rôles d'un utilisateur
- **Service** : `RoleService` (interface dans api, impl dans impl)

#### 4. Délégation Multi-Realm

- **Superadmin global** : Peut tout faire (tous les realms)
- **Admin de realm** : Limité à son realm
- **Vérification** : Côté API (double-check du token + logique métier)
- **Filtrage** : Les endpoints retournent uniquement les données du realm autorisé

#### 5. Audit & Traçabilité

- **Audit append-only** : Toutes les actions admin (utilisateur, rôle, import/export) : qui, quoi, quand, IP, success/failure
- **Stockage** : Configurable (ex: ES / DB append-only / bucket versionné)
- **Service** : `AuditService` (interface dans api, impl dans impl)
- **Endpoint** : `GET /api/audit` : Consultation des logs d'audit

#### 6. Synchronisation & Consistance

- **Event listener / polling** : Refléter changements faits directement dans Keycloak (EventListener SPI ou Keycloak events via Admin API)
- **Reconciliation périodique** : Configurable (via Admin API)
- **Service** : `SyncService` (interface dans api, impl dans impl)

#### 7. Résilience & Observabilité

- **Retry** : Exponential backoff sur appels Admin API
- **Circuit breaker** : Pour éviter surcharge Keycloak
- **Timeout** : Configuration des timeouts
- **Rate limiting** : Sur appels Admin API
- **Metrics** : Prometheus (Quarkus MicroProfile Metrics)
- **Logs structurés** : Utiliser `org.jboss.logging.Logger`
- **Alerting** : Slack/email (via configuration)

#### 8. Déploiement & Infra

- **Helm chart** : Pour k8s (secrets via Vault/K8s Secret)
- **Readiness/liveness probes** : Endpoints `/health/ready`, `/health/live`
- **Resource requests/limits** : Configuration dans Helm
- **Scripts d'init** : `kcadm.sh` / Admin API curl examples pour créer le client Keycloak et accorder les rôles nécessaires

#### 9. Documentation & SDK

- **SDK Java** : Client lib dans `server-api` (DTOs + interfaces) et exemples d'utilisation
- **Documentation OpenAPI** : Générée automatiquement via Quarkus (accessible sur `/q/swagger-ui`)
- **Guides d'intégration** : Java + JSF (dans `/docs`)

#### 10. Tests & CI

- **Testcontainers** : Instance Keycloak pour CI
- **Tests unitaires** : Services, repositories, client Keycloak (mocks)
- **Tests d'intégration** : Resources REST avec Testcontainers
- **Tests E2E minimal** : UI PrimeFaces (si possible)

## Structure du Repo Demandé

```
lions-user-manager/
├── pom.xml                          # Parent multi-modules
├── lions-user-manager-server-api/
│   ├── pom.xml
│   └── src/main/java/dev/lions/user/manager/server/api/
│       ├── dto/
│       │   ├── base/
│       │   │   └── BaseDTO.java
│       │   ├── user/
│       │   │   ├── UserDTO.java
│       │   │   ├── UserSearchCriteria.java
│       │   │   └── UserSearchResultDTO.java
│       │   ├── role/
│       │   │   ├── RoleDTO.java
│       │   │   └── RoleAssignmentDTO.java
│       │   └── audit/
│       │       └── AuditLogDTO.java
│       ├── enums/
│       │   ├── user/
│       │   │   └── StatutUser.java
│       │   └── role/
│       │       └── TypeRole.java
│       ├── service/
│       │   ├── UserService.java
│       │   ├── RoleService.java
│       │   ├── AuditService.java
│       │   └── SyncService.java
│       └── validation/
│           └── ValidationConstants.java
├── lions-user-manager-server-impl-quarkus/
│   ├── pom.xml
│   └── src/main/java/dev/lions/user/manager/server/
│       ├── resource/
│       │   ├── UserResource.java
│       │   ├── RoleResource.java
│       │   ├── AuditResource.java
│       │   └── HealthResource.java
│       ├── service/
│       │   ├── UserServiceImpl.java
│       │   ├── RoleServiceImpl.java
│       │   ├── AuditServiceImpl.java
│       │   └── SyncServiceImpl.java
│       ├── client/
│       │   ├── KeycloakAdminClient.java        # Interface
│       │   └── KeycloakAdminClientImpl.java    # Implémentation
│       ├── security/
│       │   ├── KeycloakService.java
│       │   └── SecurityConfig.java
│       ├── entity/                              # Si nécessaire pour audit local
│       │   └── AuditLog.java
│       ├── repository/                          # Si nécessaire
│       │   └── AuditLogRepository.java
│       └── UserManagerServerApplication.java
│   └── src/main/resources/
│       ├── application.properties
│       ├── application-dev.properties          # Optionnel
│       ├── application-prod.properties         # Optionnel
│       └── db/migration/                       # Si nécessaire pour audit local
│           └── V1.0__Create_Audit_Log_Table.sql
├── lions-user-manager-client-quarkus-primefaces-freya/
│   ├── pom.xml
│   └── src/main/java/dev/lions/user/manager/client/
│       ├── service/
│       │   ├── UserService.java                 # REST Client
│       │   ├── RoleService.java                 # REST Client
│       │   └── AuditService.java                # REST Client
│       ├── dto/
│       │   ├── UserDTO.java                     # DTO client simplifié
│       │   ├── RoleDTO.java
│       │   └── AuditLogDTO.java
│       ├── view/
│       │   ├── UserRechercheBean.java
│       │   ├── UserListeBean.java
│       │   ├── UserProfilBean.java
│       │   ├── RoleGestionBean.java
│       │   └── AuditConsultationBean.java
│       ├── security/
│       │   ├── JwtTokenManager.java
│       │   ├── AuthenticationFilter.java
│       │   └── PermissionChecker.java
│       └── UserManagerClientApplication.java
│   └── src/main/resources/
│       ├── application.properties
│       └── META-INF/resources/
│           └── pages/                          # Pages XHTML PrimeFaces
├── helm/
│   ├── Chart.yaml
│   ├── values.yaml
│   ├── values.yaml.example
│   └── templates/
│       ├── deployment.yaml
│       ├── service.yaml
│       ├── ingress.yaml
│       └── configmap.yaml
├── scripts/
│   ├── kcadm-provision.sh                      # Création client Keycloak
│   ├── rotate-secrets.sh                       # Rotation secrets
│   └── setup-keycloak-client.ps1               # Alternative PowerShell
├── tests/
│   ├── integration/                            # Tests Testcontainers
│   │   ├── UserResourceIT.java
│   │   └── RoleResourceIT.java
│   └── unit/                                   # Tests unitaires
│       ├── UserServiceImplTest.java
│       └── KeycloakAdminClientTest.java
└── docs/
    ├── architecture.md
    ├── runbook.md
    ├── security-policy.md
    └── integration-guide.md
```

## Contraintes Techniques Précises

### Keycloak Admin Client

- **Classe centralisée** : `KeycloakAdminClient` (interface + implémentation)
- **Interface** : Pour permettre le mocking dans les tests
- **Configuration** : Via `application.properties` :
  ```properties
  lions.user.manager.keycloak.server-url=${KEYCLOAK_SERVER_URL:http://localhost:8180}
  lions.user.manager.keycloak.realm=${KEYCLOAK_REALM:master}
  lions.user.manager.keycloak.client-id=${KEYCLOAK_CLIENT_ID:lions-user-manager}
  lions.user.manager.keycloak.client-secret=${KEYCLOAK_CLIENT_SECRET}
  lions.user.manager.keycloak.connection-timeout=5000
  lions.user.manager.keycloak.read-timeout=30000
  ```
- **Retry & Circuit Breaker** : Implémenter dans `KeycloakAdminClientImpl`
- **Token management** : Récupération automatique via client credentials, refresh si expiré

### Feature Toggles

- **`lions.user.manager.keycloak.write.enabled`** : `false` par défaut en staging, `true` en prod
- **Validation utilisateur** : Confirmation finale avant toute action destructive (DELETE)

### Health & Metrics

- **Health endpoints** : Utiliser Quarkus MicroProfile Health
  - `/health/ready` : Readiness probe
  - `/health/live` : Liveness probe
  - `/health` : Health check général
- **Metrics** : Utiliser Quarkus MicroProfile Metrics
  - Exposer sur `/metrics` (Prometheus format)
  - Métriques : nombre d'appels Admin API, taux d'erreur, latence

### Gestion d'Erreurs

- **Keycloak 5xx** : Retry avec exponential backoff + circuit breaker
- **Si échec prolongé** : Bloquer opérations sensibles et informer superadmin (log + métrique)
- **Token service account expiré** : Récupération automatique via client credentials; log & alert si échec
- **Conflit de rôle** : Transactionnel côté application (idempotence) et reconciliation par background job

### Logging

- **Utiliser** : `org.jboss.logging.Logger` (comme dans unionflow)
- **Format structuré** : JSON en prod (configurable)
- **Niveaux** : INFO par défaut, DEBUG en dev

## Livrables Concrets

1. **Diagramme d'architecture** : Components + flows AuthN/AuthZ + secrets distribution (fichier `docs/architecture.md`)
2. **Arborescence de repo** : Complète avec pom parent + modules (comme décrit ci-dessus)
3. **Code complet** :
   - Controllers (Resources REST)
   - Services (interfaces + implémentations)
   - DTOs (server-api + client)
   - Client Keycloak Admin API (interface + impl)
   - UI PrimeFaces Freya (pages XHTML + Beans JSF)
4. **Scripts** : Provisionner Keycloak client/service account (kcadm & Admin API examples)
5. **Helm chart** : Manifest k8s complet
6. **Testcontainers** : Tests d'intégration
7. **OpenAPI spec** : Générée automatiquement via Quarkus
8. **SDK Java** : DTOs + interfaces dans `server-api`
9. **Runbook ops** : Création client, rotation secret, rollback, procédure d'urgence
10. **Checklist sécurité** : Logs, no plaintext passwords, RGPD notes

## Critères d'Acceptation

- ✅ Endpoints CRUD utilisateurs + gestion rôles fonctionnels via Admin API (tests CI green)
- ✅ Admin realm ne voit/agit que sur son realm (filtrage côté API)
- ✅ UI PrimeFaces Freya totalement intégrée et authentifiée via OIDC
- ✅ Tests d'intégration avec Testcontainers Keycloak passés
- ✅ Scripts de provisioning Keycloak fournis + Helm déployable sur cluster staging
- ✅ Aucune écriture directe dans DB Keycloak (vérification code + tests)
- ✅ Code conforme aux patterns de `unionflow` (packages, annotations, structure)

## Instructions Finales pour l'IA

- **Générer le code Java complet** : Controllers, services, DTOs, client Keycloak, UI PrimeFaces Freya (templates & composants), tests, CI (GitHub Actions ou équivalent), scripts k8s/helm
- **Respecter strictement** : L'interdiction d'écriture directe sur la DB Keycloak — toute option DB doit être read-only et documentée comme « usage d'investigation seulement »
- **Fournir un README** : D'intégration clair pour les autres modules lions.dev (comment utiliser le SDK, créer un admin realm, etc.)
- **Alignement architecture** : Respecter strictement les patterns, conventions et structure de `unionflow` (packages, annotations, nommage, organisation)

## Notes Spécifiques

- **Pas de base de données locale** : Sauf pour l'audit (optionnel, configurable)
- **Tous les appels Keycloak** : Via Admin REST API uniquement
- **UI PrimeFaces Freya** : Utiliser les composants PrimeFaces 14.0.5 avec thème Freya
- **Tests** : Minimum 80% de couverture (comme unionflow avec Jacoco)
- **Documentation** : En français (comme unionflow)

