Ajout des Dockerfiles et configuration de production pour déploiement unionflow

This commit is contained in:
dahoud
2025-12-09 19:37:23 +00:00
parent 1e835ba2c3
commit bba28595f6
40 changed files with 1762 additions and 1652 deletions

View File

@@ -216,6 +216,20 @@
</configuration>
</plugin>
<!-- Maven Surefire pour les tests -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<systemPropertyVariables>
<!-- Exclure les migrations Flyway du classpath des tests -->
<quarkus.flyway.enabled>false</quarkus.flyway.enabled>
<quarkus.flyway.migrate-at-start>false</quarkus.flyway.migrate-at-start>
</systemPropertyVariables>
</configuration>
</plugin>
<!-- Jacoco pour la couverture de code -->
<plugin>
<groupId>org.jacoco</groupId>

View File

@@ -78,6 +78,10 @@ public abstract class BaseRepository<T extends BaseEntity> {
*/
@Transactional
public void delete(T entity) {
// Si l'entité n'est pas dans le contexte de persistance, la merger d'abord
if (!entityManager.contains(entity)) {
entity = entityManager.merge(entity);
}
entityManager.remove(entity);
}
@@ -90,7 +94,11 @@ public abstract class BaseRepository<T extends BaseEntity> {
public boolean deleteById(UUID id) {
T entity = findById(id);
if (entity != null) {
delete(entity);
// S'assurer que l'entité est dans le contexte de persistance
if (!entityManager.contains(entity)) {
entity = entityManager.merge(entity);
}
entityManager.remove(entity);
return true;
}
return false;

View File

@@ -360,7 +360,7 @@ public class MembreResource {
public Response searchMembresAdvanced(
@RequestBody(
description = "Critères de recherche avancée",
required = true,
required = false,
content =
@Content(
mediaType = MediaType.APPLICATION_JSON,
@@ -632,7 +632,7 @@ public class MembreResource {
List<MembreDTO> membres = membreService.listerMembresPourExport(
associationId, statut, type, dateAdhesionDebut, dateAdhesionFin);
return Response.ok(membres.size()).build();
return Response.ok(Map.of("count", membres.size())).build();
} catch (Exception e) {
LOG.errorf(e, "Erreur lors du comptage des membres");
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)

View File

@@ -345,7 +345,7 @@ public class MembreService {
long totalElements = countQueryTyped.getSingleResult();
if (totalElements == 0) {
return MembreSearchResultDTO.empty(criteria);
return MembreSearchResultDTO.empty(criteria, page.size, page.index);
}
// Ajout du tri et pagination
@@ -488,7 +488,10 @@ public class MembreService {
}
return sort.getColumns().stream()
.map(column -> "m." + column.getName() + " " + column.getDirection().name())
.map(column -> {
String direction = column.getDirection() == Sort.Direction.Descending ? "DESC" : "ASC";
return "m." + column.getName() + " " + direction;
})
.collect(Collectors.joining(", "));
}

View File

@@ -5,19 +5,27 @@
quarkus.datasource.db-kind=h2
quarkus.datasource.username=sa
quarkus.datasource.password=
quarkus.datasource.jdbc.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
quarkus.datasource.jdbc.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
# Configuration Hibernate pour tests
quarkus.hibernate-orm.database.generation=drop-and-create
# Désactiver l'exécution de import.sql pendant les tests
quarkus.hibernate-orm.sql-load-script=
# Désactiver complètement l'exécution des scripts SQL au démarrage
quarkus.hibernate-orm.sql-load-script-source=none
# Empêcher Hibernate d'exécuter les scripts SQL automatiquement
# Note: Ne pas définir quarkus.hibernate-orm.sql-load-script car une chaîne vide peut causer des problèmes
# Configuration Flyway pour tests (désactivé)
# Configuration Flyway pour tests (désactivé complètement)
quarkus.flyway.migrate-at-start=false
quarkus.flyway.enabled=false
quarkus.flyway.baseline-on-migrate=false
# Note: Ne pas définir quarkus.flyway.locations car une chaîne vide cause une erreur de configuration
# Configuration Keycloak pour tests (désactivé)
quarkus.oidc.tenant-enabled=false
quarkus.keycloak.policy-enforcer.enable=false
# Configuration HTTP pour tests
quarkus.http.port=0
quarkus.http.test-port=0

View File

@@ -104,6 +104,7 @@ class MembreResourceAdvancedSearchTest {
void testAdvancedSearchPagination() {
MembreSearchCriteria criteria =
MembreSearchCriteria.builder()
.statut("ACTIF") // Ajouter un critère valide
.includeInactifs(true) // Inclure tous les membres
.build();
@@ -286,7 +287,11 @@ class MembreResourceAdvancedSearchTest {
roles = {"SUPER_ADMIN"})
@DisplayName("POST /api/membres/search/advanced doit retourner des statistiques complètes")
void testAdvancedSearchStatistics() {
MembreSearchCriteria criteria = MembreSearchCriteria.builder().includeInactifs(true).build();
MembreSearchCriteria criteria =
MembreSearchCriteria.builder()
.statut("ACTIF") // Ajouter un critère valide
.includeInactifs(true)
.build();
given()
.contentType(ContentType.JSON)

View File

@@ -105,13 +105,21 @@ class MembreServiceAdvancedSearchTest {
if (testMembres != null) {
testMembres.forEach(membre -> {
if (membre.getId() != null) {
membreRepository.delete(membre);
// Recharger l'entité depuis la base pour éviter l'erreur "detached entity"
membreRepository.findByIdOptional(membre.getId()).ifPresent(m -> {
// Utiliser deleteById pour éviter les problèmes avec les entités détachées
membreRepository.deleteById(m.getId());
});
}
});
}
if (testOrganisation != null && testOrganisation.getId() != null) {
organisationRepository.delete(testOrganisation);
// Recharger l'entité depuis la base pour éviter l'erreur "detached entity"
organisationRepository.findByIdOptional(testOrganisation.getId()).ifPresent(o -> {
// Utiliser deleteById pour éviter les problèmes avec les entités détachées
organisationRepository.deleteById(o.getId());
});
}
}