chore(quarkus-327): bump to Quarkus 3.27.3 LTS, rename quarkus-resteasy-reactive → quarkus-rest, fix testGetAuditQuestions map vs list, rename deprecated config keys

This commit is contained in:
2026-04-23 14:47:47 +00:00
parent c336984bec
commit 51265fb0fa
127 changed files with 17488 additions and 9557 deletions

View File

@@ -1,194 +1,194 @@
package dev.lions.repositories;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import dev.lions.exceptions.RepositoryException;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Optional;
/**
* Repository générique fournissant les opérations CRUD de base.
* Cette classe abstract implémente les fonctionnalités communes à tous les repositories
* de l'application en assurant une gestion cohérente des entités.
*
* @param <T> Type de l'entité
* @param <ID> Type de l'identifiant de l'entité
*/
@Slf4j
public abstract class BaseRepository<T, ID> {
@PersistenceContext
protected EntityManager entityManager;
private final Class<T> entityClass;
/**
* Constructeur initialisant la classe d'entité via réflexion.
*/
@SuppressWarnings("unchecked")
public BaseRepository() {
Class<?> currentClass = getClass();
while (!(currentClass.getGenericSuperclass() instanceof ParameterizedType)) {
currentClass = currentClass.getSuperclass();
}
this.entityClass = (Class<T>) ((ParameterizedType) currentClass.getGenericSuperclass())
.getActualTypeArguments()[0];
log.debug("Repository initialisé pour l'entité : {}", entityClass.getSimpleName());
}
/**
* Persiste une nouvelle entité.
*
* @param entity Entité à persister
* @return Entité persistée
*/
@Transactional
public T save(T entity) {
try {
log.debug("Sauvegarde d'une nouvelle entité : {}", entityClass.getSimpleName());
entityManager.persist(entity);
entityManager.flush();
log.info("Entité sauvegardée avec succès : {}", entity);
return entity;
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la sauvegarde de l'entité", e);
}
}
/**
* Met à jour une entité existante.
*
* @param entity Entité à mettre à jour
* @return Entité mise à jour
*/
@Transactional
public T update(T entity) {
try {
log.debug("Mise à jour d'une entité : {}", entityClass.getSimpleName());
T updatedEntity = entityManager.merge(entity);
entityManager.flush();
log.info("Entité mise à jour avec succès : {}", entity);
return updatedEntity;
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la mise à jour de l'entité", e);
}
}
/**
* Recherche une entité par son identifiant.
*
* @param id Identifiant de l'entité
* @return Entité trouvée (Optional)
*/
public Optional<T> findById(ID id) {
try {
log.debug("Recherche de l'entité {} avec l'id : {}",
entityClass.getSimpleName(), id);
return Optional.ofNullable(entityManager.find(entityClass, id));
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la recherche de l'entité", e);
}
}
/**
* Récupère toutes les entités.
*
* @return Liste des entités
*/
public List<T> findAll() {
try {
log.debug("Récupération de toutes les entités : {}",
entityClass.getSimpleName());
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(entityClass);
cq.from(entityClass);
TypedQuery<T> query = entityManager.createQuery(cq);
return query.getResultList();
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la récupération des entités", e);
}
}
/**
* Supprime une entité.
*
* @param entity Entité à supprimer
*/
@Transactional
public void delete(T entity) {
try {
log.debug("Suppression de l'entité : {}", entity);
if (!entityManager.contains(entity)) {
entity = entityManager.merge(entity);
}
entityManager.remove(entity);
entityManager.flush();
log.info("Entité supprimée avec succès : {}", entity);
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la suppression de l'entité", e);
}
}
/**
* Supprime une entité par son identifiant.
*
* @param id Identifiant de l'entité à supprimer
*/
@Transactional
public void deleteById(ID id) {
try {
log.debug("Suppression de l'entité {} avec l'id : {}",
entityClass.getSimpleName(), id);
findById(id).ifPresent(this::delete);
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la suppression de l'entité", e);
}
}
/**
* Vérifie l'existence d'une entité par son identifiant.
*
* @param id Identifiant à vérifier
* @return true si l'entité existe
*/
public boolean existsById(ID id) {
try {
log.debug("Vérification de l'existence de l'entité {} avec l'id : {}",
entityClass.getSimpleName(), id);
return findById(id).isPresent();
} catch (Exception e) {
throw new RepositoryException(
"Erreur lors de la vérification de l'existence de l'entité", e);
}
}
/**
* Compte le nombre total d'entités.
*
* @return Nombre total d'entités
*/
public long count() {
try {
log.debug("Comptage des entités : {}", entityClass.getSimpleName());
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(cq.from(entityClass)));
return entityManager.createQuery(cq).getSingleResult();
} catch (Exception e) {
throw new RepositoryException(
"Erreur lors du comptage des entités", e);
}
}
package dev.lions.repositories;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import dev.lions.exceptions.RepositoryException;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Optional;
/**
* Repository générique fournissant les opérations CRUD de base.
* Cette classe abstract implémente les fonctionnalités communes à tous les repositories
* de l'application en assurant une gestion cohérente des entités.
*
* @param <T> Type de l'entité
* @param <ID> Type de l'identifiant de l'entité
*/
@Slf4j
public abstract class BaseRepository<T, ID> {
@PersistenceContext
protected EntityManager entityManager;
private final Class<T> entityClass;
/**
* Constructeur initialisant la classe d'entité via réflexion.
*/
@SuppressWarnings("unchecked")
public BaseRepository() {
Class<?> currentClass = getClass();
while (!(currentClass.getGenericSuperclass() instanceof ParameterizedType)) {
currentClass = currentClass.getSuperclass();
}
this.entityClass = (Class<T>) ((ParameterizedType) currentClass.getGenericSuperclass())
.getActualTypeArguments()[0];
log.debug("Repository initialisé pour l'entité : {}", entityClass.getSimpleName());
}
/**
* Persiste une nouvelle entité.
*
* @param entity Entité à persister
* @return Entité persistée
*/
@Transactional
public T save(T entity) {
try {
log.debug("Sauvegarde d'une nouvelle entité : {}", entityClass.getSimpleName());
entityManager.persist(entity);
entityManager.flush();
log.info("Entité sauvegardée avec succès : {}", entity);
return entity;
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la sauvegarde de l'entité", e);
}
}
/**
* Met à jour une entité existante.
*
* @param entity Entité à mettre à jour
* @return Entité mise à jour
*/
@Transactional
public T update(T entity) {
try {
log.debug("Mise à jour d'une entité : {}", entityClass.getSimpleName());
T updatedEntity = entityManager.merge(entity);
entityManager.flush();
log.info("Entité mise à jour avec succès : {}", entity);
return updatedEntity;
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la mise à jour de l'entité", e);
}
}
/**
* Recherche une entité par son identifiant.
*
* @param id Identifiant de l'entité
* @return Entité trouvée (Optional)
*/
public Optional<T> findById(ID id) {
try {
log.debug("Recherche de l'entité {} avec l'id : {}",
entityClass.getSimpleName(), id);
return Optional.ofNullable(entityManager.find(entityClass, id));
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la recherche de l'entité", e);
}
}
/**
* Récupère toutes les entités.
*
* @return Liste des entités
*/
public List<T> findAll() {
try {
log.debug("Récupération de toutes les entités : {}",
entityClass.getSimpleName());
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(entityClass);
cq.from(entityClass);
TypedQuery<T> query = entityManager.createQuery(cq);
return query.getResultList();
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la récupération des entités", e);
}
}
/**
* Supprime une entité.
*
* @param entity Entité à supprimer
*/
@Transactional
public void delete(T entity) {
try {
log.debug("Suppression de l'entité : {}", entity);
if (!entityManager.contains(entity)) {
entity = entityManager.merge(entity);
}
entityManager.remove(entity);
entityManager.flush();
log.info("Entité supprimée avec succès : {}", entity);
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la suppression de l'entité", e);
}
}
/**
* Supprime une entité par son identifiant.
*
* @param id Identifiant de l'entité à supprimer
*/
@Transactional
public void deleteById(ID id) {
try {
log.debug("Suppression de l'entité {} avec l'id : {}",
entityClass.getSimpleName(), id);
findById(id).ifPresent(this::delete);
} catch (Exception e) {
throw new RepositoryException("Erreur lors de la suppression de l'entité", e);
}
}
/**
* Vérifie l'existence d'une entité par son identifiant.
*
* @param id Identifiant à vérifier
* @return true si l'entité existe
*/
public boolean existsById(ID id) {
try {
log.debug("Vérification de l'existence de l'entité {} avec l'id : {}",
entityClass.getSimpleName(), id);
return findById(id).isPresent();
} catch (Exception e) {
throw new RepositoryException(
"Erreur lors de la vérification de l'existence de l'entité", e);
}
}
/**
* Compte le nombre total d'entités.
*
* @return Nombre total d'entités
*/
public long count() {
try {
log.debug("Comptage des entités : {}", entityClass.getSimpleName());
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(cq.from(entityClass)));
return entityManager.createQuery(cq).getSingleResult();
} catch (Exception e) {
throw new RepositoryException(
"Erreur lors du comptage des entités", e);
}
}
}