package dev.lions.unionflow.server.security; import dev.lions.unionflow.server.entity.Organisation; import jakarta.enterprise.context.RequestScoped; import java.util.UUID; /** * Holder request-scoped contenant l'organisation active résolue pour la requête courante. * *

Peuplé par {@link OrganisationContextFilter} à partir du header * {@code X-Active-Organisation-Id}. Utilisé par les services métier pour * scoper toutes les opérations à l'organisation active. * *

Exemple d'utilisation dans un service : *

{@code
 *   @Inject OrganisationContextHolder orgContext;
 *
 *   public List listTontines() {
 *       UUID orgId = orgContext.getOrganisationId();
 *       return tontineRepository.findByOrganisationId(orgId);
 *   }
 * }
*/ @RequestScoped public class OrganisationContextHolder { private UUID organisationId; private Organisation organisation; private boolean resolved = false; /** Rôle actif sélectionné par le user pour cette requête (header X-Active-Role). */ private String roleActif; /** UUID de l'utilisateur courant (sub du JWT). */ private UUID currentUserId; /** Email de l'utilisateur courant (claim email du JWT). */ private String currentUserEmail; public String getRoleActif() { return roleActif; } public void setRoleActif(String roleActif) { this.roleActif = roleActif; } public UUID getCurrentUserId() { return currentUserId; } public void setCurrentUserId(UUID currentUserId) { this.currentUserId = currentUserId; } public String getCurrentUserEmail() { return currentUserEmail; } public void setCurrentUserEmail(String currentUserEmail) { this.currentUserEmail = currentUserEmail; } public UUID getOrganisationId() { return organisationId; } public void setOrganisationId(UUID organisationId) { this.organisationId = organisationId; } public Organisation getOrganisation() { return organisation; } public void setOrganisation(Organisation organisation) { this.organisation = organisation; } public boolean isResolved() { return resolved; } public void setResolved(boolean resolved) { this.resolved = resolved; } /** * Retourne true si un contexte d'organisation est disponible. */ public boolean hasContext() { return resolved && organisationId != null; } }