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;
}
}