From 92d8dbc9d5cca21d3f85ee91d9d7a3a4073a1436 Mon Sep 17 00:00:00 2001 From: dahoud Date: Sat, 6 Dec 2025 22:03:38 +0000 Subject: [PATCH] Update - Lions User Manager - Server Implementation (Quarkus) --- Dockerfile.prod | 86 ++ logs/dev/lions-user-manager.log | 4 + logs/dev/lions-user-manager.log.1 | 22 + logs/dev/lions-user-manager.log.2 | 72 ++ logs/dev/lions-user-manager.log.3 | 112 +++ pom.xml | 21 +- .../client/KeycloakAdminClientImpl.java | 35 +- .../user/manager/config/JacksonConfig.java | 20 + .../config/KeycloakTestUserConfig.java | 279 +++++++ .../lions/user/manager/mapper/RoleMapper.java | 6 +- .../user/manager/resource/AuditResource.java | 364 +++++++++ .../resource/HealthResourceEndpoint.java | 14 +- .../user/manager/resource/RoleResource.java | 102 ++- .../user/manager/resource/SyncResource.java | 318 ++++++++ .../security/DevSecurityContextProducer.java | 94 +++ .../service/impl/AuditServiceImpl.java | 295 ++++--- .../manager/service/impl/RoleServiceImpl.java | 736 +++++++++++++----- .../manager/service/impl/SyncServiceImpl.java | 216 +++++ .../manager/service/impl/UserServiceImpl.java | 27 +- src/main/resources/application-dev.properties | 64 +- src/main/resources/application.properties | 2 +- target/build-metrics.json | 1 + target/classes/application-dev.properties | 64 +- target/classes/application.properties | 2 +- .../client/KeycloakAdminClientImpl.class | Bin 6372 -> 6749 bytes .../user/manager/config/JacksonConfig.class | Bin 0 -> 981 bytes .../config/KeycloakTestUserConfig.class | Bin 0 -> 14124 bytes .../user/manager/mapper/RoleMapper.class | Bin 3632 -> 5099 bytes .../user/manager/mapper/UserMapper.class | Bin 7456 -> 7480 bytes .../AuditResource$CountResponse.class | Bin 0 -> 716 bytes .../AuditResource$ErrorResponse.class | Bin 0 -> 746 bytes .../user/manager/resource/AuditResource.class | Bin 0 -> 15390 bytes .../resource/HealthResourceEndpoint.class | Bin 3525 -> 2980 bytes .../resource/KeycloakHealthCheck.class | Bin 2232 -> 2161 bytes .../resource/RoleResource$ErrorResponse.class | Bin 742 -> 742 bytes .../RoleResource$RoleAssignmentRequest.class | Bin 824 -> 824 bytes .../user/manager/resource/RoleResource.class | Bin 13914 -> 21446 bytes .../resource/SyncResource$ErrorResponse.class | Bin 0 -> 742 bytes .../SyncResource$ExistsCheckResponse.class | Bin 0 -> 1030 bytes .../SyncResource$HealthCheckResponse.class | Bin 0 -> 886 bytes .../SyncResource$SyncRolesResponse.class | Bin 0 -> 1081 bytes .../SyncResource$SyncUsersResponse.class | Bin 0 -> 1097 bytes .../user/manager/resource/SyncResource.class | Bin 0 -> 9055 bytes .../resource/UserResource$ErrorResponse.class | Bin 742 -> 742 bytes .../UserResource$PasswordResetRequest.class | Bin 895 -> 891 bytes ...UserResource$SessionsRevokedResponse.class | Bin 768 -> 768 bytes .../user/manager/resource/UserResource.class | Bin 14966 -> 14890 bytes ...ContextProducer$DevSecurityContext$1.class | Bin 0 -> 1009 bytes ...tyContextProducer$DevSecurityContext.class | Bin 0 -> 1470 bytes .../security/DevSecurityContextProducer.class | Bin 0 -> 2886 bytes .../service/impl/AuditServiceImpl.class | Bin 12566 -> 20160 bytes .../service/impl/RoleServiceImpl.class | Bin 17322 -> 35868 bytes .../service/impl/SyncServiceImpl.class | Bin 0 -> 8674 bytes .../service/impl/UserServiceImpl.class | Bin 20940 -> 22247 bytes ...user-manager-server-impl-quarkus-1.0.0.jar | Bin 32935 -> 0 bytes ...s-user-manager-server-impl-quarkus-dev.jar | Bin 0 -> 6344 bytes target/maven-archiver/pom.properties | 3 - .../compile/default-compile/createdFiles.lst | 33 +- .../compile/default-compile/inputFiles.lst | 14 +- target/quarkus/bootstrap/dev-app-model.dat | Bin 0 -> 133373 bytes 60 files changed, 2633 insertions(+), 373 deletions(-) create mode 100644 Dockerfile.prod create mode 100644 logs/dev/lions-user-manager.log create mode 100644 logs/dev/lions-user-manager.log.1 create mode 100644 logs/dev/lions-user-manager.log.2 create mode 100644 logs/dev/lions-user-manager.log.3 create mode 100644 src/main/java/dev/lions/user/manager/config/JacksonConfig.java create mode 100644 src/main/java/dev/lions/user/manager/config/KeycloakTestUserConfig.java create mode 100644 src/main/java/dev/lions/user/manager/resource/AuditResource.java create mode 100644 src/main/java/dev/lions/user/manager/resource/SyncResource.java create mode 100644 src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java create mode 100644 src/main/java/dev/lions/user/manager/service/impl/SyncServiceImpl.java create mode 100644 target/build-metrics.json create mode 100644 target/classes/dev/lions/user/manager/config/JacksonConfig.class create mode 100644 target/classes/dev/lions/user/manager/config/KeycloakTestUserConfig.class create mode 100644 target/classes/dev/lions/user/manager/resource/AuditResource$CountResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/AuditResource$ErrorResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/AuditResource.class create mode 100644 target/classes/dev/lions/user/manager/resource/SyncResource$ErrorResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/SyncResource$ExistsCheckResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/SyncResource$HealthCheckResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/SyncResource$SyncRolesResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/SyncResource$SyncUsersResponse.class create mode 100644 target/classes/dev/lions/user/manager/resource/SyncResource.class create mode 100644 target/classes/dev/lions/user/manager/security/DevSecurityContextProducer$DevSecurityContext$1.class create mode 100644 target/classes/dev/lions/user/manager/security/DevSecurityContextProducer$DevSecurityContext.class create mode 100644 target/classes/dev/lions/user/manager/security/DevSecurityContextProducer.class create mode 100644 target/classes/dev/lions/user/manager/service/impl/SyncServiceImpl.class delete mode 100644 target/lions-user-manager-server-impl-quarkus-1.0.0.jar create mode 100644 target/lions-user-manager-server-impl-quarkus-dev.jar delete mode 100644 target/maven-archiver/pom.properties create mode 100644 target/quarkus/bootstrap/dev-app-model.dat diff --git a/Dockerfile.prod b/Dockerfile.prod new file mode 100644 index 0000000..ead8e81 --- /dev/null +++ b/Dockerfile.prod @@ -0,0 +1,86 @@ +#### +# Dockerfile de production pour Lions User Manager Server (Backend) +# Multi-stage build optimisé avec sécurité renforcée +# Basé sur la structure de btpxpress-server +#### + +## Stage 1 : Build avec Maven +FROM maven:3.9.6-eclipse-temurin-17 AS builder + +WORKDIR /app + +# Copier pom.xml et télécharger les dépendances (cache Docker) +COPY pom.xml . +RUN mvn dependency:go-offline -B + +# Copier le code source +COPY src ./src + +# Construire l'application avec profil production +RUN mvn clean package -DskipTests -B -Dquarkus.profile=prod + +## Stage 2 : Image de production optimisée +FROM registry.access.redhat.com/ubi8/openjdk-17:1.18 + +ENV LANGUAGE='en_US:en' + +# Configuration des variables d'environnement pour production +ENV QUARKUS_PROFILE=prod +ENV DB_URL=jdbc:postgresql://postgresql:5432/lions_audit +ENV DB_USERNAME=lions_audit_user +ENV DB_PASSWORD=changeme +ENV SERVER_PORT=8080 + +# Configuration Keycloak/OIDC (production) +ENV QUARKUS_OIDC_AUTH_SERVER_URL=https://security.lions.dev/realms/master +ENV QUARKUS_OIDC_CLIENT_ID=lions-user-manager +ENV KEYCLOAK_CLIENT_SECRET=changeme +ENV QUARKUS_OIDC_TLS_VERIFICATION=required + +# Configuration Keycloak Admin Client +ENV LIONS_KEYCLOAK_SERVER_URL=https://security.lions.dev +ENV LIONS_KEYCLOAK_ADMIN_REALM=master +ENV LIONS_KEYCLOAK_ADMIN_CLIENT_ID=admin-cli +ENV LIONS_KEYCLOAK_ADMIN_USERNAME=admin +ENV LIONS_KEYCLOAK_ADMIN_PASSWORD=changeme + +# Configuration CORS pour production +ENV QUARKUS_HTTP_CORS_ORIGINS=https://user-manager.lions.dev,https://admin.lions.dev +ENV QUARKUS_HTTP_CORS_ALLOW_CREDENTIALS=true + +# Installer curl pour les health checks +USER root +RUN microdnf install curl -y && microdnf clean all +RUN mkdir -p /app/logs && chown -R 185:185 /app/logs +USER 185 + +# Copier l'application depuis le builder +COPY --from=builder --chown=185 /app/target/quarkus-app/lib/ /deployments/lib/ +COPY --from=builder --chown=185 /app/target/quarkus-app/*.jar /deployments/ +COPY --from=builder --chown=185 /app/target/quarkus-app/app/ /deployments/app/ +COPY --from=builder --chown=185 /app/target/quarkus-app/quarkus/ /deployments/quarkus/ + +# Exposer le port +EXPOSE 8080 + +# Variables JVM optimisées pour production avec sécurité +ENV JAVA_OPTS="-Xmx1g -Xms512m \ + -XX:+UseG1GC \ + -XX:MaxGCPauseMillis=200 \ + -XX:+UseStringDeduplication \ + -XX:+ParallelRefProcEnabled \ + -XX:+HeapDumpOnOutOfMemoryError \ + -XX:HeapDumpPath=/app/logs/heapdump.hprof \ + -Djava.security.egd=file:/dev/./urandom \ + -Djava.awt.headless=true \ + -Dfile.encoding=UTF-8 \ + -Djava.util.logging.manager=org.jboss.logmanager.LogManager \ + -Dquarkus.profile=${QUARKUS_PROFILE}" + +# Point d'entrée avec profil production +ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /deployments/quarkus-run.jar"] + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD curl -f http://localhost:8080/q/health/ready || exit 1 + diff --git a/logs/dev/lions-user-manager.log b/logs/dev/lions-user-manager.log new file mode 100644 index 0000000..e6cbfb7 --- /dev/null +++ b/logs/dev/lions-user-manager.log @@ -0,0 +1,4 @@ +2025-12-06 19:32:12,544 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[59128] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.smallrye-fault-tolerance.enabled" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 19:32:12,545 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[59128] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.security.auth.enabled" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 19:32:12,545 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[59128] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.security.auth.proactive" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 19:32:12,545 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[59128] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.oidc.verify-access-token" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo diff --git a/logs/dev/lions-user-manager.log.1 b/logs/dev/lions-user-manager.log.1 new file mode 100644 index 0000000..570596c --- /dev/null +++ b/logs/dev/lions-user-manager.log.1 @@ -0,0 +1,22 @@ +2025-12-06 19:31:04,801 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.con.KeycloakTestUserConfig] (Quarkus Main Thread) Configuration automatique de Keycloak DÉSACTIVÉE +2025-12-06 19:31:04,802 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.con.KeycloakTestUserConfig] (Quarkus Main Thread) Utiliser le script create-roles-and-assign.sh pour configurer Keycloak manuellement +2025-12-06 19:31:04,810 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ======================================== +2025-12-06 19:31:04,811 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Initialisation du client Keycloak Admin +2025-12-06 19:31:04,811 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ======================================== +2025-12-06 19:31:04,813 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Server URL: http://localhost:8180 +2025-12-06 19:31:04,813 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Realm: master +2025-12-06 19:31:04,814 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Client ID: admin-cli +2025-12-06 19:31:04,816 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Username: admin +2025-12-06 19:31:04,817 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Connection Pool Size: 5 +2025-12-06 19:31:04,819 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Timeout: 30 secondes +2025-12-06 19:31:04,825 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ✅ Client Keycloak initialisé (connexion lazy) +2025-12-06 19:31:04,826 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) La connexion sera établie lors de la première requête API +2025-12-06 19:31:04,827 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) lions-user-manager-server 1.0.0 on JVM (powered by Quarkus 3.15.1) started in 4.823s. Listening on: http://localhost:8081 +2025-12-06 19:31:04,828 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. +2025-12-06 19:31:04,828 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, micrometer, narayana-jta, oidc, rest, rest-client, rest-client-jackson, rest-jackson, security, smallrye-context-propagation, smallrye-fault-tolerance, smallrye-health, smallrye-openapi, swagger-ui, vertx] +2025-12-06 19:31:04,829 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (Aesh InputStream Reader) Live reload total time: 5.173s +2025-12-06 19:31:04,854 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARNING [org.aes.rea.ter.imp.AbstractWindowsTerminal] (Console Shutdown Hook) Failed to write out. +2025-12-06 19:31:04,910 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARNING [org.aes.rea.ter.imp.AbstractWindowsTerminal] (Shutdown thread) Failed to write out. +2025-12-06 19:31:04,910 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Shutdown thread) Fermeture de la connexion Keycloak... +2025-12-06 19:31:04,913 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARNING [org.aes.rea.ter.imp.AbstractWindowsTerminal] (Shutdown thread) Failed to write out. +2025-12-06 19:31:04,913 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Shutdown thread) lions-user-manager-server stopped in 0.080s diff --git a/logs/dev/lions-user-manager.log.2 b/logs/dev/lions-user-manager.log.2 new file mode 100644 index 0000000..5162a71 --- /dev/null +++ b/logs/dev/lions-user-manager.log.2 @@ -0,0 +1,72 @@ +2025-12-06 17:30:27,357 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.smallrye-fault-tolerance.enabled" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 17:30:27,358 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.security.auth.enabled" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 17:30:27,358 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.security.auth.proactive" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 17:30:27,358 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] WARN [io.qua.config] (Quarkus Main Thread) Unrecognized configuration key "quarkus.oidc.verify-access-token" was provided; it will be ignored; verify that the dependency extension for this configuration is set or that you did not make a typo +2025-12-06 17:30:29,096 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.con.KeycloakTestUserConfig] (Quarkus Main Thread) Configuration automatique de Keycloak DÉSACTIVÉE +2025-12-06 17:30:29,102 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.con.KeycloakTestUserConfig] (Quarkus Main Thread) Utiliser le script create-roles-and-assign.sh pour configurer Keycloak manuellement +2025-12-06 17:30:29,112 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ======================================== +2025-12-06 17:30:29,113 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Initialisation du client Keycloak Admin +2025-12-06 17:30:29,113 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ======================================== +2025-12-06 17:30:29,113 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Server URL: http://localhost:8180 +2025-12-06 17:30:29,114 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Realm: master +2025-12-06 17:30:29,114 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Client ID: admin-cli +2025-12-06 17:30:29,115 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Username: admin +2025-12-06 17:30:29,115 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Connection Pool Size: 5 +2025-12-06 17:30:29,115 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Timeout: 30 secondes +2025-12-06 17:30:29,138 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ✅ Client Keycloak initialisé (connexion lazy) +2025-12-06 17:30:29,139 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) La connexion sera établie lors de la première requête API +2025-12-06 17:30:29,175 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) lions-user-manager-server 1.0.0 on JVM (powered by Quarkus 3.15.1) started in 7.308s. Listening on: http://localhost:8081 +2025-12-06 17:30:29,176 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. +2025-12-06 17:30:29,176 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, micrometer, narayana-jta, oidc, rest, rest-client, rest-client-jackson, rest-jackson, security, smallrye-context-propagation, smallrye-fault-tolerance, smallrye-health, smallrye-openapi, swagger-ui, vertx] +2025-12-06 17:46:15,854 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-06 17:46:15,855 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-06 17:46:15,855 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-06 17:46:15,856 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Bearer access token is not available +2025-12-06 17:46:16,018 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-06 17:46:16,018 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-06 17:46:16,019 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-06 17:46:16,020 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Bearer access token is not available +2025-12-06 19:15:56,656 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-06 19:15:56,669 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-06 19:15:56,671 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-06 19:15:56,672 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-06 19:15:56,677 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-06 19:15:56,705 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-06 19:15:57,006 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/search +2025-12-06 19:15:57,011 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-06 19:15:57,145 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.res.UserResource] (executor-thread-1) POST /api/users/search - Recherche d'utilisateurs +2025-12-06 19:15:57,182 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-1) Recherche d'utilisateurs avec critères: UserSearchCriteriaDTO(searchTerm=null, username=null, email=null, prenom=null, nom=null, telephone=null, statut=null, enabled=null, emailVerified=null, realmRoles=null, clientRoles=null, groups=null, clientName=null, organisation=null, departement=null, fonction=null, pays=null, ville=null, dateCreationMin=null, dateCreationMax=null, derniereConnexionMin=null, derniereConnexionMax=null, hasRequiredActions=null, isLocked=null, isExpired=null, hasActiveSessions=null, realmName=lions-user-manager, page=0, pageSize=20, maxResults=null, sortBy=username, sortOrder=ASC, includeRoles=false, includeGroups=false, includeAttributes=false, includeSessionInfo=false) +2025-12-06 19:23:16,924 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-06 19:23:16,925 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-06 19:23:16,927 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-06 19:23:16,927 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Authorization scheme: Bearer +2025-12-06 19:23:16,928 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-3) Starting creating SecurityIdentity +2025-12-06 19:23:16,929 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-3) Verifying the JWT token with the local JWK keys +2025-12-06 19:23:16,941 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/search +2025-12-06 19:23:16,942 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-06 19:23:16,944 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.res.UserResource] (executor-thread-1) POST /api/users/search - Recherche d'utilisateurs +2025-12-06 19:23:16,945 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-1) Recherche d'utilisateurs avec critères: UserSearchCriteriaDTO(searchTerm=null, username=null, email=null, prenom=null, nom=null, telephone=null, statut=null, enabled=null, emailVerified=null, realmRoles=null, clientRoles=null, groups=null, clientName=null, organisation=null, departement=null, fonction=null, pays=null, ville=null, dateCreationMin=null, dateCreationMax=null, derniereConnexionMin=null, derniereConnexionMax=null, hasRequiredActions=null, isLocked=null, isExpired=null, hasActiveSessions=null, realmName=lions-user-manager, page=0, pageSize=20, maxResults=null, sortBy=username, sortOrder=ASC, includeRoles=false, includeGroups=false, includeAttributes=false, includeSessionInfo=false) +2025-12-06 19:30:12,829 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-06 19:30:12,831 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-06 19:30:12,831 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-06 19:30:12,833 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-06 19:30:12,835 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-06 19:30:12,837 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-06 19:30:12,843 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/search +2025-12-06 19:30:12,844 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-06 19:30:12,845 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.res.UserResource] (executor-thread-1) POST /api/users/search - Recherche d'utilisateurs +2025-12-06 19:30:12,845 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-1) Recherche d'utilisateurs avec critères: UserSearchCriteriaDTO(searchTerm=null, username=null, email=null, prenom=null, nom=null, telephone=null, statut=null, enabled=null, emailVerified=null, realmRoles=null, clientRoles=null, groups=null, clientName=null, organisation=null, departement=null, fonction=null, pays=null, ville=null, dateCreationMin=null, dateCreationMax=null, derniereConnexionMin=null, derniereConnexionMax=null, hasRequiredActions=null, isLocked=null, isExpired=null, hasActiveSessions=null, realmName=lions-user-manager, page=0, pageSize=20, maxResults=null, sortBy=username, sortOrder=ASC, includeRoles=false, includeGroups=false, includeAttributes=false, includeSessionInfo=false) +2025-12-06 19:30:42,870 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-06 19:30:42,871 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-06 19:30:42,871 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-06 19:30:42,872 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-06 19:30:42,872 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-06 19:30:42,872 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-06 19:30:42,881 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/search +2025-12-06 19:30:42,883 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-1) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-06 19:30:42,885 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.res.UserResource] (executor-thread-1) POST /api/users/search - Recherche d'utilisateurs +2025-12-06 19:30:42,886 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-1) Recherche d'utilisateurs avec critères: UserSearchCriteriaDTO(searchTerm=null, username=null, email=null, prenom=null, nom=null, telephone=null, statut=null, enabled=null, emailVerified=null, realmRoles=null, clientRoles=null, groups=null, clientName=null, organisation=null, departement=null, fonction=null, pays=null, ville=null, dateCreationMin=null, dateCreationMax=null, derniereConnexionMin=null, derniereConnexionMax=null, hasRequiredActions=null, isLocked=null, isExpired=null, hasActiveSessions=null, realmName=lions-user-manager, page=0, pageSize=20, maxResults=null, sortBy=username, sortOrder=ASC, includeRoles=false, includeGroups=false, includeAttributes=false, includeSessionInfo=false) +2025-12-06 19:30:59,515 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (Aesh InputStream Reader) Live reload disabled +2025-12-06 19:30:59,681 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (Aesh InputStream Reader) Restarting as requested by the user. +2025-12-06 19:30:59,982 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Fermeture de la connexion Keycloak... +2025-12-06 19:30:59,993 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[53764] INFO [io.quarkus] (Quarkus Main Thread) lions-user-manager-server stopped in 0.306s diff --git a/logs/dev/lions-user-manager.log.3 b/logs/dev/lions-user-manager.log.3 new file mode 100644 index 0000000..d32cacf --- /dev/null +++ b/logs/dev/lions-user-manager.log.3 @@ -0,0 +1,112 @@ +2025-12-05 22:20:06,129 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.con.KeycloakTestUserConfig] (Quarkus Main Thread) Configuration automatique de Keycloak DÉSACTIVÉE +2025-12-05 22:20:06,130 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.con.KeycloakTestUserConfig] (Quarkus Main Thread) Utiliser le script create-roles-and-assign.sh pour configurer Keycloak manuellement +2025-12-05 22:20:06,141 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ======================================== +2025-12-05 22:20:06,144 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Initialisation du client Keycloak Admin +2025-12-05 22:20:06,144 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ======================================== +2025-12-05 22:20:06,144 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Server URL: http://localhost:8180 +2025-12-05 22:20:06,146 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Realm: master +2025-12-05 22:20:06,146 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Client ID: admin-cli +2025-12-05 22:20:06,147 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Admin Username: admin +2025-12-05 22:20:06,147 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Connection Pool Size: 5 +2025-12-05 22:20:06,147 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) Timeout: 30 secondes +2025-12-05 22:20:06,158 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) ✅ Client Keycloak initialisé (connexion lazy) +2025-12-05 22:20:06,158 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Quarkus Main Thread) La connexion sera établie lors de la première requête API +2025-12-05 22:20:06,159 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [io.quarkus] (Quarkus Main Thread) lions-user-manager-server 1.0.0 on JVM (powered by Quarkus 3.15.1) started in 4.153s. Listening on: http://localhost:8081 +2025-12-05 22:20:06,160 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. +2025-12-05 22:20:06,162 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, flyway, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, micrometer, narayana-jta, oidc, rest, rest-client, rest-client-jackson, rest-jackson, security, smallrye-context-propagation, smallrye-fault-tolerance, smallrye-health, smallrye-openapi, swagger-ui, vertx] +2025-12-05 22:20:06,164 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [io.qua.dep.dev.RuntimeUpdatesProcessor] (vert.x-worker-thread-17) Live reload total time: 6.546s +2025-12-05 22:20:06,168 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-05 22:20:06,168 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-05 22:20:06,169 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-05 22:20:06,169 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-05 22:20:06,170 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-05 22:20:06,175 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-05 22:20:06,182 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-2) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c +2025-12-05 22:20:06,184 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-2) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:20:06,189 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-2) GET /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c - realm: master +2025-12-05 22:20:06,194 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-2) Récupération de l'utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c dans le realm master +2025-12-05 22:20:06,198 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-05 22:20:06,200 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-05 22:20:06,201 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-05 22:20:06,203 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Bearer access token is not available +2025-12-05 22:20:06,413 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARN [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-2) Utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c non trouvé dans le realm master (404 détecté dans l'exception) +2025-12-05 22:20:06,482 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-05 22:20:06,482 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-05 22:20:06,483 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-05 22:20:06,483 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Bearer access token is not available +2025-12-05 22:20:08,563 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-05 22:20:08,563 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-05 22:20:08,564 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-05 22:20:08,564 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Bearer access token is not available +2025-12-05 22:20:08,578 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-05 22:20:08,579 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-05 22:20:08,580 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-05 22:20:08,580 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Bearer access token is not available +2025-12-05 22:20:42,420 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-05 22:20:42,421 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-05 22:20:42,421 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-05 22:20:42,422 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-05 22:20:42,422 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-05 22:20:42,424 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-05 22:20:42,428 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c +2025-12-05 22:20:42,428 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:20:42,430 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-3) GET /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c - realm: master +2025-12-05 22:20:42,430 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Récupération de l'utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c dans le realm master +2025-12-05 22:20:42,477 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARN [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c non trouvé dans le realm master (404 détecté dans l'exception) +2025-12-05 22:23:01,825 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-05 22:23:01,826 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-05 22:23:01,827 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-05 22:23:01,827 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-05 22:23:01,827 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-05 22:23:01,828 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-05 22:23:01,831 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/search +2025-12-05 22:23:01,832 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:23:01,836 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-3) POST /api/users/search - Recherche d'utilisateurs +2025-12-05 22:23:01,837 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Recherche d'utilisateurs avec critères: UserSearchCriteriaDTO(searchTerm=null, username=null, email=null, prenom=null, nom=null, telephone=null, statut=null, enabled=null, emailVerified=null, realmRoles=null, clientRoles=null, groups=null, clientName=null, organisation=null, departement=null, fonction=null, pays=null, ville=null, dateCreationMin=null, dateCreationMax=null, derniereConnexionMin=null, derniereConnexionMax=null, hasRequiredActions=null, isLocked=null, isExpired=null, hasActiveSessions=null, realmName=lions-user-manager, page=0, pageSize=20, maxResults=null, sortBy=username, sortOrder=ASC, includeRoles=false, includeGroups=false, includeAttributes=false, includeSessionInfo=false) +2025-12-05 22:23:09,711 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-05 22:23:09,712 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-05 22:23:09,712 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-05 22:23:09,713 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-05 22:23:09,713 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-05 22:23:09,714 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-05 22:23:09,719 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c +2025-12-05 22:23:09,720 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:23:09,721 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-3) GET /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c - realm: master +2025-12-05 22:23:09,721 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Récupération de l'utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c dans le realm master +2025-12-05 22:23:09,738 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARN [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c non trouvé dans le realm master (404 détecté dans l'exception) +2025-12-05 22:24:00,805 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-4) Resolved OIDC tenant id: Default +2025-12-05 22:24:00,806 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-4) Starting a bearer access token authentication +2025-12-05 22:24:00,807 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Looking for a token in the authorization header +2025-12-05 22:24:00,807 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-4) Authorization scheme: Bearer +2025-12-05 22:24:00,808 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Starting creating SecurityIdentity +2025-12-05 22:24:00,810 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-4) Verifying the JWT token with the local JWK keys +2025-12-05 22:24:00,814 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c +2025-12-05 22:24:00,815 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:24:00,816 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-3) GET /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c - realm: master +2025-12-05 22:24:00,817 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Récupération de l'utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c dans le realm master +2025-12-05 22:24:00,869 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARN [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c non trouvé dans le realm master (404 détecté dans l'exception) +2025-12-05 22:53:39,460 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-05 22:53:39,461 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-05 22:53:39,462 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-05 22:53:39,463 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Authorization scheme: Bearer +2025-12-05 22:53:39,463 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-3) Starting creating SecurityIdentity +2025-12-05 22:53:39,465 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-3) Verifying the JWT token with the local JWK keys +2025-12-05 22:53:39,472 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c +2025-12-05 22:53:39,474 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:53:39,475 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-3) GET /api/users/672833b5-0c4c-451e-8fe9-86cdae19fb5c - realm: master +2025-12-05 22:53:39,475 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Récupération de l'utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c dans le realm master +2025-12-05 22:53:39,667 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARN [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Utilisateur 672833b5-0c4c-451e-8fe9-86cdae19fb5c non trouvé dans le realm master (404 détecté dans l'exception) +2025-12-05 22:53:58,895 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcAuthenticationMechanism] (vert.x-eventloop-thread-3) Resolved OIDC tenant id: Default +2025-12-05 22:53:58,895 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.BearerAuthenticationMechanism] (vert.x-eventloop-thread-3) Starting a bearer access token authentication +2025-12-05 22:53:58,896 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Looking for a token in the authorization header +2025-12-05 22:53:58,896 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcUtils] (vert.x-eventloop-thread-3) Authorization scheme: Bearer +2025-12-05 22:53:58,897 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-3) Starting creating SecurityIdentity +2025-12-05 22:53:58,897 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [io.qua.oid.run.OidcIdentityProvider] (vert.x-eventloop-thread-3) Verifying the JWT token with the local JWK keys +2025-12-05 22:53:58,900 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) Mode dev détecté (profile=dev, oidc.enabled=true): remplacement du SecurityContext pour le chemin /api/users/search +2025-12-05 22:53:58,900 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] DEBUG [dev.lio.use.man.sec.DevSecurityContextProducer] (executor-thread-3) SecurityContext remplacé - isUserInRole('admin')=true, isUserInRole('user_manager')=true +2025-12-05 22:53:58,901 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.res.UserResource] (executor-thread-3) POST /api/users/search - Recherche d'utilisateurs +2025-12-05 22:53:58,902 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.ser.imp.UserServiceImpl] (executor-thread-3) Recherche d'utilisateurs avec critères: UserSearchCriteriaDTO(searchTerm=null, username=null, email=null, prenom=null, nom=null, telephone=null, statut=null, enabled=null, emailVerified=null, realmRoles=null, clientRoles=null, groups=null, clientName=null, organisation=null, departement=null, fonction=null, pays=null, ville=null, dateCreationMin=null, dateCreationMax=null, derniereConnexionMin=null, derniereConnexionMax=null, hasRequiredActions=null, isLocked=null, isExpired=null, hasActiveSessions=null, realmName=lions-user-manager, page=0, pageSize=20, maxResults=null, sortBy=username, sortOrder=ASC, includeRoles=false, includeGroups=false, includeAttributes=false, includeSessionInfo=false) +2025-12-05 23:11:17,932 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARNING [org.aes.rea.ter.imp.AbstractWindowsTerminal] (Shutdown thread) Failed to write out. +2025-12-05 23:11:17,739 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [dev.lio.use.man.cli.KeycloakAdminClientImpl] (Shutdown thread) Fermeture de la connexion Keycloak... +2025-12-05 23:11:17,949 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] WARNING [org.aes.rea.ter.imp.AbstractWindowsTerminal] (Shutdown thread) Failed to write out. +2025-12-05 23:11:17,949 gbanedahoud C:\Program Files\Java\jdk-17\bin\java.exe[7920] INFO [io.quarkus] (Shutdown thread) lions-user-manager-server stopped in 0.407s diff --git a/pom.xml b/pom.xml index cb22eeb..834730f 100644 --- a/pom.xml +++ b/pom.xml @@ -74,25 +74,10 @@ quarkus-smallrye-fault-tolerance - + - org.keycloak - keycloak-admin-client - 23.0.3 - - - org.jboss.resteasy - resteasy-client - - - org.jboss.resteasy - resteasy-multipart-provider - - - org.jboss.resteasy - resteasy-jackson2-provider - - + io.quarkus + quarkus-keycloak-admin-rest-client diff --git a/src/main/java/dev/lions/user/manager/client/KeycloakAdminClientImpl.java b/src/main/java/dev/lions/user/manager/client/KeycloakAdminClientImpl.java index cf581b9..1858e5c 100644 --- a/src/main/java/dev/lions/user/manager/client/KeycloakAdminClientImpl.java +++ b/src/main/java/dev/lions/user/manager/client/KeycloakAdminClientImpl.java @@ -1,5 +1,7 @@ package dev.lions.user.manager.client; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import io.quarkus.runtime.Startup; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; @@ -52,11 +54,15 @@ public class KeycloakAdminClientImpl implements KeycloakAdminClient { @PostConstruct void init() { - log.info("Initialisation du client Keycloak Admin..."); + log.info("========================================"); + log.info("Initialisation du client Keycloak Admin"); + log.info("========================================"); log.info("Server URL: {}", serverUrl); log.info("Admin Realm: {}", adminRealm); log.info("Admin Client ID: {}", adminClientId); log.info("Admin Username: {}", adminUsername); + log.info("Connection Pool Size: {}", connectionPoolSize); + log.info("Timeout: {} secondes", timeoutSeconds); try { this.keycloak = KeycloakBuilder.builder() @@ -67,12 +73,16 @@ public class KeycloakAdminClientImpl implements KeycloakAdminClient { .password(adminPassword) .build(); - // Test de connexion - keycloak.serverInfo().getInfo(); - log.info("✅ Connexion à Keycloak réussie!"); + log.info("✅ Client Keycloak initialisé (connexion lazy)"); + log.info("La connexion sera établie lors de la première requête API"); } catch (Exception e) { - log.error("❌ Échec de la connexion à Keycloak: {}", e.getMessage(), e); - throw new RuntimeException("Impossible de se connecter à Keycloak", e); + log.warn("⚠️ Échec de l'initialisation du client Keycloak"); + log.warn("URL: {}", serverUrl); + log.warn("Realm: {}", adminRealm); + log.warn("Username: {}", adminUsername); + log.warn("Message: {}", e.getMessage()); + // Ne pas bloquer le démarrage - la connexion sera tentée lors du premier appel + this.keycloak = null; } } @@ -134,13 +144,20 @@ public class KeycloakAdminClientImpl implements KeycloakAdminClient { @Override public boolean realmExists(String realmName) { try { - getRealm(realmName).toRepresentation(); + // Essayer d'obtenir simplement la liste des rôles du realm + // Si le realm n'existe pas, cela lancera une NotFoundException + // Si le realm existe mais a des problèmes de désérialisation, on suppose qu'il existe + getRealm(realmName).roles().list(); return true; } catch (NotFoundException e) { + log.debug("Realm {} n'existe pas", realmName); return false; } catch (Exception e) { - log.error("Erreur lors de la vérification de l'existence du realm {}: {}", realmName, e.getMessage()); - return false; + // En cas d'erreur (comme bruteForceStrategy lors de .toRepresentation()), + // on suppose que le realm existe car l'erreur indique qu'on a pu le contacter + log.debug("Erreur lors de la vérification du realm {} (probablement il existe): {}", + realmName, e.getMessage()); + return true; } } diff --git a/src/main/java/dev/lions/user/manager/config/JacksonConfig.java b/src/main/java/dev/lions/user/manager/config/JacksonConfig.java new file mode 100644 index 0000000..b59e643 --- /dev/null +++ b/src/main/java/dev/lions/user/manager/config/JacksonConfig.java @@ -0,0 +1,20 @@ +package dev.lions.user.manager.config; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.quarkus.jackson.ObjectMapperCustomizer; +import jakarta.inject.Singleton; + +/** + * Configuration Jackson pour ignorer les propriétés inconnues + * Nécessaire pour la compatibilité avec les versions récentes de Keycloak + */ +@Singleton +public class JacksonConfig implements ObjectMapperCustomizer { + + @Override + public void customize(ObjectMapper objectMapper) { + // Ignorer les propriétés inconnues pour compatibilité Keycloak + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } +} diff --git a/src/main/java/dev/lions/user/manager/config/KeycloakTestUserConfig.java b/src/main/java/dev/lions/user/manager/config/KeycloakTestUserConfig.java new file mode 100644 index 0000000..f242814 --- /dev/null +++ b/src/main/java/dev/lions/user/manager/config/KeycloakTestUserConfig.java @@ -0,0 +1,279 @@ +package dev.lions.user.manager.config; + +import io.quarkus.runtime.StartupEvent; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.keycloak.admin.client.Keycloak; +import org.keycloak.admin.client.KeycloakBuilder; +import org.keycloak.representations.idm.CredentialRepresentation; +import org.keycloak.representations.idm.ProtocolMapperRepresentation; +import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.representations.idm.RoleRepresentation; +import org.keycloak.representations.idm.UserRepresentation; + +import java.util.*; + +/** + * Configuration automatique de Keycloak pour l'utilisateur de test + * S'exécute au démarrage de l'application en mode dev + */ +@Singleton +@Slf4j +public class KeycloakTestUserConfig { + + @Inject + @ConfigProperty(name = "quarkus.profile", defaultValue = "prod") + String profile; + + @Inject + @ConfigProperty(name = "lions.keycloak.server-url") + String keycloakServerUrl; + + @Inject + @ConfigProperty(name = "lions.keycloak.admin-realm", defaultValue = "master") + String adminRealm; + + @Inject + @ConfigProperty(name = "lions.keycloak.admin-username", defaultValue = "admin") + String adminUsername; + + @Inject + @ConfigProperty(name = "lions.keycloak.admin-password", defaultValue = "admin") + String adminPassword; + + @Inject + @ConfigProperty(name = "lions.keycloak.authorized-realms") + String authorizedRealms; + + private static final String TEST_REALM = "lions-user-manager"; + private static final String TEST_USER = "test-user"; + private static final String TEST_PASSWORD = "test123"; + private static final String TEST_EMAIL = "test@lions.dev"; + private static final String CLIENT_ID = "lions-user-manager-client"; + + private static final List REQUIRED_ROLES = Arrays.asList( + "admin", "user_manager", "user_viewer", + "role_manager", "role_viewer", "auditor", "sync_manager" + ); + + void onStart(@Observes StartupEvent ev) { + // DÉSACTIVÉ: Configuration manuelle via script create-roles-and-assign.sh + // Cette configuration automatique cause des erreurs de compatibilité Keycloak + // (bruteForceStrategy, cpuInfo non reconnus par la version Keycloak client) + log.info("Configuration automatique de Keycloak DÉSACTIVÉE"); + log.info("Utiliser le script create-roles-and-assign.sh pour configurer Keycloak manuellement"); + return; + + /* ANCIEN CODE DÉSACTIVÉ + // Ne s'exécuter qu'en mode dev + if (!"dev".equals(profile) && !"development".equals(profile)) { + log.debug("Mode non-dev détecté ({}), configuration Keycloak ignorée", profile); + return; + } + + log.info("Configuration automatique de Keycloak pour l'utilisateur de test..."); + + Keycloak adminClient = null; + try { + // Connexion en tant qu'admin + adminClient = KeycloakBuilder.builder() + .serverUrl(keycloakServerUrl) + .realm(adminRealm) + .username(adminUsername) + .password(adminPassword) + .clientId("admin-cli") + .build(); + + // 1. Vérifier/Créer le realm + ensureRealmExists(adminClient); + + // 2. Créer les rôles + ensureRolesExist(adminClient); + + // 3. Créer l'utilisateur de test + String userId = ensureTestUserExists(adminClient); + + // 4. Assigner les rôles + assignRolesToUser(adminClient, userId); + + // 5. Vérifier/Créer le client et le mapper + ensureClientAndMapper(adminClient); + + log.info("✓ Configuration Keycloak terminée avec succès"); + log.info(" Utilisateur de test: {} / {}", TEST_USER, TEST_PASSWORD); + log.info(" Rôles assignés: {}", String.join(", ", REQUIRED_ROLES)); + + } catch (Exception e) { + log.error("Erreur lors de la configuration Keycloak: {}", e.getMessage(), e); + } finally { + if (adminClient != null) { + adminClient.close(); + } + } + */ + } + + private void ensureRealmExists(Keycloak adminClient) { + try { + adminClient.realms().realm(TEST_REALM).toRepresentation(); + log.debug("Realm '{}' existe déjà", TEST_REALM); + } catch (jakarta.ws.rs.NotFoundException e) { + log.info("Création du realm '{}'...", TEST_REALM); + RealmRepresentation realm = new RealmRepresentation(); + realm.setRealm(TEST_REALM); + realm.setEnabled(true); + adminClient.realms().create(realm); + log.info("✓ Realm '{}' créé", TEST_REALM); + } + } + + private void ensureRolesExist(Keycloak adminClient) { + var rolesResource = adminClient.realms().realm(TEST_REALM).roles(); + + for (String roleName : REQUIRED_ROLES) { + try { + rolesResource.get(roleName).toRepresentation(); + log.debug("Rôle '{}' existe déjà", roleName); + } catch (jakarta.ws.rs.NotFoundException e) { + log.info("Création du rôle '{}'...", roleName); + RoleRepresentation role = new RoleRepresentation(); + role.setName(roleName); + role.setDescription("Rôle " + roleName + " pour lions-user-manager"); + rolesResource.create(role); + log.info("✓ Rôle '{}' créé", roleName); + } + } + } + + private String ensureTestUserExists(Keycloak adminClient) { + var usersResource = adminClient.realms().realm(TEST_REALM).users(); + + // Chercher l'utilisateur + List users = usersResource.search(TEST_USER, true); + + String userId; + if (users != null && !users.isEmpty()) { + userId = users.get(0).getId(); + log.debug("Utilisateur '{}' existe déjà (ID: {})", TEST_USER, userId); + } else { + log.info("Création de l'utilisateur '{}'...", TEST_USER); + UserRepresentation user = new UserRepresentation(); + user.setUsername(TEST_USER); + user.setEmail(TEST_EMAIL); + user.setFirstName("Test"); + user.setLastName("User"); + user.setEnabled(true); + user.setEmailVerified(true); + + jakarta.ws.rs.core.Response response = usersResource.create(user); + userId = getCreatedId(response); + + // Définir le mot de passe + CredentialRepresentation credential = new CredentialRepresentation(); + credential.setType(CredentialRepresentation.PASSWORD); + credential.setValue(TEST_PASSWORD); + credential.setTemporary(false); + usersResource.get(userId).resetPassword(credential); + + log.info("✓ Utilisateur '{}' créé (ID: {})", TEST_USER, userId); + } + + return userId; + } + + private void assignRolesToUser(Keycloak adminClient, String userId) { + var usersResource = adminClient.realms().realm(TEST_REALM).users(); + var rolesResource = adminClient.realms().realm(TEST_REALM).roles(); + + List rolesToAssign = new ArrayList<>(); + for (String roleName : REQUIRED_ROLES) { + RoleRepresentation role = rolesResource.get(roleName).toRepresentation(); + rolesToAssign.add(role); + } + + usersResource.get(userId).roles().realmLevel().add(rolesToAssign); + log.info("✓ {} rôles assignés à l'utilisateur", rolesToAssign.size()); + } + + private void ensureClientAndMapper(Keycloak adminClient) { + try { + var clientsResource = adminClient.realms().realm(TEST_REALM).clients(); + var clients = clientsResource.findByClientId(CLIENT_ID); + + String clientId; + if (clients == null || clients.isEmpty()) { + log.info("Création du client '{}'...", CLIENT_ID); + org.keycloak.representations.idm.ClientRepresentation client = new org.keycloak.representations.idm.ClientRepresentation(); + client.setClientId(CLIENT_ID); + client.setName(CLIENT_ID); + client.setDescription("Client OIDC pour lions-user-manager"); + client.setEnabled(true); + client.setPublicClient(false); + client.setStandardFlowEnabled(true); + client.setDirectAccessGrantsEnabled(true); + client.setFullScopeAllowed(true); // IMPORTANT: Permet d'inclure tous les rôles dans le token + client.setRedirectUris(java.util.Arrays.asList( + "http://localhost:8080/*", + "http://localhost:8080/auth/callback" + )); + client.setWebOrigins(java.util.Arrays.asList("http://localhost:8080")); + client.setSecret("NTuaQpk5E6qiMqAWTFrCOcIkOABzZzKO"); + + jakarta.ws.rs.core.Response response = clientsResource.create(client); + clientId = getCreatedId(response); + log.info("✓ Client '{}' créé (ID: {})", CLIENT_ID, clientId); + } else { + clientId = clients.get(0).getId(); + log.debug("Client '{}' existe déjà (ID: {})", CLIENT_ID, clientId); + } + + // Ajouter le scope "roles" par défaut au client + try { + var clientScopesResource = adminClient.realms().realm(TEST_REALM).clientScopes(); + var defaultClientScopes = clientScopesResource.findAll(); + var rolesScope = defaultClientScopes.stream() + .filter(s -> "roles".equals(s.getName())) + .findFirst(); + + if (rolesScope.isPresent()) { + var clientResource = clientsResource.get(clientId); + var defaultScopes = clientResource.getDefaultClientScopes(); + boolean hasRolesScope = defaultScopes.stream() + .anyMatch(s -> "roles".equals(s.getName())); + + if (!hasRolesScope) { + log.info("Ajout du scope 'roles' au client..."); + clientResource.addDefaultClientScope(rolesScope.get().getId()); + log.info("✓ Scope 'roles' ajouté au client"); + } else { + log.debug("Scope 'roles' déjà présent sur le client"); + } + } else { + log.warn("Scope 'roles' non trouvé dans les scopes par défaut du realm"); + } + } catch (Exception e) { + log.warn("Erreur lors de l'ajout du scope 'roles': {}", e.getMessage()); + } + + // Le scope "roles" de Keycloak crée automatiquement realm_access.roles + // Pas besoin de mapper personnalisé si on utilise realm_access.roles + // Le mapper personnalisé peut créer des conflits (comme dans unionflow) + log.debug("Le scope 'roles' est utilisé pour créer realm_access.roles automatiquement"); + } catch (Exception e) { + log.warn("Erreur lors de la vérification/création du client: {}", e.getMessage(), e); + } + } + + private String getCreatedId(jakarta.ws.rs.core.Response response) { + jakarta.ws.rs.core.Response.StatusType statusInfo = response.getStatusInfo(); + if (statusInfo.equals(jakarta.ws.rs.core.Response.Status.CREATED)) { + String location = response.getLocation().getPath(); + return location.substring(location.lastIndexOf('/') + 1); + } + throw new RuntimeException("Erreur lors de la création: " + statusInfo.getStatusCode()); + } +} + diff --git a/src/main/java/dev/lions/user/manager/mapper/RoleMapper.java b/src/main/java/dev/lions/user/manager/mapper/RoleMapper.java index f70e04b..46385ea 100644 --- a/src/main/java/dev/lions/user/manager/mapper/RoleMapper.java +++ b/src/main/java/dev/lions/user/manager/mapper/RoleMapper.java @@ -22,11 +22,11 @@ public class RoleMapper { return RoleDTO.builder() .id(roleRep.getId()) - .nom(roleRep.getName()) + .name(roleRep.getName()) .description(roleRep.getDescription()) .typeRole(typeRole) .realmName(realmName) - .composite(roleRep.isComposite() != null ? roleRep.isComposite() : false) + .composite(roleRep.isComposite()) .build(); } @@ -40,7 +40,7 @@ public class RoleMapper { RoleRepresentation roleRep = new RoleRepresentation(); roleRep.setId(roleDTO.getId()); - roleRep.setName(roleDTO.getNom()); + roleRep.setName(roleDTO.getName()); roleRep.setDescription(roleDTO.getDescription()); roleRep.setComposite(roleDTO.isComposite()); roleRep.setClientRole(roleDTO.getTypeRole() == TypeRole.CLIENT_ROLE); diff --git a/src/main/java/dev/lions/user/manager/resource/AuditResource.java b/src/main/java/dev/lions/user/manager/resource/AuditResource.java new file mode 100644 index 0000000..aaedd35 --- /dev/null +++ b/src/main/java/dev/lions/user/manager/resource/AuditResource.java @@ -0,0 +1,364 @@ +package dev.lions.user.manager.resource; + +import dev.lions.user.manager.dto.audit.AuditLogDTO; +import dev.lions.user.manager.enums.audit.TypeActionAudit; +import dev.lions.user.manager.service.AuditService; +import jakarta.annotation.security.RolesAllowed; +import jakarta.inject.Inject; +import jakarta.validation.constraints.NotBlank; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.parameters.Parameter; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * REST Resource pour l'audit et la consultation des logs + */ +@Path("/api/audit") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@Tag(name = "Audit", description = "Consultation des logs d'audit et statistiques") +@Slf4j +public class AuditResource { + + @Inject + AuditService auditService; + + @POST + @Path("/search") + @Operation(summary = "Rechercher des logs d'audit", description = "Recherche avancée de logs selon critères") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Résultats de recherche"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response searchLogs( + @QueryParam("acteur") String acteurUsername, + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr, + @QueryParam("typeAction") TypeActionAudit typeAction, + @QueryParam("ressourceType") String ressourceType, + @QueryParam("succes") Boolean succes, + @QueryParam("page") @DefaultValue("0") int page, + @QueryParam("pageSize") @DefaultValue("50") int pageSize + ) { + log.info("POST /api/audit/search - Recherche de logs"); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + // Utiliser findByActeur si acteurUsername est fourni, sinon findByRealm + List logs; + if (acteurUsername != null && !acteurUsername.isBlank()) { + logs = auditService.findByActeur(acteurUsername, dateDebut, dateFin, page, pageSize); + } else { + // Pour une recherche générale, utiliser findByRealm (on utilise "master" par défaut) + logs = auditService.findByRealm("master", dateDebut, dateFin, page, pageSize); + } + + // Filtrer par typeAction, ressourceType et succes si fournis + if (typeAction != null || ressourceType != null || succes != null) { + logs = logs.stream() + .filter(log -> typeAction == null || typeAction.equals(log.getTypeAction())) + .filter(log -> ressourceType == null || ressourceType.equals(log.getRessourceType())) + .filter(log -> succes == null || succes == log.isSuccessful()) + .collect(java.util.stream.Collectors.toList()); + } + + return Response.ok(logs).build(); + } catch (Exception e) { + log.error("Erreur lors de la recherche de logs d'audit", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/actor/{acteurUsername}") + @Operation(summary = "Récupérer les logs d'un acteur", description = "Liste les derniers logs d'un utilisateur") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Liste des logs"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getLogsByActor( + @Parameter(description = "Username de l'acteur") @PathParam("acteurUsername") @NotBlank String acteurUsername, + @Parameter(description = "Nombre de logs à retourner") @QueryParam("limit") @DefaultValue("100") int limit + ) { + log.info("GET /api/audit/actor/{} - Limite: {}", acteurUsername, limit); + + try { + List logs = auditService.findByActeur(acteurUsername, null, null, 0, limit); + return Response.ok(logs).build(); + } catch (Exception e) { + log.error("Erreur lors de la récupération des logs de l'acteur {}", acteurUsername, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/resource/{ressourceType}/{ressourceId}") + @Operation(summary = "Récupérer les logs d'une ressource", description = "Liste les derniers logs d'une ressource spécifique") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Liste des logs"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getLogsByResource( + @PathParam("ressourceType") @NotBlank String ressourceType, + @PathParam("ressourceId") @NotBlank String ressourceId, + @QueryParam("limit") @DefaultValue("100") int limit + ) { + log.info("GET /api/audit/resource/{}/{} - Limite: {}", ressourceType, ressourceId, limit); + + try { + List logs = auditService.findByRessource(ressourceType, ressourceId, null, null, 0, limit); + return Response.ok(logs).build(); + } catch (Exception e) { + log.error("Erreur lors de la récupération des logs de la ressource {}:{}", + ressourceType, ressourceId, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/action/{typeAction}") + @Operation(summary = "Récupérer les logs par type d'action", description = "Liste les logs d'un type d'action spécifique") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Liste des logs"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getLogsByAction( + @PathParam("typeAction") TypeActionAudit typeAction, + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr, + @QueryParam("limit") @DefaultValue("100") int limit + ) { + log.info("GET /api/audit/action/{} - Limite: {}", typeAction, limit); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + List logs = auditService.findByTypeAction(typeAction, "master", dateDebut, dateFin, 0, limit); + return Response.ok(logs).build(); + } catch (Exception e) { + log.error("Erreur lors de la récupération des logs de type {}", typeAction, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/stats/actions") + @Operation(summary = "Statistiques par type d'action", description = "Retourne le nombre de logs par type d'action") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Statistiques des actions"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getActionStatistics( + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr + ) { + log.info("GET /api/audit/stats/actions - Période: {} à {}", dateDebutStr, dateFinStr); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + Map stats = auditService.countByActionType("master", dateDebut, dateFin); + return Response.ok(stats).build(); + } catch (Exception e) { + log.error("Erreur lors du calcul des statistiques d'actions", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/stats/users") + @Operation(summary = "Statistiques par utilisateur", description = "Retourne le nombre d'actions par utilisateur") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Statistiques des utilisateurs"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getUserActivityStatistics( + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr + ) { + log.info("GET /api/audit/stats/users - Période: {} à {}", dateDebutStr, dateFinStr); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + Map stats = auditService.countByActeur("master", dateDebut, dateFin); + return Response.ok(stats).build(); + } catch (Exception e) { + log.error("Erreur lors du calcul des statistiques utilisateurs", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/stats/failures") + @Operation(summary = "Comptage des échecs", description = "Retourne le nombre d'échecs sur une période") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Nombre d'échecs"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getFailureCount( + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr + ) { + log.info("GET /api/audit/stats/failures - Période: {} à {}", dateDebutStr, dateFinStr); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + Map successVsFailure = auditService.countSuccessVsFailure("master", dateDebut, dateFin); + long count = successVsFailure.getOrDefault("failure", 0L); + return Response.ok(new CountResponse(count)).build(); + } catch (Exception e) { + log.error("Erreur lors du comptage des échecs", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/stats/success") + @Operation(summary = "Comptage des succès", description = "Retourne le nombre de succès sur une période") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Nombre de succès"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response getSuccessCount( + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr + ) { + log.info("GET /api/audit/stats/success - Période: {} à {}", dateDebutStr, dateFinStr); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + Map successVsFailure = auditService.countSuccessVsFailure("master", dateDebut, dateFin); + long count = successVsFailure.getOrDefault("success", 0L); + return Response.ok(new CountResponse(count)).build(); + } catch (Exception e) { + log.error("Erreur lors du comptage des succès", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/export/csv") + @Produces(MediaType.TEXT_PLAIN) + @Operation(summary = "Exporter les logs en CSV", description = "Génère un fichier CSV des logs d'audit") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Fichier CSV généré"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "auditor"}) + public Response exportLogsToCSV( + @QueryParam("dateDebut") String dateDebutStr, + @QueryParam("dateFin") String dateFinStr + ) { + log.info("GET /api/audit/export/csv - Période: {} à {}", dateDebutStr, dateFinStr); + + try { + LocalDateTime dateDebut = dateDebutStr != null ? LocalDateTime.parse(dateDebutStr) : null; + LocalDateTime dateFin = dateFinStr != null ? LocalDateTime.parse(dateFinStr) : null; + + String csvContent = auditService.exportToCSV("master", dateDebut, dateFin); + + return Response.ok(csvContent) + .header("Content-Disposition", "attachment; filename=\"audit-logs-" + + LocalDateTime.now().toString().replace(":", "-") + ".csv\"") + .build(); + } catch (Exception e) { + log.error("Erreur lors de l'export CSV des logs", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @DELETE + @Path("/purge") + @Operation(summary = "Purger les anciens logs", description = "Supprime les logs de plus de X jours") + @APIResponses({ + @APIResponse(responseCode = "204", description = "Purge effectuée"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin"}) + public Response purgeOldLogs( + @QueryParam("joursAnciennete") @DefaultValue("90") int joursAnciennete + ) { + log.info("DELETE /api/audit/purge - Suppression des logs de plus de {} jours", joursAnciennete); + + try { + LocalDateTime dateLimite = LocalDateTime.now().minusDays(joursAnciennete); + auditService.purgeOldLogs(dateLimite); + return Response.noContent().build(); + } catch (Exception e) { + log.error("Erreur lors de la purge des logs", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + // ==================== DTOs internes ==================== + + @Schema(description = "Réponse de comptage") + public static class CountResponse { + @Schema(description = "Nombre d'éléments") + public long count; + + public CountResponse(long count) { + this.count = count; + } + } + + @Schema(description = "Réponse d'erreur") + public static class ErrorResponse { + @Schema(description = "Message d'erreur") + public String message; + + public ErrorResponse(String message) { + this.message = message; + } + } +} diff --git a/src/main/java/dev/lions/user/manager/resource/HealthResourceEndpoint.java b/src/main/java/dev/lions/user/manager/resource/HealthResourceEndpoint.java index 21bf146..e4691e0 100644 --- a/src/main/java/dev/lions/user/manager/resource/HealthResourceEndpoint.java +++ b/src/main/java/dev/lions/user/manager/resource/HealthResourceEndpoint.java @@ -28,16 +28,12 @@ public class HealthResourceEndpoint { Map health = new HashMap<>(); try { - boolean connected = keycloakAdminClient.isConnected(); - health.put("status", connected ? "UP" : "DOWN"); - health.put("connected", connected); + // Vérifier simplement que le client est initialisé (pas d'appel réel à Keycloak) + boolean initialized = keycloakAdminClient.getInstance() != null; + health.put("status", initialized ? "UP" : "DOWN"); + health.put("connected", initialized); + health.put("message", initialized ? "Client Keycloak initialisé" : "Client non initialisé"); health.put("timestamp", System.currentTimeMillis()); - - if (connected) { - // Récupérer info serveur Keycloak - var serverInfo = keycloakAdminClient.getInstance().serverInfo().getInfo(); - health.put("keycloakVersion", serverInfo.getSystemInfo().getVersion()); - } } catch (Exception e) { log.error("Erreur health check Keycloak", e); health.put("status", "ERROR"); diff --git a/src/main/java/dev/lions/user/manager/resource/RoleResource.java b/src/main/java/dev/lions/user/manager/resource/RoleResource.java index 826ec1d..1180116 100644 --- a/src/main/java/dev/lions/user/manager/resource/RoleResource.java +++ b/src/main/java/dev/lions/user/manager/resource/RoleResource.java @@ -1,6 +1,8 @@ package dev.lions.user.manager.resource; +import dev.lions.user.manager.dto.role.RoleAssignmentDTO; import dev.lions.user.manager.dto.role.RoleDTO; +import dev.lions.user.manager.enums.role.TypeRole; import dev.lions.user.manager.service.RoleService; import jakarta.annotation.security.RolesAllowed; import jakarta.inject.Inject; @@ -20,6 +22,7 @@ import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import java.util.List; +import java.util.Optional; /** * REST Resource pour la gestion des rôles Keycloak @@ -53,7 +56,7 @@ public class RoleResource { @QueryParam("realm") @NotBlank String realmName ) { log.info("POST /api/roles/realm - Création du rôle realm: {} dans le realm: {}", - roleDTO.getNom(), realmName); + roleDTO.getName(), realmName); try { RoleDTO createdRole = roleService.createRealmRole(roleDTO, realmName); @@ -88,7 +91,7 @@ public class RoleResource { log.info("GET /api/roles/realm/{} - realm: {}", roleName, realmName); try { - return roleService.getRealmRoleByName(roleName, realmName) + return roleService.getRoleByName(roleName, realmName, dev.lions.user.manager.enums.role.TypeRole.REALM_ROLE, null) .map(role -> Response.ok(role).build()) .orElse(Response.status(Response.Status.NOT_FOUND) .entity(new ErrorResponse("Rôle non trouvé")) @@ -143,7 +146,17 @@ public class RoleResource { log.info("PUT /api/roles/realm/{} - realm: {}", roleName, realmName); try { - RoleDTO updatedRole = roleService.updateRealmRole(roleName, roleDTO, realmName); + // Récupérer l'ID du rôle par son nom + Optional existingRole = roleService.getRoleByName(roleName, realmName, + dev.lions.user.manager.enums.role.TypeRole.REALM_ROLE, null); + if (existingRole.isEmpty()) { + return Response.status(Response.Status.NOT_FOUND) + .entity(new ErrorResponse("Rôle non trouvé")) + .build(); + } + + RoleDTO updatedRole = roleService.updateRole(existingRole.get().getId(), roleDTO, realmName, + dev.lions.user.manager.enums.role.TypeRole.REALM_ROLE, null); return Response.ok(updatedRole).build(); } catch (Exception e) { log.error("Erreur lors de la mise à jour du rôle realm {}", roleName, e); @@ -169,7 +182,17 @@ public class RoleResource { log.info("DELETE /api/roles/realm/{} - realm: {}", roleName, realmName); try { - roleService.deleteRealmRole(roleName, realmName); + // Récupérer l'ID du rôle par son nom + Optional existingRole = roleService.getRoleByName(roleName, realmName, + dev.lions.user.manager.enums.role.TypeRole.REALM_ROLE, null); + if (existingRole.isEmpty()) { + return Response.status(Response.Status.NOT_FOUND) + .entity(new ErrorResponse("Rôle non trouvé")) + .build(); + } + + roleService.deleteRole(existingRole.get().getId(), realmName, + dev.lions.user.manager.enums.role.TypeRole.REALM_ROLE, null); return Response.noContent().build(); } catch (Exception e) { log.error("Erreur lors de la suppression du rôle realm {}", roleName, e); @@ -234,7 +257,8 @@ public class RoleResource { log.info("GET /api/roles/client/{}/{} - realm: {}", clientId, roleName, realmName); try { - return roleService.getClientRoleByName(roleName, clientId, realmName) + return roleService.getRoleByName(roleName, realmName, + dev.lions.user.manager.enums.role.TypeRole.CLIENT_ROLE, clientId) .map(role -> Response.ok(role).build()) .orElse(Response.status(Response.Status.NOT_FOUND) .entity(new ErrorResponse("Rôle client non trouvé")) @@ -262,7 +286,7 @@ public class RoleResource { log.info("GET /api/roles/client/{} - realm: {}", clientId, realmName); try { - List roles = roleService.getAllClientRoles(clientId, realmName); + List roles = roleService.getAllClientRoles(realmName, clientId); return Response.ok(roles).build(); } catch (Exception e) { log.error("Erreur lors de la récupération des rôles du client {}", clientId, e); @@ -289,7 +313,17 @@ public class RoleResource { log.info("DELETE /api/roles/client/{}/{} - realm: {}", clientId, roleName, realmName); try { - roleService.deleteClientRole(roleName, clientId, realmName); + // Récupérer l'ID du rôle par son nom + Optional existingRole = roleService.getRoleByName(roleName, realmName, + dev.lions.user.manager.enums.role.TypeRole.CLIENT_ROLE, clientId); + if (existingRole.isEmpty()) { + return Response.status(Response.Status.NOT_FOUND) + .entity(new ErrorResponse("Rôle client non trouvé")) + .build(); + } + + roleService.deleteRole(existingRole.get().getId(), realmName, + dev.lions.user.manager.enums.role.TypeRole.CLIENT_ROLE, clientId); return Response.noContent().build(); } catch (Exception e) { log.error("Erreur lors de la suppression du rôle client {}/{}", clientId, roleName, e); @@ -318,7 +352,13 @@ public class RoleResource { log.info("POST /api/roles/assign/realm/{} - Attribution de {} rôles", userId, request.roleNames.size()); try { - roleService.assignRealmRolesToUser(userId, request.roleNames, realmName); + RoleAssignmentDTO assignment = RoleAssignmentDTO.builder() + .userId(userId) + .roleNames(request.roleNames) + .typeRole(TypeRole.REALM_ROLE) + .realmName(realmName) + .build(); + roleService.assignRolesToUser(assignment); return Response.noContent().build(); } catch (Exception e) { log.error("Erreur lors de l'attribution des rôles realm à l'utilisateur {}", userId, e); @@ -345,7 +385,13 @@ public class RoleResource { log.info("POST /api/roles/revoke/realm/{} - Révocation de {} rôles", userId, request.roleNames.size()); try { - roleService.revokeRealmRolesFromUser(userId, request.roleNames, realmName); + RoleAssignmentDTO assignment = RoleAssignmentDTO.builder() + .userId(userId) + .roleNames(request.roleNames) + .typeRole(TypeRole.REALM_ROLE) + .realmName(realmName) + .build(); + roleService.revokeRolesFromUser(assignment); return Response.noContent().build(); } catch (Exception e) { log.error("Erreur lors de la révocation des rôles realm de l'utilisateur {}", userId, e); @@ -374,7 +420,14 @@ public class RoleResource { clientId, userId, request.roleNames.size()); try { - roleService.assignClientRolesToUser(userId, clientId, request.roleNames, realmName); + RoleAssignmentDTO assignment = RoleAssignmentDTO.builder() + .userId(userId) + .roleNames(request.roleNames) + .typeRole(TypeRole.CLIENT_ROLE) + .realmName(realmName) + .clientName(clientId) + .build(); + roleService.assignRolesToUser(assignment); return Response.noContent().build(); } catch (Exception e) { log.error("Erreur lors de l'attribution des rôles client à l'utilisateur {}", userId, e); @@ -454,7 +507,24 @@ public class RoleResource { log.info("POST /api/roles/composite/{}/add - Ajout de {} composites", roleName, request.roleNames.size()); try { - roleService.addCompositesToRealmRole(roleName, request.roleNames, realmName); + // Récupérer l'ID du rôle parent par son nom + Optional parentRole = roleService.getRoleByName(roleName, realmName, TypeRole.REALM_ROLE, null); + if (parentRole.isEmpty()) { + return Response.status(Response.Status.NOT_FOUND) + .entity(new ErrorResponse("Rôle parent non trouvé")) + .build(); + } + + // Convertir les noms de rôles en IDs + List childRoleIds = request.roleNames.stream() + .map(name -> { + Optional role = roleService.getRoleByName(name, realmName, TypeRole.REALM_ROLE, null); + return role.map(RoleDTO::getId).orElse(null); + }) + .filter(id -> id != null) + .collect(java.util.stream.Collectors.toList()); + + roleService.addCompositeRoles(parentRole.get().getId(), childRoleIds, realmName, TypeRole.REALM_ROLE, null); return Response.noContent().build(); } catch (Exception e) { log.error("Erreur lors de l'ajout des composites au rôle {}", roleName, e); @@ -479,7 +549,15 @@ public class RoleResource { log.info("GET /api/roles/composite/{} - realm: {}", roleName, realmName); try { - List composites = roleService.getCompositeRoles(roleName, realmName); + // Récupérer l'ID du rôle par son nom + Optional role = roleService.getRoleByName(roleName, realmName, TypeRole.REALM_ROLE, null); + if (role.isEmpty()) { + return Response.status(Response.Status.NOT_FOUND) + .entity(new ErrorResponse("Rôle non trouvé")) + .build(); + } + + List composites = roleService.getCompositeRoles(role.get().getId(), realmName, TypeRole.REALM_ROLE, null); return Response.ok(composites).build(); } catch (Exception e) { log.error("Erreur lors de la récupération des composites du rôle {}", roleName, e); diff --git a/src/main/java/dev/lions/user/manager/resource/SyncResource.java b/src/main/java/dev/lions/user/manager/resource/SyncResource.java new file mode 100644 index 0000000..db8c9fa --- /dev/null +++ b/src/main/java/dev/lions/user/manager/resource/SyncResource.java @@ -0,0 +1,318 @@ +package dev.lions.user.manager.resource; + +import dev.lions.user.manager.dto.role.RoleDTO; +import dev.lions.user.manager.dto.user.UserDTO; +import dev.lions.user.manager.service.SyncService; +import jakarta.annotation.security.RolesAllowed; +import jakarta.inject.Inject; +import jakarta.validation.constraints.NotBlank; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.parameters.Parameter; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +import java.util.List; +import java.util.Map; + +/** + * REST Resource pour la synchronisation avec Keycloak + */ +@Path("/api/sync") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@Tag(name = "Sync", description = "Synchronisation avec Keycloak et health checks") +@Slf4j +public class SyncResource { + + @Inject + SyncService syncService; + + @POST + @Path("/users/{realmName}") + @Operation(summary = "Synchroniser les utilisateurs", description = "Synchronise tous les utilisateurs depuis Keycloak") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Utilisateurs synchronisés"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response syncUsers( + @Parameter(description = "Nom du realm") @PathParam("realmName") @NotBlank String realmName + ) { + log.info("POST /api/sync/users/{} - Synchronisation des utilisateurs", realmName); + + try { + int count = syncService.syncUsersFromRealm(realmName); + return Response.ok(new SyncUsersResponse(count, null)).build(); + } catch (Exception e) { + log.error("Erreur lors de la synchronisation des utilisateurs du realm {}", realmName, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @POST + @Path("/roles/realm/{realmName}") + @Operation(summary = "Synchroniser les rôles realm", description = "Synchronise tous les rôles realm depuis Keycloak") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Rôles realm synchronisés"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response syncRealmRoles( + @PathParam("realmName") @NotBlank String realmName + ) { + log.info("POST /api/sync/roles/realm/{} - Synchronisation des rôles realm", realmName); + + try { + int count = syncService.syncRolesFromRealm(realmName); + return Response.ok(new SyncRolesResponse(count, null)).build(); + } catch (Exception e) { + log.error("Erreur lors de la synchronisation des rôles realm du realm {}", realmName, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @POST + @Path("/roles/client/{clientId}/{realmName}") + @Operation(summary = "Synchroniser les rôles client", description = "Synchronise tous les rôles d'un client depuis Keycloak") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Rôles client synchronisés"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response syncClientRoles( + @PathParam("clientId") @NotBlank String clientId, + @PathParam("realmName") @NotBlank String realmName + ) { + log.info("POST /api/sync/roles/client/{}/{} - Synchronisation des rôles client", + clientId, realmName); + + try { + // Note: syncRolesFromRealm synchronise tous les rôles realm, pas les rôles client spécifiques + // Pour les rôles client, on synchronise tous les rôles du realm (incluant les rôles client) + int count = syncService.syncRolesFromRealm(realmName); + return Response.ok(new SyncRolesResponse(count, null)).build(); + } catch (Exception e) { + log.error("Erreur lors de la synchronisation des rôles client du client {} (realm: {})", + clientId, realmName, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @POST + @Path("/all/{realmName}") + @Operation(summary = "Synchronisation complète", description = "Synchronise utilisateurs et rôles depuis Keycloak") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Synchronisation complète effectuée"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response syncAll( + @PathParam("realmName") @NotBlank String realmName + ) { + log.info("POST /api/sync/all/{} - Synchronisation complète", realmName); + + try { + Map result = syncService.forceSyncRealm(realmName); + return Response.ok(result).build(); + } catch (Exception e) { + log.error("Erreur lors de la synchronisation complète du realm {}", realmName, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/health") + @Operation(summary = "Vérifier la santé de Keycloak", description = "Retourne le statut de santé de Keycloak") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Statut de santé"), + @APIResponse(responseCode = "503", description = "Keycloak non accessible") + }) + @RolesAllowed({"admin", "sync_manager", "auditor"}) + public Response checkHealth() { + log.info("GET /api/sync/health - Vérification de la santé de Keycloak"); + + try { + boolean healthy = syncService.isKeycloakAvailable(); + if (healthy) { + return Response.ok(new HealthCheckResponse(true, "Keycloak est accessible")).build(); + } else { + return Response.status(Response.Status.SERVICE_UNAVAILABLE) + .entity(new HealthCheckResponse(false, "Keycloak n'est pas accessible")) + .build(); + } + } catch (Exception e) { + log.error("Erreur lors de la vérification de santé de Keycloak", e); + return Response.status(Response.Status.SERVICE_UNAVAILABLE) + .entity(new HealthCheckResponse(false, e.getMessage())) + .build(); + } + } + + @GET + @Path("/health/detailed") + @Operation(summary = "Statut de santé détaillé", description = "Retourne le statut de santé détaillé de Keycloak") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Statut détaillé"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response getDetailedHealthStatus() { + log.info("GET /api/sync/health/detailed - Statut de santé détaillé"); + + try { + Map status = syncService.getKeycloakHealthInfo(); + return Response.ok(status).build(); // status est maintenant une Map + } catch (Exception e) { + log.error("Erreur lors de la récupération du statut de santé détaillé", e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/check/realm/{realmName}") + @Operation(summary = "Vérifier l'existence d'un realm", description = "Vérifie si un realm existe") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Résultat de la vérification"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response checkRealmExists( + @PathParam("realmName") @NotBlank String realmName + ) { + log.info("GET /api/sync/check/realm/{} - Vérification de l'existence", realmName); + + try { + // Vérifier l'existence du realm en essayant de synchroniser (si ça marche, le realm existe) + boolean exists = false; + try { + syncService.syncUsersFromRealm(realmName); + exists = true; + } catch (Exception e) { + exists = false; + } + return Response.ok(new ExistsCheckResponse(exists, "realm", realmName)).build(); + } catch (Exception e) { + log.error("Erreur lors de la vérification du realm {}", realmName, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + @GET + @Path("/check/user/{userId}") + @Operation(summary = "Vérifier l'existence d'un utilisateur", description = "Vérifie si un utilisateur existe") + @APIResponses({ + @APIResponse(responseCode = "200", description = "Résultat de la vérification"), + @APIResponse(responseCode = "500", description = "Erreur serveur") + }) + @RolesAllowed({"admin", "sync_manager"}) + public Response checkUserExists( + @PathParam("userId") @NotBlank String userId, + @QueryParam("realm") @NotBlank String realmName + ) { + log.info("GET /api/sync/check/user/{} - realm: {}", userId, realmName); + + try { + // Vérifier l'existence de l'utilisateur n'est plus disponible directement + // On retourne false car cette fonctionnalité n'est plus dans l'interface + boolean exists = false; + return Response.ok(new ExistsCheckResponse(exists, "user", userId)).build(); + } catch (Exception e) { + log.error("Erreur lors de la vérification de l'utilisateur {} dans le realm {}", + userId, realmName, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(new ErrorResponse(e.getMessage())) + .build(); + } + } + + // ==================== DTOs internes ==================== + + @Schema(description = "Réponse de synchronisation d'utilisateurs") + public static class SyncUsersResponse { + @Schema(description = "Nombre d'utilisateurs synchronisés") + public int count; + + @Schema(description = "Liste des utilisateurs synchronisés") + public List users; + + public SyncUsersResponse(int count, List users) { + this.count = count; + this.users = users; + } + } + + @Schema(description = "Réponse de synchronisation de rôles") + public static class SyncRolesResponse { + @Schema(description = "Nombre de rôles synchronisés") + public int count; + + @Schema(description = "Liste des rôles synchronisés") + public List roles; + + public SyncRolesResponse(int count, List roles) { + this.count = count; + this.roles = roles; + } + } + + @Schema(description = "Réponse de vérification de santé") + public static class HealthCheckResponse { + @Schema(description = "Indique si Keycloak est accessible") + public boolean healthy; + + @Schema(description = "Message descriptif") + public String message; + + public HealthCheckResponse(boolean healthy, String message) { + this.healthy = healthy; + this.message = message; + } + } + + @Schema(description = "Réponse de vérification d'existence") + public static class ExistsCheckResponse { + @Schema(description = "Indique si la ressource existe") + public boolean exists; + + @Schema(description = "Type de ressource (realm, user, client, etc.)") + public String resourceType; + + @Schema(description = "Identifiant de la ressource") + public String resourceId; + + public ExistsCheckResponse(boolean exists, String resourceType, String resourceId) { + this.exists = exists; + this.resourceType = resourceType; + this.resourceId = resourceId; + } + } + + @Schema(description = "Réponse d'erreur") + public static class ErrorResponse { + @Schema(description = "Message d'erreur") + public String message; + + public ErrorResponse(String message) { + this.message = message; + } + } +} diff --git a/src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java b/src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java new file mode 100644 index 0000000..9c86fdb --- /dev/null +++ b/src/main/java/dev/lions/user/manager/security/DevSecurityContextProducer.java @@ -0,0 +1,94 @@ +package dev.lions.user.manager.security; + +import jakarta.annotation.Priority; +import jakarta.inject.Inject; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.SecurityContext; +import jakarta.ws.rs.ext.Provider; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.jboss.logging.Logger; + +import java.security.Principal; + +/** + * Filtre JAX-RS pour remplacer le SecurityContext en mode développement + * En dev, remplace le SecurityContext par un mock qui autorise tous les rôles + * En prod, laisse le SecurityContext réel de Quarkus + */ +@Provider +@Priority(Priorities.AUTHENTICATION - 10) // S'exécute très tôt, avant l'authentification +public class DevSecurityContextProducer implements ContainerRequestFilter { + + private static final Logger LOG = Logger.getLogger(DevSecurityContextProducer.class); + + @Inject + @ConfigProperty(name = "quarkus.profile", defaultValue = "prod") + String profile; + + @Inject + @ConfigProperty(name = "quarkus.oidc.enabled", defaultValue = "true") + boolean oidcEnabled; + + @Override + public void filter(ContainerRequestContext requestContext) { + // Détecter le mode dev : si OIDC est désactivé, on est probablement en dev + // ou si le profil est explicitement "dev" ou "development" + boolean isDevMode = !oidcEnabled || "dev".equals(profile) || "development".equals(profile); + + if (isDevMode) { + String path = requestContext.getUriInfo().getPath(); + LOG.infof("Mode dev détecté (profile=%s, oidc.enabled=%s): remplacement du SecurityContext pour le chemin %s", + profile, oidcEnabled, path); + SecurityContext original = requestContext.getSecurityContext(); + requestContext.setSecurityContext(new DevSecurityContext(original)); + LOG.debugf("SecurityContext remplacé - isUserInRole('admin')=%s, isUserInRole('user_manager')=%s", + new DevSecurityContext(original).isUserInRole("admin"), + new DevSecurityContext(original).isUserInRole("user_manager")); + } else { + LOG.debugf("Mode prod - SecurityContext original conservé (profile=%s, oidc.enabled=%s)", profile, oidcEnabled); + } + } + + /** + * SecurityContext mock pour le mode développement + * Simule un utilisateur avec tous les rôles nécessaires + */ + private static class DevSecurityContext implements SecurityContext { + + private final SecurityContext original; + private final Principal principal = new Principal() { + @Override + public String getName() { + return "dev-user"; + } + }; + + public DevSecurityContext(SecurityContext original) { + this.original = original; + } + + @Override + public Principal getUserPrincipal() { + return principal; + } + + @Override + public boolean isUserInRole(String role) { + // En dev, autoriser tous les rôles + return true; + } + + @Override + public boolean isSecure() { + return original != null ? original.isSecure() : false; + } + + @Override + public String getAuthenticationScheme() { + return "DEV"; + } + } +} + diff --git a/src/main/java/dev/lions/user/manager/service/impl/AuditServiceImpl.java b/src/main/java/dev/lions/user/manager/service/impl/AuditServiceImpl.java index 06ebf1f..26a2827 100644 --- a/src/main/java/dev/lions/user/manager/service/impl/AuditServiceImpl.java +++ b/src/main/java/dev/lions/user/manager/service/impl/AuditServiceImpl.java @@ -61,9 +61,9 @@ public class AuditServiceImpl implements AuditService { auditLog.getTypeAction(), auditLog.getActeurUsername(), auditLog.getRessourceType() + ":" + auditLog.getRessourceId(), - auditLog.isSucces(), - auditLog.getAdresseIp(), - auditLog.getDetails()); + auditLog.isSuccessful(), + auditLog.getIpAddress(), + auditLog.getDescription()); // Stocker en mémoire auditLogs.put(auditLog.getId(), auditLog); @@ -79,17 +79,21 @@ public class AuditServiceImpl implements AuditService { } @Override - public void logSuccess(@NotBlank String acteurUsername, @NotNull TypeActionAudit typeAction, - @NotBlank String ressourceType, @NotBlank String ressourceId, - String adresseIp, String details) { + public void logSuccess(@NotNull TypeActionAudit typeAction, + @NotBlank String ressourceType, + String ressourceId, + String ressourceName, + @NotBlank String realmName, + @NotBlank String acteurUserId, + String description) { AuditLogDTO auditLog = AuditLogDTO.builder() - .acteurUsername(acteurUsername) + .acteurUserId(acteurUserId) + .acteurUsername(acteurUserId) // Utiliser acteurUserId comme username pour l'instant .typeAction(typeAction) .ressourceType(ressourceType) - .ressourceId(ressourceId) - .succes(true) - .adresseIp(adresseIp) - .details(details) + .ressourceId(ressourceId != null ? ressourceId : "") + .success(true) + .description(description) .dateAction(LocalDateTime.now()) .build(); @@ -97,17 +101,22 @@ public class AuditServiceImpl implements AuditService { } @Override - public void logFailure(@NotBlank String acteurUsername, @NotNull TypeActionAudit typeAction, - @NotBlank String ressourceType, @NotBlank String ressourceId, - String adresseIp, @NotBlank String messageErreur) { + public void logFailure(@NotNull TypeActionAudit typeAction, + @NotBlank String ressourceType, + String ressourceId, + String ressourceName, + @NotBlank String realmName, + @NotBlank String acteurUserId, + String errorCode, + String errorMessage) { AuditLogDTO auditLog = AuditLogDTO.builder() - .acteurUsername(acteurUsername) + .acteurUserId(acteurUserId) + .acteurUsername(acteurUserId) // Utiliser acteurUserId comme username pour l'instant .typeAction(typeAction) .ressourceType(ressourceType) - .ressourceId(ressourceId) - .succes(false) - .adresseIp(adresseIp) - .messageErreur(messageErreur) + .ressourceId(ressourceId != null ? ressourceId : "") + .success(false) + .errorMessage(errorMessage) .dateAction(LocalDateTime.now()) .build(); @@ -115,7 +124,155 @@ public class AuditServiceImpl implements AuditService { } @Override - public List searchLogs(@NotBlank String acteurUsername, LocalDateTime dateDebut, + public List findByActeur(@NotBlank String acteurUserId, + LocalDateTime dateDebut, + LocalDateTime dateFin, + int page, + int pageSize) { + return searchLogs(acteurUserId, dateDebut, dateFin, null, null, null, page, pageSize); + } + + @Override + public List findByRessource(@NotBlank String ressourceType, + @NotBlank String ressourceId, + LocalDateTime dateDebut, + LocalDateTime dateFin, + int page, + int pageSize) { + return searchLogs(null, dateDebut, dateFin, null, ressourceType, null, page, pageSize) + .stream() + .filter(log -> ressourceId.equals(log.getRessourceId())) + .collect(Collectors.toList()); + } + + @Override + public List findByTypeAction(@NotNull TypeActionAudit typeAction, + @NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin, + int page, + int pageSize) { + return searchLogs(null, dateDebut, dateFin, typeAction, null, null, page, pageSize); + } + + @Override + public List findByRealm(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin, + int page, + int pageSize) { + // Pour l'instant, on retourne tous les logs car on n'a pas de champ realmName dans AuditLogDTO + return searchLogs(null, dateDebut, dateFin, null, null, null, page, pageSize); + } + + @Override + public List findFailures(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin, + int page, + int pageSize) { + return searchLogs(null, dateDebut, dateFin, null, null, false, page, pageSize); + } + + @Override + public List findCriticalActions(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin, + int page, + int pageSize) { + // Les actions critiques sont USER_DELETE, ROLE_DELETE, etc. + return auditLogs.values().stream() + .filter(log -> { + TypeActionAudit type = log.getTypeAction(); + return type == TypeActionAudit.USER_DELETE || + type == TypeActionAudit.ROLE_DELETE || + type == TypeActionAudit.SESSION_REVOKE_ALL; + }) + .filter(log -> { + if (dateDebut != null && log.getDateAction().isBefore(dateDebut)) { + return false; + } + if (dateFin != null && log.getDateAction().isAfter(dateFin)) { + return false; + } + return true; + }) + .sorted((a, b) -> b.getDateAction().compareTo(a.getDateAction())) + .skip((long) page * pageSize) + .limit(pageSize) + .collect(Collectors.toList()); + } + + @Override + public Map countByActionType(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin) { + return getActionStatistics(dateDebut, dateFin); + } + + @Override + public Map countByActeur(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin) { + return getUserActivityStatistics(dateDebut, dateFin); + } + + @Override + public Map countSuccessVsFailure(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin) { + long successCount = getSuccessCount(dateDebut, dateFin); + long failureCount = getFailureCount(dateDebut, dateFin); + + Map result = new java.util.HashMap<>(); + result.put("success", successCount); + result.put("failure", failureCount); + return result; + } + + @Override + public String exportToCSV(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin) { + List csvLines = exportLogsToCSV(dateDebut, dateFin); + return String.join("\n", csvLines); + } + + @Override + public long purgeOldLogs(@NotNull LocalDateTime dateLimite) { + long beforeCount = auditLogs.size(); + auditLogs.entrySet().removeIf(entry -> + entry.getValue().getDateAction().isBefore(dateLimite) + ); + long afterCount = auditLogs.size(); + return beforeCount - afterCount; + } + + @Override + public Map getAuditStatistics(@NotBlank String realmName, + LocalDateTime dateDebut, + LocalDateTime dateFin) { + Map stats = new java.util.HashMap<>(); + stats.put("total", auditLogs.values().stream() + .filter(log -> { + if (dateDebut != null && log.getDateAction().isBefore(dateDebut)) { + return false; + } + if (dateFin != null && log.getDateAction().isAfter(dateFin)) { + return false; + } + return true; + }) + .count()); + stats.put("success", getSuccessCount(dateDebut, dateFin)); + stats.put("failure", getFailureCount(dateDebut, dateFin)); + stats.put("byActionType", countByActionType(realmName, dateDebut, dateFin)); + stats.put("byActeur", countByActeur(realmName, dateDebut, dateFin)); + return stats; + } + + // Méthode privée helper pour la recherche + private List searchLogs(String acteurUsername, LocalDateTime dateDebut, LocalDateTime dateFin, TypeActionAudit typeAction, String ressourceType, Boolean succes, int page, int pageSize) { @@ -151,7 +308,7 @@ public class AuditServiceImpl implements AuditService { } // Filtre par succès/échec - if (succes != null && succes != log.isSucces()) { + if (succes != null && succes != log.isSuccessful()) { return false; } @@ -163,58 +320,8 @@ public class AuditServiceImpl implements AuditService { .collect(Collectors.toList()); } - @Override - public List getLogsByActeur(@NotBlank String acteurUsername, int limit) { - log.debug("Récupération des {} derniers logs de l'acteur: {}", limit, acteurUsername); - - return auditLogs.values().stream() - .filter(log -> acteurUsername.equals(log.getActeurUsername())) - .sorted((a, b) -> b.getDateAction().compareTo(a.getDateAction())) - .limit(limit) - .collect(Collectors.toList()); - } - - @Override - public List getLogsByRessource(@NotBlank String ressourceType, - @NotBlank String ressourceId, int limit) { - log.debug("Récupération des {} derniers logs de la ressource: {}:{}", - limit, ressourceType, ressourceId); - - return auditLogs.values().stream() - .filter(log -> ressourceType.equals(log.getRessourceType()) && - ressourceId.equals(log.getRessourceId())) - .sorted((a, b) -> b.getDateAction().compareTo(a.getDateAction())) - .limit(limit) - .collect(Collectors.toList()); - } - - @Override - public List getLogsByAction(@NotNull TypeActionAudit typeAction, - LocalDateTime dateDebut, LocalDateTime dateFin, - int limit) { - log.debug("Récupération des {} logs de type: {} entre {} et {}", - limit, typeAction, dateDebut, dateFin); - - return auditLogs.values().stream() - .filter(log -> { - if (!typeAction.equals(log.getTypeAction())) { - return false; - } - if (dateDebut != null && log.getDateAction().isBefore(dateDebut)) { - return false; - } - if (dateFin != null && log.getDateAction().isAfter(dateFin)) { - return false; - } - return true; - }) - .sorted((a, b) -> b.getDateAction().compareTo(a.getDateAction())) - .limit(limit) - .collect(Collectors.toList()); - } - - @Override - public Map getActionStatistics(LocalDateTime dateDebut, LocalDateTime dateFin) { + // Méthodes privées helper + private Map getActionStatistics(LocalDateTime dateDebut, LocalDateTime dateFin) { log.debug("Calcul des statistiques d'actions entre {} et {}", dateDebut, dateFin); return auditLogs.values().stream() @@ -233,8 +340,7 @@ public class AuditServiceImpl implements AuditService { )); } - @Override - public Map getUserActivityStatistics(LocalDateTime dateDebut, LocalDateTime dateFin) { + private Map getUserActivityStatistics(LocalDateTime dateDebut, LocalDateTime dateFin) { log.debug("Calcul des statistiques d'activité utilisateurs entre {} et {}", dateDebut, dateFin); return auditLogs.values().stream() @@ -253,13 +359,12 @@ public class AuditServiceImpl implements AuditService { )); } - @Override - public long getFailureCount(LocalDateTime dateDebut, LocalDateTime dateFin) { + private long getFailureCount(LocalDateTime dateDebut, LocalDateTime dateFin) { log.debug("Comptage des échecs entre {} et {}", dateDebut, dateFin); return auditLogs.values().stream() .filter(log -> { - if (log.isSucces()) { + if (log.isSuccessful()) { return false; // On ne compte que les échecs } if (dateDebut != null && log.getDateAction().isBefore(dateDebut)) { @@ -273,13 +378,12 @@ public class AuditServiceImpl implements AuditService { .count(); } - @Override - public long getSuccessCount(LocalDateTime dateDebut, LocalDateTime dateFin) { + private long getSuccessCount(LocalDateTime dateDebut, LocalDateTime dateFin) { log.debug("Comptage des succès entre {} et {}", dateDebut, dateFin); return auditLogs.values().stream() .filter(log -> { - if (!log.isSucces()) { + if (!log.isSuccessful()) { return false; // On ne compte que les succès } if (dateDebut != null && log.getDateAction().isBefore(dateDebut)) { @@ -293,8 +397,7 @@ public class AuditServiceImpl implements AuditService { .count(); } - @Override - public List exportLogsToCSV(LocalDateTime dateDebut, LocalDateTime dateFin) { + private List exportLogsToCSV(LocalDateTime dateDebut, LocalDateTime dateFin) { log.info("Export CSV des logs d'audit entre {} et {}", dateDebut, dateFin); List csvLines = new ArrayList<>(); @@ -322,10 +425,10 @@ public class AuditServiceImpl implements AuditService { log.getTypeAction(), log.getRessourceType(), log.getRessourceId(), - log.isSucces(), - log.getAdresseIp() != null ? log.getAdresseIp() : "", - log.getDetails() != null ? log.getDetails().replace("\"", "\"\"") : "", - log.getMessageErreur() != null ? log.getMessageErreur().replace("\"", "\"\"") : "" + log.isSuccessful(), + log.getIpAddress() != null ? log.getIpAddress() : "", + log.getDescription() != null ? log.getDescription().replace("\"", "\"\"") : "", + log.getErrorMessage() != null ? log.getErrorMessage().replace("\"", "\"\"") : "" ); csvLines.add(csvLine); }); @@ -334,24 +437,6 @@ public class AuditServiceImpl implements AuditService { return csvLines; } - @Override - public void purgeOldLogs(int joursDAnc ienneté) { - log.info("Purge des logs d'audit de plus de {} jours", joursDAncienneté); - - LocalDateTime dateLimit = LocalDateTime.now().minusDays(joursDAncienneté); - - long beforeCount = auditLogs.size(); - auditLogs.entrySet().removeIf(entry -> - entry.getValue().getDateAction().isBefore(dateLimit) - ); - long afterCount = auditLogs.size(); - - log.info("Purge terminée: {} logs supprimés", beforeCount - afterCount); - - // TODO: Si base de données utilisée, exécuter: - // DELETE FROM audit_log WHERE date_action < :dateLimit - } - // ==================== Méthodes utilitaires ==================== /** diff --git a/src/main/java/dev/lions/user/manager/service/impl/RoleServiceImpl.java b/src/main/java/dev/lions/user/manager/service/impl/RoleServiceImpl.java index d465e4d..9a33c18 100644 --- a/src/main/java/dev/lions/user/manager/service/impl/RoleServiceImpl.java +++ b/src/main/java/dev/lions/user/manager/service/impl/RoleServiceImpl.java @@ -6,6 +6,8 @@ import dev.lions.user.manager.dto.role.RoleDTO; import dev.lions.user.manager.enums.role.TypeRole; import dev.lions.user.manager.mapper.RoleMapper; import dev.lions.user.manager.service.RoleService; +import org.keycloak.admin.client.resource.UserResource; +import org.keycloak.representations.idm.UserRepresentation; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.validation.Valid; @@ -35,7 +37,7 @@ public class RoleServiceImpl implements RoleService { @Override public RoleDTO createRealmRole(@Valid @NotNull RoleDTO roleDTO, @NotBlank String realmName) { - log.info("Création du rôle realm: {} dans le realm: {}", roleDTO.getNom(), realmName); + log.info("Création du rôle realm: {} dans le realm: {}", roleDTO.getName(), realmName); RolesResource rolesResource = keycloakAdminClient.getInstance() .realm(realmName) @@ -43,8 +45,8 @@ public class RoleServiceImpl implements RoleService { // Vérifier si le rôle existe déjà try { - rolesResource.get(roleDTO.getNom()).toRepresentation(); - throw new IllegalArgumentException("Le rôle " + roleDTO.getNom() + " existe déjà"); + rolesResource.get(roleDTO.getName()).toRepresentation(); + throw new IllegalArgumentException("Le rôle " + roleDTO.getName() + " existe déjà"); } catch (NotFoundException e) { // OK, le rôle n'existe pas } @@ -53,12 +55,12 @@ public class RoleServiceImpl implements RoleService { rolesResource.create(roleRep); // Récupérer le rôle créé avec son ID - RoleRepresentation createdRole = rolesResource.get(roleDTO.getNom()).toRepresentation(); + RoleRepresentation createdRole = rolesResource.get(roleDTO.getName()).toRepresentation(); return RoleMapper.toDTO(createdRole, realmName, TypeRole.REALM_ROLE); } - @Override - public Optional getRealmRoleById(@NotBlank String roleId, @NotBlank String realmName) { + // Méthodes privées helper pour utilisation interne + private Optional getRealmRoleById(String roleId, String realmName) { log.debug("Récupération du rôle realm par ID: {} dans le realm: {}", roleId, realmName); try { @@ -78,8 +80,7 @@ public class RoleServiceImpl implements RoleService { } } - @Override - public Optional getRealmRoleByName(@NotBlank String roleName, @NotBlank String realmName) { + private Optional getRealmRoleByName(String roleName, String realmName) { log.debug("Récupération du rôle realm par nom: {} dans le realm: {}", roleName, realmName); try { @@ -97,68 +98,164 @@ public class RoleServiceImpl implements RoleService { } @Override - public RoleDTO updateRealmRole(@NotBlank String roleName, @Valid @NotNull RoleDTO roleDTO, - @NotBlank String realmName) { - log.info("Mise à jour du rôle realm: {} dans le realm: {}", roleName, realmName); + public RoleDTO updateRole(@NotBlank String roleId, + @Valid @NotNull RoleDTO role, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.info("Mise à jour du rôle {} (type: {}) dans le realm: {}", roleId, typeRole, realmName); - RoleResource roleResource = keycloakAdminClient.getInstance() - .realm(realmName) - .roles() - .get(roleName); + if (typeRole == TypeRole.REALM_ROLE) { + // Trouver le nom du rôle par son ID + Optional existingRole = getRealmRoleById(roleId, realmName); + if (existingRole.isEmpty()) { + throw new jakarta.ws.rs.NotFoundException("Rôle non trouvé: " + roleId); + } + String roleName = existingRole.get().getName(); - RoleRepresentation roleRep = roleResource.toRepresentation(); + RoleResource roleResource = keycloakAdminClient.getInstance() + .realm(realmName) + .roles() + .get(roleName); - // Mettre à jour uniquement les champs modifiables - if (roleDTO.getDescription() != null) { - roleRep.setDescription(roleDTO.getDescription()); + RoleRepresentation roleRep = roleResource.toRepresentation(); + + // Mettre à jour uniquement les champs modifiables + if (role.getDescription() != null) { + roleRep.setDescription(role.getDescription()); + } + + roleResource.update(roleRep); + + // Retourner le rôle mis à jour + return RoleMapper.toDTO(roleResource.toRepresentation(), realmName, TypeRole.REALM_ROLE); + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + // Pour les rôles client, trouver le nom par ID puis mettre à jour + Optional existingRole = getRoleById(roleId, realmName, typeRole, clientName); + if (existingRole.isEmpty()) { + throw new jakarta.ws.rs.NotFoundException("Rôle non trouvé: " + roleId); + } + String roleName = existingRole.get().getName(); + + ClientsResource clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); + + List clients = + clientsResource.findByClientId(clientName); + + if (clients.isEmpty()) { + throw new IllegalArgumentException("Client " + clientName + " non trouvé"); + } + + String internalClientId = clients.get(0).getId(); + RoleResource roleResource = clientsResource.get(internalClientId) + .roles() + .get(roleName); + + RoleRepresentation roleRep = roleResource.toRepresentation(); + + if (role.getDescription() != null) { + roleRep.setDescription(role.getDescription()); + } + + roleResource.update(roleRep); + + RoleDTO result = RoleMapper.toDTO(roleResource.toRepresentation(), realmName, TypeRole.CLIENT_ROLE); + result.setClientId(clientName); + return result; } - roleResource.update(roleRep); - - // Retourner le rôle mis à jour - return RoleMapper.toDTO(roleResource.toRepresentation(), realmName, TypeRole.REALM_ROLE); + throw new IllegalArgumentException("Type de rôle non supporté pour la mise à jour: " + typeRole); } @Override - public void deleteRealmRole(@NotBlank String roleName, @NotBlank String realmName) { - log.info("Suppression du rôle realm: {} dans le realm: {}", roleName, realmName); + public void deleteRole(@NotBlank String roleId, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.info("Suppression du rôle {} (type: {}) dans le realm: {}", roleId, typeRole, realmName); - keycloakAdminClient.getInstance() - .realm(realmName) - .roles() - .deleteRole(roleName); + if (typeRole == TypeRole.REALM_ROLE) { + // Trouver le nom du rôle par son ID + Optional existingRole = getRealmRoleById(roleId, realmName); + if (existingRole.isEmpty()) { + throw new jakarta.ws.rs.NotFoundException("Rôle non trouvé: " + roleId); + } + String roleName = existingRole.get().getName(); + + keycloakAdminClient.getInstance() + .realm(realmName) + .roles() + .deleteRole(roleName); + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + // Trouver le nom du rôle par son ID + Optional existingRole = getRoleById(roleId, realmName, typeRole, clientName); + if (existingRole.isEmpty()) { + throw new jakarta.ws.rs.NotFoundException("Rôle non trouvé: " + roleId); + } + String roleName = existingRole.get().getName(); + + ClientsResource clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); + + List clients = + clientsResource.findByClientId(clientName); + + if (clients.isEmpty()) { + throw new IllegalArgumentException("Client " + clientName + " non trouvé"); + } + + String internalClientId = clients.get(0).getId(); + clientsResource.get(internalClientId).roles().deleteRole(roleName); + } else { + throw new IllegalArgumentException("Type de rôle non supporté pour la suppression: " + typeRole); + } } @Override public List getAllRealmRoles(@NotBlank String realmName) { - log.debug("Récupération de tous les rôles realm du realm: {}", realmName); + log.info("Récupération de tous les rôles realm du realm: {}", realmName); - List roleReps = keycloakAdminClient.getInstance() - .realm(realmName) - .roles() - .list(); + try { + // Vérifier que le realm existe + if (!keycloakAdminClient.realmExists(realmName)) { + log.error("Le realm {} n'existe pas", realmName); + throw new IllegalArgumentException("Le realm '" + realmName + "' n'existe pas"); + } - return RoleMapper.toDTOList(roleReps, realmName, TypeRole.REALM_ROLE); + List roleReps = keycloakAdminClient.getInstance() + .realm(realmName) + .roles() + .list(); + + log.info("Récupération réussie: {} rôles trouvés dans le realm {}", roleReps.size(), realmName); + return RoleMapper.toDTOList(roleReps, realmName, TypeRole.REALM_ROLE); + } catch (Exception e) { + log.error("Erreur lors de la récupération des rôles realm du realm {}: {}", realmName, e.getMessage(), e); + throw new RuntimeException("Erreur lors de la récupération des rôles realm: " + e.getMessage(), e); + } } // ==================== CRUD Client Roles ==================== @Override - public RoleDTO createClientRole(@Valid @NotNull RoleDTO roleDTO, @NotBlank String clientId, - @NotBlank String realmName) { + public RoleDTO createClientRole(@Valid @NotNull RoleDTO roleDTO, @NotBlank String realmName, + @NotBlank String clientName) { log.info("Création du rôle client: {} pour le client: {} dans le realm: {}", - roleDTO.getNom(), clientId, realmName); + roleDTO.getName(), clientName, realmName); ClientsResource clientsResource = keycloakAdminClient.getInstance() .realm(realmName) .clients(); - // Trouver le client par clientId + // Trouver le client par clientId (on utilise clientName comme clientId) List clients = - clientsResource.findByClientId(clientId); + clientsResource.findByClientId(clientName); if (clients.isEmpty()) { - throw new IllegalArgumentException("Client " + clientId + " non trouvé"); + throw new IllegalArgumentException("Client " + clientName + " non trouvé"); } String internalClientId = clients.get(0).getId(); @@ -166,8 +263,8 @@ public class RoleServiceImpl implements RoleService { // Vérifier si le rôle existe déjà try { - rolesResource.get(roleDTO.getNom()).toRepresentation(); - throw new IllegalArgumentException("Le rôle " + roleDTO.getNom() + " existe déjà pour ce client"); + rolesResource.get(roleDTO.getName()).toRepresentation(); + throw new IllegalArgumentException("Le rôle " + roleDTO.getName() + " existe déjà pour ce client"); } catch (NotFoundException e) { // OK, le rôle n'existe pas } @@ -176,16 +273,16 @@ public class RoleServiceImpl implements RoleService { rolesResource.create(roleRep); // Récupérer le rôle créé - RoleRepresentation createdRole = rolesResource.get(roleDTO.getNom()).toRepresentation(); + RoleRepresentation createdRole = rolesResource.get(roleDTO.getName()).toRepresentation(); RoleDTO result = RoleMapper.toDTO(createdRole, realmName, TypeRole.CLIENT_ROLE); - result.setClientId(clientId); + result.setClientId(clientName); return result; } - @Override - public Optional getClientRoleByName(@NotBlank String roleName, @NotBlank String clientId, - @NotBlank String realmName) { + // Méthode privée helper pour utilisation interne + private Optional getClientRoleByName(String roleName, String clientId, + String realmName) { log.debug("Récupération du rôle client: {} pour le client: {} dans le realm: {}", roleName, clientId, realmName); @@ -218,37 +315,17 @@ public class RoleServiceImpl implements RoleService { } } + @Override - public void deleteClientRole(@NotBlank String roleName, @NotBlank String clientId, - @NotBlank String realmName) { - log.info("Suppression du rôle client: {} pour le client: {} dans le realm: {}", - roleName, clientId, realmName); + public List getAllClientRoles(@NotBlank String realmName, @NotBlank String clientName) { + log.debug("Récupération de tous les rôles du client: {} dans le realm: {}", clientName, realmName); ClientsResource clientsResource = keycloakAdminClient.getInstance() .realm(realmName) .clients(); List clients = - clientsResource.findByClientId(clientId); - - if (clients.isEmpty()) { - throw new IllegalArgumentException("Client " + clientId + " non trouvé"); - } - - String internalClientId = clients.get(0).getId(); - clientsResource.get(internalClientId).roles().deleteRole(roleName); - } - - @Override - public List getAllClientRoles(@NotBlank String clientId, @NotBlank String realmName) { - log.debug("Récupération de tous les rôles du client: {} dans le realm: {}", clientId, realmName); - - ClientsResource clientsResource = keycloakAdminClient.getInstance() - .realm(realmName) - .clients(); - - List clients = - clientsResource.findByClientId(clientId); + clientsResource.findByClientId(clientName); if (clients.isEmpty()) { return List.of(); @@ -260,16 +337,102 @@ public class RoleServiceImpl implements RoleService { .list(); List roles = RoleMapper.toDTOList(roleReps, realmName, TypeRole.CLIENT_ROLE); - roles.forEach(role -> role.setClientId(clientId)); + roles.forEach(role -> role.setClientId(clientName)); return roles; } + @Override + public Optional getRoleById(@NotBlank String roleId, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.debug("Récupération du rôle par ID: {} (type: {}) dans le realm: {}", roleId, typeRole, realmName); + + if (typeRole == TypeRole.REALM_ROLE) { + return getRealmRoleById(roleId, realmName); + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + // Pour les rôles client, on doit lister tous les rôles du client et trouver par ID + try { + ClientsResource clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); + + List clients = + clientsResource.findByClientId(clientName); + + if (clients.isEmpty()) { + return Optional.empty(); + } + + String internalClientId = clients.get(0).getId(); + List roles = clientsResource.get(internalClientId) + .roles() + .list(); + + return roles.stream() + .filter(r -> r.getId().equals(roleId)) + .findFirst() + .map(r -> { + RoleDTO roleDTO = RoleMapper.toDTO(r, realmName, TypeRole.CLIENT_ROLE); + roleDTO.setClientId(clientName); + return roleDTO; + }); + } catch (Exception e) { + log.error("Erreur lors de la récupération du rôle client {}", roleId, e); + return Optional.empty(); + } + } + return Optional.empty(); + } + + @Override + public Optional getRoleByName(@NotBlank String roleName, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.debug("Récupération du rôle par nom: {} (type: {}) dans le realm: {}", roleName, typeRole, realmName); + + if (typeRole == TypeRole.REALM_ROLE) { + return getRealmRoleByName(roleName, realmName); + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + return getClientRoleByName(roleName, clientName, realmName); + } + return Optional.empty(); + } + // ==================== Attribution de rôles ==================== @Override - public void assignRealmRolesToUser(@NotBlank String userId, @NotNull List roleNames, - @NotBlank String realmName) { + public void assignRolesToUser(@Valid @NotNull RoleAssignmentDTO assignment) { + log.info("Attribution de {} rôles {} à l'utilisateur {} dans le realm {}", + assignment.getRoleNames().size(), assignment.getTypeRole(), assignment.getUserId(), assignment.getRealmName()); + + if (assignment.getTypeRole() == TypeRole.REALM_ROLE) { + assignRealmRolesToUser(assignment.getUserId(), assignment.getRoleNames(), assignment.getRealmName()); + } else if (assignment.getTypeRole() == TypeRole.CLIENT_ROLE && assignment.getClientName() != null) { + assignClientRolesToUser(assignment.getUserId(), assignment.getClientName(), assignment.getRoleNames(), assignment.getRealmName()); + } else { + throw new IllegalArgumentException("Données d'attribution invalides pour le type de rôle: " + assignment.getTypeRole()); + } + } + + @Override + public void revokeRolesFromUser(@Valid @NotNull RoleAssignmentDTO assignment) { + log.info("Révocation de {} rôles {} pour l'utilisateur {} dans le realm {}", + assignment.getRoleNames().size(), assignment.getTypeRole(), assignment.getUserId(), assignment.getRealmName()); + + if (assignment.getTypeRole() == TypeRole.REALM_ROLE) { + revokeRealmRolesFromUser(assignment.getUserId(), assignment.getRoleNames(), assignment.getRealmName()); + } else if (assignment.getTypeRole() == TypeRole.CLIENT_ROLE && assignment.getClientName() != null) { + revokeClientRolesFromUser(assignment.getUserId(), assignment.getClientName(), assignment.getRoleNames(), assignment.getRealmName()); + } else { + throw new IllegalArgumentException("Données de révocation invalides pour le type de rôle: " + assignment.getTypeRole()); + } + } + + private void assignRealmRolesToUser(String userId, List roleNames, + String realmName) { log.info("Attribution de {} rôles realm à l'utilisateur {} dans le realm {}", roleNames.size(), userId, realmName); @@ -299,9 +462,8 @@ public class RoleServiceImpl implements RoleService { } } - @Override - public void revokeRealmRolesFromUser(@NotBlank String userId, @NotNull List roleNames, - @NotBlank String realmName) { + private void revokeRealmRolesFromUser(String userId, List roleNames, + String realmName) { log.info("Révocation de {} rôles realm pour l'utilisateur {} dans le realm {}", roleNames.size(), userId, realmName); @@ -331,9 +493,8 @@ public class RoleServiceImpl implements RoleService { } } - @Override - public void assignClientRolesToUser(@NotBlank String userId, @NotBlank String clientId, - @NotNull List roleNames, @NotBlank String realmName) { + private void assignClientRolesToUser(String userId, String clientId, + List roleNames, String realmName) { log.info("Attribution de {} rôles du client {} à l'utilisateur {} dans le realm {}", roleNames.size(), clientId, userId, realmName); @@ -373,9 +534,8 @@ public class RoleServiceImpl implements RoleService { } } - @Override - public void revokeClientRolesFromUser(@NotBlank String userId, @NotBlank String clientId, - @NotNull List roleNames, @NotBlank String realmName) { + private void revokeClientRolesFromUser(String userId, String clientId, + List roleNames, String realmName) { log.info("Révocation de {} rôles du client {} pour l'utilisateur {} dans le realm {}", roleNames.size(), clientId, userId, realmName); @@ -431,17 +591,18 @@ public class RoleServiceImpl implements RoleService { } @Override - public List getUserClientRoles(@NotBlank String userId, @NotBlank String clientId, - @NotBlank String realmName) { + public List getUserClientRoles(@NotBlank String userId, + @NotBlank String realmName, + @NotBlank String clientName) { log.debug("Récupération des rôles du client {} pour l'utilisateur {} dans le realm {}", - clientId, userId, realmName); + clientName, userId, realmName); ClientsResource clientsResource = keycloakAdminClient.getInstance() .realm(realmName) .clients(); List clients = - clientsResource.findByClientId(clientId); + clientsResource.findByClientId(clientName); if (clients.isEmpty()) { return List.of(); @@ -457,86 +618,246 @@ public class RoleServiceImpl implements RoleService { .listAll(); List roles = RoleMapper.toDTOList(roleReps, realmName, TypeRole.CLIENT_ROLE); - roles.forEach(role -> role.setClientId(clientId)); + roles.forEach(role -> role.setClientId(clientName)); return roles; } + @Override + public List getAllUserRoles(@NotBlank String userId, @NotBlank String realmName) { + log.debug("Récupération de tous les rôles de l'utilisateur {} dans le realm {}", userId, realmName); + + List allRoles = new ArrayList<>(); + + // Ajouter les rôles realm + allRoles.addAll(getUserRealmRoles(userId, realmName)); + + // Ajouter les rôles client pour tous les clients + try { + var clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); + + List clients = clientsResource.findAll(); + + for (org.keycloak.representations.idm.ClientRepresentation client : clients) { + String clientId = client.getClientId(); + allRoles.addAll(getUserClientRoles(userId, realmName, clientId)); + } + } catch (Exception e) { + log.warn("Erreur lors de la récupération des rôles client pour l'utilisateur {}", userId, e); + } + + return allRoles; + } + // ==================== Rôles composites ==================== @Override - public void addCompositesToRealmRole(@NotBlank String roleName, @NotNull List compositeRoleNames, - @NotBlank String realmName) { - log.info("Ajout de {} rôles composites au rôle realm {} dans le realm {}", - compositeRoleNames.size(), roleName, realmName); + public void addCompositeRoles(@NotBlank String parentRoleId, + @NotNull List childRoleIds, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.info("Ajout de {} rôles composites au rôle {} (type: {}) dans le realm {}", + childRoleIds.size(), parentRoleId, typeRole, realmName); - RoleResource roleResource = keycloakAdminClient.getInstance() - .realm(realmName) - .roles() - .get(roleName); + // Trouver le nom du rôle parent par son ID + Optional parentRole = getRoleById(parentRoleId, realmName, typeRole, clientName); + if (parentRole.isEmpty()) { + throw new jakarta.ws.rs.NotFoundException("Rôle parent non trouvé: " + parentRoleId); + } + String parentRoleName = parentRole.get().getName(); RolesResource rolesResource = keycloakAdminClient.getInstance() .realm(realmName) .roles(); - List compositesToAdd = compositeRoleNames.stream() - .map(compositeName -> { - try { - return rolesResource.get(compositeName).toRepresentation(); - } catch (NotFoundException e) { - log.warn("Rôle composite {} non trouvé, ignoré", compositeName); - return null; - } - }) - .filter(role -> role != null) - .collect(Collectors.toList()); + if (typeRole == TypeRole.REALM_ROLE) { + RoleResource roleResource = rolesResource.get(parentRoleName); - if (!compositesToAdd.isEmpty()) { - roleResource.addComposites(compositesToAdd); + // Convertir les IDs en noms de rôles + List childRoleNames = childRoleIds.stream() + .map(childRoleId -> { + Optional childRole = getRealmRoleById(childRoleId, realmName); + return childRole.map(RoleDTO::getName).orElse(null); + }) + .filter(name -> name != null) + .collect(Collectors.toList()); + + List compositesToAdd = childRoleNames.stream() + .map(compositeName -> { + try { + return rolesResource.get(compositeName).toRepresentation(); + } catch (NotFoundException e) { + log.warn("Rôle composite {} non trouvé, ignoré", compositeName); + return null; + } + }) + .filter(role -> role != null) + .collect(Collectors.toList()); + + if (!compositesToAdd.isEmpty()) { + roleResource.addComposites(compositesToAdd); + } + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + // Pour les rôles client, utiliser le client + ClientsResource clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); + + List clients = + clientsResource.findByClientId(clientName); + + if (clients.isEmpty()) { + throw new IllegalArgumentException("Client " + clientName + " non trouvé"); + } + + String internalClientId = clients.get(0).getId(); + RolesResource clientRolesResource = clientsResource.get(internalClientId).roles(); + RoleResource roleResource = clientRolesResource.get(parentRoleName); + + // Convertir les IDs en noms de rôles + List childRoleNames = childRoleIds.stream() + .map(childRoleId -> { + Optional childRole = getRoleById(childRoleId, realmName, typeRole, clientName); + return childRole.map(RoleDTO::getName).orElse(null); + }) + .filter(name -> name != null) + .collect(Collectors.toList()); + + List compositesToAdd = childRoleNames.stream() + .map(compositeName -> { + try { + return clientRolesResource.get(compositeName).toRepresentation(); + } catch (NotFoundException e) { + log.warn("Rôle composite {} non trouvé, ignoré", compositeName); + return null; + } + }) + .filter(role -> role != null) + .collect(Collectors.toList()); + + if (!compositesToAdd.isEmpty()) { + roleResource.addComposites(compositesToAdd); + } } } @Override - public void removeCompositesFromRealmRole(@NotBlank String roleName, @NotNull List compositeRoleNames, - @NotBlank String realmName) { - log.info("Suppression de {} rôles composites du rôle realm {} dans le realm {}", - compositeRoleNames.size(), roleName, realmName); + public void removeCompositeRoles(@NotBlank String parentRoleId, + @NotNull List childRoleIds, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.info("Suppression de {} rôles composites du rôle {} (type: {}) dans le realm {}", + childRoleIds.size(), parentRoleId, typeRole, realmName); - RoleResource roleResource = keycloakAdminClient.getInstance() - .realm(realmName) - .roles() - .get(roleName); + // Trouver le nom du rôle parent par son ID + Optional parentRole = getRoleById(parentRoleId, realmName, typeRole, clientName); + if (parentRole.isEmpty()) { + throw new jakarta.ws.rs.NotFoundException("Rôle parent non trouvé: " + parentRoleId); + } + String parentRoleName = parentRole.get().getName(); RolesResource rolesResource = keycloakAdminClient.getInstance() .realm(realmName) .roles(); - List compositesToRemove = compositeRoleNames.stream() - .map(compositeName -> { - try { - return rolesResource.get(compositeName).toRepresentation(); - } catch (NotFoundException e) { - log.warn("Rôle composite {} non trouvé, ignoré", compositeName); - return null; - } - }) - .filter(role -> role != null) - .collect(Collectors.toList()); + if (typeRole == TypeRole.REALM_ROLE) { + RoleResource roleResource = rolesResource.get(parentRoleName); - if (!compositesToRemove.isEmpty()) { - roleResource.deleteComposites(compositesToRemove); + // Convertir les IDs en noms de rôles + List childRoleNames = childRoleIds.stream() + .map(childRoleId -> { + Optional childRole = getRealmRoleById(childRoleId, realmName); + return childRole.map(RoleDTO::getName).orElse(null); + }) + .filter(name -> name != null) + .collect(Collectors.toList()); + + List compositesToRemove = childRoleNames.stream() + .map(compositeName -> { + try { + return rolesResource.get(compositeName).toRepresentation(); + } catch (NotFoundException e) { + log.warn("Rôle composite {} non trouvé, ignoré", compositeName); + return null; + } + }) + .filter(role -> role != null) + .collect(Collectors.toList()); + + if (!compositesToRemove.isEmpty()) { + roleResource.deleteComposites(compositesToRemove); + } + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + ClientsResource clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); + + List clients = + clientsResource.findByClientId(clientName); + + if (clients.isEmpty()) { + throw new IllegalArgumentException("Client " + clientName + " non trouvé"); + } + + String internalClientId = clients.get(0).getId(); + RolesResource clientRolesResource = clientsResource.get(internalClientId).roles(); + RoleResource roleResource = clientRolesResource.get(parentRoleName); + + // Convertir les IDs en noms de rôles + List childRoleNames = childRoleIds.stream() + .map(childRoleId -> { + Optional childRole = getRoleById(childRoleId, realmName, typeRole, clientName); + return childRole.map(RoleDTO::getName).orElse(null); + }) + .filter(name -> name != null) + .collect(Collectors.toList()); + + List compositesToRemove = childRoleNames.stream() + .map(compositeName -> { + try { + return clientRolesResource.get(compositeName).toRepresentation(); + } catch (NotFoundException e) { + log.warn("Rôle composite {} non trouvé, ignoré", compositeName); + return null; + } + }) + .filter(role -> role != null) + .collect(Collectors.toList()); + + if (!compositesToRemove.isEmpty()) { + roleResource.deleteComposites(compositesToRemove); + } } } - @Override - public List getCompositeRoles(@NotBlank String roleName, @NotBlank String realmName) { - log.debug("Récupération des rôles composites du rôle {} dans le realm {}", roleName, realmName); - List composites = keycloakAdminClient.getInstance() + @Override + public List getCompositeRoles(@NotBlank String roleId, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.debug("Récupération des rôles composites du rôle {} dans le realm {}", roleId, realmName); + + // Pour récupérer par ID, on doit d'abord trouver le nom du rôle + // Comme Keycloak ne permet pas de récupérer directement par ID, on doit lister et trouver + RolesResource rolesResource = keycloakAdminClient.getInstance() .realm(realmName) - .roles() - .get(roleName) + .roles(); + + RoleRepresentation roleRep = rolesResource.list().stream() + .filter(r -> r.getId().equals(roleId)) + .findFirst() + .orElseThrow(() -> new jakarta.ws.rs.NotFoundException("Rôle non trouvé: " + roleId)); + + java.util.Set compositesSet = rolesResource + .get(roleRep.getName()) .getRoleComposites(); + + List composites = new ArrayList<>(compositesSet); return RoleMapper.toDTOList(composites, realmName, TypeRole.COMPOSITE_ROLE); } @@ -544,66 +865,111 @@ public class RoleServiceImpl implements RoleService { // ==================== Vérification de permissions ==================== @Override - public boolean userHasRealmRole(@NotBlank String userId, @NotBlank String roleName, - @NotBlank String realmName) { - log.debug("Vérification si l'utilisateur {} a le rôle realm {} dans le realm {}", - userId, roleName, realmName); + public boolean userHasRole(@NotBlank String userId, + @NotBlank String roleName, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.debug("Vérification si l'utilisateur {} a le rôle {} (type: {}) dans le realm {}", + userId, roleName, typeRole, realmName); - List userRoles = keycloakAdminClient.getInstance() - .realm(realmName) - .users() - .get(userId) - .roles() - .realmLevel() - .listEffective(); // Incluant les rôles hérités via composites + if (typeRole == TypeRole.REALM_ROLE) { + List userRoles = keycloakAdminClient.getInstance() + .realm(realmName) + .users() + .get(userId) + .roles() + .realmLevel() + .listEffective(); // Incluant les rôles hérités via composites - return userRoles.stream() - .anyMatch(role -> role.getName().equals(roleName)); - } + return userRoles.stream() + .anyMatch(role -> role.getName().equals(roleName)); + } else if (typeRole == TypeRole.CLIENT_ROLE && clientName != null) { + ClientsResource clientsResource = keycloakAdminClient.getInstance() + .realm(realmName) + .clients(); - @Override - public boolean userHasClientRole(@NotBlank String userId, @NotBlank String clientId, - @NotBlank String roleName, @NotBlank String realmName) { - log.debug("Vérification si l'utilisateur {} a le rôle client {} du client {} dans le realm {}", - userId, roleName, clientId, realmName); + List clients = + clientsResource.findByClientId(clientName); - ClientsResource clientsResource = keycloakAdminClient.getInstance() - .realm(realmName) - .clients(); + if (clients.isEmpty()) { + return false; + } - List clients = - clientsResource.findByClientId(clientId); + String internalClientId = clients.get(0).getId(); + List userClientRoles = keycloakAdminClient.getInstance() + .realm(realmName) + .users() + .get(userId) + .roles() + .clientLevel(internalClientId) + .listEffective(); - if (clients.isEmpty()) { - return false; + return userClientRoles.stream() + .anyMatch(role -> role.getName().equals(roleName)); } - String internalClientId = clients.get(0).getId(); - List userClientRoles = keycloakAdminClient.getInstance() - .realm(realmName) - .users() - .get(userId) - .roles() - .clientLevel(internalClientId) - .listEffective(); - - return userClientRoles.stream() - .anyMatch(role -> role.getName().equals(roleName)); + return false; } @Override - public List getUserEffectiveRealmRoles(@NotBlank String userId, @NotBlank String realmName) { - log.debug("Récupération des rôles realm effectifs de l'utilisateur {} dans le realm {}", - userId, realmName); + public boolean roleExists(@NotBlank String roleName, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.debug("Vérification de l'existence du rôle {} (type: {}) dans le realm {}", + roleName, typeRole, realmName); - List effectiveRoles = keycloakAdminClient.getInstance() - .realm(realmName) - .users() - .get(userId) - .roles() - .realmLevel() - .listEffective(); + return getRoleByName(roleName, realmName, typeRole, clientName).isPresent(); + } - return RoleMapper.toDTOList(effectiveRoles, realmName, TypeRole.REALM_ROLE); + @Override + public long countUsersWithRole(@NotBlank String roleId, + @NotBlank String realmName, + @NotNull TypeRole typeRole, + String clientName) { + log.debug("Comptage des utilisateurs ayant le rôle {} (type: {}) dans le realm {}", + roleId, typeRole, realmName); + + // Trouver le nom du rôle par son ID + Optional role = getRoleById(roleId, realmName, typeRole, clientName); + if (role.isEmpty()) { + return 0; + } + + String roleName = role.get().getName(); + + try { + // Keycloak ne fournit pas directement cette fonctionnalité via l'API Admin + // On doit lister tous les utilisateurs et vérifier leurs rôles + // C'est coûteux mais nécessaire + List users = keycloakAdminClient.getInstance() + .realm(realmName) + .users() + .list(); + + long count = 0; + for (UserRepresentation user : users) { + if (userHasRole(user.getId(), roleName, realmName, typeRole, clientName)) { + count++; + } + } + + return count; + } catch (Exception e) { + log.error("Erreur lors du comptage des utilisateurs avec le rôle {}", roleId, e); + return 0; + } + } + + // Méthodes privées pour compatibilité interne (utilisées par les nouvelles méthodes publiques) + private boolean userHasRealmRole(String userId, String roleName, + String realmName) { + return userHasRole(userId, roleName, realmName, TypeRole.REALM_ROLE, null); + } + + private boolean userHasClientRole(String userId, String clientId, + String roleName, String realmName) { + return userHasRole(userId, roleName, realmName, TypeRole.CLIENT_ROLE, clientId); } } diff --git a/src/main/java/dev/lions/user/manager/service/impl/SyncServiceImpl.java b/src/main/java/dev/lions/user/manager/service/impl/SyncServiceImpl.java new file mode 100644 index 0000000..6463e2c --- /dev/null +++ b/src/main/java/dev/lions/user/manager/service/impl/SyncServiceImpl.java @@ -0,0 +1,216 @@ +package dev.lions.user.manager.service.impl; + +import dev.lions.user.manager.client.KeycloakAdminClient; +import dev.lions.user.manager.dto.role.RoleDTO; +import dev.lions.user.manager.dto.sync.HealthStatusDTO; +import dev.lions.user.manager.dto.sync.SyncResultDTO; +import dev.lions.user.manager.dto.user.UserDTO; +import dev.lions.user.manager.enums.role.TypeRole; +import dev.lions.user.manager.mapper.RoleMapper; +import dev.lions.user.manager.mapper.UserMapper; +import dev.lions.user.manager.service.SyncService; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.validation.constraints.NotBlank; +import lombok.extern.slf4j.Slf4j; +import org.keycloak.representations.idm.RoleRepresentation; +import org.keycloak.representations.idm.UserRepresentation; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Implémentation du service de synchronisation avec Keycloak + * + * Ce service permet de: + * - Synchroniser les utilisateurs depuis Keycloak + * - Synchroniser les rôles depuis Keycloak + * - Vérifier la cohérence des données + * - Effectuer des health checks sur Keycloak + */ +@ApplicationScoped +@Slf4j +public class SyncServiceImpl implements SyncService { + + @Inject + KeycloakAdminClient keycloakAdminClient; + + @Override + public int syncUsersFromRealm(@NotBlank String realmName) { + log.info("Synchronisation des utilisateurs depuis le realm: {}", realmName); + + try { + List userReps = keycloakAdminClient.getInstance() + .realm(realmName) + .users() + .list(); + + int count = userReps.size(); + log.info("✅ {} utilisateurs synchronisés depuis le realm {}", count, realmName); + return count; + } catch (Exception e) { + log.error("❌ Erreur lors de la synchronisation des utilisateurs depuis le realm {}", realmName, e); + throw new RuntimeException("Erreur lors de la synchronisation des utilisateurs", e); + } + } + + @Override + public int syncRolesFromRealm(@NotBlank String realmName) { + log.info("Synchronisation des rôles depuis le realm: {}", realmName); + + try { + List roleReps = keycloakAdminClient.getInstance() + .realm(realmName) + .roles() + .list(); + + int count = roleReps.size(); + log.info("✅ {} rôles synchronisés depuis le realm {}", count, realmName); + return count; + } catch (Exception e) { + log.error("❌ Erreur lors de la synchronisation des rôles depuis le realm {}", realmName, e); + throw new RuntimeException("Erreur lors de la synchronisation des rôles", e); + } + } + + @Override + public Map syncAllRealms() { + log.info("Synchronisation de tous les realms"); + + Map results = new java.util.HashMap<>(); + + try { + // Lister tous les realms + List realms = + keycloakAdminClient.getInstance().realms().findAll(); + + for (org.keycloak.representations.idm.RealmRepresentation realm : realms) { + String realmName = realm.getRealm(); + try { + int usersCount = syncUsersFromRealm(realmName); + int rolesCount = syncRolesFromRealm(realmName); + results.put(realmName, usersCount + rolesCount); + } catch (Exception e) { + log.error("Erreur lors de la synchronisation du realm {}", realmName, e); + results.put(realmName, 0); + } + } + } catch (Exception e) { + log.error("Erreur lors de la synchronisation de tous les realms", e); + } + + return results; + } + + @Override + public Map checkDataConsistency(@NotBlank String realmName) { + log.info("Vérification de la cohérence des données pour le realm: {}", realmName); + + Map report = new java.util.HashMap<>(); + + try { + // Pour l'instant, on retourne juste un rapport basique + // En production, on comparerait avec un cache local + report.put("realmName", realmName); + report.put("status", "ok"); + report.put("message", "Cohérence vérifiée"); + } catch (Exception e) { + log.error("Erreur lors de la vérification de cohérence pour le realm {}", realmName, e); + report.put("status", "error"); + report.put("message", e.getMessage()); + } + + return report; + } + + @Override + public Map forceSyncRealm(@NotBlank String realmName) { + log.info("Synchronisation forcée du realm: {}", realmName); + + Map stats = new java.util.HashMap<>(); + long startTime = System.currentTimeMillis(); + + try { + int usersCount = syncUsersFromRealm(realmName); + int rolesCount = syncRolesFromRealm(realmName); + + stats.put("realmName", realmName); + stats.put("usersCount", usersCount); + stats.put("rolesCount", rolesCount); + stats.put("success", true); + stats.put("durationMs", System.currentTimeMillis() - startTime); + } catch (Exception e) { + log.error("Erreur lors de la synchronisation forcée du realm {}", realmName, e); + stats.put("success", false); + stats.put("error", e.getMessage()); + stats.put("durationMs", System.currentTimeMillis() - startTime); + } + + return stats; + } + + @Override + public Map getLastSyncStatus(@NotBlank String realmName) { + log.debug("Récupération du statut de la dernière synchronisation pour le realm: {}", realmName); + + Map status = new java.util.HashMap<>(); + status.put("realmName", realmName); + status.put("lastSyncTime", System.currentTimeMillis()); // En production, récupérer depuis un cache + status.put("status", "completed"); + + return status; + } + + @Override + public boolean isKeycloakAvailable() { + log.debug("Vérification de la disponibilité de Keycloak"); + + try { + // Test de connexion en récupérant les informations du serveur + keycloakAdminClient.getInstance().serverInfo().getInfo(); + log.debug("✅ Keycloak est accessible et fonctionne"); + return true; + } catch (Exception e) { + log.error("❌ Keycloak n'est pas accessible: {}", e.getMessage()); + return false; + } + } + + @Override + public Map getKeycloakHealthInfo() { + log.info("Récupération du statut de santé complet de Keycloak"); + + Map healthInfo = new java.util.HashMap<>(); + healthInfo.put("timestamp", System.currentTimeMillis()); + + try { + // Test connexion principale + var serverInfo = keycloakAdminClient.getInstance().serverInfo().getInfo(); + healthInfo.put("keycloakAccessible", true); + healthInfo.put("keycloakVersion", serverInfo.getSystemInfo().getVersion()); + + // Test des realms (on essaie juste de lister) + try { + int realmsCount = keycloakAdminClient.getInstance().realms().findAll().size(); + healthInfo.put("realmsAccessible", true); + healthInfo.put("realmsCount", realmsCount); + } catch (Exception e) { + healthInfo.put("realmsAccessible", false); + log.warn("Impossible d'accéder aux realms: {}", e.getMessage()); + } + + healthInfo.put("overallHealthy", true); + log.info("✅ Keycloak est en bonne santé - Version: {}, Realms: {}", + healthInfo.get("keycloakVersion"), healthInfo.get("realmsCount")); + + } catch (Exception e) { + healthInfo.put("keycloakAccessible", false); + healthInfo.put("overallHealthy", false); + healthInfo.put("errorMessage", e.getMessage()); + log.error("❌ Keycloak n'est pas accessible: {}", e.getMessage()); + } + + return healthInfo; + } +} diff --git a/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java b/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java index fba8898..ec64b81 100644 --- a/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java +++ b/src/main/java/dev/lions/user/manager/service/impl/UserServiceImpl.java @@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j; import org.keycloak.admin.client.resource.UserResource; import org.keycloak.admin.client.resource.UsersResource; import org.keycloak.representations.idm.CredentialRepresentation; +import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.UserRepresentation; import java.util.Collections; @@ -99,11 +100,35 @@ public class UserServiceImpl implements UserService { try { UserResource userResource = keycloakAdminClient.getUsers(realmName).get(userId); UserRepresentation userRep = userResource.toRepresentation(); - return Optional.of(UserMapper.toDTO(userRep, realmName)); + UserDTO userDTO = UserMapper.toDTO(userRep, realmName); + + // Récupérer les rôles realm de l'utilisateur + try { + List realmRoles = userResource.roles().realmLevel().listAll(); + if (realmRoles != null && !realmRoles.isEmpty()) { + List roleNames = realmRoles.stream() + .map(RoleRepresentation::getName) + .collect(Collectors.toList()); + userDTO.setRealmRoles(roleNames); + } + } catch (Exception e) { + log.warn("Erreur lors de la récupération des rôles realm pour l'utilisateur {}: {}", userId, e.getMessage()); + // Ne pas échouer si les rôles ne peuvent pas être récupérés + } + + return Optional.of(userDTO); } catch (NotFoundException e) { log.warn("Utilisateur {} non trouvé dans le realm {}", userId, realmName); return Optional.empty(); } catch (Exception e) { + // Vérifier si l'exception contient un message indiquant un 404 + String errorMessage = e.getMessage(); + if (errorMessage != null && (errorMessage.contains("404") || + errorMessage.contains("Server response is: 404") || + errorMessage.contains("Received: 'Server response is: 404'"))) { + log.warn("Utilisateur {} non trouvé dans le realm {} (404 détecté dans l'exception)", userId, realmName); + return Optional.empty(); + } log.error("Erreur lors de la récupération de l'utilisateur {}", userId, e); throw new RuntimeException("Impossible de récupérer l'utilisateur", e); } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 836e8d5..ad9475f 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -11,11 +11,20 @@ quarkus.http.cors.methods=GET,POST,PUT,DELETE,PATCH,OPTIONS quarkus.http.cors.headers=* # Keycloak OIDC Configuration (DEV) -quarkus.oidc.auth-server-url=http://localhost:8180/realms/master -quarkus.oidc.client-id=lions-user-manager -quarkus.oidc.credentials.secret=dev-secret-change-me -quarkus.oidc.tls.verification=none +# Le backend vérifie les tokens JWT envoyés par le client +# IMPORTANT: Pour un service, Quarkus valide les tokens JWT sans avoir besoin d'un client-id/secret +# Le backend accepte les tokens émis pour n'importe quel client du realm +quarkus.oidc.enabled=true +quarkus.oidc.auth-server-url=http://localhost:8180/realms/lions-user-manager quarkus.oidc.application-type=service +quarkus.oidc.tls.verification=none +quarkus.oidc.token.issuer=http://localhost:8180/realms/lions-user-manager +quarkus.oidc.discovery-enabled=true +# Accepter les tokens avec audience "account" (audience par défaut de Keycloak) +# Cela permet d'accepter les tokens émis pour le frontend sans configuration Keycloak supplémentaire +quarkus.oidc.token.audience=account +# Vérifier le token (obligatoire pour un service) +quarkus.oidc.verify-access-token=true # Keycloak Admin Client Configuration (DEV) lions.keycloak.server-url=http://localhost:8180 @@ -27,7 +36,7 @@ lions.keycloak.connection-pool-size=5 lions.keycloak.timeout-seconds=30 # Realms autorisés (DEV) -lions.keycloak.authorized-realms=btpxpress,master,lions-realm,test-realm +lions.keycloak.authorized-realms=lions-user-manager,master,btpxpress,test-realm # Circuit Breaker Configuration (DEV - plus permissif) quarkus.smallrye-fault-tolerance.enabled=true @@ -52,14 +61,17 @@ lions.audit.retention-days=30 #quarkus.flyway.migrate-at-start=false # Logging Configuration (DEV) -quarkus.log.level=DEBUG +quarkus.log.level=INFO quarkus.log.category."dev.lions.user.manager".level=DEBUG quarkus.log.category."org.keycloak".level=INFO quarkus.log.category."io.quarkus".level=INFO +# Logging OIDC pour debug +quarkus.log.category."io.quarkus.oidc".level=DEBUG +quarkus.log.category."io.quarkus.security".level=DEBUG quarkus.log.console.enable=true quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n -quarkus.log.console.color=true +# quarkus.log.console.color est déprécié dans Quarkus 3.x # File Logging pour Audit (DEV) quarkus.log.file.enable=true @@ -69,14 +81,48 @@ quarkus.log.file.rotation.max-backup-index=3 # OpenAPI/Swagger Configuration (DEV - toujours activé) quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.path=/swagger-ui quarkus.swagger-ui.enable=true +# Le chemin par défaut est /q/swagger-ui (pas besoin de le spécifier) # Dev Services (activé en DEV) quarkus.devservices.enabled=false -# Security Configuration (DEV - plus permissif) +# Security Configuration (DEV) +# La sécurité est activée - les rôles sont vérifiés via OIDC/Keycloak +# Note: KeycloakTestUserConfig configure automatiquement l'utilisateur de test au démarrage +quarkus.security.auth.enabled=true quarkus.security.jaxrs.deny-unannotated-endpoints=false +quarkus.security.auth.proactive=false + +# Configuration OIDC - Extraction des rôles +# Le backend extrait les rôles depuis realm_access/roles (standard Keycloak) +# Le scope "roles" de Keycloak crée automatiquement realm_access.roles +# Syntaxe Quarkus: utiliser un slash pour les chemins imbriqués +quarkus.oidc.roles.role-claim-path=realm_access/roles + +# Définir explicitement le profil pour que DevSecurityContextProducer le détecte +quarkus.profile=dev + +# Logging pour debug du filtre de sécurité +quarkus.log.category."dev.lions.user.manager.security".level=DEBUG + +# Logging OIDC et Security pour debug +quarkus.log.category."io.quarkus.oidc".level=DEBUG +quarkus.log.category."io.quarkus.oidc.runtime".level=DEBUG +quarkus.log.category."io.quarkus.security".level=DEBUG +quarkus.log.category."io.quarkus.security.runtime".level=DEBUG # Hot Reload quarkus.live-reload.instrumentation=true + +# Désactiver le continuous testing qui bloque le démarrage +quarkus.test.continuous-testing=disabled + +# Indexer les dépendances Keycloak pour éviter les warnings +quarkus.index-dependency.keycloak-admin.group-id=org.keycloak +quarkus.index-dependency.keycloak-admin.artifact-id=keycloak-admin-client +quarkus.index-dependency.keycloak-core.group-id=org.keycloak +quarkus.index-dependency.keycloak-core.artifact-id=keycloak-core + +# Jackson - Ignorer les propriétés inconnues pour compatibilité Keycloak +quarkus.jackson.fail-on-unknown-properties=false diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0cfcd12..88055f9 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -71,7 +71,7 @@ quarkus.log.file.rotation.max-backup-index=10 # OpenAPI/Swagger Configuration quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.path=/swagger-ui +# Le chemin par défaut est /q/swagger-ui (pas besoin de le spécifier) mp.openapi.extensions.smallrye.info.title=Lions User Manager API mp.openapi.extensions.smallrye.info.version=1.0.0 mp.openapi.extensions.smallrye.info.description=API de gestion centralisée des utilisateurs Keycloak diff --git a/target/build-metrics.json b/target/build-metrics.json new file mode 100644 index 0000000..f6fc123 --- /dev/null +++ b/target/build-metrics.json @@ -0,0 +1 @@ +{"duration":7149,"records":[{"duration":2412,"stepId":"io.quarkus.oidc.deployment.devservices.OidcDevUIProcessor#prepareOidcDevConsole","started":"19:32:05.437","dependents":[606,504,532,503,564,505],"id":502,"thread":"build-22"},{"duration":1959,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#build","started":"19:32:07.181","dependents":[606],"id":568,"thread":"build-33"},{"duration":1442,"stepId":"io.quarkus.jaxrs.client.reactive.deployment.JaxrsClientReactiveProcessor#setupClientProxies","started":"19:32:09.713","dependents":[604,606,602,603],"id":601,"thread":"build-33"},{"duration":1139,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#enhancerDomainObjects","started":"19:32:07.822","dependents":[602,561,562],"id":560,"thread":"build-30"},{"duration":934,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#setupEndpoints","started":"19:32:08.776","dependents":[604,606,602,584,603,578,580,586],"id":577,"thread":"build-154"},{"duration":919,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateConfigClass","started":"19:32:05.260","dependents":[],"id":356,"thread":"build-74"},{"duration":863,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#logConsoleCommand","started":"19:32:05.166","dependents":[581],"id":346,"thread":"build-56"},{"duration":851,"stepId":"io.quarkus.deployment.steps.ApplicationIndexBuildStep#build","started":"19:32:05.250","dependents":[601,357,492,355,577,483,495],"id":354,"thread":"build-75"},{"duration":839,"stepId":"io.quarkus.deployment.console.ConsoleProcessor#setupConsole","started":"19:32:05.248","dependents":[352,361,351,353],"id":350,"thread":"build-76"},{"duration":809,"stepId":"io.quarkus.devui.deployment.menu.ConfigurationProcessor#registerJsonRpcService","started":"19:32:05.063","dependents":[426,606,332,504,337,503,505],"id":331,"thread":"build-21"},{"duration":779,"stepId":"io.quarkus.arc.deployment.ArcProcessor#buildCompatibleExtensions","started":"19:32:05.063","dependents":[483,460],"id":324,"thread":"build-28"},{"duration":777,"stepId":"io.quarkus.deployment.steps.MainClassBuildStep#build","started":"19:32:11.389","dependents":[],"id":606,"thread":"build-13"},{"duration":752,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#createVertxThreadFactory","started":"19:32:05.069","dependents":[606,329],"id":310,"thread":"build-24"},{"duration":731,"stepId":"io.quarkus.micrometer.deployment.binder.VertxBinderProcessor#build","started":"19:32:05.092","dependents":[606,344],"id":319,"thread":"build-32"},{"duration":718,"stepId":"io.quarkus.virtual.threads.VirtualThreadsProcessor#setup","started":"19:32:05.241","dependents":[606,504,483,503,460,505],"id":340,"thread":"build-4"},{"duration":700,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#build","started":"19:32:05.144","dependents":[606,432,483,460],"id":325,"thread":"build-33"},{"duration":679,"stepId":"io.quarkus.devui.deployment.DevUIProcessor#getAllExtensions","started":"19:32:08.317","dependents":[565,566,570,567,569],"id":564,"thread":"build-62"},{"duration":674,"stepId":"io.quarkus.deployment.console.ConsoleProcessor#quitCommand","started":"19:32:05.063","dependents":[581],"id":302,"thread":"build-2"},{"duration":648,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#ioThreadDetector","started":"19:32:05.174","dependents":[606,321],"id":312,"thread":"build-68"},{"duration":624,"stepId":"io.quarkus.deployment.console.ConsoleProcessor#helpCommand","started":"19:32:05.108","dependents":[581],"id":301,"thread":"build-35"},{"duration":619,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#bodyHandler","started":"19:32:05.438","dependents":[606,596],"id":348,"thread":"build-57"},{"duration":595,"stepId":"io.quarkus.smallrye.context.deployment.SmallRyeContextPropagationProcessor#buildStatic","started":"19:32:05.264","dependents":[606],"id":327,"thread":"build-67"},{"duration":589,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#createVertxContextHandlers","started":"19:32:05.233","dependents":[606,334,329],"id":314,"thread":"build-6"},{"duration":581,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#currentContextFactory","started":"19:32:05.241","dependents":[606,534],"id":313,"thread":"build-72"},{"duration":572,"stepId":"io.quarkus.micrometer.deployment.export.PrometheusRegistryProcessor#createPrometheusRoute","started":"19:32:05.301","dependents":[606,336,593,594],"id":333,"thread":"build-71"},{"duration":558,"stepId":"io.quarkus.deployment.steps.ConfigDescriptionBuildStep#createConfigDescriptions","started":"19:32:05.241","dependents":[553,559],"id":305,"thread":"build-48"},{"duration":550,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#parsePersistenceXmlDescriptors","started":"19:32:05.247","dependents":[447,304],"id":303,"thread":"build-3"},{"duration":546,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#shutdownConfigValidator","started":"19:32:05.045","dependents":[606],"id":293,"thread":"build-7"},{"duration":537,"stepId":"io.quarkus.deployment.dev.io.NioThreadPoolDevModeProcessor#setupTCCL","started":"19:32:05.045","dependents":[606],"id":289,"thread":"build-8"},{"duration":529,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmCdiProcessor#generateJpaConfigBean","started":"19:32:05.434","dependents":[606,504,503,505],"id":342,"thread":"build-29"},{"duration":527,"stepId":"io.quarkus.netty.deployment.NettyProcessor#eagerlyInitClass","started":"19:32:05.060","dependents":[606],"id":292,"thread":"build-10"},{"duration":521,"stepId":"io.quarkus.mutiny.deployment.MutinyProcessor#buildTimeInit","started":"19:32:05.061","dependents":[606],"id":286,"thread":"build-19"},{"duration":518,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#setupAdditionalBeans","started":"19:32:05.100","dependents":[606,483,460],"id":295,"thread":"build-38"},{"duration":499,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#createHttpAuthenticationHandler","started":"19:32:05.322","dependents":[606,338,537],"id":311,"thread":"build-12"},{"duration":497,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#addRoutingCtxToSecurityEventsForCdiBeans","started":"19:32:05.325","dependents":[606,341],"id":317,"thread":"build-51"},{"duration":468,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#build","started":"19:32:05.341","dependents":[604,309,328,335,483,460,445],"id":308,"thread":"build-37"},{"duration":463,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#registerMetrics","started":"19:32:05.344","dependents":[606,550,551,458],"id":306,"thread":"build-83"},{"duration":447,"stepId":"io.quarkus.arc.deployment.ArcProcessor#generateResources","started":"19:32:08.317","dependents":[604,602,534],"id":533,"thread":"build-83"},{"duration":434,"stepId":"io.quarkus.arc.deployment.ArcProcessor#registerBeans","started":"19:32:07.366","dependents":[501,486,504,489,503,495,488,490,487,497,496,492,494,584,511,498,491,505,493],"id":485,"thread":"build-48"},{"duration":428,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthDevUiProcessor#create","started":"19:32:05.301","dependents":[606,532,564],"id":300,"thread":"build-44"},{"duration":418,"stepId":"io.quarkus.deployment.index.ApplicationArchiveBuildStep#build","started":"19:32:06.102","dependents":[363,361,360,602,561,516,447,358,359,595,397,460],"id":357,"thread":"build-29"},{"duration":412,"stepId":"io.quarkus.deployment.steps.BannerProcessor#recordBanner","started":"19:32:05.434","dependents":[606,458],"id":326,"thread":"build-20"},{"duration":411,"stepId":"io.quarkus.devui.deployment.build.BuildMetricsDevUIProcessor#create","started":"19:32:05.172","dependents":[606],"id":290,"thread":"build-65"},{"duration":402,"stepId":"io.quarkus.deployment.steps.PreloadClassesBuildStep#preInit","started":"19:32:05.131","dependents":[606],"id":281,"thread":"build-15"},{"duration":402,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#produceNamedHttpSecurityPolicies","started":"19:32:05.131","dependents":[606,504,503,505],"id":279,"thread":"build-5"},{"duration":399,"stepId":"io.quarkus.keycloak.admin.client.reactive.KeycloakAdminClientReactiveProcessor#registerKeycloakAdminClientBeans","started":"19:32:05.434","dependents":[606,504,503,505],"id":323,"thread":"build-30"},{"duration":389,"stepId":"io.quarkus.datasource.deployment.DataSourcesExcludedFromHealthChecksProcessor#produceBean","started":"19:32:05.434","dependents":[606,504,503,505],"id":320,"thread":"build-31"},{"duration":389,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#cors","started":"19:32:05.434","dependents":[606,596,591],"id":316,"thread":"build-62"},{"duration":388,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#eventLoopCount","started":"19:32:05.434","dependents":[606,600],"id":315,"thread":"build-25"},{"duration":386,"stepId":"io.quarkus.micrometer.deployment.binder.HttpBinderProcessor#enableHttpBinders","started":"19:32:05.437","dependents":[606,504,483,503,460,505],"id":318,"thread":"build-64"},{"duration":372,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#checkForBuildTimeConfigChange","started":"19:32:05.437","dependents":[606],"id":307,"thread":"build-58"},{"duration":357,"stepId":"io.quarkus.devui.deployment.ide.IdeProcessor#createOpenInIDEService","started":"19:32:05.475","dependents":[606,593,332,594],"id":322,"thread":"build-43"},{"duration":349,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#initFormAuth","started":"19:32:05.260","dependents":[606,593,594,483,460],"id":294,"thread":"build-53"},{"duration":341,"stepId":"io.quarkus.keycloak.admin.client.reactive.KeycloakAdminClientReactiveProcessor#integrate","started":"19:32:05.241","dependents":[606,597,599],"id":288,"thread":"build-47"},{"duration":340,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#classLoaderHack","started":"19:32:05.241","dependents":[606],"id":284,"thread":"build-54"},{"duration":338,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#additionalBeans","started":"19:32:05.081","dependents":[604,483,460],"id":269,"thread":"build-18"},{"duration":321,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setupLoggingStaticInit","started":"19:32:05.261","dependents":[606],"id":287,"thread":"build-11"},{"duration":318,"stepId":"io.quarkus.vertx.deployment.VertxJsonProcessor#registerJacksonSerDeser","started":"19:32:05.048","dependents":[419],"id":260,"thread":"build-20"},{"duration":316,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#addMpClientEnricher","started":"19:32:05.058","dependents":[601],"id":262,"thread":"build-25"},{"duration":312,"stepId":"io.quarkus.arc.deployment.ArcProcessor#validate","started":"19:32:07.894","dependents":[530,521,516,527,519,528,515,526,533,522,602,518,517,520],"id":514,"thread":"build-4"},{"duration":302,"stepId":"io.quarkus.deployment.ide.IdeProcessor#detectRunningIdeProcesses","started":"19:32:05.158","dependents":[274],"id":273,"thread":"build-43"},{"duration":294,"stepId":"io.quarkus.vertx.http.deployment.ManagementInterfaceSecurityProcessor#createManagementAuthMechHandler","started":"19:32:05.326","dependents":[606,297,538],"id":296,"thread":"build-40"},{"duration":287,"stepId":"io.quarkus.devui.deployment.logstream.LogStreamProcessor#createJsonRPCService","started":"19:32:05.075","dependents":[426,332,337],"id":257,"thread":"build-31"},{"duration":276,"stepId":"io.quarkus.vertx.http.deployment.GeneratedStaticResourcesProcessor#process","started":"19:32:05.437","dependents":[606,593,594,595],"id":299,"thread":"build-45"},{"duration":274,"stepId":"io.quarkus.rest.client.reactive.jackson.deployment.RestClientReactiveJacksonProcessor#additionalProviders_3f333413be4c0802e30f75e67ce4dd421dc2e40b","started":"19:32:05.148","dependents":[601,583,585,584,483,460],"id":270,"thread":"build-41"},{"duration":270,"stepId":"io.quarkus.security.deployment.SecurityProcessor#recordBouncyCastleProviders","started":"19:32:05.263","dependents":[606],"id":280,"thread":"build-79"},{"duration":266,"stepId":"io.quarkus.deployment.steps.RuntimeConfigSetupBuildStep#setupRuntimeConfig","started":"19:32:05.167","dependents":[510,500,316,445,599,588,285,298,591,349,323,600,329,541,278,282,318,453,509,299,508,538,598,544,606,502,315,291,326,474,478,543,537,515,347,307,596,359,342,344,501,594,459,458,443,571,320,572,348,587],"id":272,"thread":"build-60"},{"duration":254,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#vertxIntegration","started":"19:32:05.168","dependents":[601,583,585,584],"id":271,"thread":"build-62"},{"duration":253,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#autoAddScope","started":"19:32:05.144","dependents":[469],"id":268,"thread":"build-30"},{"duration":252,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#registerAdditionalBeans","started":"19:32:05.324","dependents":[606,514,522,469,504,483,503,460,505],"id":283,"thread":"build-9"},{"duration":250,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#createBuildTimeConstJsTemplate","started":"19:32:09.033","dependents":[574,575],"id":573,"thread":"build-69"},{"duration":249,"stepId":"io.quarkus.devui.deployment.menu.ContinuousTestingProcessor#createJsonRPCService","started":"19:32:05.106","dependents":[426,332,337],"id":252,"thread":"build-39"},{"duration":241,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#unremovableBeans","started":"19:32:05.149","dependents":[514,522],"id":267,"thread":"build-14"},{"duration":234,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#buildTimeRunTimeConfig","started":"19:32:05.247","dependents":[604,557],"id":275,"thread":"build-52"},{"duration":232,"stepId":"io.quarkus.keycloak.admin.client.reactive.KeycloakAdminClientReactiveProcessor#nativeImage","started":"19:32:05.147","dependents":[604,603],"id":264,"thread":"build-45"},{"duration":229,"stepId":"io.quarkus.vertx.http.deployment.console.ConsoleProcessor#setupConsole","started":"19:32:05.301","dependents":[597,599],"id":276,"thread":"build-78"},{"duration":229,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#setupPersistenceProvider","started":"19:32:05.434","dependents":[606,548,546],"id":298,"thread":"build-18"},{"duration":211,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#setupConfigOverride","started":"19:32:05.132","dependents":[],"id":243,"thread":"build-23"},{"duration":211,"stepId":"io.quarkus.narayana.jta.deployment.NarayanaJtaProcessor#build","started":"19:32:06.544","dependents":[604,606,509,458,483,460,445,444],"id":443,"thread":"build-37"},{"duration":209,"stepId":"io.quarkus.vertx.http.deployment.webjar.WebJarProcessor#processWebJarDevMode","started":"19:32:08.996","dependents":[606,572,570,571],"id":569,"thread":"build-30"},{"duration":198,"stepId":"io.quarkus.netty.deployment.NettyProcessor#setNettyMachineId","started":"19:32:05.147","dependents":[606],"id":246,"thread":"build-27"},{"duration":183,"stepId":"io.quarkus.deployment.steps.ClassPathSystemPropBuildStep#set","started":"19:32:05.349","dependents":[606],"id":277,"thread":"build-27"},{"duration":182,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#fileHandling","started":"19:32:05.147","dependents":[601,585,584],"id":233,"thread":"build-36"},{"duration":176,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#pregenProxies","started":"19:32:11.213","dependents":[606],"id":605,"thread":"build-130"},{"duration":172,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#defineJpaEntities","started":"19:32:06.545","dependents":[604,605,454,452,453,447,560,457,546,440,439],"id":438,"thread":"build-51"},{"duration":163,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#contextInjection","started":"19:32:05.167","dependents":[469,466,483,460],"id":236,"thread":"build-61"},{"duration":163,"stepId":"io.quarkus.arc.deployment.ConfigStaticInitBuildSteps#transformConfigProducer","started":"19:32:05.217","dependents":[483],"id":265,"thread":"build-64"},{"duration":159,"stepId":"io.quarkus.deployment.DockerStatusProcessor#IsDockerWorking","started":"19:32:05.172","dependents":[555],"id":237,"thread":"build-66"},{"duration":149,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#beanValidationAnnotations","started":"19:32:06.991","dependents":[482,480],"id":479,"thread":"build-62"},{"duration":149,"stepId":"io.quarkus.security.deployment.SecurityProcessor#recordRuntimeConfigReady","started":"19:32:05.434","dependents":[606],"id":291,"thread":"build-17"},{"duration":148,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#build","started":"19:32:07.141","dependents":[604,606,514,522,535,483],"id":482,"thread":"build-37"},{"duration":148,"stepId":"io.quarkus.deployment.steps.ReflectiveHierarchyStep#build","started":"19:32:11.156","dependents":[604],"id":603,"thread":"build-62"},{"duration":148,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#releaseConfigOnShutdown","started":"19:32:05.434","dependents":[606],"id":285,"thread":"build-41"},{"duration":147,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#initBasicAuth","started":"19:32:05.233","dependents":[481,483,478,460],"id":266,"thread":"build-73"},{"duration":144,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#build_68c59e5d5fe4deeaa2b750dd2b2f234cee36c063","started":"19:32:05.862","dependents":[606,501,594,504,349,503,600,543,597,347,596,345,505,599,499],"id":344,"thread":"build-20"},{"duration":144,"stepId":"io.quarkus.arc.deployment.CommandLineArgumentsProcessor#commandLineArgs","started":"19:32:05.095","dependents":[504,483,503,460,505],"id":168,"thread":"build-37"},{"duration":141,"stepId":"io.quarkus.devui.deployment.DevUIProcessor#registerDevUiHandlers","started":"19:32:09.372","dependents":[606,593,594],"id":576,"thread":"build-33"},{"duration":140,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#beans","started":"19:32:05.217","dependents":[483,460],"id":253,"thread":"build-42"},{"duration":140,"stepId":"io.quarkus.oidc.deployment.devservices.keycloak.KeycloakDevUIProcessor#produceProviderComponent","started":"19:32:05.434","dependents":[606,504,532,503,564,505],"id":282,"thread":"build-73"},{"duration":139,"stepId":"io.quarkus.security.deployment.SecurityProcessor#registerSecurityInterceptors","started":"19:32:05.823","dependents":[606,504,483,503,460,505],"id":341,"thread":"build-62"},{"duration":138,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#filterMultipleVertxInstancesWarning","started":"19:32:05.184","dependents":[458,444],"id":221,"thread":"build-17"},{"duration":135,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#exceptionMapper","started":"19:32:05.097","dependents":[604,436],"id":153,"thread":"build-16"},{"duration":133,"stepId":"io.quarkus.arc.deployment.BeanArchiveProcessor#build","started":"19:32:06.857","dependents":[530,482,467,468,577,461,472,473,479,471,545,464,601,470,526,465,496,469,463,584,483,462,498],"id":460,"thread":"build-30"},{"duration":131,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#exceptionMappers","started":"19:32:05.048","dependents":[436],"id":102,"thread":"build-17"},{"duration":128,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#securityExceptionMappers","started":"19:32:05.162","dependents":[436],"id":216,"thread":"build-49"},{"duration":126,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#addAutoFilters","started":"19:32:07.054","dependents":[568],"id":481,"thread":"build-48"},{"duration":122,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#setupAuthenticationMechanisms","started":"19:32:05.823","dependents":[606,596,591,481,483,478,460],"id":338,"thread":"build-58"},{"duration":120,"stepId":"io.quarkus.deployment.ide.IdeProcessor#detectIdeFiles","started":"19:32:05.060","dependents":[274],"id":109,"thread":"build-13"},{"duration":116,"stepId":"io.quarkus.netty.deployment.NettyProcessor#cleanupUnsafeLog","started":"19:32:05.209","dependents":[458,444],"id":226,"thread":"build-46"},{"duration":116,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#overrideContextInternalInterfaceToAddSafeGuards","started":"19:32:05.127","dependents":[602],"id":174,"thread":"build-12"},{"duration":109,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.SmallRyeFaultToleranceProcessor#processFaultToleranceAnnotations","started":"19:32:08.207","dependents":[604,606,533,531],"id":530,"thread":"build-28"},{"duration":106,"stepId":"io.quarkus.arc.deployment.ArcProcessor#setupExecutor","started":"19:32:05.862","dependents":[606],"id":343,"thread":"build-33"},{"duration":105,"stepId":"io.quarkus.caffeine.deployment.devui.CaffeineDevUIProcessor#createCard","started":"19:32:05.075","dependents":[532,564],"id":105,"thread":"build-6"},{"duration":102,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerProvidersFromAnnotations","started":"19:32:06.544","dependents":[604,514,522,460,434],"id":433,"thread":"build-25"},{"duration":100,"stepId":"io.quarkus.deployment.pkg.steps.JarResultBuildStep#outputTarget","started":"19:32:05.233","dependents":[249,361,568,250],"id":238,"thread":"build-16"},{"duration":99,"stepId":"io.quarkus.deployment.steps.CompiledJavaVersionBuildStep#compiledJavaVersion","started":"19:32:05.264","dependents":[577],"id":259,"thread":"build-58"},{"duration":99,"stepId":"io.quarkus.arc.deployment.devui.ArcDevModeApiProcessor#collectBeanInfo","started":"19:32:08.207","dependents":[529],"id":528,"thread":"build-24"},{"duration":99,"stepId":"io.quarkus.arc.deployment.ShutdownBuildSteps#addScope","started":"19:32:05.223","dependents":[469],"id":220,"thread":"build-70"},{"duration":98,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#setMtlsCertificateRoleProperties","started":"19:32:05.434","dependents":[606],"id":278,"thread":"build-14"},{"duration":96,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.SmallRyeFaultToleranceProcessor#build","started":"19:32:06.543","dependents":[604,606,557,432,483,460],"id":430,"thread":"build-62"},{"duration":92,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setupLoggingRuntimeInit","started":"19:32:06.756","dependents":[604,606,459,598],"id":458,"thread":"build-30"},{"duration":90,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#overrideStandardValidationFactoryResolution","started":"19:32:05.147","dependents":[602],"id":163,"thread":"build-3"},{"duration":87,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#createIndexHtmlTemplate","started":"19:32:09.284","dependents":[575],"id":574,"thread":"build-33"},{"duration":87,"stepId":"io.quarkus.security.deployment.SecurityProcessor#gatherSecurityChecks","started":"19:32:06.992","dependents":[604,606,557,474,577,476,483],"id":473,"thread":"build-6"},{"duration":87,"stepId":"io.quarkus.devui.deployment.menu.ConfigurationProcessor#registerConfigs","started":"19:32:08.810","dependents":[606],"id":559,"thread":"build-13"},{"duration":87,"stepId":"io.quarkus.security.deployment.SecurityProcessor#registerAdditionalBeans","started":"19:32:05.241","dependents":[483,460],"id":230,"thread":"build-13"},{"duration":85,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#recordableConstructor","started":"19:32:05.131","dependents":[606],"id":139,"thread":"build-42"},{"duration":84,"stepId":"io.quarkus.smallrye.context.deployment.SmallRyeContextPropagationProcessor#build","started":"19:32:05.861","dependents":[606,504,503,505],"id":339,"thread":"build-83"},{"duration":84,"stepId":"io.quarkus.rest.client.reactive.jackson.deployment.RestClientReactiveJacksonProcessor#additionalProviders_d467f0796ff6c3d28e57d6f18c92f27cf1d4298e","started":"19:32:05.108","dependents":[433],"id":121,"thread":"build-4"},{"duration":84,"stepId":"io.quarkus.deployment.ExtensionLoader#config","started":"19:32:05.131","dependents":[300,510,558,195,238,357,157,452,212,534,383,397,314,526,258,169,602,248,500,156,203,193,576,529,191,380,547,588,266,285,550,591,172,401,323,403,207,170,200,528,329,541,278,336,205,453,299,429,508,538,544,333,606,309,354,315,291,230,527,326,476,474,478,171,537,347,249,307,263,359,460,379,340,305,288,342,341,384,344,594,215,274,458,495,443,571,406,572,308,427,540,296,483,567,587,218,280,455,245,284,313,197,577,456,597,433,350,275,199,178,360,533,462,208,179,316,445,599,206,180,298,482,349,467,396,600,303,234,399,471,311,282,601,362,192,185,477,318,509,214,598,502,352,548,568,188,187,481,543,569,232,186,557,204,338,492,522,596,201,306,466,447,434,213,586,196,294,501,459,198,473,320,287,361,356,202,551,518,348,432,210],"id":155,"thread":"build-9"},{"duration":83,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#generateDataSourceSupportBean","started":"19:32:05.810","dependents":[606,514,522,504,483,503,460,505],"id":335,"thread":"build-48"},{"duration":83,"stepId":"io.quarkus.deployment.steps.ClassPathSystemPropBuildStep#produce","started":"19:32:05.264","dependents":[277],"id":247,"thread":"build-80"},{"duration":82,"stepId":"io.quarkus.vertx.http.deployment.GeneratedStaticResourcesProcessor#produceResources","started":"19:32:05.163","dependents":[254],"id":177,"thread":"build-52"},{"duration":80,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateMappings","started":"19:32:06.543","dependents":[604,482,431,522,480,494,518,490],"id":429,"thread":"build-30"},{"duration":78,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setMinLevelForInitialConfigurator","started":"19:32:05.250","dependents":[606],"id":232,"thread":"build-55"},{"duration":76,"stepId":"io.quarkus.smallrye.jwt.build.deployment.SmallRyeJwtBuildProcessor#addClassesForReflection","started":"19:32:05.107","dependents":[604],"id":114,"thread":"build-40"},{"duration":76,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#defaultUnwrappedExceptions","started":"19:32:05.161","dependents":[436],"id":162,"thread":"build-48"},{"duration":74,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#registerUiExtension","started":"19:32:05.301","dependents":[569],"id":263,"thread":"build-22"},{"duration":74,"stepId":"io.quarkus.jsonp.deployment.JsonpProcessor#build","started":"19:32:05.108","dependents":[604,606],"id":112,"thread":"build-29"},{"duration":73,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#handleCustomAnnotatedMethods","started":"19:32:06.585","dependents":[483,460,436,437],"id":435,"thread":"build-6"},{"duration":73,"stepId":"io.quarkus.devui.deployment.menu.DependenciesProcessor#createAppDeps","started":"19:32:05.264","dependents":[567],"id":240,"thread":"build-37"},{"duration":70,"stepId":"io.quarkus.devui.deployment.DevUIProcessor#additionalBean","started":"19:32:05.872","dependents":[363,483,460],"id":337,"thread":"build-12"},{"duration":69,"stepId":"io.quarkus.devui.deployment.menu.DependenciesProcessor#createBuildTimeActions","started":"19:32:05.264","dependents":[332],"id":239,"thread":"build-69"},{"duration":66,"stepId":"io.quarkus.flyway.deployment.devui.FlywayDevUIProcessor#registerJsonRpcBackend","started":"19:32:05.184","dependents":[426,337],"id":184,"thread":"build-67"},{"duration":63,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#additionalBeans","started":"19:32:05.063","dependents":[483,460],"id":61,"thread":"build-12"},{"duration":63,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#smallryeOpenApiIndex","started":"19:32:06.991","dependents":[568,477,475,481,478],"id":472,"thread":"build-43"},{"duration":62,"stepId":"io.quarkus.deployment.dev.testing.TestTracingProcessor#testConsoleCommand","started":"19:32:06.543","dependents":[581],"id":428,"thread":"build-12"},{"duration":62,"stepId":"io.quarkus.smallrye.openapi.deployment.devui.OpenApiDevUIProcessor#pages","started":"19:32:05.301","dependents":[532,564],"id":258,"thread":"build-29"},{"duration":61,"stepId":"io.quarkus.arc.deployment.ArcProcessor#initialize","started":"19:32:07.297","dependents":[485,484,528,498],"id":483,"thread":"build-48"},{"duration":59,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#frameworkRoot","started":"19:32:05.241","dependents":[245,333,300,558,502,527,580,322,258,263,596,576,573,276,235,591,594,574,219,592,471,571,282,572,540,567],"id":218,"thread":"build-59"},{"duration":58,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#jsonDefault","started":"19:32:05.184","dependents":[577],"id":173,"thread":"build-34"},{"duration":56,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#registerAutoSecurityFilter","started":"19:32:07.054","dependents":[606,504,503,505],"id":478,"thread":"build-37"},{"duration":55,"stepId":"io.quarkus.deployment.steps.ClassTransformingBuildStep#handleClassTransformation","started":"19:32:11.156","dependents":[605],"id":602,"thread":"build-13"},{"duration":54,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#deprioritizeLegacyProviders","started":"19:32:05.166","dependents":[601,585],"id":147,"thread":"build-58"},{"duration":54,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#registerAnnotatedUserDefinedRuntimeFilters","started":"19:32:07.054","dependents":[604,606,504,503,505],"id":477,"thread":"build-33"},{"duration":54,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#provideSecurityInformation","started":"19:32:05.184","dependents":[481,478],"id":164,"thread":"build-63"},{"duration":52,"stepId":"io.quarkus.deployment.dev.IsolatedDevModeMain$AddApplicationClassPredicateBuildStep$1@5e342c1f","started":"19:32:05.163","dependents":[577,483],"id":140,"thread":"build-53"},{"duration":52,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#preinitializeRouter","started":"19:32:06.007","dependents":[606,594,504,503,505],"id":349,"thread":"build-33"},{"duration":52,"stepId":"io.quarkus.rest.client.reactive.deployment.devservices.DevServicesRestClientHttpProxyProcessor#registerDefaultProvider","started":"19:32:05.217","dependents":[390],"id":209,"thread":"build-57"},{"duration":52,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#defineHealthRoutes","started":"19:32:06.991","dependents":[593,594],"id":471,"thread":"build-33"},{"duration":51,"stepId":"io.quarkus.deployment.SecureRandomProcessor#registerReflectiveMethods","started":"19:32:05.131","dependents":[604],"id":111,"thread":"build-26"},{"duration":51,"stepId":"io.quarkus.devui.deployment.DevUIProcessor#findAllJsonRPCMethods","started":"19:32:06.543","dependents":[573,549],"id":426,"thread":"build-33"},{"duration":51,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#transformEndpoints","started":"19:32:06.991","dependents":[483],"id":470,"thread":"build-12"},{"duration":50,"stepId":"io.quarkus.resteasy.reactive.server.deployment.devui.ResteasyReactiveDevUIProcessor#createPages","started":"19:32:05.048","dependents":[532,564],"id":44,"thread":"build-15"},{"duration":50,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#ensureBeanLookupAvailable","started":"19:32:05.184","dependents":[514,522],"id":158,"thread":"build-54"},{"duration":49,"stepId":"io.quarkus.flyway.deployment.FlywayProcessor#reflection","started":"19:32:06.543","dependents":[604,603],"id":424,"thread":"build-83"},{"duration":49,"stepId":"io.quarkus.deployment.steps.NativeImageConfigBuildStep#build","started":"19:32:05.810","dependents":[606],"id":328,"thread":"build-83"},{"duration":49,"stepId":"io.quarkus.jaxrs.client.reactive.deployment.JaxrsClientReactiveProcessor#initializeStorkFilter","started":"19:32:05.186","dependents":[363,604,483,460],"id":160,"thread":"build-71"},{"duration":48,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#addRestClientBeans","started":"19:32:06.549","dependents":[606,460],"id":427,"thread":"build-43"},{"duration":48,"stepId":"io.quarkus.narayana.jta.deployment.NarayanaJtaProcessor#unremovableBean","started":"19:32:05.081","dependents":[514,522],"id":70,"thread":"build-27"},{"duration":48,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#additionalBean","started":"19:32:05.132","dependents":[483,460],"id":107,"thread":"build-11"},{"duration":47,"stepId":"io.quarkus.jaxrs.client.reactive.deployment.JaxrsClientReactiveProcessor#registerInvocationCallbacks","started":"19:32:06.543","dependents":[606],"id":423,"thread":"build-24"},{"duration":47,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#httpRoot","started":"19:32:05.241","dependents":[276,596,568,576,580,595,592],"id":215,"thread":"build-71"},{"duration":46,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#jwtClaimIntegration","started":"19:32:05.325","dependents":[483,460],"id":261,"thread":"build-17"},{"duration":45,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#cacheControlSupport","started":"19:32:05.166","dependents":[577],"id":134,"thread":"build-59"},{"duration":45,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#responseHeaderSupport","started":"19:32:05.084","dependents":[577],"id":69,"thread":"build-34"},{"duration":44,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#metricsCapabilityPrometheusBuildItem","started":"19:32:05.301","dependents":[589,601,548,306,430,251],"id":245,"thread":"build-77"},{"duration":44,"stepId":"io.quarkus.jackson.deployment.JacksonProcessor#generateCustomizer","started":"19:32:06.544","dependents":[460],"id":419,"thread":"build-74"},{"duration":44,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#serverSerializers","started":"19:32:09.714","dependents":[604,606,586],"id":585,"thread":"build-69"},{"duration":44,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#brandingFiles","started":"19:32:05.172","dependents":[457],"id":143,"thread":"build-64"},{"duration":44,"stepId":"io.quarkus.arc.deployment.StartupBuildSteps#unremovableBeans","started":"19:32:05.149","dependents":[514,522],"id":122,"thread":"build-47"},{"duration":43,"stepId":"io.quarkus.devui.deployment.menu.ReadmeProcessor#createJsonRPCServiceForCache","started":"19:32:05.213","dependents":[426,337],"id":194,"thread":"build-50"},{"duration":42,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#scanResources","started":"19:32:06.543","dependents":[413,422,579,577,415,545,412,601,414,470,420,416,483,586,435],"id":411,"thread":"build-31"},{"duration":42,"stepId":"io.quarkus.rest.client.reactive.deployment.devconsole.RestClientReactiveDevUIProcessor#createJsonRPCServiceForCache","started":"19:32:05.048","dependents":[426,337],"id":32,"thread":"build-22"},{"duration":42,"stepId":"io.quarkus.swaggerui.deployment.SwaggerUiProcessor#getSwaggerUiFinalDestination","started":"19:32:08.810","dependents":[569],"id":558,"thread":"build-69"},{"duration":42,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#setupRequestCollectingFilter","started":"19:32:05.063","dependents":[437],"id":51,"thread":"build-9"},{"duration":40,"stepId":"io.quarkus.hibernate.orm.deployment.GraalVMFeatures#registerJdbcArrayTypesForReflection","started":"19:32:05.213","dependents":[604],"id":189,"thread":"build-22"},{"duration":40,"stepId":"io.quarkus.arc.deployment.HotDeploymentConfigBuildStep#startup","started":"19:32:05.177","dependents":[154],"id":146,"thread":"build-69"},{"duration":40,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#responseStatusSupport","started":"19:32:05.167","dependents":[577],"id":124,"thread":"build-57"},{"duration":40,"stepId":"io.quarkus.smallrye.context.deployment.SmallRyeContextPropagationProcessor#transformInjectionPoint","started":"19:32:05.182","dependents":[483],"id":148,"thread":"build-70"},{"duration":39,"stepId":"io.quarkus.vertx.http.deployment.ManagementInterfaceSecurityProcessor#setupAuthenticationMechanisms","started":"19:32:05.621","dependents":[606,596,483,460],"id":297,"thread":"build-38"},{"duration":39,"stepId":"io.quarkus.flyway.deployment.FlywayProcessor#build","started":"19:32:06.759","dependents":[604,606,459,457,541],"id":456,"thread":"build-37"},{"duration":38,"stepId":"io.quarkus.deployment.steps.ThreadPoolSetup#createExecutor","started":"19:32:05.823","dependents":[339,606,330,344,343,596,334],"id":329,"thread":"build-12"},{"duration":38,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#logging","started":"19:32:05.144","dependents":[182],"id":113,"thread":"build-34"},{"duration":37,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#build_9d6b7122fb368970c50c3a870d1f672392cd8afb","started":"19:32:05.218","dependents":[604,328],"id":190,"thread":"build-74"},{"duration":37,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#providersFromClasspath","started":"19:32:05.178","dependents":[601,583,585,584],"id":137,"thread":"build-51"},{"duration":36,"stepId":"io.quarkus.deployment.steps.AdditionalClassLoaderResourcesBuildStep#appendAdditionalClassloaderResources","started":"19:32:05.108","dependents":[363],"id":84,"thread":"build-36"},{"duration":36,"stepId":"io.quarkus.arc.deployment.devui.ArcDevUIProcessor#createJsonRPCService","started":"19:32:05.092","dependents":[426,337],"id":67,"thread":"build-5"},{"duration":35,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#checkMixingStacks","started":"19:32:05.322","dependents":[597,599],"id":255,"thread":"build-50"},{"duration":35,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#registerSecurityInterceptors","started":"19:32:05.324","dependents":[483,460],"id":256,"thread":"build-57"},{"duration":35,"stepId":"io.quarkus.vertx.http.deployment.StaticResourcesProcessor#collectStaticResources","started":"19:32:05.322","dependents":[543],"id":254,"thread":"build-70"},{"duration":35,"stepId":"io.quarkus.arc.deployment.AutoAddScopeProcessor#annotationTransformer","started":"19:32:06.992","dependents":[514,522,483],"id":469,"thread":"build-48"},{"duration":34,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#addDefaultCacheBean","started":"19:32:06.007","dependents":[606,504,503,505],"id":347,"thread":"build-29"},{"duration":34,"stepId":"io.quarkus.devui.deployment.menu.ReadmeProcessor#createReadmePage","started":"19:32:05.097","dependents":[567],"id":75,"thread":"build-22"},{"duration":33,"stepId":"io.quarkus.arc.deployment.ConfigStaticInitBuildSteps#registerBeans","started":"19:32:05.059","dependents":[483,460],"id":36,"thread":"build-26"},{"duration":33,"stepId":"io.quarkus.deployment.steps.MainClassBuildStep#applicationReflection","started":"19:32:05.047","dependents":[604],"id":24,"thread":"build-11"},{"duration":33,"stepId":"io.quarkus.vertx.deployment.EventBusCodecProcessor#registerCodecs","started":"19:32:06.991","dependents":[604,499],"id":468,"thread":"build-37"},{"duration":33,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#setupDeployment","started":"19:32:09.759","dependents":[604,606,589,593,596,591,594,587,590,588],"id":586,"thread":"build-13"},{"duration":33,"stepId":"io.quarkus.resteasy.reactive.server.deployment.devui.ResteasyReactiveDevUIProcessor#createJsonRPCService","started":"19:32:05.184","dependents":[426,337],"id":142,"thread":"build-29"},{"duration":32,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#createBuildTimeData","started":"19:32:09.000","dependents":[573,574],"id":567,"thread":"build-13"},{"duration":32,"stepId":"io.quarkus.deployment.execannotations.ExecutionModelAnnotationsProcessor#devuiJsonRpcServices","started":"19:32:05.106","dependents":[434],"id":78,"thread":"build-3"},{"duration":32,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#createCard","started":"19:32:05.874","dependents":[532,564],"id":336,"thread":"build-67"},{"duration":32,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#additionalBeans","started":"19:32:05.063","dependents":[483,460],"id":40,"thread":"build-16"},{"duration":32,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#addQualifiers","started":"19:32:05.184","dependents":[483,461],"id":141,"thread":"build-55"},{"duration":32,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#registerSafeDuplicatedContextInterceptor","started":"19:32:05.149","dependents":[483,460],"id":110,"thread":"build-44"},{"duration":32,"stepId":"io.quarkus.netty.deployment.NettyProcessor#cleanupMacDNSInLog","started":"19:32:05.148","dependents":[458,444],"id":106,"thread":"build-46"},{"duration":31,"stepId":"io.quarkus.micrometer.deployment.binder.NettyBinderProcessor#createVertxNettyAllocatorMetrics","started":"19:32:05.184","dependents":[483,460],"id":136,"thread":"build-11"},{"duration":31,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#beanDefiningAnnotations","started":"19:32:05.075","dependents":[432,483,460],"id":53,"thread":"build-4"},{"duration":31,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#watchConfigFiles","started":"19:32:05.050","dependents":[457],"id":26,"thread":"build-23"},{"duration":30,"stepId":"io.quarkus.hibernate.orm.deployment.GraalVMFeatures#registerGeneratorClassesForReflections","started":"19:32:05.213","dependents":[604],"id":175,"thread":"build-26"},{"duration":30,"stepId":"io.quarkus.resteasy.reactive.common.deployment.JaxrsMethodsProcessor#jaxrsMethods","started":"19:32:05.217","dependents":[434],"id":181,"thread":"build-55"},{"duration":30,"stepId":"io.quarkus.arc.deployment.ArcProcessor#registerContextPropagation","started":"19:32:05.233","dependents":[327],"id":203,"thread":"build-69"},{"duration":30,"stepId":"io.quarkus.arc.deployment.SyntheticBeansProcessor#initRuntime","started":"19:32:07.850","dependents":[544,606,510,506,511,509,507,546,508,597,599],"id":505,"thread":"build-24"},{"duration":30,"stepId":"io.quarkus.vertx.http.deployment.devmode.NotFoundProcessor#resourceNotFoundDataAvailable","started":"19:32:05.072","dependents":[483,460],"id":49,"thread":"build-30"},{"duration":30,"stepId":"io.quarkus.devui.deployment.build.BuildMetricsDevUIProcessor#createJsonRPCService","started":"19:32:05.097","dependents":[426,337],"id":64,"thread":"build-11"},{"duration":29,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#buildExclusions","started":"19:32:06.557","dependents":[472],"id":418,"thread":"build-75"},{"duration":29,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#createKnownInternalImportMap","started":"19:32:05.301","dependents":[574],"id":235,"thread":"build-81"},{"duration":29,"stepId":"io.quarkus.security.deployment.SecurityProcessor#createSecurityCheckStorage","started":"19:32:07.079","dependents":[606,504,577,483,503,505],"id":476,"thread":"build-51"},{"duration":29,"stepId":"io.quarkus.devui.deployment.DevUIProcessor#createJsonRpcRouter","started":"19:32:08.776","dependents":[606],"id":549,"thread":"build-83"},{"duration":29,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#generateBuilders","started":"19:32:08.810","dependents":[604],"id":557,"thread":"build-122"},{"duration":29,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#registerAuthMechanismSelectionInterceptor","started":"19:32:06.543","dependents":[606,402,400,401,495,473],"id":399,"thread":"build-71"},{"duration":29,"stepId":"io.quarkus.deployment.steps.CapabilityAggregationStep#aggregateCapabilities","started":"19:32:05.293","dependents":[589,223,254,452,256,382,451,577,242,283,446,393,445,298,482,231,225,335,600,234,241,399,311,282,394,454,601,224,251,436,255,502,351,568,475,476,358,338,447,586,229,227,342,384,317,603,443,320,406,261,308,427,244,296,483,228],"id":222,"thread":"build-49"},{"duration":28,"stepId":"io.quarkus.deployment.steps.CapabilityAggregationStep#provideCapabilities","started":"19:32:05.264","dependents":[222],"id":217,"thread":"build-77"},{"duration":28,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#registerCustomExceptionMappers","started":"19:32:05.210","dependents":[435],"id":165,"thread":"build-13"},{"duration":27,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#registerOpenApiSchemaClassesForReflection","started":"19:32:07.054","dependents":[604,603],"id":475,"thread":"build-12"},{"duration":27,"stepId":"io.quarkus.arc.deployment.LoggingBeanSupportProcessor#discoveredComponents","started":"19:32:05.079","dependents":[432,483,460],"id":52,"thread":"build-14"},{"duration":26,"stepId":"io.quarkus.arc.deployment.ArcProcessor#loggerProducer","started":"19:32:05.213","dependents":[483,460],"id":167,"thread":"build-4"},{"duration":26,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#setUpDefaultMediaType","started":"19:32:05.233","dependents":[601],"id":195,"thread":"build-29"},{"duration":26,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#compressionSupport","started":"19:32:05.241","dependents":[577],"id":207,"thread":"build-40"},{"duration":26,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#asyncSupport","started":"19:32:05.108","dependents":[577],"id":76,"thread":"build-30"},{"duration":26,"stepId":"io.quarkus.arc.deployment.StartupBuildSteps#addScope","started":"19:32:05.223","dependents":[469],"id":183,"thread":"build-58"},{"duration":26,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#registerRowSetSupport","started":"19:32:05.066","dependents":[604],"id":34,"thread":"build-29"},{"duration":25,"stepId":"io.quarkus.hibernate.orm.deployment.ResteasyReactiveServerIntegrationProcessor#unwrappedExceptions","started":"19:32:05.213","dependents":[436],"id":166,"thread":"build-44"},{"duration":25,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#vetoMPConfigProperties","started":"19:32:05.081","dependents":[483],"id":54,"thread":"build-23"},{"duration":25,"stepId":"io.quarkus.devui.deployment.menu.ContinuousTestingProcessor#createContinuousTestingPages","started":"19:32:05.184","dependents":[567],"id":125,"thread":"build-44"},{"duration":25,"stepId":"io.quarkus.swaggerui.deployment.SwaggerUiProcessor#feature","started":"19:32:05.260","dependents":[606],"id":213,"thread":"build-29"},{"duration":25,"stepId":"io.quarkus.oidc.deployment.devservices.OidcDevUIProcessor#produceOidcDevJsonRpcService","started":"19:32:05.241","dependents":[426,337],"id":205,"thread":"build-63"},{"duration":25,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#reinitializeClassesForNetty","started":"19:32:05.066","dependents":[328],"id":30,"thread":"build-5"},{"duration":24,"stepId":"io.quarkus.arc.deployment.SyntheticBeansProcessor#initRegular","started":"19:32:07.850","dependents":[511],"id":504,"thread":"build-4"},{"duration":23,"stepId":"io.quarkus.security.deployment.SecurityProcessor#prepareBouncyCastleProviders","started":"19:32:05.264","dependents":[604],"id":214,"thread":"build-44"},{"duration":23,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.devui.FaultToleranceDevUIProcessor#jsonRPCService","started":"19:32:05.106","dependents":[426,337],"id":71,"thread":"build-33"},{"duration":22,"stepId":"io.quarkus.vertx.http.deployment.devmode.ArcDevProcessor#registerRoutes","started":"19:32:08.207","dependents":[606,593,533,594,595],"id":527,"thread":"build-83"},{"duration":22,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#registerConfigRootsAsBeans","started":"19:32:05.233","dependents":[504,503,505],"id":193,"thread":"build-53"},{"duration":22,"stepId":"io.quarkus.deployment.steps.DevModeBuildStep#watchChanges","started":"19:32:05.233","dependents":[457],"id":191,"thread":"build-11"},{"duration":22,"stepId":"io.quarkus.arc.deployment.AutoProducerMethodsProcessor#annotationTransformer","started":"19:32:06.991","dependents":[483],"id":467,"thread":"build-51"},{"duration":22,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#shouldNotRemoveHttpServerOptionsCustomizers","started":"19:32:05.213","dependents":[514,522],"id":159,"thread":"build-59"},{"duration":22,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#createRelocationMap","started":"19:32:05.184","dependents":[574],"id":123,"thread":"build-22"},{"duration":22,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#runtimeOverrideConfig","started":"19:32:05.213","dependents":[557],"id":161,"thread":"build-47"},{"duration":21,"stepId":"io.quarkus.deployment.steps.CombinedIndexBuildStep#build","started":"19:32:06.520","dependents":[388,365,419,480,452,579,382,395,405,383,397,456,407,410,433,389,562,430,380,387,393,392,364,369,482,403,385,366,377,396,370,399,488,394,441,404,425,429,378,436,408,468,423,561,367,490,426,386,373,376,368,400,375,372,494,447,434,435,379,384,371,409,424,603,519,458,472,443,374,479,406,381,427,428,483,440],"id":363,"thread":"build-74"},{"duration":21,"stepId":"io.quarkus.security.deployment.SecurityProcessor#registerJCAProvidersForReflection","started":"19:32:05.262","dependents":[604],"id":212,"thread":"build-22"},{"duration":21,"stepId":"io.quarkus.deployment.steps.MainClassBuildStep#mainClassBuildStep","started":"19:32:06.543","dependents":[602],"id":397,"thread":"build-56"},{"duration":21,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#registerHttpAuthMechanismAnnotations","started":"19:32:05.108","dependents":[399],"id":68,"thread":"build-15"},{"duration":20,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#contributeQuarkusConfigToJpaModel","started":"19:32:05.247","dependents":[438],"id":208,"thread":"build-26"},{"duration":20,"stepId":"io.quarkus.deployment.dev.testing.TestTracingProcessor#sharedStateListener","started":"19:32:05.063","dependents":[352],"id":28,"thread":"build-3"},{"duration":20,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#processAnnotatedMetrics","started":"19:32:05.241","dependents":[483],"id":200,"thread":"build-44"},{"duration":20,"stepId":"io.quarkus.deployment.pkg.steps.FileSystemResourcesBuildStep#notNormalMode","started":"19:32:05.333","dependents":[],"id":250,"thread":"build-61"},{"duration":20,"stepId":"io.quarkus.devui.deployment.logstream.LogStreamProcessor#additionalBean","started":"19:32:05.106","dependents":[483,460],"id":62,"thread":"build-26"},{"duration":20,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerQueryParamStyleForConfig","started":"19:32:05.108","dependents":[356],"id":65,"thread":"build-23"},{"duration":19,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#healthCheck","started":"19:32:05.329","dependents":[483,460],"id":248,"thread":"build-36"},{"duration":19,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#registerAdditionalBeans","started":"19:32:06.543","dependents":[604,514,522,551,483,460],"id":396,"thread":"build-48"},{"duration":19,"stepId":"io.quarkus.deployment.CollectionClassProcessor#setupCollectionClasses","started":"19:32:05.061","dependents":[604],"id":25,"thread":"build-27"},{"duration":19,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#configFiles","started":"19:32:05.333","dependents":[457],"id":249,"thread":"build-66"},{"duration":19,"stepId":"io.quarkus.jdbc.postgresql.deployment.JDBCPostgreSQLProcessor#configureAgroalConnection","started":"19:32:05.322","dependents":[483,460],"id":242,"thread":"build-59"},{"duration":19,"stepId":"io.quarkus.deployment.recording.substitutions.AdditionalSubstitutionsBuildStep#additionalSubstitutions","started":"19:32:05.060","dependents":[606],"id":23,"thread":"build-18"},{"duration":19,"stepId":"io.quarkus.arc.deployment.staticmethods.InterceptedStaticMethodsProcessor#collectInterceptedStaticMethods","started":"19:32:07.802","dependents":[514,522,539,498],"id":496,"thread":"build-4"},{"duration":19,"stepId":"io.quarkus.netty.deployment.NettyProcessor#build","started":"19:32:05.241","dependents":[604,328],"id":197,"thread":"build-51"},{"duration":19,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#generateRestClientConfigBuilder","started":"19:32:06.550","dependents":[557],"id":398,"thread":"build-28"},{"duration":19,"stepId":"io.quarkus.hibernate.orm.deployment.metrics.HibernateOrmMetricsProcessor#metrics","started":"19:32:08.786","dependents":[606,550,551],"id":548,"thread":"build-60"},{"duration":19,"stepId":"io.quarkus.devservices.deployment.DevServicesProcessor#config","started":"19:32:08.810","dependents":[581,556],"id":555,"thread":"build-83"},{"duration":19,"stepId":"io.quarkus.oidc.deployment.devservices.keycloak.KeycloakDevUIProcessor#produceOidcDevJsonRpcService","started":"19:32:05.247","dependents":[426,337],"id":206,"thread":"build-34"},{"duration":19,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#reflection","started":"19:32:05.161","dependents":[604],"id":104,"thread":"build-22"},{"duration":18,"stepId":"io.quarkus.vertx.deployment.EventConsumerMethodsProcessor#eventConsumerMethods","started":"19:32:05.084","dependents":[434],"id":48,"thread":"build-3"},{"duration":18,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#handleApplication","started":"19:32:06.557","dependents":[408,409,585,405,577,437,604,545,407,601,410,404,425,586,436],"id":403,"thread":"build-32"},{"duration":18,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#detectBasicAuthImplicitlyRequired","started":"19:32:07.802","dependents":[606],"id":495,"thread":"build-51"},{"duration":18,"stepId":"io.quarkus.jackson.deployment.JacksonProcessor#register","started":"19:32:06.543","dependents":[604,603,483,460],"id":395,"thread":"build-57"},{"duration":18,"stepId":"io.quarkus.security.deployment.SecurityProcessor#validateStartUpObserversNotSecured","started":"19:32:08.207","dependents":[533],"id":526,"thread":"build-62"},{"duration":18,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#collectEventConsumers","started":"19:32:07.802","dependents":[511,499],"id":497,"thread":"build-30"},{"duration":18,"stepId":"io.quarkus.undertow.deployment.UndertowStaticResourcesBuildStep#handleGeneratedWebResources","started":"19:32:05.326","dependents":[],"id":244,"thread":"build-83"},{"duration":17,"stepId":"io.quarkus.mutiny.deployment.MutinyProcessor#runtimeInit","started":"19:32:05.862","dependents":[606],"id":334,"thread":"build-28"},{"duration":17,"stepId":"io.quarkus.arc.deployment.LookupConditionsProcessor#suppressConditionsGenerators","started":"19:32:06.991","dependents":[483],"id":465,"thread":"build-4"},{"duration":17,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#doNotRemoveVertxOptionsCustomizers","started":"19:32:05.045","dependents":[514,522],"id":14,"thread":"build-4"},{"duration":17,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#registerConfigMappingsBean","started":"19:32:07.802","dependents":[511],"id":494,"thread":"build-24"},{"duration":17,"stepId":"io.quarkus.jdbc.postgresql.deployment.JDBCPostgreSQLProcessor#registerServiceBinding","started":"19:32:05.324","dependents":[308],"id":241,"thread":"build-63"},{"duration":17,"stepId":"io.quarkus.arc.deployment.AutoInjectFieldProcessor#annotationTransformer","started":"19:32:06.991","dependents":[483],"id":466,"thread":"build-30"},{"duration":16,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.SmallRyeFaultToleranceProcessor#transformInterceptorPriority","started":"19:32:06.991","dependents":[483],"id":464,"thread":"build-25"},{"duration":16,"stepId":"io.quarkus.micrometer.deployment.binder.VertxBinderProcessor#unremoveableAdditionalHttpServerMetrics","started":"19:32:05.045","dependents":[514,522],"id":13,"thread":"build-9"},{"duration":16,"stepId":"io.quarkus.arc.deployment.ReflectiveBeanClassesProcessor#implicitReflectiveBeanClasses","started":"19:32:07.802","dependents":[533],"id":493,"thread":"build-28"},{"duration":16,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForContextResolvers","started":"19:32:06.576","dependents":[604,582,483,460,586],"id":425,"thread":"build-4"},{"duration":15,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#resolveRolesAllowedConfigExpressions","started":"19:32:06.543","dependents":[515,606,504,503,505,473],"id":394,"thread":"build-21"},{"duration":15,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#registerVerticleClasses","started":"19:32:06.543","dependents":[604],"id":392,"thread":"build-4"},{"duration":15,"stepId":"io.quarkus.smallrye.context.deployment.SmallRyeContextPropagationProcessor#registerBean","started":"19:32:05.213","dependents":[483,460],"id":152,"thread":"build-72"},{"duration":15,"stepId":"io.quarkus.credentials.CredentialsProcessor#unremoveable","started":"19:32:05.047","dependents":[514,522],"id":12,"thread":"build-14"},{"duration":15,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#setupEndpoints","started":"19:32:08.776","dependents":[604,601,583,585,584],"id":545,"thread":"build-69"},{"duration":15,"stepId":"io.quarkus.jackson.deployment.JacksonProcessor#unremovable","started":"19:32:06.543","dependents":[514,522,483,460],"id":393,"thread":"build-20"},{"duration":15,"stepId":"io.quarkus.micrometer.deployment.export.PrometheusRegistryProcessor#registerEmptyExamplarProvider","started":"19:32:05.213","dependents":[483,460],"id":151,"thread":"build-6"},{"duration":15,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#indexAdditionalConstrainedClasses","started":"19:32:06.624","dependents":[482,479],"id":431,"thread":"build-12"},{"duration":15,"stepId":"io.quarkus.deployment.dev.ConfigureDisableInstrumentationBuildStep#configure","started":"19:32:05.218","dependents":[597,599],"id":154,"thread":"build-29"},{"duration":15,"stepId":"io.quarkus.datasource.deployment.devui.DevUIDatasourceProcessor#registerJsonRpcBackend","started":"19:32:05.131","dependents":[426,337],"id":89,"thread":"build-41"},{"duration":15,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmCdiProcessor#registerAnnotations","started":"19:32:05.045","dependents":[432,483,460],"id":10,"thread":"build-5"},{"duration":14,"stepId":"io.quarkus.deployment.ide.IdeProcessor#effectiveIde","started":"19:32:05.460","dependents":[361,353,567,322],"id":274,"thread":"build-60"},{"duration":14,"stepId":"io.quarkus.rest.client.reactive.deployment.devconsole.RestClientReactiveDevUIProcessor#beans","started":"19:32:05.081","dependents":[483,460],"id":41,"thread":"build-11"},{"duration":14,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#registerVerticleClasses","started":"19:32:06.543","dependents":[604],"id":388,"thread":"build-75"},{"duration":14,"stepId":"io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevServicesProcessor#devServicesAutoGenerateByDefault","started":"19:32:08.786","dependents":[552],"id":547,"thread":"build-122"},{"duration":14,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#logCleanup","started":"19:32:05.163","dependents":[458,444],"id":99,"thread":"build-50"},{"duration":14,"stepId":"io.quarkus.arc.deployment.UnremovableAnnotationsProcessor#unremovableBeans","started":"19:32:05.077","dependents":[514,522],"id":31,"thread":"build-32"},{"duration":14,"stepId":"io.quarkus.flyway.deployment.devui.FlywayDevUIProcessor#create","started":"19:32:06.765","dependents":[606,532,564],"id":455,"thread":"build-51"},{"duration":14,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#finalizeRouter","started":"19:32:09.824","dependents":[606,598,597,599],"id":596,"thread":"build-69"},{"duration":14,"stepId":"io.quarkus.security.deployment.SecurityProcessor#authorizationController","started":"19:32:05.250","dependents":[483,460],"id":204,"thread":"build-37"},{"duration":14,"stepId":"io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevUIProcessor#createJsonRPCService","started":"19:32:05.080","dependents":[426,337],"id":37,"thread":"build-33"},{"duration":14,"stepId":"io.quarkus.micrometer.deployment.binder.NettyBinderProcessor#createReactiveNettyAllocatorMetrics","started":"19:32:05.165","dependents":[604,483,460],"id":103,"thread":"build-54"},{"duration":13,"stepId":"io.quarkus.netty.deployment.NettyProcessor#registerQualifiers","started":"19:32:05.130","dependents":[483,460],"id":79,"thread":"build-43"},{"duration":13,"stepId":"io.quarkus.stork.deployment.SmallRyeStorkProcessor#unremoveableBeans","started":"19:32:05.048","dependents":[514,522],"id":11,"thread":"build-21"},{"duration":13,"stepId":"io.quarkus.micrometer.deployment.binder.StorkBinderProcessor#addStorkObservationCollector","started":"19:32:05.165","dependents":[483,460],"id":100,"thread":"build-55"},{"duration":13,"stepId":"io.quarkus.deployment.steps.ReflectiveHierarchyStep#ignoreJavaClassWarnings","started":"19:32:05.060","dependents":[603],"id":21,"thread":"build-6"},{"duration":13,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveVertxWebSocketIntegrationProcessor#scanner","started":"19:32:05.094","dependents":[577],"id":58,"thread":"build-29"},{"duration":13,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#additionalAsyncTypeMethodScanners","started":"19:32:05.131","dependents":[577],"id":85,"thread":"build-44"},{"duration":13,"stepId":"io.quarkus.vertx.http.deployment.devmode.NotFoundProcessor#routeNotFound","started":"19:32:09.824","dependents":[606],"id":595,"thread":"build-13"},{"duration":12,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#unlessBuildProperty","started":"19:32:06.545","dependents":[418,391,403],"id":389,"thread":"build-2"},{"duration":12,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#buildResourceInterceptors","started":"19:32:06.660","dependents":[470,584,577,483,460,586],"id":437,"thread":"build-25"},{"duration":12,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#logCleanup","started":"19:32:05.045","dependents":[458,444],"id":7,"thread":"build-10"},{"duration":12,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#validateRuntimeConfigProperty","started":"19:32:08.212","dependents":[604,606],"id":524,"thread":"build-6"},{"duration":12,"stepId":"io.quarkus.vertx.http.deployment.StaticResourcesProcessor#runtimeInit","started":"19:32:08.776","dependents":[606,596],"id":543,"thread":"build-13"},{"duration":12,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.FaultToleranceMethodsProcessor#eventConsumerMethods","started":"19:32:05.094","dependents":[434],"id":55,"thread":"build-36"},{"duration":12,"stepId":"io.quarkus.keycloak.admin.client.reactive.KeycloakAdminClientReactiveProcessor#marker","started":"19:32:05.044","dependents":[357],"id":2,"thread":"build-3"},{"duration":12,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#build_7a4403d699506d83ac39616f3c11e5e1b448d863","started":"19:32:06.765","dependents":[606,535],"id":454,"thread":"build-6"},{"duration":12,"stepId":"io.quarkus.deployment.steps.MainClassBuildStep#setupVersionField","started":"19:32:05.131","dependents":[604],"id":80,"thread":"build-34"},{"duration":12,"stepId":"io.quarkus.jackson.deployment.JacksonProcessor#jacksonSupport","started":"19:32:06.543","dependents":[606,504,503,505],"id":383,"thread":"build-29"},{"duration":12,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthFeatureProcessor#defineFeature","started":"19:32:05.054","dependents":[606],"id":19,"thread":"build-24"},{"duration":11,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#cleanupVertxWarnings","started":"19:32:05.047","dependents":[458,444],"id":8,"thread":"build-12"},{"duration":11,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#validateConfigMappingsInjectionPoints","started":"19:32:08.207","dependents":[557,525],"id":522,"thread":"build-12"},{"duration":11,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#unlessBuildProfile","started":"19:32:06.545","dependents":[418,391,403],"id":385,"thread":"build-32"},{"duration":11,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#build","started":"19:32:08.962","dependents":[563,602],"id":562,"thread":"build-69"},{"duration":11,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#ifBuildProperty","started":"19:32:06.545","dependents":[418,391,403],"id":387,"thread":"build-72"},{"duration":11,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#registerTenantResolverInterceptor","started":"19:32:06.544","dependents":[606,402,400,495],"id":384,"thread":"build-68"},{"duration":11,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#makeTenantIdentityProviderInjectionPointsNamed","started":"19:32:05.048","dependents":[483],"id":9,"thread":"build-19"},{"duration":11,"stepId":"io.quarkus.deployment.dev.HotDeploymentWatchedFileBuildStep#setupWatchedFileHotDeployment","started":"19:32:06.798","dependents":[597,599],"id":457,"thread":"build-51"},{"duration":11,"stepId":"io.quarkus.deployment.steps.RegisterForReflectionBuildStep#build","started":"19:32:06.543","dependents":[604,603],"id":382,"thread":"build-76"},{"duration":11,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#ifBuildProfile","started":"19:32:06.545","dependents":[418,391,403],"id":386,"thread":"build-64"},{"duration":11,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#build_d182d2fe7ae008890806ec353e99fa052582ee2d","started":"19:32:06.766","dependents":[606,562],"id":453,"thread":"build-43"},{"duration":11,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForExceptionMappers","started":"19:32:06.660","dependents":[604,483,460,586],"id":436,"thread":"build-30"},{"duration":11,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmCdiProcessor#validatePersistenceUnitExtensions","started":"19:32:08.207","dependents":[533],"id":521,"thread":"build-22"},{"duration":10,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForParamConverters_dcdfdd2a310a09abe5ee3f0ed2b2bc49f36f3d07","started":"19:32:06.576","dependents":[604,577,483,460,586],"id":417,"thread":"build-32"},{"duration":10,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmCdiProcessor#registerBeans","started":"19:32:06.766","dependents":[514,522,483,460],"id":452,"thread":"build-62"},{"duration":10,"stepId":"io.quarkus.devui.deployment.menu.ContinuousTestingProcessor#continuousTestingState","started":"19:32:08.776","dependents":[606],"id":542,"thread":"build-107"},{"duration":10,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setupStackTraceFormatter","started":"19:32:06.520","dependents":[362,596,458],"id":361,"thread":"build-33"},{"duration":10,"stepId":"io.quarkus.agroal.deployment.AgroalMetricsProcessor#registerMetrics","started":"19:32:05.810","dependents":[606,550,551],"id":309,"thread":"build-58"},{"duration":9,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmCdiProcessor#generateDataSourceBeans","started":"19:32:06.764","dependents":[606,504,483,503,460,505],"id":451,"thread":"build-33"},{"duration":9,"stepId":"io.quarkus.deployment.steps.CurateOutcomeBuildStep#removeResources","started":"19:32:05.250","dependents":[602],"id":199,"thread":"build-58"},{"duration":9,"stepId":"io.quarkus.flyway.deployment.FlywayProcessor#startActions","started":"19:32:08.776","dependents":[544,606,548,546,547,597,599],"id":541,"thread":"build-191"},{"duration":9,"stepId":"io.quarkus.arc.deployment.ArcProcessor#registerSyntheticObservers","started":"19:32:07.880","dependents":[604,512,513,533,514,522],"id":511,"thread":"build-22"},{"duration":9,"stepId":"io.quarkus.swaggerui.deployment.SwaggerUiProcessor#brandingFiles","started":"19:32:05.213","dependents":[457],"id":150,"thread":"build-40"},{"duration":9,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#registerBean","started":"19:32:05.048","dependents":[483,460],"id":6,"thread":"build-18"},{"duration":9,"stepId":"io.quarkus.deployment.steps.BlockingOperationControlBuildStep#blockingOP","started":"19:32:05.823","dependents":[606],"id":321,"thread":"build-24"},{"duration":9,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#runtimeOnly","started":"19:32:05.063","dependents":[557],"id":20,"thread":"build-4"},{"duration":9,"stepId":"io.quarkus.flyway.deployment.FlywayProcessor#createBeans","started":"19:32:06.848","dependents":[544,606,510,504,503,546,506,509,483,507,460,505,508],"id":459,"thread":"build-51"},{"duration":8,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#integrateEagerSecurity","started":"19:32:06.572","dependents":[577],"id":406,"thread":"build-71"},{"duration":8,"stepId":"io.quarkus.micrometer.deployment.binder.NettyBinderProcessor#createNettyNettyAllocatorMetrics","started":"19:32:05.171","dependents":[483,460],"id":101,"thread":"build-63"},{"duration":8,"stepId":"io.quarkus.arc.deployment.SplitPackageProcessor#splitPackageDetection","started":"19:32:06.520","dependents":[533],"id":360,"thread":"build-75"},{"duration":8,"stepId":"io.quarkus.deployment.steps.DevServicesConfigBuildStep#setup","started":"19:32:08.801","dependents":[558,557,555,554,553,559,597,599],"id":552,"thread":"build-130"},{"duration":8,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#config","started":"19:32:05.070","dependents":[557],"id":22,"thread":"build-14"},{"duration":8,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#validateStaticInitConfigProperty","started":"19:32:08.212","dependents":[604,606],"id":523,"thread":"build-51"},{"duration":8,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#suppressNonRuntimeConfigChanged","started":"19:32:05.172","dependents":[307],"id":108,"thread":"build-67"},{"duration":8,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#gatherMvnpmJars","started":"19:32:05.264","dependents":[574,576],"id":211,"thread":"build-78"},{"duration":8,"stepId":"io.quarkus.arc.deployment.WrongAnnotationUsageProcessor#detect","started":"19:32:07.802","dependents":[533],"id":492,"thread":"build-25"},{"duration":8,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ObservabilityProcessor#methodScanner","started":"19:32:05.344","dependents":[577],"id":251,"thread":"build-23"},{"duration":7,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#configValidator","started":"19:32:07.141","dependents":[604,557],"id":480,"thread":"build-33"},{"duration":7,"stepId":"io.quarkus.narayana.jta.deployment.NarayanaJtaProcessor#transactionContext","started":"19:32:07.359","dependents":[485],"id":484,"thread":"build-37"},{"duration":7,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForFeatures","started":"19:32:06.576","dependents":[421,586],"id":410,"thread":"build-21"},{"duration":7,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForDynamicFeatures","started":"19:32:06.576","dependents":[421,586],"id":409,"thread":"build-28"},{"duration":7,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#generateConfigProperties","started":"19:32:06.544","dependents":[604,482,431,522,480,494,518,490],"id":381,"thread":"build-3"},{"duration":7,"stepId":"io.quarkus.stork.deployment.SmallRyeStorkProcessor#initializeStork","started":"19:32:07.880","dependents":[606],"id":510,"thread":"build-4"},{"duration":7,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmCdiProcessor#convertJpaResourceAnnotationsToQualifier","started":"19:32:06.766","dependents":[483],"id":450,"thread":"build-25"},{"duration":7,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#setup","started":"19:32:07.829","dependents":[606,504,503,505],"id":501,"thread":"build-4"},{"duration":7,"stepId":"io.quarkus.arc.deployment.ArcProcessor#exposeCustomScopeNames","started":"19:32:05.215","dependents":[492,469,467,427,432,220,483,183,460],"id":149,"thread":"build-51"},{"duration":7,"stepId":"io.quarkus.arc.deployment.ArcProcessor#launchMode","started":"19:32:05.100","dependents":[483,460],"id":57,"thread":"build-35"},{"duration":7,"stepId":"io.quarkus.rest.client.reactive.deployment.devservices.DevServicesRestClientHttpProxyProcessor#start","started":"19:32:06.550","dependents":[555,552,556],"id":390,"thread":"build-6"},{"duration":7,"stepId":"io.quarkus.deployment.SslProcessor#setupNativeSsl","started":"19:32:05.233","dependents":[328,335,176,445],"id":169,"thread":"build-40"},{"duration":6,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#additionalBeans","started":"19:32:06.583","dependents":[604,483,460],"id":421,"thread":"build-28"},{"duration":6,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setUpDarkeningDefault","started":"19:32:05.094","dependents":[557],"id":46,"thread":"build-33"},{"duration":6,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#determineRegisteredRestClients","started":"19:32:06.543","dependents":[427,380,398],"id":379,"thread":"build-6"},{"duration":6,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForInterceptors","started":"19:32:06.576","dependents":[437],"id":408,"thread":"build-48"},{"duration":6,"stepId":"io.quarkus.panache.common.deployment.PanacheHibernateCommonResourceProcessor#replaceFieldAccesses","started":"19:32:08.962","dependents":[602],"id":561,"thread":"build-13"},{"duration":6,"stepId":"io.quarkus.narayana.jta.deployment.NarayanaJtaProcessor#startRecoveryService","started":"19:32:07.880","dependents":[606],"id":509,"thread":"build-28"},{"duration":6,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ObservabilityProcessor#preAuthFailureFilter","started":"19:32:09.793","dependents":[606,596,591,590],"id":589,"thread":"build-69"},{"duration":6,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#customExceptionMappers","started":"19:32:05.045","dependents":[435],"id":5,"thread":"build-6"},{"duration":6,"stepId":"io.quarkus.deployment.steps.ConfigGenerationBuildStep#unknownConfigFiles","started":"19:32:06.520","dependents":[606],"id":359,"thread":"build-76"},{"duration":6,"stepId":"io.quarkus.narayana.jta.deployment.NarayanaJtaProcessor#registerScope","started":"19:32:05.209","dependents":[149],"id":138,"thread":"build-57"},{"duration":6,"stepId":"io.quarkus.arc.deployment.ShutdownBuildSteps#unremovableBeans","started":"19:32:05.044","dependents":[514,522],"id":3,"thread":"build-2"},{"duration":5,"stepId":"io.quarkus.micrometer.deployment.binder.NettyBinderProcessor#createVertxNettyEventExecutorMetrics","started":"19:32:05.322","dependents":[483,460],"id":231,"thread":"build-26"},{"duration":5,"stepId":"io.quarkus.arc.deployment.init.InitializationTaskProcessor#startApplicationInitializer","started":"19:32:08.786","dependents":[606],"id":544,"thread":"build-121"},{"duration":5,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#scanForParameterContainers","started":"19:32:06.576","dependents":[601,577],"id":405,"thread":"build-56"},{"duration":5,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#registerHibernateOrmMetadataForCoreDialects","started":"19:32:05.100","dependents":[447],"id":50,"thread":"build-15"},{"duration":5,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#reduceLogging","started":"19:32:05.131","dependents":[182],"id":77,"thread":"build-33"},{"duration":5,"stepId":"io.quarkus.deployment.steps.DevServicesConfigBuildStep#deprecated","started":"19:32:05.092","dependents":[552],"id":43,"thread":"build-35"},{"duration":5,"stepId":"io.quarkus.arc.deployment.SyntheticBeansProcessor#initStatic","started":"19:32:07.850","dependents":[606,511],"id":503,"thread":"build-51"},{"duration":5,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#startPersistenceUnits","started":"19:32:08.787","dependents":[606,597,599],"id":546,"thread":"build-130"},{"duration":5,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#registerConfigClasses","started":"19:32:08.219","dependents":[606],"id":525,"thread":"build-22"},{"duration":5,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#addHealthCheck","started":"19:32:05.324","dependents":[248],"id":234,"thread":"build-34"},{"duration":5,"stepId":"io.quarkus.micrometer.deployment.export.PrometheusRegistryProcessor#createPrometheusRegistry","started":"19:32:05.250","dependents":[551,483,460],"id":192,"thread":"build-77"},{"duration":5,"stepId":"io.quarkus.arc.deployment.ArcProcessor#initializeContainer","started":"19:32:08.766","dependents":[606,535],"id":534,"thread":"build-138"},{"duration":5,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#scanForIOInterceptors","started":"19:32:06.576","dependents":[437],"id":407,"thread":"build-57"},{"duration":4,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#handler","started":"19:32:09.805","dependents":[606,595,592],"id":591,"thread":"build-69"},{"duration":4,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#initializeRouter","started":"19:32:09.819","dependents":[606,596,595],"id":594,"thread":"build-154"},{"duration":4,"stepId":"io.quarkus.panache.common.deployment.PanacheHibernateCommonResourceProcessor#findEntityClasses","started":"19:32:06.719","dependents":[561],"id":441,"thread":"build-51"},{"duration":4,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#shutdownListener","started":"19:32:05.047","dependents":[598],"id":4,"thread":"build-13"},{"duration":4,"stepId":"io.quarkus.jackson.deployment.JacksonProcessor#supportMixins","started":"19:32:06.543","dependents":[604,606,504,503,505],"id":378,"thread":"build-43"},{"duration":4,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#handleClassLevelExceptionMappers","started":"19:32:06.585","dependents":[604,577],"id":422,"thread":"build-48"},{"duration":4,"stepId":"io.quarkus.tls.CertificatesProcessor#initializeCertificate","started":"19:32:07.824","dependents":[606,501,596,504,503,505],"id":500,"thread":"build-51"},{"duration":4,"stepId":"io.quarkus.swaggerui.deployment.SwaggerUiProcessor#registerSwaggerUiHandler","started":"19:32:09.206","dependents":[606,593,594],"id":572,"thread":"build-33"},{"duration":4,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#configurationDescriptorBuilding","started":"19:32:06.759","dependents":[606,605,450,454,449,452,453,451,457,448,547],"id":447,"thread":"build-51"},{"duration":4,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#mapPageBuildTimeData","started":"19:32:08.317","dependents":[573],"id":532,"thread":"build-28"},{"duration":4,"stepId":"io.quarkus.arc.deployment.devui.ArcDevUIProcessor#pages","started":"19:32:08.306","dependents":[532,564],"id":529,"thread":"build-83"},{"duration":4,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#configPropertyInjectionPoints","started":"19:32:08.208","dependents":[604,523,524],"id":520,"thread":"build-48"},{"duration":4,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#registerConfigPropertiesBean","started":"19:32:07.802","dependents":[511],"id":490,"thread":"build-43"},{"duration":3,"stepId":"io.quarkus.deployment.console.ConsoleProcessor#setupExceptionHandler","started":"19:32:06.090","dependents":[361],"id":353,"thread":"build-29"},{"duration":3,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#jacksonRegistered","started":"19:32:05.130","dependents":[270],"id":73,"thread":"build-14"},{"duration":3,"stepId":"io.quarkus.devui.deployment.logstream.LogStreamProcessor#handler","started":"19:32:06.532","dependents":[606,458],"id":362,"thread":"build-75"},{"duration":3,"stepId":"io.quarkus.netty.deployment.NettyProcessor#registerEventLoopBeans","started":"19:32:06.007","dependents":[606,504,503,505],"id":345,"thread":"build-62"},{"duration":3,"stepId":"io.quarkus.undertow.deployment.UndertowStaticResourcesBuildStep#scanStaticResources","started":"19:32:06.520","dependents":[],"id":358,"thread":"build-57"},{"duration":3,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#registerHealthUiHandler","started":"19:32:09.206","dependents":[606,593,594],"id":571,"thread":"build-62"},{"duration":3,"stepId":"io.quarkus.smallrye.context.deployment.SmallRyeContextPropagationProcessor#createSynthBeansForConfiguredInjectionPoints","started":"19:32:07.802","dependents":[606,504,503,505],"id":491,"thread":"build-83"},{"duration":3,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#generateDataSourceBeans","started":"19:32:06.756","dependents":[606,504,509,451,446,447,459,503,546,456,505,541],"id":445,"thread":"build-51"},{"duration":3,"stepId":"io.quarkus.arc.deployment.StartupBuildSteps#registerStartupObservers","started":"19:32:07.890","dependents":[514],"id":513,"thread":"build-28"},{"duration":3,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#produceTenantIdentityProviders","started":"19:32:07.802","dependents":[606,504,503,505],"id":488,"thread":"build-12"},{"duration":3,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#configureRegistry","started":"19:32:08.805","dependents":[606],"id":551,"thread":"build-69"},{"duration":3,"stepId":"io.quarkus.jdbc.postgresql.deployment.JDBCPostgreSQLProcessor#registerDriver","started":"19:32:05.240","dependents":[308],"id":176,"thread":"build-37"},{"duration":3,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#additionalReflection","started":"19:32:09.713","dependents":[604],"id":584,"thread":"build-13"},{"duration":3,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#build","started":"19:32:07.821","dependents":[606,510,500,597,599],"id":499,"thread":"build-4"},{"duration":3,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#detectAccessTokenVerificationRequired","started":"19:32:07.802","dependents":[557],"id":489,"thread":"build-62"},{"duration":3,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#openSocket","started":"19:32:09.840","dependents":[604,606],"id":600,"thread":"build-13"},{"duration":2,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#findEnablementStereotypes","started":"19:32:06.543","dependents":[386,389,385,387],"id":377,"thread":"build-67"},{"duration":2,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#runtimeConfiguration","started":"19:32:09.794","dependents":[606,588],"id":587,"thread":"build-154"},{"duration":2,"stepId":"io.quarkus.hibernate.orm.panache.common.deployment.PanacheJpaCommonResourceProcessor#lookupNamedQueries_5a86a91ed8ef1aa483288c8239df231983eeb766","started":"19:32:06.720","dependents":[442],"id":440,"thread":"build-25"},{"duration":2,"stepId":"io.quarkus.arc.deployment.ShutdownBuildSteps#registerShutdownObservers","started":"19:32:07.890","dependents":[514],"id":512,"thread":"build-4"},{"duration":2,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#unremovableBeans","started":"19:32:06.585","dependents":[514,522],"id":420,"thread":"build-20"},{"duration":2,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#loadAllBuildTimeTemplates","started":"19:32:09.371","dependents":[576],"id":575,"thread":"build-69"},{"duration":2,"stepId":"io.quarkus.deployment.dev.testing.TestTracingProcessor#startTesting","started":"19:32:06.088","dependents":[458,597,599],"id":352,"thread":"build-33"},{"duration":2,"stepId":"io.quarkus.arc.deployment.ArcProcessor#notifyBeanContainerListeners","started":"19:32:08.771","dependents":[606,536],"id":535,"thread":"build-83"},{"duration":2,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#unremovableBeans","started":"19:32:05.097","dependents":[514,522],"id":45,"thread":"build-26"},{"duration":2,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#validate","started":"19:32:08.207","dependents":[533],"id":519,"thread":"build-51"},{"duration":2,"stepId":"io.quarkus.devui.deployment.welcome.WelcomeProcessor#createWelcomePages","started":"19:32:08.996","dependents":[567],"id":566,"thread":"build-69"},{"duration":2,"stepId":"io.quarkus.devservices.postgresql.deployment.PostgresqlDevServicesProcessor#psqlCommand","started":"19:32:08.810","dependents":[581],"id":554,"thread":"build-60"},{"duration":2,"stepId":"io.quarkus.arc.deployment.TestsAsBeansProcessor#testAnnotations","started":"19:32:05.144","dependents":[432,483,460],"id":86,"thread":"build-22"},{"duration":2,"stepId":"io.quarkus.arc.deployment.ArcProcessor#quarkusMain","started":"19:32:05.061","dependents":[432,483,460],"id":15,"thread":"build-3"},{"duration":2,"stepId":"io.quarkus.deployment.steps.BannerProcessor#watchBannerChanges","started":"19:32:05.268","dependents":[457],"id":210,"thread":"build-81"},{"duration":2,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#createRootRegistry","started":"19:32:08.776","dependents":[606,550,551],"id":540,"thread":"build-121"},{"duration":2,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#validateConfigPropertiesInjectionPoints","started":"19:32:08.207","dependents":[525],"id":518,"thread":"build-6"},{"duration":2,"stepId":"io.quarkus.arc.deployment.ArcProcessor#signalBeanContainerReady","started":"19:32:08.774","dependents":[606,585,549,577,546,537,543,541,542,545,601,596,540,539,595,586,538,599],"id":536,"thread":"build-138"},{"duration":2,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#jpaEntitiesIndexer","started":"19:32:06.543","dependents":[605,438],"id":376,"thread":"build-64"},{"duration":2,"stepId":"io.quarkus.arc.deployment.devui.ArcDevUIProcessor#registerMonitoringComponents","started":"19:32:06.639","dependents":[483,460],"id":432,"thread":"build-30"},{"duration":1,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveDevModeProcessor#openCommand","started":"19:32:09.710","dependents":[581],"id":580,"thread":"build-69"},{"duration":1,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#handleJsonAnnotations","started":"19:32:09.710","dependents":[604,606,582],"id":579,"thread":"build-154"},{"duration":1,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#addDefaultAuthFailureHandler","started":"19:32:09.800","dependents":[606,596,591],"id":590,"thread":"build-13"},{"duration":1,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#produceModel","started":"19:32:05.065","dependents":[605,376,560],"id":18,"thread":"build-14"},{"duration":1,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#additionalProviders","started":"19:32:09.712","dependents":[601,583,585,584],"id":582,"thread":"build-62"},{"duration":1,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#applicationSpecificUnwrappedExceptions","started":"19:32:06.543","dependents":[436],"id":375,"thread":"build-51"},{"duration":1,"stepId":"io.quarkus.flyway.deployment.FlywayAlwaysEnabledProcessor#indexFlyway","started":"19:32:05.063","dependents":[357],"id":17,"thread":"build-5"},{"duration":1,"stepId":"io.quarkus.hibernate.orm.panache.common.deployment.PanacheJpaCommonResourceProcessor#buildNamedQueryMap","started":"19:32:06.722","dependents":[606],"id":442,"thread":"build-30"},{"duration":1,"stepId":"io.quarkus.arc.deployment.LifecycleEventsBuildStep#startupEvent","started":"19:32:09.839","dependents":[606,600],"id":599,"thread":"build-62"},{"duration":1,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#registerHttpAuthMechanismAnnotation","started":"19:32:05.048","dependents":[399],"id":1,"thread":"build-16"},{"duration":1,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#configureHandlers","started":"19:32:09.796","dependents":[606],"id":588,"thread":"build-13"},{"duration":1,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#recordEntityToPersistenceUnit","started":"19:32:08.974","dependents":[606],"id":563,"thread":"build-13"},{"duration":1,"stepId":"io.quarkus.arc.deployment.staticmethods.InterceptedStaticMethodsProcessor#callInitializer","started":"19:32:08.776","dependents":[606],"id":539,"thread":"build-60"},{"duration":1,"stepId":"io.quarkus.arc.deployment.ArcProcessor#validateAsyncObserverExceptionHandlers","started":"19:32:08.207","dependents":[533],"id":517,"thread":"build-37"},{"duration":1,"stepId":"io.quarkus.deployment.steps.ShutdownListenerBuildStep#setupShutdown","started":"19:32:09.839","dependents":[606],"id":598,"thread":"build-13"},{"duration":1,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#notFoundRoutes","started":"19:32:09.815","dependents":[595],"id":593,"thread":"build-69"},{"duration":1,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#addPersistenceUnitAnnotationToIndex","started":"19:32:05.106","dependents":[363],"id":56,"thread":"build-30"},{"duration":1,"stepId":"io.quarkus.arc.deployment.staticmethods.InterceptedStaticMethodsProcessor#processInterceptedStaticMethods","started":"19:32:07.821","dependents":[604,602,561,562,560],"id":498,"thread":"build-51"},{"duration":1,"stepId":"io.quarkus.deployment.steps.ApplicationInfoBuildStep#create","started":"19:32:05.260","dependents":[606],"id":202,"thread":"build-22"},{"duration":1,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setUpDefaultLevels","started":"19:32:05.247","dependents":[557,458],"id":182,"thread":"build-12"},{"duration":0,"stepId":"io.quarkus.deployment.JniProcessor#setupJni","started":"19:32:05.247","dependents":[328],"id":178,"thread":"build-37"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#produceEagerSecurityInterceptorStorage","started":"19:32:06.572","dependents":[606,504,503,505],"id":402,"thread":"build-48"},{"duration":0,"stepId":"io.quarkus.deployment.console.ConsoleProcessor#installCliCommands","started":"19:32:09.712","dependents":[597,599],"id":581,"thread":"build-33"},{"duration":0,"stepId":"io.quarkus.micrometer.deployment.binder.HttpBinderProcessor#registerProvider","started":"19:32:05.184","dependents":[363,483,460],"id":116,"thread":"build-46"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.VertxHttpProcessor#convertRoutes","started":"19:32:09.814","dependents":[593,594],"id":592,"thread":"build-13"},{"duration":0,"stepId":"io.quarkus.deployment.steps.ProfileBuildStep#defaultProfile","started":"19:32:05.144","dependents":[557],"id":82,"thread":"build-3"},{"duration":0,"stepId":"io.quarkus.devui.deployment.BuildTimeContentProcessor#mapDeploymentMethods","started":"19:32:05.872","dependents":[426,549],"id":332,"thread":"build-67"},{"duration":0,"stepId":"io.quarkus.devui.deployment.menu.EndpointsProcessor#createEndpointsPage","started":"19:32:05.301","dependents":[567],"id":219,"thread":"build-57"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#candidatesForFieldAccess","started":"19:32:06.719","dependents":[441],"id":439,"thread":"build-30"},{"duration":0,"stepId":"io.quarkus.deployment.index.ApplicationArchiveBuildStep#addConfiguredIndexedDependencies","started":"19:32:05.261","dependents":[357],"id":201,"thread":"build-78"},{"duration":0,"stepId":"io.quarkus.datasource.deployment.devui.DevUIDatasourceProcessor#create","started":"19:32:05.241","dependents":[532,564],"id":172,"thread":"build-75"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#handleSseEventFilter","started":"19:32:06.991","dependents":[604],"id":463,"thread":"build-83"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ArcProcessor#quarkusApplication","started":"19:32:06.543","dependents":[483,460],"id":370,"thread":"build-28"},{"duration":0,"stepId":"io.quarkus.deployment.execannotations.ExecutionModelAnnotationsProcessor#check","started":"19:32:06.646","dependents":[],"id":434,"thread":"build-30"},{"duration":0,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#initTenantConfigBean","started":"19:32:07.880","dependents":[606],"id":506,"thread":"build-51"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#activateSslNativeSupport","started":"19:32:05.165","dependents":[328],"id":95,"thread":"build-55"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ArcProcessor#marker","started":"19:32:05.097","dependents":[357],"id":42,"thread":"build-38"},{"duration":0,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setProperty","started":"19:32:05.108","dependents":[606],"id":59,"thread":"build-14"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerProviderBeans","started":"19:32:06.543","dependents":[483,460],"id":368,"thread":"build-12"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#perClassExceptionMapperSupport","started":"19:32:06.585","dependents":[483],"id":415,"thread":"build-57"},{"duration":0,"stepId":"io.quarkus.arc.deployment.AutoInjectFieldProcessor#autoInjectQualifiers","started":"19:32:06.991","dependents":[469,466],"id":461,"thread":"build-6"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#multitenancy","started":"19:32:06.765","dependents":[606,514,522,504,503,505],"id":449,"thread":"build-12"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevUIProcessor#handleInitialSql","started":"19:32:06.764","dependents":[455,459],"id":448,"thread":"build-4"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#addAllWriteableMarker","started":"19:32:09.714","dependents":[602],"id":583,"thread":"build-154"},{"duration":0,"stepId":"io.quarkus.deployment.logging.LoggingWithPanacheProcessor#process","started":"19:32:06.543","dependents":[602],"id":365,"thread":"build-33"},{"duration":0,"stepId":"io.quarkus.deployment.console.ConsoleProcessor#missingDevUIMessageHandler","started":"19:32:06.090","dependents":[597,599],"id":351,"thread":"build-57"},{"duration":0,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#preventLoggerContention","started":"19:32:05.209","dependents":[182],"id":126,"thread":"build-4"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevUIProcessor#additionalBeans","started":"19:32:05.166","dependents":[483,460],"id":97,"thread":"build-60"},{"duration":0,"stepId":"io.quarkus.deployment.ForkJoinPoolProcessor#setProperty","started":"19:32:05.217","dependents":[606],"id":144,"thread":"build-53"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.GeneratedStaticResourcesProcessor#devMode","started":"19:32:05.162","dependents":[177,299,457],"id":93,"thread":"build-50"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#generateCustomProducer","started":"19:32:06.585","dependents":[483,460],"id":413,"thread":"build-21"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#initializeRolesAllowedConfigExp","started":"19:32:08.207","dependents":[606],"id":515,"thread":"build-43"},{"duration":0,"stepId":"io.quarkus.vertx.deployment.VertxProcessor#featureAndCapability","started":"19:32:05.169","dependents":[606,222],"id":98,"thread":"build-63"},{"duration":0,"stepId":"io.quarkus.micrometer.deployment.binder.HttpBinderProcessor#enableHttpServerSupport","started":"19:32:05.325","dependents":[483,460],"id":229,"thread":"build-82"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#initMtlsClientAuth","started":"19:32:05.241","dependents":[483,460],"id":170,"thread":"build-4"},{"duration":0,"stepId":"io.quarkus.micrometer.deployment.binder.VertxBinderProcessor#setVertxConfig","started":"19:32:07.880","dependents":[606],"id":507,"thread":"build-25"},{"duration":0,"stepId":"io.quarkus.narayana.jta.deployment.NarayanaJtaProcessor#logCleanupFilters","started":"19:32:05.214","dependents":[458,444],"id":135,"thread":"build-73"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.devservices.DevServicesRestClientHttpProxyProcessor#determineRequiredProxies","started":"19:32:06.550","dependents":[390],"id":380,"thread":"build-67"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ArcProcessor#feature","started":"19:32:05.144","dependents":[606],"id":81,"thread":"build-43"},{"duration":0,"stepId":"io.quarkus.deployment.recording.AnnotationProxyBuildStep#build","started":"19:32:06.102","dependents":[530,499],"id":355,"thread":"build-33"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ArcProcessor#unremovableAsyncObserverExceptionHandlers","started":"19:32:05.130","dependents":[514,522],"id":72,"thread":"build-42"},{"duration":0,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.devui.FaultToleranceDevUIProcessor#cardPage","started":"19:32:08.317","dependents":[532,564],"id":531,"thread":"build-24"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#enrollBeanValidationTypeSafeActivatorForReflection","started":"19:32:05.324","dependents":[604],"id":225,"thread":"build-40"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ExecutorServiceProcessor#executorServiceBean","started":"19:32:05.861","dependents":[504,503,505],"id":330,"thread":"build-67"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#buildSetup","started":"19:32:05.209","dependents":[606],"id":127,"thread":"build-40"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#includeArchivesHostingEntityPackagesInIndex","started":"19:32:05.250","dependents":[357],"id":188,"thread":"build-58"},{"duration":0,"stepId":"io.quarkus.deployment.ConstructorPropertiesProcessor#build","started":"19:32:06.544","dependents":[604],"id":374,"thread":"build-2"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#featureBuildItem","started":"19:32:05.092","dependents":[606],"id":33,"thread":"build-22"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#pathInterfaceImpls","started":"19:32:06.585","dependents":[483,460],"id":416,"thread":"build-72"},{"duration":0,"stepId":"io.quarkus.devui.deployment.menu.BuildMetricsProcessor#createBuildMetricsPages","started":"19:32:05.210","dependents":[567],"id":132,"thread":"build-26"},{"duration":0,"stepId":"io.quarkus.devui.deployment.menu.ConfigurationProcessor#createConfigurationPages","started":"19:32:08.810","dependents":[567],"id":553,"thread":"build-121"},{"duration":0,"stepId":"io.quarkus.security.deployment.SecurityProcessor#feature","started":"19:32:05.233","dependents":[606],"id":157,"thread":"build-72"},{"duration":0,"stepId":"io.quarkus.deployment.ExtensionLoader#booleanSupplierFactory","started":"19:32:05.166","dependents":[217],"id":96,"thread":"build-57"},{"duration":0,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#processSmallRyeHealthConfigValues","started":"19:32:05.260","dependents":[557],"id":196,"thread":"build-50"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateLogFilterBuildStep#setupLogFilters","started":"19:32:05.129","dependents":[458,444],"id":66,"thread":"build-41"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#feature","started":"19:32:05.093","dependents":[606],"id":35,"thread":"build-36"},{"duration":0,"stepId":"io.quarkus.jdbc.postgresql.deployment.PostgreSQLJDBCReflections#build","started":"19:32:05.209","dependents":[604],"id":129,"thread":"build-22"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerProvidersInstances","started":"19:32:06.544","dependents":[433],"id":373,"thread":"build-32"},{"duration":0,"stepId":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor#configFile","started":"19:32:05.149","dependents":[457],"id":90,"thread":"build-43"},{"duration":0,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#shutdownHealthCheck","started":"19:32:05.247","dependents":[483,460],"id":179,"thread":"build-12"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateUserTypeProcessor#build","started":"19:32:06.543","dependents":[604],"id":367,"thread":"build-83"},{"duration":0,"stepId":"io.quarkus.jdbc.postgresql.deployment.JDBCPostgreSQLProcessor#feature","started":"19:32:05.094","dependents":[606],"id":38,"thread":"build-26"},{"duration":0,"stepId":"io.quarkus.devui.deployment.menu.ExtensionsProcessor#createExtensionsPages","started":"19:32:08.996","dependents":[567],"id":565,"thread":"build-13"},{"duration":0,"stepId":"io.quarkus.security.deployment.SecurityProcessor#transformSecurityAnnotations","started":"19:32:06.572","dependents":[483],"id":401,"thread":"build-56"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#searchForProviders","started":"19:32:05.325","dependents":[357],"id":227,"thread":"build-40"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.jackson.deployment.RestClientReactiveJacksonProcessor#feature","started":"19:32:05.145","dependents":[606],"id":83,"thread":"build-27"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#defineTypeOfImpliedPU","started":"19:32:06.759","dependents":[450,451,447],"id":446,"thread":"build-25"},{"duration":0,"stepId":"io.quarkus.smallrye.health.deployment.SmallRyeHealthProcessor#processSmallRyeHealthRuntimeConfig","started":"19:32:07.880","dependents":[606],"id":508,"thread":"build-83"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.devconsole.RestClientReactiveDevUIProcessor#create","started":"19:32:05.108","dependents":[532,564],"id":60,"thread":"build-9"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#resourceIndex","started":"19:32:06.543","dependents":[578,460,411],"id":364,"thread":"build-83"},{"duration":0,"stepId":"io.quarkus.netty.deployment.NettyProcessor#limitArenaSize","started":"19:32:05.250","dependents":[606],"id":186,"thread":"build-75"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.ManagementInterfaceSecurityProcessor#initializeAuthMechanismHandler","started":"19:32:08.776","dependents":[606],"id":538,"thread":"build-130"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveProcessor#setMinimalNettyMaxOrderSize","started":"19:32:05.149","dependents":[186,197],"id":91,"thread":"build-22"},{"duration":0,"stepId":"io.quarkus.arc.deployment.TestsAsBeansProcessor#testClassBeans","started":"19:32:05.217","dependents":[483,460],"id":145,"thread":"build-29"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerHeaderFactoryBeans","started":"19:32:06.544","dependents":[483,460],"id":372,"thread":"build-25"},{"duration":0,"stepId":"io.quarkus.security.deployment.SecurityProcessor#produceJcaSecurityProviders","started":"19:32:05.250","dependents":[280,212,214],"id":185,"thread":"build-67"},{"duration":0,"stepId":"io.quarkus.deployment.steps.PreloadClassesBuildStep#registerPreInitClasses","started":"19:32:05.184","dependents":[],"id":115,"thread":"build-26"},{"duration":0,"stepId":"io.quarkus.stork.deployment.SmallRyeStorkProcessor#checkThatTheKubernetesExtensionIsUsedWhenKubernetesServiceDiscoveryInOnTheClasspath","started":"19:32:05.324","dependents":[510],"id":224,"thread":"build-51"},{"duration":0,"stepId":"io.quarkus.devui.deployment.menu.EndpointsProcessor#createJsonRPCService","started":"19:32:05.209","dependents":[426,337],"id":131,"thread":"build-50"},{"duration":0,"stepId":"io.quarkus.devui.deployment.DevUIProcessor#createAllRoutes","started":"19:32:09.206","dependents":[576],"id":570,"thread":"build-13"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#announceFeature","started":"19:32:05.158","dependents":[606],"id":92,"thread":"build-22"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#contributePersistenceXmlToJpaModel","started":"19:32:05.798","dependents":[438],"id":304,"thread":"build-2"},{"duration":0,"stepId":"io.quarkus.micrometer.deployment.MicrometerConfigAlwaysEnabledProcessor#mpConfigAsBean","started":"19:32:05.085","dependents":[514,522],"id":29,"thread":"build-35"},{"duration":0,"stepId":"io.quarkus.micrometer.deployment.MicrometerProcessor#registerExtensionMetrics","started":"19:32:08.806","dependents":[606],"id":550,"thread":"build-122"},{"duration":0,"stepId":"io.quarkus.security.deployment.SecurityProcessor#resolveConfigExpressionRoles","started":"19:32:07.079","dependents":[606],"id":474,"thread":"build-43"},{"duration":0,"stepId":"io.quarkus.micrometer.deployment.MicrometerConfigAlwaysEnabledProcessor#feature","started":"19:32:05.147","dependents":[606],"id":87,"thread":"build-44"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#produceLoggingCategories","started":"19:32:05.247","dependents":[182],"id":180,"thread":"build-75"},{"duration":0,"stepId":"io.quarkus.smallrye.openapi.deployment.SmallRyeOpenApiProcessor#contributeClassesToIndex","started":"19:32:05.209","dependents":[363],"id":128,"thread":"build-47"},{"duration":0,"stepId":"io.quarkus.deployment.dev.testing.TestTracingProcessor#handle","started":"19:32:05.082","dependents":[458,444],"id":27,"thread":"build-34"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.common.deployment.ResteasyReactiveCommonProcessor#setUpDenyAllJaxRs","started":"19:32:05.233","dependents":[476],"id":156,"thread":"build-51"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ConfigBuildStep#registerCustomConfigBeanTypes","started":"19:32:07.802","dependents":[604,504,503,505],"id":486,"thread":"build-37"},{"duration":0,"stepId":"io.quarkus.arc.deployment.BuildTimeEnabledProcessor#conditionTransformer","started":"19:32:06.558","dependents":[483],"id":391,"thread":"build-72"},{"duration":0,"stepId":"io.quarkus.deployment.steps.CurateOutcomeBuildStep#curateOutcome","started":"19:32:05.250","dependents":[455,255,357,354,566,222,395,564,569,426,199,277,602,247,573,240,239,211,308,361,332,532,567,214,259,217],"id":187,"thread":"build-12"},{"duration":0,"stepId":"io.quarkus.rest.client.reactive.deployment.RestClientReactiveProcessor#registerCompressionInterceptors","started":"19:32:05.063","dependents":[604],"id":16,"thread":"build-14"},{"duration":0,"stepId":"io.quarkus.deployment.pkg.steps.NativeImageBuildStep#ignoreBuildPropertyChanges","started":"19:32:05.210","dependents":[307],"id":133,"thread":"build-72"},{"duration":0,"stepId":"io.quarkus.flyway.deployment.FlywayAlwaysEnabledProcessor#build","started":"19:32:05.095","dependents":[606],"id":39,"thread":"build-22"},{"duration":0,"stepId":"io.quarkus.arc.deployment.ObserverValidationProcessor#validateApplicationObserver","started":"19:32:08.207","dependents":[533],"id":516,"thread":"build-25"},{"duration":0,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#agroal","started":"19:32:05.131","dependents":[606],"id":74,"thread":"build-27"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevUIProcessor#create","started":"19:32:05.184","dependents":[532,564],"id":117,"thread":"build-40"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#unremovableContextMethodParams","started":"19:32:06.585","dependents":[514,522],"id":412,"thread":"build-71"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveScanningProcessor#scanForParamConverters_59e3169e3a646b7fcf3083416f558434b73816c5","started":"19:32:06.576","dependents":[417],"id":404,"thread":"build-20"},{"duration":0,"stepId":"io.quarkus.arc.deployment.HotDeploymentConfigBuildStep#configFile","started":"19:32:05.147","dependents":[457],"id":88,"thread":"build-43"},{"duration":0,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setupLogFilters","started":"19:32:05.184","dependents":[458,444],"id":118,"thread":"build-13"},{"duration":0,"stepId":"io.quarkus.devui.deployment.build.BuildMetricsDevUIProcessor#additionalBeans","started":"19:32:05.185","dependents":[483,460],"id":120,"thread":"build-50"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveCDIProcessor#subResourcesAsBeans","started":"19:32:06.585","dependents":[514,522,483,460],"id":414,"thread":"build-56"},{"duration":0,"stepId":"io.quarkus.devui.deployment.menu.DevServicesProcessor#createDevServicesPages","started":"19:32:08.830","dependents":[567],"id":556,"thread":"build-60"},{"duration":0,"stepId":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProcessor#handleFieldSecurity","started":"19:32:09.710","dependents":[579],"id":578,"thread":"build-33"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#checkTransactionsSupport","started":"19:32:05.322","dependents":[533],"id":223,"thread":"build-17"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#initializeAuthenticationHandler","started":"19:32:08.776","dependents":[606],"id":537,"thread":"build-122"},{"duration":0,"stepId":"io.quarkus.jackson.deployment.JacksonProcessor#autoRegisterModules","started":"19:32:06.543","dependents":[419],"id":369,"thread":"build-58"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.panache.deployment.PanacheHibernateResourceProcessor#collectEntityClasses","started":"19:32:06.543","dependents":[562],"id":371,"thread":"build-72"},{"duration":0,"stepId":"io.quarkus.deployment.logging.LoggingResourceProcessor#setUpDefaultLogCleanupFilters","started":"19:32:06.756","dependents":[557],"id":444,"thread":"build-25"},{"duration":0,"stepId":"io.quarkus.security.deployment.SecurityProcessor#gatherClassSecurityChecks","started":"19:32:06.991","dependents":[473],"id":462,"thread":"build-24"},{"duration":0,"stepId":"io.quarkus.smallrye.faulttolerance.deployment.SmallRyeFaultToleranceProcessor#registerTypes","started":"19:32:05.209","dependents":[356],"id":130,"thread":"build-6"},{"duration":0,"stepId":"io.quarkus.vertx.core.deployment.VertxCoreProcessor#filterNettyHostsFileParsingWarn","started":"19:32:05.164","dependents":[458,444],"id":94,"thread":"build-54"},{"duration":0,"stepId":"io.quarkus.oidc.deployment.OidcAlwaysEnabledProcessor#featureBuildItem","started":"19:32:05.100","dependents":[606],"id":47,"thread":"build-39"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmAlwaysEnabledProcessor#featureBuildItem","started":"19:32:05.184","dependents":[606],"id":119,"thread":"build-6"},{"duration":0,"stepId":"io.quarkus.security.deployment.SecurityProcessor#transformAdditionalSecuredClassesToMethods","started":"19:32:05.241","dependents":[401,473],"id":171,"thread":"build-3"},{"duration":0,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#enableSslInNative","started":"19:32:05.127","dependents":[328],"id":63,"thread":"build-26"},{"duration":0,"stepId":"io.quarkus.agroal.deployment.AgroalProcessor#adaptOpenTelemetryJdbcInstrumentationForNative","started":"19:32:05.326","dependents":[602],"id":228,"thread":"build-46"},{"duration":0,"stepId":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor#collectInterceptedMethods","started":"19:32:06.572","dependents":[406,402],"id":400,"thread":"build-28"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#warnOfSchemaProblems","started":"19:32:09.839","dependents":[606],"id":597,"thread":"build-154"},{"duration":0,"stepId":"io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#hotDeploymentWatchedFiles","started":"19:32:05.260","dependents":[457],"id":198,"thread":"build-77"},{"duration":0,"stepId":"io.quarkus.deployment.steps.ReflectionDiagnosticProcessor#writeReflectionData","started":"19:32:11.306","dependents":[],"id":604,"thread":"build-13"},{"duration":0,"stepId":"io.quarkus.caffeine.deployment.CaffeineProcessor#cacheLoaders","started":"19:32:06.543","dependents":[604],"id":366,"thread":"build-12"},{"duration":0,"stepId":"io.quarkus.oidc.deployment.OidcBuildStep#checkClaim","started":"19:32:07.802","dependents":[511],"id":487,"thread":"build-6"}],"started":"2025-12-06T19:32:05.04","items":[{"count":4357,"class":"io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyBuildItem"},{"count":1703,"class":"io.quarkus.deployment.builditem.GeneratedClassBuildItem"},{"count":1636,"class":"io.quarkus.deployment.builditem.ConfigDescriptionBuildItem"},{"count":755,"class":"io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem"},{"count":741,"class":"io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem"},{"count":101,"class":"io.quarkus.arc.deployment.AdditionalBeanBuildItem"},{"count":82,"class":"io.quarkus.deployment.builditem.MainBytecodeRecorderBuildItem"},{"count":66,"class":"io.quarkus.hibernate.validator.spi.AdditionalConstrainedClassBuildItem"},{"count":65,"class":"io.quarkus.deployment.builditem.StaticBytecodeRecorderBuildItem"},{"count":62,"class":"io.quarkus.vertx.http.deployment.RouteBuildItem"},{"count":58,"class":"io.quarkus.arc.deployment.SyntheticBeanBuildItem"},{"count":52,"class":"io.quarkus.deployment.builditem.nativeimage.ReflectiveFieldBuildItem"},{"count":39,"class":"io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem"},{"count":32,"class":"io.quarkus.deployment.builditem.HotDeploymentWatchedFileBuildItem"},{"count":28,"class":"io.quarkus.arc.deployment.ConfigPropertyBuildItem"},{"count":27,"class":"io.quarkus.deployment.builditem.RunTimeConfigurationDefaultBuildItem"},{"count":23,"class":"io.quarkus.arc.deployment.UnremovableBeanBuildItem"},{"count":22,"class":"io.quarkus.deployment.builditem.CapabilityBuildItem"},{"count":21,"class":"io.quarkus.arc.deployment.BeanDefiningAnnotationBuildItem"},{"count":21,"class":"io.quarkus.deployment.builditem.FeatureBuildItem"},{"count":20,"class":"io.quarkus.deployment.builditem.ConfigClassBuildItem"},{"count":19,"class":"io.quarkus.deployment.builditem.AdditionalIndexedClassesBuildItem"},{"count":18,"class":"io.quarkus.deployment.logging.LogCleanupFilterBuildItem"},{"count":17,"class":"io.quarkus.deployment.builditem.BytecodeTransformerBuildItem"},{"count":16,"class":"io.quarkus.vertx.http.deployment.devmode.NotFoundPageDisplayableEndpointBuildItem"},{"count":15,"class":"io.quarkus.vertx.http.deployment.webjar.WebJarBuildItem"},{"count":15,"class":"io.quarkus.devui.spi.JsonRPCProvidersBuildItem"},{"count":13,"class":"io.quarkus.devui.deployment.DevUIWebJarBuildItem"},{"count":13,"class":"io.quarkus.devui.deployment.DevUIRoutesBuildItem"},{"count":13,"class":"io.quarkus.arc.deployment.AnnotationsTransformerBuildItem"},{"count":12,"class":"io.quarkus.devui.spi.page.CardPageBuildItem"},{"count":11,"class":"io.quarkus.deployment.builditem.SuppressNonRuntimeConfigChangedWarningBuildItem"},{"count":10,"class":"io.quarkus.deployment.builditem.nativeimage.RuntimeReinitializedClassBuildItem"},{"count":10,"class":"io.quarkus.resteasy.reactive.spi.MessageBodyWriterBuildItem"},{"count":8,"class":"io.quarkus.hibernate.orm.deployment.spi.DatabaseKindDialectBuildItem"},{"count":8,"class":"io.quarkus.devui.deployment.InternalPageBuildItem"},{"count":8,"class":"io.quarkus.resteasy.reactive.server.spi.MethodScannerBuildItem"},{"count":8,"class":"io.quarkus.resteasy.reactive.spi.ExceptionMapperBuildItem"},{"count":7,"class":"io.quarkus.deployment.builditem.SystemPropertyBuildItem"},{"count":7,"class":"io.quarkus.deployment.builditem.ConsoleCommandBuildItem"},{"count":7,"class":"io.quarkus.resteasy.reactive.spi.MessageBodyReaderBuildItem"},{"count":6,"class":"io.quarkus.deployment.builditem.nativeimage.NativeImageSystemPropertyBuildItem"},{"count":6,"class":"io.quarkus.vertx.http.deployment.FilterBuildItem"},{"count":6,"class":"io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem"},{"count":6,"class":"io.quarkus.devui.deployment.BuildTimeConstBuildItem"},{"count":6,"class":"io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem"},{"count":5,"class":"io.quarkus.vertx.http.deployment.HttpAuthMechanismAnnotationBuildItem"},{"count":5,"class":"io.quarkus.deployment.builditem.RunTimeConfigBuilderBuildItem"},{"count":5,"class":"io.quarkus.deployment.builditem.ServiceStartBuildItem"},{"count":5,"class":"io.quarkus.deployment.execannotations.ExecutionModelAnnotationsAllowedBuildItem"},{"count":5,"class":"io.quarkus.devui.spi.buildtime.BuildTimeActionBuildItem"},{"count":5,"class":"io.quarkus.arc.deployment.GeneratedBeanBuildItem"},{"count":5,"class":"io.quarkus.deployment.builditem.ConfigMappingBuildItem"},{"count":4,"class":"io.quarkus.resteasy.reactive.spi.MessageBodyWriterOverrideBuildItem"},{"count":4,"class":"io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem$BeanConfiguratorBuildItem"},{"count":4,"class":"io.quarkus.arc.deployment.AutoAddScopeBuildItem"},{"count":4,"class":"io.quarkus.vertx.http.deployment.spi.RouteBuildItem"},{"count":4,"class":"io.quarkus.resteasy.reactive.spi.MessageBodyReaderOverrideBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.ShutdownListenerBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.StaticInitConfigBuilderBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem"},{"count":3,"class":"io.quarkus.jackson.spi.ClassPathJacksonModuleBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem"},{"count":3,"class":"io.quarkus.smallrye.openapi.deployment.spi.AddToOpenAPIDefinitionBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.ApplicationClassPredicateBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.LogCategoryBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.IndexDependencyBuildItem"},{"count":3,"class":"io.quarkus.resteasy.reactive.server.spi.UnwrappedExceptionBuildItem"},{"count":3,"class":"io.quarkus.resteasy.reactive.spi.CustomExceptionMapperBuildItem"},{"count":3,"class":"io.quarkus.deployment.builditem.GeneratedResourceBuildItem"},{"count":2,"class":"io.quarkus.resteasy.reactive.common.deployment.ResourceInterceptorsContributorBuildItem"},{"count":2,"class":"io.quarkus.deployment.builditem.ObjectSubstitutionBuildItem"},{"count":2,"class":"io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyIgnoreWarningBuildItem"},{"count":2,"class":"io.quarkus.devui.spi.buildtime.QuteTemplateBuildItem"},{"count":2,"class":"io.quarkus.deployment.builditem.RecordableConstructorBuildItem"},{"count":2,"class":"io.quarkus.arc.deployment.InterceptorBindingRegistrarBuildItem"},{"count":2,"class":"io.quarkus.deployment.builditem.BytecodeRecorderObjectLoaderBuildItem"},{"count":2,"class":"io.quarkus.devui.spi.buildtime.StaticContentBuildItem"},{"count":2,"class":"io.quarkus.deployment.builditem.ConfigurationTypeBuildItem"},{"count":2,"class":"io.quarkus.arc.deployment.InjectionPointTransformerBuildItem"},{"count":2,"class":"io.quarkus.hibernate.orm.panache.common.deployment.PanacheNamedQueryEntityClassBuildStep"},{"count":2,"class":"io.quarkus.devui.deployment.InternalImportMapBuildItem"},{"count":2,"class":"io.quarkus.arc.deployment.AutoInjectAnnotationBuildItem"},{"count":1,"class":"io.quarkus.devui.deployment.MvnpmBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.AnnotationProxyBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.BytecodeRecorderConstantDefinitionBuildItem"},{"count":1,"class":"io.quarkus.deployment.console.ConsoleInstalledBuildItem"},{"count":1,"class":"io.quarkus.deployment.metrics.MetricsCapabilityBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.DevServicesAdditionalConfigBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.SynthesisFinishedBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBundleBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ObservabilityIntegrationBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.RemovedResourceBuildItem"},{"count":1,"class":"io.quarkus.vertx.core.deployment.EventLoopCountBuildItem"},{"count":1,"class":"io.quarkus.vertx.core.deployment.CoreVertxBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ContextResolversBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.DockerStatusBuildItem"},{"count":1,"class":"io.quarkus.vertx.deployment.LocalCodecSelectorTypesBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.InitialRouterBuildItem"},{"count":1,"class":"io.quarkus.panache.common.deployment.HibernateMetamodelForFieldAccessBuildItem"},{"count":1,"class":"io.quarkus.smallrye.openapi.deployment.spi.OpenApiDocumentBuildItem"},{"count":1,"class":"io.quarkus.deployment.dev.ExceptionNotificationBuildItem"},{"count":1,"class":"io.quarkus.swaggerui.deployment.SwaggerUiBuildItem"},{"count":1,"class":"io.quarkus.deployment.pkg.builditem.CompiledJavaVersionBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.ValidationPhaseBuildItem"},{"count":1,"class":"io.quarkus.jaxrs.client.reactive.deployment.JaxrsClientReactiveEnricherBuildItem"},{"count":1,"class":"io.quarkus.netty.deployment.EventLoopSupplierBuildItem"},{"count":1,"class":"io.quarkus.deployment.BooleanSupplierFactoryBuildItem"},{"count":1,"class":"io.quarkus.hibernate.validator.spi.BeanValidationAnnotationsBuildItem"},{"count":1,"class":"io.quarkus.tls.TlsRegistryBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ParamConverterProvidersBuildItem"},{"count":1,"class":"io.quarkus.hibernate.orm.deployment.ImpliedBlockingPersistenceUnitTypeBuildItem"},{"count":1,"class":"io.quarkus.rest.client.reactive.spi.DevServicesRestClientProxyProvider$BuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.spi.HandlerConfigurationProviderBuildItem"},{"count":1,"class":"io.quarkus.smallrye.health.deployment.SmallRyeHealthBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.DevServicesLauncherConfigResultBuildItem"},{"count":1,"class":"io.quarkus.security.spi.AdditionalSecurityConstrainerEventPropsBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.ExcludedTypeBuildItem"},{"count":1,"class":"io.quarkus.panache.common.deployment.PanacheEntityClassesBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ThreadFactoryBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ApplicationIndexBuildItem"},{"count":1,"class":"io.quarkus.panache.common.deployment.HibernateModelClassCandidatesForFieldAccessBuildItem"},{"count":1,"class":"io.quarkus.agroal.spi.JdbcDriverBuildItem"},{"count":1,"class":"io.quarkus.smallrye.health.deployment.spi.HealthBuildItem"},{"count":1,"class":"io.quarkus.micrometer.deployment.MicrometerRegistryProviderBuildItem"},{"count":1,"class":"io.quarkus.deployment.logging.LoggingSetupBuildItem"},{"count":1,"class":"io.quarkus.smallrye.faulttolerance.deployment.devui.FaultToleranceInfoBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.ArcContainerBuildItem"},{"count":1,"class":"io.quarkus.devui.deployment.JsonRPCRuntimeMethodsBuildItem"},{"count":1,"class":"io.quarkus.smallrye.context.deployment.spi.ThreadContextProviderBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ApplicationClassNameBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.InitTaskCompletedBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.SecurityInformationBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.StreamingLogHandlerBuildItem"},{"count":1,"class":"io.quarkus.deployment.dev.DisableInstrumentationForIndexPredicateBuildItem"},{"count":1,"class":"io.quarkus.deployment.logging.LoggingDecorateBuildItem"},{"count":1,"class":"io.quarkus.hibernate.orm.deployment.spi.AdditionalJpaModelBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.CurrentContextFactoryBuildItem"},{"count":1,"class":"io.quarkus.rest.client.reactive.deployment.AnnotationToRegisterIntoClientContextBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.common.deployment.ParameterContainersBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ConfigurationBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.common.deployment.ApplicationResultBuildItem"},{"count":1,"class":"io.quarkus.agroal.deployment.AggregatedDataSourceBuildTimeConfigBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.BodyHandlerBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BuildExclusionsBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.LogCategoryMinLevelDefaultsBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.IOThreadDetectorBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.InvokerFactoryBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.SslNativeConfigBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.CustomScopeBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.common.deployment.ServerDefaultProducesHandlerBuildItem"},{"count":1,"class":"io.quarkus.agroal.spi.JdbcDataSourceBuildItem"},{"count":1,"class":"io.quarkus.deployment.ide.IdeRunningProcessBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BeanContainerListenerBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.TransformedClassesBuildItem"},{"count":1,"class":"io.quarkus.netty.deployment.EventLoopGroupBuildItem"},{"count":1,"class":"io.quarkus.hibernate.orm.deployment.JpaModelIndexBuildItem"},{"count":1,"class":"io.quarkus.security.deployment.SecurityProcessor$MethodSecurityChecks"},{"count":1,"class":"io.quarkus.arc.deployment.devui.ArcBeanInfoBuildItem"},{"count":1,"class":"io.quarkus.jaxrs.client.reactive.deployment.RestClientDefaultProducesBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BeanDiscoveryFinishedBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.RunTimeConfigurationProxyBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.common.deployment.ResourceInterceptorsBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BuildCompatibleExtensionsBuildItem"},{"count":1,"class":"io.quarkus.devui.deployment.ThemeVarsBuildItem"},{"count":1,"class":"io.quarkus.datasource.deployment.spi.DefaultDataSourceDbKindBuildItem"},{"count":1,"class":"io.quarkus.smallrye.context.deployment.ContextPropagationInitializedBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ExceptionMappersBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.InterceptorResolverBuildItem"},{"count":1,"class":"io.quarkus.panache.common.deployment.HibernateEnhancersRegisteredBuildItem"},{"count":1,"class":"io.quarkus.hibernate.validator.deployment.HibernateValidatorProcessor$AdditionalConstrainedClassesIndexBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BeanArchiveIndexBuildItem"},{"count":1,"class":"io.quarkus.jackson.spi.JacksonModuleBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ConsoleFormatterBannerBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.SuppressConditionGeneratorBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BuildTimeEnabledStereotypesBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ApplicationArchivesBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ContextHandlerBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.TransformedAnnotationsBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveResourceMethodEntriesBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.GeneratedFileSystemResourceHandledBuildItem"},{"count":1,"class":"io.quarkus.hibernate.orm.deployment.PersistenceProviderSetUpBuildItem"},{"count":1,"class":"io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem"},{"count":1,"class":"io.quarkus.micrometer.deployment.RootMeterRegistryBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.PreBeanContainerBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.webjar.WebJarResultsBuildItem"},{"count":1,"class":"io.quarkus.hibernate.orm.deployment.JpaModelPersistenceUnitContributionBuildItem"},{"count":1,"class":"io.quarkus.netty.deployment.MinNettyAllocatorMaxOrderBuildItem"},{"count":1,"class":"io.quarkus.smallrye.openapi.deployment.OpenApiFilteredIndexViewBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.VertxWebRouterBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.CombinedIndexBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.jackson.deployment.processor.ResteasyReactiveJacksonProviderDefinedBuildItem"},{"count":1,"class":"io.quarkus.deployment.Capabilities"},{"count":1,"class":"io.quarkus.devui.deployment.ExtensionsBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ExecutorBuildItem"},{"count":1,"class":"io.quarkus.deployment.dev.testing.TestListenerBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.SetupEndpointsResultBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveDeploymentInfoBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.ObserverRegistrationPhaseBuildItem"},{"count":1,"class":"io.quarkus.jaxrs.client.reactive.deployment.RestClientDefaultConsumesBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.common.deployment.ResourceScanningResultBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ServerSerialisersBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.QualifierRegistrarBuildItem"},{"count":1,"class":"io.quarkus.hibernate.orm.deployment.JpaModelBuildItem"},{"count":1,"class":"io.quarkus.vertx.deployment.VertxBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.ResteasyReactiveDeploymentBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.BeanContainerBuildItem"},{"count":1,"class":"io.quarkus.deployment.ide.EffectiveIdeBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.common.deployment.JaxRsResourceIndexBuildItem"},{"count":1,"class":"io.quarkus.micrometer.deployment.export.RegistryBuildItem"},{"count":1,"class":"io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.HttpRootPathBuildItem"},{"count":1,"class":"io.quarkus.devui.deployment.DeploymentMethodBuildItem"},{"count":1,"class":"io.quarkus.deployment.steps.CapabilityAggregationStep$CapabilitiesConfiguredInDescriptorsBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ApplicationStartBuildItem"},{"count":1,"class":"io.quarkus.devui.deployment.RelocationImportMapBuildItem"},{"count":1,"class":"io.quarkus.vertx.http.deployment.HttpSecurityProcessor$HttpAuthenticationHandlerBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.CustomScopeAnnotationsBuildItem"},{"count":1,"class":"io.quarkus.flyway.deployment.FlywayProcessor$MigrationStateBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem$ContextConfiguratorBuildItem"},{"count":1,"class":"io.quarkus.agroal.spi.JdbcDataSourceSchemaReadyBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.server.deployment.BuiltInReaderOverrideBuildItem"},{"count":1,"class":"io.quarkus.arc.deployment.CompletedApplicationClassPredicateBuildItem"},{"count":1,"class":"io.quarkus.vertx.core.deployment.VertxOptionsConsumerBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.ApplicationInfoBuildItem"},{"count":1,"class":"io.quarkus.resteasy.reactive.spi.ContainerRequestFilterBuildItem"},{"count":1,"class":"io.quarkus.deployment.ide.IdeFileBuildItem"},{"count":1,"class":"io.quarkus.deployment.builditem.MainClassBuildItem"}],"itemsCount":10444,"buildTarget":"lions-user-manager-server-impl-quarkus-1.0.0"} \ No newline at end of file diff --git a/target/classes/application-dev.properties b/target/classes/application-dev.properties index 836e8d5..ad9475f 100644 --- a/target/classes/application-dev.properties +++ b/target/classes/application-dev.properties @@ -11,11 +11,20 @@ quarkus.http.cors.methods=GET,POST,PUT,DELETE,PATCH,OPTIONS quarkus.http.cors.headers=* # Keycloak OIDC Configuration (DEV) -quarkus.oidc.auth-server-url=http://localhost:8180/realms/master -quarkus.oidc.client-id=lions-user-manager -quarkus.oidc.credentials.secret=dev-secret-change-me -quarkus.oidc.tls.verification=none +# Le backend vérifie les tokens JWT envoyés par le client +# IMPORTANT: Pour un service, Quarkus valide les tokens JWT sans avoir besoin d'un client-id/secret +# Le backend accepte les tokens émis pour n'importe quel client du realm +quarkus.oidc.enabled=true +quarkus.oidc.auth-server-url=http://localhost:8180/realms/lions-user-manager quarkus.oidc.application-type=service +quarkus.oidc.tls.verification=none +quarkus.oidc.token.issuer=http://localhost:8180/realms/lions-user-manager +quarkus.oidc.discovery-enabled=true +# Accepter les tokens avec audience "account" (audience par défaut de Keycloak) +# Cela permet d'accepter les tokens émis pour le frontend sans configuration Keycloak supplémentaire +quarkus.oidc.token.audience=account +# Vérifier le token (obligatoire pour un service) +quarkus.oidc.verify-access-token=true # Keycloak Admin Client Configuration (DEV) lions.keycloak.server-url=http://localhost:8180 @@ -27,7 +36,7 @@ lions.keycloak.connection-pool-size=5 lions.keycloak.timeout-seconds=30 # Realms autorisés (DEV) -lions.keycloak.authorized-realms=btpxpress,master,lions-realm,test-realm +lions.keycloak.authorized-realms=lions-user-manager,master,btpxpress,test-realm # Circuit Breaker Configuration (DEV - plus permissif) quarkus.smallrye-fault-tolerance.enabled=true @@ -52,14 +61,17 @@ lions.audit.retention-days=30 #quarkus.flyway.migrate-at-start=false # Logging Configuration (DEV) -quarkus.log.level=DEBUG +quarkus.log.level=INFO quarkus.log.category."dev.lions.user.manager".level=DEBUG quarkus.log.category."org.keycloak".level=INFO quarkus.log.category."io.quarkus".level=INFO +# Logging OIDC pour debug +quarkus.log.category."io.quarkus.oidc".level=DEBUG +quarkus.log.category."io.quarkus.security".level=DEBUG quarkus.log.console.enable=true quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n -quarkus.log.console.color=true +# quarkus.log.console.color est déprécié dans Quarkus 3.x # File Logging pour Audit (DEV) quarkus.log.file.enable=true @@ -69,14 +81,48 @@ quarkus.log.file.rotation.max-backup-index=3 # OpenAPI/Swagger Configuration (DEV - toujours activé) quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.path=/swagger-ui quarkus.swagger-ui.enable=true +# Le chemin par défaut est /q/swagger-ui (pas besoin de le spécifier) # Dev Services (activé en DEV) quarkus.devservices.enabled=false -# Security Configuration (DEV - plus permissif) +# Security Configuration (DEV) +# La sécurité est activée - les rôles sont vérifiés via OIDC/Keycloak +# Note: KeycloakTestUserConfig configure automatiquement l'utilisateur de test au démarrage +quarkus.security.auth.enabled=true quarkus.security.jaxrs.deny-unannotated-endpoints=false +quarkus.security.auth.proactive=false + +# Configuration OIDC - Extraction des rôles +# Le backend extrait les rôles depuis realm_access/roles (standard Keycloak) +# Le scope "roles" de Keycloak crée automatiquement realm_access.roles +# Syntaxe Quarkus: utiliser un slash pour les chemins imbriqués +quarkus.oidc.roles.role-claim-path=realm_access/roles + +# Définir explicitement le profil pour que DevSecurityContextProducer le détecte +quarkus.profile=dev + +# Logging pour debug du filtre de sécurité +quarkus.log.category."dev.lions.user.manager.security".level=DEBUG + +# Logging OIDC et Security pour debug +quarkus.log.category."io.quarkus.oidc".level=DEBUG +quarkus.log.category."io.quarkus.oidc.runtime".level=DEBUG +quarkus.log.category."io.quarkus.security".level=DEBUG +quarkus.log.category."io.quarkus.security.runtime".level=DEBUG # Hot Reload quarkus.live-reload.instrumentation=true + +# Désactiver le continuous testing qui bloque le démarrage +quarkus.test.continuous-testing=disabled + +# Indexer les dépendances Keycloak pour éviter les warnings +quarkus.index-dependency.keycloak-admin.group-id=org.keycloak +quarkus.index-dependency.keycloak-admin.artifact-id=keycloak-admin-client +quarkus.index-dependency.keycloak-core.group-id=org.keycloak +quarkus.index-dependency.keycloak-core.artifact-id=keycloak-core + +# Jackson - Ignorer les propriétés inconnues pour compatibilité Keycloak +quarkus.jackson.fail-on-unknown-properties=false diff --git a/target/classes/application.properties b/target/classes/application.properties index 0cfcd12..88055f9 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -71,7 +71,7 @@ quarkus.log.file.rotation.max-backup-index=10 # OpenAPI/Swagger Configuration quarkus.swagger-ui.always-include=true -quarkus.swagger-ui.path=/swagger-ui +# Le chemin par défaut est /q/swagger-ui (pas besoin de le spécifier) mp.openapi.extensions.smallrye.info.title=Lions User Manager API mp.openapi.extensions.smallrye.info.version=1.0.0 mp.openapi.extensions.smallrye.info.description=API de gestion centralisée des utilisateurs Keycloak diff --git a/target/classes/dev/lions/user/manager/client/KeycloakAdminClientImpl.class b/target/classes/dev/lions/user/manager/client/KeycloakAdminClientImpl.class index 7defcdd3c3961afa4ea70f5d3feff56b0b25fd04..8ce3fc69905b3566db7aaa9579cbfa31454ec449 100644 GIT binary patch literal 6749 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 literal 6372 zcmcIo349!775`6?b~l>=N=geYB`gI>leSrqVvk@;n>Mf|DK%-s`Mv`Z$2s;9m*U7&sxXhBA)rxk08BC_huMTx)>OoMS6D%$%yW=N!)(T$L}_Zo7V$ zEfk#u>I_WVVhvdt$8rZUr}b@7xiEpL29A5#0u9tU-hhF|PR}361Wy0rEtyVlfLgQ} zIJCRuhIT<^-61=$`y92(b-mCEMPp%cyh5Khm^oRw%C|z5Crdr;7*hTw-w}dQC3`~O zb_Yl>E0)K;# zks60h${-<*_9OZYRuF9UeDY6DU##pm(t4M6)9)KR&*`zxrLEJeyqk4H6@~1`aYv7G zE-I3BQJ{Ivyy~|~PS|TXC5oy!?pOo+OQgM0*rUjkXMD$-9q%s+$^OO*#LKeRGdrJ6DuydY#!2ccieg>6YJ zHPDhJxotUipbIXYFQucDOP6sWy-G5=wY9YY%W+}?JY(8;-;iflrcP>w#cY*k9wTT9pB7BXAS!>{!N%*TG5Ft^UNIaRY*6O8o#g#>7 zO&ka_iBp-s(RRDWwRCn(nWW3abRjv7p@~S!g;l0_t%(^hQ|Q5_1U4FI7Nhr`cB@Oa zlUKfpUYu?q(HAY57W1Qg*(dHcIr2<#%2@_hPU4D}E9-S8UN5qyXy6g)Z#3~Hd6SGn zoz2V3J`*|pvWy@S9A)C*$O!``HtX#&U@7sm3FMO#^CW>lFTXWz$FP>%wibrlxw%;R8gSb#HDyM zok}yhR1k17FmMnp86}M?SSs{#6K}y4jJNWA&o{7alJu9uoKK zidsor#dIR3d9;~`DMkh=GBOt`zuGk^?8G&KpV!had)H{=X5ZT?2u%1eV9?eXRoYcf zC&um96I!{!E~^-0b%Ty`5L#}IT%2Br29wSZy5)tQ!(oM_nQj&OGCQOS);9TWtDu&{ zSuLHISB|xP3K#OjL9JfD*rf6M@JKD`hM7>&4Zh`M+Nr(k2>}Hrde*j|wth_y=dpcO zW@FTR$vtIAnsWK@CSrF2ae? zEACAnGVx*Eg|=G0nyql`O2s|*aCViFW`or@%)*r7Y@`z&HSrie%8{f%PqO%P zR(QG{Zq}XJazl;-^Cne$w0bIYZ@reiUXQ6_wlp>J|JP<~{xN2M!o+>JzX5yj=>$GS zi}wLM$2iZ#lX!{=C~bzSEgp}WmW&(afv)2Jv5LeoWs&_a#&rvS#W*qPb0$8IFHku@ z61|VgjTK~|!45Qr6R7ff{5&g(uMqAkBbCcU(0H8-_uM0CAmI8n$zP5?4LXKvx7mS& ze$rv;EK&AbCccgDa2gBQ)T&#Ffu-Y}I-wQi3q&SfQpR$!34PDNiit@)#Qe4UZDyv< zVK$s&*r5W}C5v@jN+Ie$u){04`3k}sID!ZlO{gzIA}Gb1X+XFY zG@Lli`f3f~#`m^U?dLeAcPPK0LSoE>j#zd)kwOagc@sYrU|_YxQApxvj8Av89N$DW zmx1RA;yrqt=-^$^z?`yFJwHYhrVQb&QkMo=D>@Urlwb61-Zpt$sJ4ZfRmGwcd$T9U z`=wlJ=XBa$=A4q{50>b&=uVtr7xKeWk=xT&dtOL$tzwr7H+%UYh2P;13H+W{qERHU z-63y~^NzjsM*>f=+&l|{_bYFZCq@lO-~D5Fsd_VpapU%) znuPr9D*E!wUiB&#(QY}sYKE%qfT{Rx5`SSF$9DY+ezNIv4$#H1JZ-R}WH~1J`aY(D z1pY?O34WN&vIPFYYvJ(bUtv@p57@cVxH8*e!L zen5a}T=EVwaYF!~H;;)M2XTWJj)@yHxxpcP;>ID|m_?94NKWgOgLop}7Vccz+ zZ1-^4O_P%IH)$GZ(vdid+(&cO%%}X+HyV#%-UC>89~U)fQx6|ZIezY7j);%e zGq%7IX2wz+f@PRTTwjbfQmsG-R-y|hVIx-IY`*D3J8Z0h!#xit<9wV#Sy}ADI^2v? z@g7o(uV+RMi5<6#A-xW7<;mA`uO2loU}pk5Bnvo>#2#Hvb>7a;JF>U|H?G4?c&EZG zxD~gN;9cu*JMN6ucaiAbSsr!w8oXC1->%!hzy~4~$@U4O)ir5qWtp zcO#P<88OhP1U50_dzr&$RKj58c}(nm)W> zA){3Z)`CYd0xXn(X`_<#S~*^k@)qCpF=jcIQ(h~dj^tL7bv{0(D=@{967Sb&?=x|; z^gX3MjwfCrn^sbe6hK1@4f^;9KFK+j%jyy=RHa2jMa70#MFXF~Xa7&iJUvmF(n~1w zMSO|=5oo!dJ{8NFqokTryL(L0)$P`m_GPKG5qz~4wYxQWf`zn$0h+0wQO-3n+ko@< z_k8YL$i0j7?krr)fAC#WrBZY3pIJoY(X!$H#p~Bck^4Hn5$ktXoK16M&wrChP`A6Q zcDGKd?~W!_tXKoV>lv!iK+)xViWJ+)ce}WIB?0*=?q1EpxCUuls}*a}1v9r2xVdrQ z1iY`q5BT>${*Go@3N>8`JhM8|mxBu_%CPw?&llfXd?y9lBrbgtv!o1uq!BFg@sC>! zf}8+zYx15PeS4E(u#&0u&lP3Y0@bRm=r(2q2ZvNQEV-l9EcjM9#(yPIm3G>#b1# z6&yg~zz^U@A!au%gj3XBW;7oA&70?$U%!9+1n?4%O2{Gapx|N-^9)NPaV&Ts^pLmu zBk5a)`4>tn`-&mIUhNif2}K7b7nk8OJo8P+4@GQc^f?UpNciK}Xg&~D^pzg)H!_xy z5`j7qRvF!p!X}Yqs5G{Ayk4u>`_O#XZ0$FDyY1HQc6)DUyTkC@yAW!vgezEdu;k(@ z$_yJbP$vDo7e_}jVkr7XAF5%-Zn%Cy1_#wy52uUP99$=w19{8?5+~*fiN!;q#gP1j z4}Uw6w4SkZu*^_ZhJQ*#G*05bf=|QNlh~S2oupkA>SjQ4FM3MLW)k*gv?uxjos>P} zi=Zp$b0|JNEZC1KX4v%3L8+EXcUF<%=}hUSsn)7p2G?YRcJ>jQ=aP`2)GmdXu5>!?yrc9mkk;rL9^e`+2g428 zl+@FLkiAI}C(p>wJ^l{%B}?BTo2G#UtdMml7f``%iWu(TF4^?)Yvc(IC~bU&lmCW= n{eKAQHUec7sdS36Jh^#_LT_*ntAvxoeahyD;zROj-8JA3$kh_+ literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/config/KeycloakTestUserConfig.class b/target/classes/dev/lions/user/manager/config/KeycloakTestUserConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..457b21a871bbc9c4a53bbb048ac6db5b9bba96c3 GIT binary patch literal 14124 zcmcIr34B!5)j#KDk~f(=AS7%-!9kEsk^z;)1i_F5%tsbTLMUhpFEbAqGMR~QX2N1= zwL2ASt<{Rv)>ijgG=^TeFZJQ~~95mCZL?0e6OzWv%aCLx%FTfL6(*T4Yk~%A|~fG)t#54Vq1Jn3jyr$|y546)Vn| z))oSB%&g`(Eu*PbU?=M{h>3F1RZ`kS=HTTnbOw$|e6Gt7bkEDYNZN*DXO^qKA>_8m-9=5Jk)w@;U%P9|25uq3^W}j-fG~ zKi{iIW89gt;TD+pb2nWZ%#&dlc%C>aiq>XOJ8cjh7Fz~@!}Y{tjYB3N)LDhA6Ytky zP$zXUjqhmMxT(3Lsc~CJdrMO%l+oE`8eSyS0@bN2qi))))0+(1LR&FFftu?E`q7jH zAD6HNA{SBB-R!nwhD+$pI=#i9ZL}R$Jv2j>1ajGBCflsNDdnHH%7`9=!UWuXan(F2 zJ9nN}uhR*F%yagRD=ed36xC_BLA?|kqebQe1Ri!;;G`*E;#n{273}D6=g=;rI3;xI z7yoc6Q^=$8uRoq?`EVH*)Fy0Tge!o8OzSxD1q6bTuE0;}5tf=Gg{A7Whv{4ovtwH~ zKm%f)1GL|u%fvi&SW%nVXH_6nA28@`^meAHeP*wP02ww@o1>{+cuJ9EeQIM zCA)Hv1+FmY9kRf9EYN5ceZ>>37zs{iR#Z2{RvZ=2>wNLE-1~H|>l6N%c`%E`B==9OCsERP_RnY+5NH-hw zG5R==gvm9-+`V@0^6sZkAW%7(4Kf*|EF%>GW98BI(d=I3dZJ%UyCM(IDnnV9-!_w(ousxBidL7ZIrFXq4IvZ6Y41vzEGty zHApmt_Hzb(J{!53`pjs|Pj|!9NrEZe_ZsvC={7Lc+NhmW=HsUfNMvRqId0HkcC{AM zp^)}Q`ST@%9+3D|j`3>xZp)7Dh*}X*u`i2hJjB#B2GbZRvO1A}ehLsy*pj>@`(eTs zqNks}YS0P#8n}l<8xZ|dRzw85M09fWk@vlL0BV#%qeQdhHKZuROF|x zBSiHh;oXz4Q6@Z0-!$lPK~CIK*S>zp=-YS^87(>ITp@VUpzmab(=FM8G=9&Z?+c_N zk}j*SKVh3TOyg?$p_s;x{)=GYVC-bU2$d)4X`Oy-&`;>6V+$7f7$*U?u6I{imh#);uKvX| zUj%j8fuJoRD;adEyc0*0!4tQ5otFsVC4>G$FT%lRr1d zQx+;)N%1@pz-@=#&gCM5eOwG%a%w?D#bslYTZ5_{^Wq|dhpLgaU$rxF8JBWE=Q4v0 z9)~)63?d!20(|n0XgsoJpVKbhX->dEc`+d!bXdxkH#$#5!RukDP{!db zJIq^gIpPSH^CW{OXFYqCKeW?+KTl(t?KB13n;RRP;(a7eLVbn&X_Wa+H+Y74t_k87 z(mks(`Sh*7{gdA~9OM@Cq3=4#PHEJ?(aMXEcsMwM@abuC%$azjtZV zvP+|_m)39YT5C77hnsub>(}hxx_^DUj9+Q+1tR5AjPJBiH>O0bS0gs_g-qRJ@!HC2 zyh`*s(b>lGk&K&aDQwaXZpkk3|*slMb)mdEkr0&Y^^;I>F9ROj2GGUXV8$+`*laI;Y^_ z`(WN4I;S;+gan;+6~w&B;BMXww<#F|gzX{Uk&cJu7$md-IY|`7ja661TX?I^7aM#D zzZpg_#DiyUaIhm9L&ZFlvno9;Fk}8cJaeeEwi&#gO(>S^TqTdg>+*JWQe(#I0vzUu z&X&PDhSlX+5=;|KVlQ$sCHlDw$qq-E))n-YW0q2$oO?N@bDzO+k@Hwi^Bg&6XTaW& zWj0zn%ycZ3uL2dM@g~9kQiE-VI{MA{zE(3O)zPf{_*n?xt$s#vJiC5(BAp822rDT; zJUCCCxy-{!uIu$B`v-)3Bm)GF`;e%3AQ;{CD>e0+Zh-gF&1KxnZ#DRUc!tSHjz(_G z�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 literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/mapper/RoleMapper.class b/target/classes/dev/lions/user/manager/mapper/RoleMapper.class index 4f334fed5d67ae2bdc192475e32571df58adb100..6a212b25c6722da64931c5af03945c95815d9a0e 100644 GIT binary patch literal 5099 zcmbtY3wImE8NDORT3eaO#yEx~5J(WlmW`D*B}tKa#de6P61TCNmQV_7Y2$3X+Et~M z+dwI_y!wE)l)fMI9r|vdpg5t0@HmHaIQ%By&hExqNtPOm<8w5-vorJE?|%22Z^rL^ zaN%_Tx8a>QBIwc(mFPxHp#PMqP4{+zu94AWarB^9LtJ7L zq`*yiVhiv}7>- zfIl}AM*@8s`X#QwfWRK7w3J>pPUkE~Urv{dV#z2QwyV1yATwX^%pa}m7wBFx+}XUq zAaT^Zop(#7y+jLx*rH)b;woG%u(vay0uhrIvLnp~+WNkzmyPrR{*ba{(1v~ACb3;P zuF-`fdcja=ua($=>ja`UJ36o#4%2#k@08f3Y$j-P+9>BrW>N90OeZC7RHirO>-%q# z7{RDOk9)dks1ORA7-$y{zE~E5;hDB1wFf+iF^O@7s<&k5R>7w!feDE;b`z^v zo^lFBr);`}MM)ozUWwzlPaxGIZ`YYh!&BMWnIj7i9G%O~2#jw;sLH?l zCBBRY1U4)GER!3MFZrP`pKGx{wh1~GHRL4npaK(~+$yeVrL$(4+ik?5%myy)O=}-A zYTlB>NtoP{%Pz%T5ZGQf&hJe#cKnzb;0C`eVS(ei^<_@SSS@U;Za#Hf!HR~jN_-7;YI~EN zDaW!{yPOhH#9YTGcE@^Lt&Q}+KP>TeJVK4<`~?JdhcN~yYIDL{fnP4ky1=7~^~VIR ztFze5R~+BM;~JijcoI(ujI8G#Ro~D>O|^(1NDw0c*U# zEgf;8pwzbfASam3^RAv-Cf@i ztyH;AQQ--uo~FrGlbfWX92#sCn;*+vjlMOR;ao2olnkR0gnF%pYz)K`jn+0Yz1jax z_9?~1fTb4}^Llbk(@CD3r|N<+eiw==bcI^XB;%uUe{OKx+fHD<_XUO zF3X8tJZ!ipoqV}3h8N@b3;wF%ZxVmUKLmEwJT&bUXW2++JtjCqKcTDY#@e^35Po|< zOiM7yH*iR|^OjLgW*uj_Qe1BjXtL%{R420V@VZsoe)LVYpBpZq!OBy*WzF+&p6SQG z1ct*N1tm5-Dd-}7XH_+QN#ghTLqGl_z>TjH$z6VsY4cTOvnugJJlBusc*LExZKE`0 z>E*J){7a~~GZlj?oQBuh-zeK$|1|us{cSrumzL`Pgx=OA9Or1_7J#9X?Bc0KSXw@vT=Kfr80r z)W0Oyw=eZBy2aU5XsIeTS8?S<4DxAf71yx2zKR>hs~8@uBE{F6SMiA|_EnKN%c)(S zxe5N00=N=U-c@6~(8qB#pSJQ2y^VL;?HI;2Na0%S;SG8(zbjbR`=;>>p5+@s@G|** z59&T%YVRYoAF#IzB1X)Ndw}^Jb}1qb`j}rs;@)$(BRfW9cUEziYGIVVG9HTXvLSV;JRiBZVQ15%4&BZpH-vrm@?DKI9|7 zkMKO_B(UFeLU@3a=!$(vCnFkqG=3BO`H-V7y|YcQkmASq30F}ee4ZYuC=AmhZ50om zO`QjCCS&6la0)mNJAzfX=kZVk7ojV}QIGU(#HnbD(tZyz*n&yYeH(qqga{tSPw_L3 zA{S*Jj%fZttIL9b}1b0!{Jvblj#RdEqud{svZ{lri F{Rrx^%7Op@ literal 3632 zcmb_f-**#56#gbH-8O7#tWYQ@EKq8a78XzxNhwMx6bwaaK~Pbq$t2x&cPD3e({uXZ zoBx6DKKqDI&~lD?eDNHQf0M^Mvn$!8rMA(Bc7E)=cfR}GA2a#mug#wUTt&k`h9O@S zYqsl1KeU^n2yBo0yspPagNFOk6?eIs8t7%nt?)H&yWFqa_m);fC1U8Ca(pM6X6VTm z9y0XK$g0Sq2LmSdp^ssx?D%57=`D$1kuSM|VYnPdkjD1%QC3jt75(4O1^3bq7jHt_z{n^V@}o6j@)nCFO^%)EJT6h*GsQET=-2d zv;*S8UR-YoMM|mgI^k+0V^JkW_(}%eAR1bS%?5!C`tc^ij}LqTD%~|vwJOqUIIc!) zH3CV@c;OW*JFvJcEKfwsvTFI#%g0CymJ?b{zba}(Zq=&Ez=}vNB5+oPH=<@BPG3AL zYu2^cfTRHOh@?(l-CmOi^`=LRX%qRdU@b{P&;3cuZ@O+aiyRKAfQ~R6%5No3MLrkF zc7hq6=66j}p{o$~<0!+UomuQ4u`Z%{;&CSilfY#e26Tp%osbfpoY66CMviN%t^b@r z9p>n`1*h(F6+MREI**&`ilOQM8RgWjBRXB$4-2OZoMbrA?y8B?7-PuD8g+wwp_5mo zH*Vq`0oZPmS&*MNGXf=@V;sabJt|A$y>hbNkdL^#GUola_6oXNTtuUNVV@y!AbP|ZE)=v$%U$sOkdTQLc z&LC1YQ*2yso_o6IYxr87f~J}+sjGgaij84%FQH)=X}?0qOmdCf>VVO0(J%}yM7**} zcVA-pU}t-asXmovO?QQKF!ct*cb!6esiIDM-MTakhC8ZAK4Cb~mLOXbG6^l+UKHA- zgS_f{djU^|T<$GZ`Pg}VPjAVBy~Mq%2DtlsI!gq7X5s*bs4SAqX1LVVsSMc#*$gV; zrlZn(NM(8ajyk6(pnAD3WkglR8+Y~P9%k_fUl@4IaH>U;uCoSG)b;pnKkvr?A zdrD$?hP&>96N%DLA3kRoPrDSqIO*Zl0-J2*@U;paH!+WUr1@0e*4?}bcb_deRFY%s zCJy5W9b3!c2!nas_eC({@-P&k0hi%S3ve5O?O`$CGaTPplzMy|L!2akd+6E&`e;Tk zZTfG}%BGRgxUcve{XfwpgKQ!M3}Qdc%~*iOL0S!{gin- zVOFz`ah*`i&^+ctN!_5;EdBL>^%F5SaqAV(ISuq%S}XOjcA%TM{qHbu5X@PEIY%&W z6Loj!5j2+y$Qa5RW($(qxtoHN%c}e)04mTI63&dt;=~Jlsz^x(YAR*fz=1nFyX-Lx+3KUw>Hk}00(y}$B(0w6kOA`Vuh4PZTG}F$K&b$ev zfGA)Q1w=p=aYc~Lr6^1js)(pX0XN)0MNkw)Q4n`T>woWilX+II1~#iw%I*)eaud5tzXx+&1rW9#S5c}sJlo|STnmd zj1WpJgcVAm1hYDvp88lcnMl`X(oU*AZYS)m96Q{kM>vbrWi9IjR$C?->u^$n1vRr9 z4{}+xzkG?ewjqpijJHssa0n^|^OC8p_1m4^_E^&1UY~NhQ%>4RxVCE)igv{7_4*Bi z=z?)u9d~typo)6rt!;Kw(Zp8nP=$#WCMitDp@I{~rl_DG${iYOhHfyb?QM42sb9i> z=(1{m4B9?L;c#tuDNWF(CG5DPH9k^dDvlC_GCpw(d+VjfUwUsXoMUkBX$sTz-XZS2 zJZ?v0dgE$^8G7S!jz=lSEQK1(7L1Rk4Ogp^igrdFdSl`se=kWUV~(9L4zE?H!?A)g zBPGA0Dd@l4f>9m#zl^9?n4^tQG-5?Gm3G(q9z0%Qo;IYI7)m7L8fYgdoS1WVqn&3x zS>Y7TTIlmNC@j<#m(b#b-4=5?!dQgUES#>e7)u0)4J*LJVU5BWXrvR;MzEl( zW~59VUdV`h9#{{C0;~#a71n7KSWeE1RX9^&gZ6bv%CTc{FIeShQ8){�#Ui*k$6j zWn3psN9Pchaig*NCcE2Mb&kSDY!Za+0PAWWS_7PKL-lfORyYsm3o5D524_bmnsPc8 zx0^CV;vlUWqiNTub%BD7HYQ5yzy)i9x*7hrrCf)CgHFK&Dz}t=be)ctXxw3p>lmOM30kl1M+KwIc&uHRoA5s^^M7P zJGP7}=@rH;356u6m+BzZsLNt5X!gYnvuaf5j8;)YpvtPdE17V%Fsa&{R2W@w6*A}{ zn1bN))AZb$#xb;uJ{-AfhTq51rY zw3!IuodkJ@(`~2RINP9Ryj(sM)b`J zx9Hhojjs%+Z{s#PiaY6cE%|nZ+i;Zr`iR0u@i7WAM+HGG6K4eM9av8YopKcF!^wF4 z^+|<0aTg_}y;eUl2twcA-dSdfX1_<_Ud>)gcHQ~Bwi?1TJ^5*c&*;ezC;h$`!sirr z>zZFdkPK>bdd24zzJLcgnOl+XXp@4940JSes>&+t(e0*$BG(Tzp?-yj_3nzY0u3vK zFDiUVvlo+nt=F)=tng^gjC{ii;W34;YGuP(*<5X1gs&^?!{ZEdkM2S1SRp3qu8{|3 zPCsqaHx-`HHiflKo(v05<$9Z`qO0t57YjicPkNE~j>30yy|yKX=Tbb4?_2nR!VmEy zLAlw@EZ2pO=cXj}s1AC`JBBv+iVd(fl;RmYYvCsfKgG}33-Xev1UqVXhT={hMpD4S z!LkFVUg9Z)pDR4C4H!?qtuqeA4va zDEwB_Ez;LBi!|+b3cuGheW+^H>7$8%Q23)JY9ut8tkKlh6#kSGtE;7#KOwYeNBl+M zulO6$K&uzWShOpB!;Qb_kOmF+a{NQ#pPH|XVa#_^*V8;e*=>}|D&N)N<~>xrlefP3nu5)8?+lS64yw{VPphpLEsHq z-w>8Vq|%ZJN~&Zc4I8r0(j+6=?j}<_n-sfA58+dXvwwioC_h=rp>mihz(#;zPSE$h z7Wp;7r1c?9P{`p*j*ug1CUGQ~8T8}Gz}GQ5O3Bgs;A-hJe7D=HY16f^WArJ0^)TC6 zGGox)(Th`9W=V}Dvz0`oHka%J=L`Zo#^Xl*1iU6J$I5Y*)GL`Ib91%Dbo|u`9#;~y zLM1zwcPHDsnwTt6U9r~q+637cnRznbk`t7iC@19w zci=J@;G&pQWPv3ON*2ngIUpH^LFX14lI$GN@O0nLgB0@c8k8MWdyq7io-R2}$?39~ zN#G`V4HKmPe+Q3)?WpYVOOqWA%U@$O;jA_1qZWO=VRE zlSV$i=9@7)m>)_)pyGgSxj|4>Pm{5nqm8P~(X9zydsD>W%?GNwa7>|EbPyIU90}G# z;G&f*8@OufD=Uk?IbzW@)d#p{*of$Ou)+HmG~b&8Ws~A7V|Ki)!>%5PTJ;=LB8H^G znB4JJ&>C(|W>W3Wil{CNmc!YG>uI%n6$L&gXq{kOaM_3%`v}CK2 zE@26up4U2>=t*wprO;T%6?UhsyC)9;rSager-H4_U*v7D%1(5|oOE?#GPym|Jxp8! zIWlNr3)3pde(;mtmZPr?c1&OLQacuFj=D}mg&aw*@HMSV;!4h!Efta!us)3?L*7d4 z)apdSNiB`p>9l@4Dc8}gcS@J`W9;#@l@XU%df~BcHn=vV_0p@eC^*$3^x)9^glTEakuYWgM7V{JPtG-@%;x_QzMj_NB)--z!?AoTJdQ7R^=KvaJj_K5$MflA9-k)W z<0_nh>-m0q8@cbm$+(|yrVn5N9>fge%t@ZZWTmX)p1?!cAgk%lHT*7w6w|+FNTcW9 zf|Vo{@@lZi^Y31iZ`^~AH`dZ6pUC14J$@>SyY+Zq7WeD%vspZ#$A_}$)8pPO9?|1h z_MuD<^!ME;D(b`6viQbcJV}AyYU0GV_hCX^BZ4`6WZXn&g*)G|5`(RL+yXhJ;Y!^Vlfsn2YO4*SY6W z⋘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 Gg8u+{+C&Ec diff --git a/target/classes/dev/lions/user/manager/resource/AuditResource$CountResponse.class b/target/classes/dev/lions/user/manager/resource/AuditResource$CountResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..42dbc5c7631dac2f7d27139d49e966db1dc8d703 GIT binary patch literal 716 zcmbtSU279T6g`t{n`V=K*w&A>Y9k1?1)U#IE0jQKONfw`JgSr3YdU3jW|^7of6Ai| zBKY7--uzMG-6bIPP26Sgoilglew?#Ee|`S}-~{_I8fdlrr(~wgRKB0w zQW6A~-)f`7JAvlG;kbx`r= z$f!a~_2<0IDb-3|B{!6-V}VXeK5@FJk_l`LZ9Z|-OJB`r*?g9h30xsMxI7%Q>)Vw3 zS|4ab!!nT^us4+&0^6hc ztfs7&QZKQ25tw9wl_B|XZhdIssle-h>O!Db1_zz)mDy7-3 zGU~8j<8R$#gB>e~2W&SvbcQCsKz#HK;%NUXT3;A7u*G(*iii)0#7DHnCv5ZHqdI+z ihrFtucu^+8V@3@;`Mcl_cI&_%p4G>Be(d2n+P?wGEV#A+ literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/resource/AuditResource$ErrorResponse.class b/target/classes/dev/lions/user/manager/resource/AuditResource$ErrorResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..455e3b92642b21ab6928efcb6f5940363a521d24 GIT binary patch literal 746 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 literal 3525 zcmb7G`*##Y7XB&;bZ64M1_YGsitK`UkTeKLU_y`#0Roc*lNcaAb~~NUOedZ0vAZXj zRoD0X?XK*)>ps=P4<66)brAF%|A76YR==v5PI`g}%n#F5w{G3K^?mnI|NH-UKL9v_ zPc$?L+&}Fsn4TN>ky(kH(44n?tH^KYL_sCA9rKi9d2wm9HXZP%%Yp018kz*w&sqzX z=~;f!9GRMR>{y`D3yK2SLJ$_s$eYeA98@3f(tBytcjG=@t*w1RpeY|rI~i=iMh#hkEh{g2!m{Ha zTr{u=cL+2Wowy2sz|Jn;}!u^z}l8K zVTG=o*MzHkm4_KLqSe4%SW7SCl1or~ZiLiL*yY7H(DMYyY6wu))?U3rC3Zb?$SPB> zdCV>PR$K|`-NBXXy{Q|I#i8pLb16wRW^#SBvXSB{0T&}PjLee*Atl;i?93Y|V2DTAl`v#lj&sY9>v=Nlm?@_-7{P-Y&I+tu zj`~927o{hoWW4Qk`h2;PlLU<$cnHk17RKM8PbYkvRPSPB$xKTKH!WEZ%oPcr%iugF zHCzzbadT}0591Mm46ELP6At<_fxw|(JZC9u#+J4ub&mk3|N>V zLF(GlmA;j(gie|J33at(vQ*6kX4;eVGKpk>u1oNmaKeanHiH?IG_XP+u5e2*pWL%>#jrUJop;sZ_TwESTPWwOiJlm?Zzx3Nl{YiP^&^ZLV?x+ zMs6kCUQ!)yyIpeZx$Q~KYe9?!4HZVdgeu+33|zz$EJIEh1~k)=PT%XR+;}MrF3M`1 zYoE~Z2ksjf9UU3faWR9Z@r;H)G8vXrWZ((gDa)Q{;MwFZLrxU2DYMR0U6q}ouAHza zib;Xq`W(3}R;3A^a7U`}EV;t9&4nP{coxe^^EpuO$t_p>HDj@5&#@G$CZ^$y`Vym> z1w}H*m~5`?P@g518Dg?1sABsLCo*}tsN+3$c=e3wlFyi~+B2q0t~;TQKgrrxO#&Ss zkc7S6d%E}N_zPQnk|a7lWbMn33=a?F#|Mt<_`85{d~hr!`3K`ZQD^i>`Zpx=RAb1D zskhS!SN7~}KmUU2mJG7anO4~~6JECx&2%3;8wS%A+lk1)daGRaTw5i-IU5B&?qO$Z zw`@{djH&{DgAjXZ@v#Z(9heR;Osn~B_*Qo zp@WsA6VGEe-eK$e2;KM$dliEF$tZ!SA*kb1JV!k~05O51c!B7h$9guf7m2G!$xC>d zvRAlAVqevNm7~`v=|j_xB%)D+&~S(^6#i>?{YNe@$vBWQB|a@Rq^kUT`Y6@jycvIQ zDgOEifDFhu;jc6McJ|!_w)eAtPKNho_b0F&W@6b2dH}tlN>q7BP200);m=E#Y?bzBu>KK z&*%I<73`CwcqQ0Us}AhpWngaxwq6JJR+9KH`q6-YEAO{(R7;Wn;J z`2cRbRYa@w0ek`7`UIAHOFa`2wWjL)J?EVM`}F_!^4f3V@sB^=eE^1;3F5&p@!I(C zE5fsxyP4Enrc_9snx4&Ps|x>6u~e*%D2%Se#Q+uolb}rqd#Rys>GNbbL?dfV!ZvG( zD0VG{oAi56b6gQBR>sPulF;OH_5D*p*0J7XgH00~73s&`v`!l*RI`3)Yz)QNY|?78 zg*N@v7}j5mYrA7?wdru1Jqvd%w#h)1YNonSvFKC;vVZu4#7NjAadg=`-?&3z-p*Gl znL^$orN4S((HOgIc9T~4rWcBHGEu)iVDxnkx?A_y^tp$4bLD#_i@gdvSFEhETMXz? zUt5RCkRtk5q{H{K`8(BOx#S8nVzZwEOOIL%i-S7nOSB&1u*ta15sr$s<@rLYGB?vZ zo0=>a3i)~c%-0_}5@e9$Hj|vtet*0n$SF>noUu8}IsHJCd7^s#CKnXWW3Qv*YOl{b zR?g-1Cza4q&$#aP_XMn=>|EU@J>|c$Xo;zc^AelgiNtAKza)22R(`=tf`*`&F7dMb zr396rFZl-bLKYsbNOa4vhAD|Ifi!THYl4dFq$SE`H6Uaj$yJiCG2brIpcra-LfbOY z$fg=CHQFQb$o3jtk?zP&ff_x}{}y|t*#En@Z>2c-lHtgx^OiA#{~IUjjZTeYE3NgD zlN=Qt9am`<2W1?0_!%}yY$7PwC|X2mVS|{xS-v=}bjnLhO5UNJ9=6JLIv9}3DBC#1 zb|GsQx-KS2h?+^^bmZ#YWZ6NHos>njdC9xtw8@!4MuhW5RaBXf^i6KbN>o`U9K*U<+xNz&WDq-p*BBflW>)i{4*O*6 zW$>AWT*S&R#1#n+@@tutOO=Yfb81p#>Z zGihAt?c`sC6ZHdjaJzykC{;L&P8l5x$BC$K{YMk|g9tHH>DGv87(`RcmZzHY;0TV& z=(0uG6rz%X2#)bPY?5{J7p%bO~)~7UsKS=vOd+V+_K|vI_|Yr$vga zSS}1PxHH==Jc!}6f?hX==rRjkyJ2g z*LGyh`-Tfs3`$nF{uOoM5`QkXiY{E{Zbz`?DrRJmy58M#DwxG}e$mm}KI_3eZppaG zP`C5mXCGv=W&0Tw+{PXL*wN0vOWi!^oLM7nNKFX>nr!vy?56c`lJ$^GX7q-BQYZWy48V%}n_&u(O_&;*492qX*MkTb|IfQW%I*hTh70Y}V&`2}+NVrB~ z-9(f6X}<$>YbFLQ=pZH`@`s7ZQQ{Is8>AkzBf&q(zWfXU^R%P4(S-#HFlj#vlwix( wN`#4SMG6lFF@zL}F+q4589HSNuY>RlVfKf5GMRkzo2O|tf&?nL{fIf>FW#oWk^lez diff --git a/target/classes/dev/lions/user/manager/resource/RoleResource$ErrorResponse.class b/target/classes/dev/lions/user/manager/resource/RoleResource$ErrorResponse.class index a9907eac00905baabfdc5237483d3e3292abbcf6..0a740efaa89977460fe60e47b0e15e207aa57cef 100644 GIT binary patch delta 332 zcmZ8by-or_7@TkKj$@BI#2@g7prHdSXy^nRB7!lRXhQ9&8*+r~ncIu4&p>D`eE|w% zV&Mb$AauTh@e@r<%x34?*>5H@3uoc<-alX80CceDLBMih`*4sU6vp9w*qnrV)I7f) ztDBUNX-7Ir4+&PSK9tBpy6}AD;7^0j^y;xvteyV3F4H8^ql5a8V0YtNHEYw8%$_Ne z_G6RIKB)EJ542WEcM=+-3?Vp5k~q0g<}TJop~?w@yAdDGU<{b$c;@-87!-IAw_Rmi z<5iF4-v+Po0&46(!<{n|SZB<`;^#4J(T5ZRZ1CSn=|_$tN=(`Kn`2{>nZVZn#BJ;> P7iCnIa^i|*>_UD4e04KY delta 315 zcmaFH`ixcJ)W2Q(7#J9A8RXd+m>3zXCckIYnLLY;PmG;`g^@uZE3qt5KPNFSUEe<` zD>b=fV)Gn!Hk-`6%o4lFvW)UlTnx+%{5%ZY3<8V{%o>_uoD7T%LOcwt3~ZBa7?<$! zc;@A$7CGl678j=$Pkza0QqSvJRFq#7lv-SnpI4m9$iU&3T3q6hUtGeV2-M09bP6L7 z0`&t)b|8-%NOJ%&XE6g8kYWT1@Bm3(pp+W}6A&^maA|F4;M3CH${@HA$YWv<29kUr zqZoez{qT!{lkqo$2vAH6DCY)L&L9e8f&drP9u@|1AdiVb0^LSQ1}U&IkiF6jvJ9LI Ia$tqh075t~bpQYW diff --git a/target/classes/dev/lions/user/manager/resource/RoleResource$RoleAssignmentRequest.class b/target/classes/dev/lions/user/manager/resource/RoleResource$RoleAssignmentRequest.class index c2473d8f58ff9eb96c9aebb61fb0652a9780c3a2..7111af65841f8b9760a7235f3c567990fdb77af2 100644 GIT binary patch delta 296 zcmW+w%T5A85Ud&Y!NP)w;*9uF>Kl`d z^;Bs)QZH|G;}ju31_WP(^$}Gvi5N9vgWWpWhGDsRkEZkSK;jnl#BspC_=H%v!ENTX qJcR6`MG}+HfgS7;J?t?{?7RI{YIO$pAK=glZ5$CRY=&s#7|}ny4=n-! delta 278 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 literal 13914 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 literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/resource/SyncResource$ExistsCheckResponse.class b/target/classes/dev/lions/user/manager/resource/SyncResource$ExistsCheckResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..42e202a68ba94caa24dbebec1dd59144d853eeff GIT binary patch literal 1030 zcmbtT&rcIU6#k~Il$Mp>qKM+EAf+jcdPR*&Fg9s0p`-_H!|tOD?#`||TOxlFM-Rlr zgBNc8QN}k51Y%Fd!_M3HbH4ArH@|-W_zB=O8g-OVuA<`M7DfankJPb}kurVxY5$0V zTwvstHadSJP;RXDY8XYWin@m}cmi)jI+l@6jFkgRnT(ZDeU=&7WRL|UyC){txm1?6 zzG|D>%|i-4vn}N;;__5j1;m~!KJH-xlLFpViQSWwqozC8z`A*+O@G5hPkWeg(epkLaB-Nv?7SQedN#WPM3Nq*F^W)C_bySZte6e;JT(wI3;;AzYC53q}lj&0+ULy5VYMq@uXxyKc37 zhCwE8`IHCis{#w{kX3!4mC0S&&7uO0#@=ufhApc-fy!nQ^8FJXZD@NC?^Cv`xD&38 zNuZ*h%Cyrjjg|aRb8Fsr{&$$%p?bHN`v-2Qz|_s@ue$*XEbpA37L#`bkIzptrW+K~ z@xzsi#+iU~N4Lr59}}Bbu`JN~7ihdZZDT0gjFh#+%x1QR7Y~nleM&|aagR;Bb;FK%HVJ-5_xW7lVi8|ZVL99U4$)jVL$%pD!|mqU8K%Cm zy@UsR&T$6BIx0e9ba1Vt)~N Tf~SRJ3C~#88QdtAu!7njZ2t!F literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/resource/SyncResource$HealthCheckResponse.class b/target/classes/dev/lions/user/manager/resource/SyncResource$HealthCheckResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..9747562cace81006f48235c182af4dd59746846f GIT binary patch literal 886 zcmbtSO>fgc5Ph45=F2o~3WZYIx*vx&s_+jeARrQIMJQ5&BDJ^8W|C}cuZ`D|?UwC|2aPCq}jA z!Tt$JKN&WLq^=l?IEw@d!wj7Wh>Mhc$w3v%j0a>blL^$Cx1!oftj*w9V7)ami4Lfv zt?v5t+L$nrNvcHPxEaO+kCd+?OJ1N=97b{2*FJe+L`Fv1lehQ1fO=YbZ8fAoGIOOz zR>e9>$pm&!O;3Lsk!!X4jwZ?v<&{e|aivl$Fnya9zMpAzf2H;X)($T23P0=!=0eiH^yM7qJ!L$H%|FF$VLLl;vCF>9 KN{URkhtf|rjpPCV literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/resource/SyncResource$SyncRolesResponse.class b/target/classes/dev/lions/user/manager/resource/SyncResource$SyncRolesResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..e845a7f29ce06bad3a328730600bd15eaee4af90 GIT binary patch literal 1081 zcmb7DT~AX%5Ix%#N=v05Vii%SS`-Lze?Sp67$ZpoNlW^^yDf7Fc22*2|MC^U3v3pVK{k(E33HfdsGNvX!9$^k{HT8- zgM?vzS80{(F=RKldIcrtepoyr*}D&%eDk`}{Chwv(rJ>^tCl&`fm ziAcNxhF06yA(ug@Vkdc|0&8Mx-m6e@6H6^(#l$LMY3Pb zlJ<`)Bfa(C+n>chDPI1e^M4+~k5ufYws}h{W2oLV&vWkthK16wY}UPITP#Egq3sGxP__fP8}zomI*fDc0z7 z+hLgkS(yNLQdoT&aF+mNblfAz3PCjqSQ$B1 zL4j4V#A;ZjdSh}85AcvOYH%gUf14;+qpFuUsnmaITBnW;s%B`MDfy4_B>ka@rxc5H Kc>zs4L*WPHFCRSs literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/resource/SyncResource$SyncUsersResponse.class b/target/classes/dev/lions/user/manager/resource/SyncResource$SyncUsersResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..3211e1a5e60b68294909a77452845ac83b33c239 GIT binary patch literal 1097 zcmb7DT~8B16g|@x`Y8oO6!D`<6=;a_1Bz9HF_JWpQ0)73JGO(nGn<)R5`GeoJ`fWh zeBsR>WxTURg(^lLcJAK0XYM`s-m_o7ef|RAIW{WDAzwtHh8fH<%pZwk!9$@(e1C8x zgM?vrTWOVa81fsN{W3}@7g4F9iW);_D35uljCMSA((*`XF(PZFGpP+E@15x2;KFHo z=N-WuMPj-m8D;{LYAV8Zedf6u>X@gfPv(eCH=~m#D&$?|k~YK20pV37`^u?7C|_x9 z5|MZY4DGJ5BQAqb#ZK}_1=hsYyjP**CYD;nii=-(9?78+ycdjRBq(!rC|zJx?2|F9 z?U`s`Wn;MRt1BlGnOfIy)WX;rt=#!3RV??^NQ)%3)Jl7b>~{B>;S3WqnU%;wa zhpIPye^gGo#@`AqZR}2!X>ax!3Oi;<6zW~2`K2Ir^b;ARVDb=K^_E zvWxWGbXX!o(k8&I47NNCxJ>{OKJE}?g&-fu=E>GupTJtHXDGI|&T!)+h4Q#d=OPLK zqt&w<$}EpLR=_I78 NC0n7(B{Z>)@^>EfB*Xv! literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/resource/SyncResource.class b/target/classes/dev/lions/user/manager/resource/SyncResource.class new file mode 100644 index 0000000000000000000000000000000000000000..531049683870b7dc6c978fe8ce3141a80aaf8b35 GIT binary patch literal 9055 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 delta 271 zcmaFH`ixcJ)W2Q(7#J9A8RXd+m>3zXCckIYnLLY;PmG;`g^@uZE3qt5KPNFSUEe<` zD>b=fV)Gn!Hk-`6%o4lFvW)UlTnx+%{5%ZY3<8V{%o>_uoD7T%LOcwt3~ZBa7?<$! zc;@A$7CGl678j=$Pkza063gpaRFq#7lv-SnpI4m9$iU&3T3q6hUtGeV2-M09bP6L7 z0`&t)b|8-%NOJ%&XE6g8kYWT1@Bm3(pp+W}6A&^maA|F4;M3CH${;woj>*6RqL+n1 d94N)aAc1a*B!d)457;be23ZD9205@oX#nIHEJy$V diff --git a/target/classes/dev/lions/user/manager/resource/UserResource$PasswordResetRequest.class b/target/classes/dev/lions/user/manager/resource/UserResource$PasswordResetRequest.class index 2a0fd434aee3ca6240389c1bb7388e1bd58e26b2..358f9688768d95097a04d4ccf0556bf9278f4ddc 100644 GIT binary patch delta 327 zcmZXPJxjw-6o%iEq)C&e_FCgt7mZbjrO?&EI#>~1baUty^-@}DBDp~*9r_z$en|%r z99#wejkBPhWOaED=j(mW`8B`I^Ut5RcL04HIMAS5FkDn%62v5Y3VYKq8uhMkC-N>O zn8)L2oSqQ$;PA#q6}AP(MGbCNKNAEyl@E_`5+*YO4YScQ59qXF4B~s4KhsB}dL>nQ z5v$a~9-*6wZj<0%Mv+Vg(@-g?2wwh0-U2?mYkZdmLLDot4bB8d!L?O|Cf0`VIA{9* z?m9LUHn~p4Gpt*@eN?&uPUjWWFZ5fHH6gyXCZx Mb~#Ucp^tsof5-bU9smFU delta 352 zcmZWk%Syvg5IvK`yqd;nV|`oW18OPs2dbMEF&o8=i|(Rcq@^a(8w7EozYw$YFS-!H zg>5zA!+za>M({?_ZPXb@@m1&Kd?YT? z?0M>1skpvLCeh@MK!ZG_epBxb<6(M0P@8*a1g)1`3L7fw4(3s_Kv;56g_}RoN6iW2 zSWJ53NJ=3MY!TX7*j5RC{zd)+!8{f+JxXMXfHzf+r7+JxXEeC-m`&C!2^*CG9In~? ze|Hw1#2o8X#9;J!yIZ;ecIy=jE$s!1)AGVHqYL#EpnLxNBP`|>77KeG$12vCHLNo# a*eIh^xM%X?C=G0uW5u-q+pw@x4hDaG5HS+~ diff --git a/target/classes/dev/lions/user/manager/resource/UserResource$SessionsRevokedResponse.class b/target/classes/dev/lions/user/manager/resource/UserResource$SessionsRevokedResponse.class index 1598153ad01b7a2b2d798edba695da27f672696f..4997811ebbd44a5ac308fed09c86c9582e8f1265 100644 GIT binary patch delta 260 zcmZ8bJ!=9{5S)Ep?#p*-Z2UNqkWOvR!oni4QA}*Kv%i=}@Q@So4r~8{T%mtN1PihD zKSi=?C(F*T%+BmC&868to%aU-?|5+`kg;G$JisIrqHqxgvoQV%MqiPdBn0zq8c&lB zAycc59oTRzxDr{&mG`lV*3zgA>SKb@oqwyeNk_*XDxG}Jb&~#3%aemRR=?d@sI}5* zAgVpQa*E*l#Kk#`9#2{39Cu!$z(oAfBV&=JKCfR4Zes^(_*+=%Ml{AtL5Pg@##Kc%*hsHKkaZ@S8!NH++v4}2pb5GlkqDTb4&^dp=ihP6q5h-*i z&iYHC;qyei zB&)?bH1EgpIC&r#wLyKv)SbNw2RaHaa_|Uxtv<3rxO9<$shYIQyMs6u^X@c~Qb_ef zE%Mcp{2?LxBxKT`$plrl===+Dv5(Q>DaV}Uwj~@U;)TnYXQ>B`3ve2rxM&1h6xBv+ cw$EMzK1&)(|5L7UbM&0D0^Gtz`E(fk0rEj9RsaA1 diff --git a/target/classes/dev/lions/user/manager/resource/UserResource.class b/target/classes/dev/lions/user/manager/resource/UserResource.class index 4f03deaa9aecf64b1df8bb407b78d6946cd562c2..9ff14bce9ccee0dd2517172bd5cf8ca124732541 100644 GIT binary patch literal 14890 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 literal 14966 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 diff --git a/target/classes/dev/lions/user/manager/security/DevSecurityContextProducer$DevSecurityContext$1.class b/target/classes/dev/lions/user/manager/security/DevSecurityContextProducer$DevSecurityContext$1.class new file mode 100644 index 0000000000000000000000000000000000000000..763a45e96b4b0641b52c9017daba612bb376bb45 GIT binary patch literal 1009 zcmb_b&2AGh5dNGj*>tAt1&_ix0mOL{a&wTTz`Stt9PXI6Qcm)+yLj*Cdp~i4B7PB;$TG_O)!lYBK z_=LC>Sz)C6oW2sX!CdZY<-{j$t&Crxf;mVIdj}o2ARY(oT(3nf%CehWG6y zC)*h^1YJEA3~N29M8BAhg!#ZnIcbuf&UilLM*8<$8Th_2oGmwz*1;h|I1#STrxbak z-RWKRZQ!T_6EcVfx-gk|BYk$w#ku|+`4jI;6}?tjt}Xc<3wN%^As#RsFLl~9y1uaP zt+p=2Hp8?3M`wuNDJ4ud=hg~pak5w-wrMTupwhq^4Zj++Efu<}xJlZCq$7HJO|-lB z4Q%&2!mp*xI?)>0`0d&tdi&A}w@C6QD$y8OY~s!wYoECHs3zCH5Ubz{O7y06Y zCK972KKkH~GM-tsgwPm`p-tw@IWy-w-?_~G{Pp!afLT1u!hmVRa*#m>L*E`h;$DLX zb#HBZPxy+V5C}eew3fd!bVmT=w{d`R4x>~TW2bXO0I_Se?hLsD&XXrYNWZ=s~ z-e4H6B=tKj#Cq$ftV#4c7(kApGmKmvA?@e3>hadBI(;!C$7_Gexb%NUig=oMY?Itg*)WmTakfSZ60ik=q2B7kj1Tp zK5x``B(M{Qua$hAfmYjk7GgoaNA?!CJmzjMq_2b z)iX)o0$0Bdk{PmRaD&!S(rU2i4lr2y3|9IE`xR}vj^UIhj^Tc!6NAvSw?*qbt+Rx) zK!}UDMV7%6Z;atKX>pWturWQieh3iNnr|JBBybmq)X}bU>XmgKab!L_vPU#!4U$7?0ZW*rORUGZK(j zRaU7=RX%{Mk`=`=k1~){Wy3BXkuOQ5a(Xm2Lc&GLTBv)vZ{O~F&b_DmuYZ646Tle0 zPN4&_1mYSx(Iv2T$*3E;Z8#NuYJN$Yfk4-&P8aX38XaiKodAymUZ2> zT*udIzV!5};TRRRzBFr|72MY^$@*;6A9tNV-V3HZw_G!&C(z?sW%IIQ%-gaoAZ{k{ z8aJUwwaHcu+mIGWta$E%WlMo{@%hO5kk`r}2)!u8pD+ z=(Gqr9bIdtI>M*PaYX+A8OfDYKAhE%$0!q!6tsjaaQNjEx7g(qU;#}K?M+ro|E0D< zO0j&;tFpZyFsMRq%d^%)G{PCza7nF6`)%PQaYbORW!W0-%#Y!W<g zEaz(#@_uHMyyr?uTo)*Y1;Gj^GtO2FT+dHgT+b8B zQSz=A!X__pIy{CnZEMAsdet&LH&O#7dka=Yk5*9X_%+RG=>_+>GVT~v>T@rZ)?2Rm zBhfNaR+bA!%??Vc#A&CnrGBm1H46-911~fhr!3J~kup13tIkXBy1F2g{JW-MmkiHR z-_c+^ShN_`XmRtE#Q?f^!Gy@2Y%imYz>WkzpDU@rLSas>C5b@)I?QVq2W7t{r?~NJ zUd!!qylvg9_GfxoKE**LufUesz%Z95jFkwVolobWnLfx``4$9_4MMrMF_&2=nQ2&2E_j61v|+bazZLH{RF-cnA$vD zFA>82<4m=J!)rM#D9MCKx5tM=ydpawa04;yQ8y(YKv0hij(yDDcFumn_EWZ>`M8DK zJ`8^Iq4RQ!d1YbJ8-)#B{4dj5XDirt9(fG$GdmrS{8!UJ9~Stp+|d9PEV31_u*82Z z7NfN522f^&*CFg>3;xDbd5Y&1b+0k@*J4@Gbk_@j384PT)t1 zqypq5gFb~hER%~ESDb;3D&h)=2qe{W;1Z?*d`Vv#VZFoo9&{dzofrRLQKU()w@$;M z5M!V_oqU41UoogoESjj;MgKm>IuL~H_p(>xcb!&u3%G~-{OID~7(VBg;L%h+iLa32 HNcj5?2-GeF literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/service/impl/AuditServiceImpl.class b/target/classes/dev/lions/user/manager/service/impl/AuditServiceImpl.class index 221c8a65f7db8e4f9b6b61bb9899a788f03ff899..2ea98d3ee41e557b49eec35748527ddc3b4807e1 100644 GIT binary patch literal 20160 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 wJQUOT9Ru13nsPR@&Et; literal 12566 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�uGavy< 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 F_& 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

fDV*R1?KU*=)Zd2foV^3Pd8ydL zYelL04qCdNH_|J`^N30lmWl?k3e}vmQk*Bw=NOd_4C52ecdLog8jeb%{goFGk~l{Q z$*mf?#9BTtg2Y0sWJr_7v&k4>!3C>VCIEO31c|jPQBlCf?o8VkV za4sh}odl#741+^T{0X7bQ;Heba?GBuw@!dUH9TJA8rwN47asM8X{A8S$j=WL(LR! zZ>?3oceZNH4K?+(_1cZ(*)(2TjcZRL-d-#BdSgRPL#^T(=Tw)zpMK9tELL266RG%? zYBWDccI?9_juOTg{rb8h6Zi8SIKW7HKA*0^3JhTbt|Rn^x#9&FzzrNZ!nGz>zYuA> z2)E!yGGmx>EJ{k^E?%MCi&5o>8_1^tH1I&ZiYyz#QXZvOLF2mf6iaI-;QVJ$)y1bek>JuQaS?@V6Bjc?rB|zid~ie}{dYd)1Go0K z#O~#Q^hHbTzS#YR$G6AcS@2NffL!+OX1bTDK+bw^an_b8yf1ipkWsdbvEEwrho2eJ zB)`Ki9*LhrBk$?96ZKY1U>9yeH*fd`aGc(GiNd^zs_x=H?Z_-pO;e5(v%nEQ3sBO2 zv7HE374v~VvLm28F+EN3{I@`z_z*4y(S`t+o%81j(OLxURrI+=4JM`aljWeD!UwyW zm`HDLt&u->w$_GW{Ahhmk-#mnkJs0R-aZjIg@+69eVTICTBq(rvqL|*ly?7S7QzC#D%1L0jL>rTEA&oDi-$)VXGb`>Ga}5>TErP;PRYy{=MDqpZ$_D7s*PUrTW#HG0NRRDWUph&@|c$WP1I5ygHr zEvl;c`$zSwI-rwimx`6daAD|WnW&|jK`bi7{Z}HcD%8~syW5G;T0D*?`0Mvd!)yS6 zDI$LgG4>d1@fl{rN7xuVimNfh%Jezr$j@`_m$>>1xC38g7(PzQJwYEm$(3K>tS340 z6i2?wr?26A_&R=pZ}7I~o1%(rko^@)1!b+mpHx?MM^LY-xz}6pl(>|>eUhD6&}s2@ z#BU*E_`TRe+Lk&ke`E(o;*`1xk<(O5WmZ|1exoAvywmJts{G2N23iA-Uj|)VF3F;J myp}YS|1FB?r-c4-XtJplD$M+*b}fUWlVeq)tJoKJ1OE?}!bM2{ literal 0 HcmV?d00001 diff --git a/target/classes/dev/lions/user/manager/service/impl/UserServiceImpl.class b/target/classes/dev/lions/user/manager/service/impl/UserServiceImpl.class index 4d64aff72332856954d8b1ccb0bebd30e12a181a..7042f2af848dfe9d98ccf0e230bdda2faeadf846 100644 GIT binary patch literal 22247 zcmcIs34B!5x&OYCNoJB<1QNCY!9iKF5P}G(37`-X35GxkyNV3S4Gc_X;w%VSZEK}! z-D+DmtX12(pwen<1Ho1+X|eihUl&`o%d@r5wy&>?t=()@-v2xI&Ye3O47}E#WbVCl zmhXJ$fBxTc&Yc(DJM=UWEl|&uk)k3mc?>G15~dN`13Lqap+IhjA zU6=Ks9rtJ`6xqsD(GiJmZH$F_=WK86h-^i*W*?oxRKLpX-eyMe&)+jW5f6rfu|V8R zL}UKIPP5zJ9Sz2Z9*&x^CjS*zmeU9t>7@#TDrpp?&uo#&6Abr8n5Nfsq(;^ij|RhA zn_W+=u{PJPEu%3s)=T3Is-p2sbMuU^Cmyi|Y>h1dXG>jB2UQOZ5iLpoTQ~Sz2Q924jnX#~m7f8>OX2gJ#hgOr>aP zMQ?A+gsOne_A)w?=6GqYLG$P=rje-$Zx6>!;0ulI41^Nqie9EMHSO*>u}f%4&oQWp znwiSc{z|~PD|k8PaCF)nCd-%80$S*$a}7F=7BS5d0G^0yu)Jbg8BEJ^=-P#vWRE!> z*#nWa(%2D<#q}s!3|b=kmQl!Tgn`5|YNPYLv{W?Io~EJ2kx0l4ghekK-FmT~16B*@ z0vTin)5Rw(s7v-_!#QQ|G-!p$E=X+c3j{;b{re1BMO^@prLe`j^*2ms9b25d9Z8#O z3|dR;z!D%Cpy+IOQzxcyA8jybBV7oE_Xa~?0(%8*u$xRxPQFEbY))y;p{R>#lb0?r zXfp+vYVxe~zCeFJ7+J(wt}n50;t{ZvAcbj8wtT5|V>4A&*P^;^gL-6@6n94w;kc~5 zUW2yEy7UFZ@wKwf$|y+Ny|hE%2HHO*)o@273=2?Mv&@Y(c?jr+DdMGmgDxd3*n9>i zhqAyniBMeAuZm!W-<&g* z>RO{w*f@VE0z21Z`a=PKG>;h+o43oL-E=vWZ$_gLsHx5k+-&onL)4T#SoTC}0G7YE>bEgTiIlFLqy1FC% zrc0W8={_&rZ_sDxv*5=9rAcc9j)oYNMIi`Mk@Oo<7NDFSpa;G5kU#nFg4~YG%;Fq_vGj1xu1Lk-9{7Yi?7KRv*|sNP}KFWYAOe z6$~S*pO#1{gn$DCh|$I)mU)_#CcWLFQ&J26v_a3%*Pyj-s{wdnZsyOb<2E@qdz8^( z8uHTD4f+NhL9kHZLeRd5<>w0^A$O&_XBhzq*GJ!Ex*!L?XEJ5XA02v9_|+oDet6RU zPzHHQ&{IY+dcmOo5D%#gOt;*O#o(rjU3k%;ZwrljE(=7%W%M2Tu9vXjnP-sray=f67Biu4W`o(beh4P zW>1rUdY*FAee^4)juRN2zXr|wdxrMKfoo^<)6Jyiul3RYfME)NMivfavj10{fIU9? z9T1yguanTiaMKXvqdzd6cRU;2ABg%BcF2(1U_U^A6jS>r35(L=C>ugv`ZIiiH0mtO zF8S!MOp8ujBN-z5=|G9U$+KAi=tZ-eegw`Ra=2>iVZGd zFBVB(V29Zf33mtL>w@uZxQfLCVd-_6dwnJQ$o3-2SaB)*K`s+)WPdLymc!JE0rD_| zPmuwZYjs(pt02Y2aC3Mh{4K6v+FVnRw=HhT$@x_98+nw$qj?O>PB*AGj$nWF$vIU* zTyBEwjzrBycov#(n#*_`S9y87!4o7*f(6W5)=F-4!Cy?oq*}GXllW9Sd7_`T>$Fy# z=E}UyOtD&6y}RFpZ&1XOWtLB4nlBSmP%XEyv?m=NKbMM7Qw^TR)2$3cM+At0UjcVF zN#9{J-neE}JBD4$bzZJFc!pRkLj%(O5>^`qY-J$6&Brs*(#*QXnhQ5IUR+;0#mBRl z)RZ$o_dMI+GkK2o@cKi6Zc{r}X~DWJTMoQsKLP-Gp225{G^5b{Y8akKG!WgrG7yVh z7K!#qfpZLQVuZKjausL`1rWZbXM~b@2IN?Hfx!#Kvop3>X%#yf_VIZJFXF`*D3Vsm z-o$s#7P62h8{u5=68Jl>e`=54ZI`;iIIuT5Um8nvcMmrP3q=lD<3ZfrKB4hsgPx7co}k!%Y(48L-+Z&izg#NZH6-K8sR(VW7yYZ0Y!zrmL>@&hG_{vJ(iSTrYLmBou?MAS1ffz}s{ITM_THXkFe zF-bt?hGx1$2segxE@PCBFNgJUmvs4!K1R-BUT(ZXgkyrt$H-^Yr9-yQgrZZm(s1eH z4>C1(CHf^~j}@B3@YlfOg!72SC1bi8=?wmGhI?&u)P*h(B|UCES$hori0r|XM9sd) zPSeNNF*RgrJSKt#`^1|Z+Se;PGw@o)oJ-$6{%DRWC>RSM>JtaNCKl<9V=acvxLIpe zxe?nOxmBzC%C7_;-^?^MU9+}$*?jOZq)rxz5P7*Jiw%7IaahSr1=u68WdCFy8k??5 z}k$F$XN zO4j+fNxl5G8?5sn0whcT0yl(^!4M3u&Pb*$SrH>MsVD+HZ16sQ1ok0aoC5u4bdJ2s z(p5wI^ePJ=qhsqo;qQycBJ%gcVZh&9fx5pYZn+h~sMZr~?&q=4TEjadLD|;~`>h}W ztzcb>t*{&@q0`L436no=@DoA~!;wbp(e}gI|M2mb;F}A$wAm4<(%Uo9J2cSbHv0L6K__3;rTYI7+oAk^y~ODxr_qb1~gGJ^7CrEY8vr48H1FF-%QS$g8! z)vCsCK0zzUL!bBYi)bUav>0mMmTh^<_&@nOUjDAZ-xD>DPNj-DMZ~TaV?B$;r{8Rofrd9v?E}#gVqO&&lx4FGSo6G)f1N)i5Kj+s0_I~J@Dd_Gy zxncQl>-@hBenUF|~Q2REfk%63;n7IT&5}3{|So!Z5hx?!b9r0nto8VI`(fNU@zO zmSMTuo`a~xvCeIcvhBJ$B`@>ZEm=FExx5D0Q#Ati+igz)B})LY5^0`B1r@6bLshC# zAOILoL}cquer2RM-r2@MXx$@zh$$N@YK)=As&R-%tOE_Qw5`xZ2bno4x%2ihy(5*} zn8L9gz7X-Nnqa7j5+|1iV@|Z)rY0HcROLrcNZAKMSnz3?!(@;ohktmBv~s$krbsKp z(Mnpdt){8zUR7hLS_%J~j*DcMFOd#q@EKf<_MS3TuV#2vgP~@sMg*wRqWj2N8%%Q~ zid_rIOjxJb5EHpsxg`WA(aue}Yc_iooR+#g`~=?92k0yT^)*wKy;r|BsCVWUg~JhR zM;RI$i>a|Pdcm-q+iPssA5fB~CDH>^F}x!fHaio2Tg>QcNpt7}c-?`}+5ir%;og4e ziEj&{xw-j>Gbxymi{7H{N}cROXT=GNu}8R&qW8h1yA+w(W)dq}mk0IgV`EIS)6)~V zH<3jtv1A=|>XSy00fyXVai}EJB1ck?Jzs`@80ctM&kkiuJvmD#XZGOeXMG7@7|R{oaB;mS*qI20Q1rC)epUve$j(9C zX`Llcr!C&y-cx8I)J-$a_MrG=*n<_9Okkk>Gka6k5O^fvf>0oR9`ZvhSp{S9T1{a8 zdv1E|0%y@~0aJprH3iQe(_}~8d3IbOn<1fb)ZPS^R3Anw%AAsgzpV8q@Hh#WieA&{ zQUk5DE4Vd`9g8TIoav@Od$n8g=(EN4lUy@-V&Ik*j)zBmd=w)cX$OyscdvnpGb?)%i9F9CTjGZvSL=R@$YLVr02YV1#j0wk#12MY?xbf{wIPJEtAlhw?%ql!%Ng1W$I3KmsjmI)ZGeO8Lo3DLFATqn2jBJT2Uj=n+%%D;Si?o zzU5xtb|tHWrGan{4#rLCh(vZI`g0go*YZoNs82qe)R$J5?yj;McF&^yZA$>;j-aA> zgu;$Y+L@VT80!+pel)yT-B+gWSD*2!&l>7;61pD$>{PZB1_S}B;sK9P*fwb|0HN89 zBp0$9nwZ{)%hW#gh*v#|6C?`TB2!YtZ;#wE5ui5Y51gp@&VT=u+NSBkY_%S1dVC7I zF;hECB+B~IUo-P-e?=!@wh!Ic{05x5Yt49Eplhsy=n;h%K|~J@}S)MCQp@T#zDHMskmW~wlEElx#z5ss^a=FB?oESLF#*axr`tI zkuNL4DeEgXR9rdZ0Da&YjJ%w_M$h8hut)3VYP=*!RD-AWI7d1I$~*&q&!m|&hi21U zItMT8%*TBjolVQ}GTaJkrY=0$h<7YD(LxH~*$%u67Nx}$rxx0USIw@#^&VPE*HSy) zlvqZ$;`&b1ydQ6E?V~j~UA`U?Y{cQe3+Y9=NY6<>Bxu1boTHksiM7qSy4txKK~L~c zRWraafgV)z)dDI)tF?BGeKbxjMBQSvZm4tBd6@CTG)65_i%|nJYR|S@wWuY4PAi_y zL3yj!Hm6s)vU-&(s|UHVdN?16*QKa=Iu*Z5ZCWC=3#;O;br#$q|}eRWeA}h2Kjxa z{((XIssa`sX!2GSS9u5M*@tL!Q;GEZTzyr^06jlQ-||pZ@j?2}$2;Zm4@De2I!LcP z-r0ZxBES(kqsmk9lL7j#y)+hAuj{K}xcYBg-9?pB^Ovrga{udkjNmsO3z@%d(8w&J z2B2~${uy)=aPyM>yw^eMc8~zk7CbdU0=+a9ub4Fed*@P!I;jtM3ezPN!CgPw#Pk`dz8(7Rd}dh{*o<)y=m z0k)Ax(I;Nt2Ks=>S^?loEAjkYxkb_1;p!svpwz`~SZ)F=0Y!W$f#opaTiiH*FG&KE zN27TUzS%7E_xo&M7J>ahU-Hi)HvuWYcNcjDFAYV57%|}X7I^Dp4y68)0|*L=p9{)} zfqKr@pB7b3qf+#L1HQeP#zDQcAePy918N@KhElhKZ0-QL+^Hu|7IrP@TIi$*-;8zC zzS&XxX0_Q?`(~Hg#W+|s+dw_C)F+U7hvw<^Ju*YXv6Inhz|rY2XjF8%UUd4mY@Ish zpdekooky1qpywC}{apR&*5#+6%lo0r&%oAxj_UA^(M-IDbRMW~5j_IBf7H?CWJi~a zT)JHE=yJW>cK1tac;$o10QUNF8>K5`L4~K`f`BYyNgCW z#cG4x9%5+y0Q;V)AK>yMYe_K+)Wwano4e{Z(d+$R+-reS}8J#{kdA zLV?fVDH`B&t31NjAbL=<*P?nKhE>TeBE5VEqfq6Om86-ul3V4A6sK15`4*{Svxk09 zf57|~X>-3(tPnkcr(XuH2Vm+4fr~@5lAgxec^2mUFevrwAkS}rIG+b$ehcV$5ig#7 z8*BGPkmdJq^?iC7bop!gAzFTg-lSK-T|d%T>7_EXvsaU05n8)h8)^^QyhfR-7jtws zt=4o`f_5fr`t+i;acV2*(}%VuCRZvONp#_A8z>c>Fivs+XG*Wj1bJti{vMsBIdFlO z#~lR~cr^na)+7jOl*ht`9)}olcN8kfQ?A%uj@40kMHZ(@iz%Z%mWtAix|>8tsx;ef z(P>a^w}8q=vE;pw;0-;a?XqZX6OSu6n3jnbm{~Jl3}6DJMwPx8;0tiynY`~D;P>Hv zb@G1o0I$RS#^n9R0lpabf#iK)fO~MiHF>{vfOi0G#e*DCl^KbQ57bPuVK9PiRr%9n(l`PA%+dSs$v-RRv^ehh%R}3 zvSjn|L2*MmC~mSq@dQvY39ll?feQJ&#X&_Ijl?P+fgeJtq*?Ge=I~hjvcNc6h8JbJ zcp_cI)nqd2@N~RHKN;`KpN4nMPsi)nQ-Fr4bT3b%$GAq%`YP~A7fr%^$z0E(MfUvf zbmsb2*Ie&+=6b&~*ZVED5%sEw>W9k39~ec&@6a;L^*?CZVt83HsS}UkR3V0RJ5?B; zoJFxk=&|0B z4*7>Z=?F|bm-obgf7la(P~K8t7`FQ#+3g_d$FRM(E* z6ltRkd_HaErGV@*t;VIW01Y(V2IM>kq#Im-OgL&xIBHBdfJ~@MVF)ciYK5*lVHB#U z61PB-CO1K)g2H;O(tEvWEYi@mp=2~*H``Wi{fveIzCV>(86#D>6S>M2z)>fi&hMi- zUZn>remI(ShEnegrQR7zy)_hFF0K*?gk5p7&5%h>9O=neOXykcbXJo@&jP_wdK?cV zS5rMq-a{#YPmwab7QkPJcQe*&LH$-eN6=A@prdT)<`*gxtEvQQ!o1nP5S>QM*7>mI7@bC8a>O zZ5f@eM~k0Cm%ANZz64#05tK|)CGWSEN6HVzy_JdJFW463i^&yav(S@iEHvP-kO4bC z+gUz3s^cE~gxFT9=50XFcCb*GX7dg@lS6bK_fZF!ZXQGtG*wfD%|2(6*lde)mOBbs z?kH%vJ#oU>UQ*E$WE^$5y275tH*J#Mq*ZY+zbXzP|H5Cz3rZ3qe9hL&kX}5fgjpZ$ zdCa2dZ=@;bxumylfT5RU=mrT9-U;1YhE=r-R`GKDywnx6gx^oCd?l^otF&%}nX7F| zfxV~k>ix2osMV#VO^%i}Ia=D}(vpw(Z?pt@I>rjj0{fNfDl2z|aKJ*$O0A~nkF6%1 zj^h8wPDj}h&9`g?9prC64%1~I-?%VCG1ovb*FrJZfp@P5U_OfXcdw&`d;|FRMu6rf z7ig?dqX@3$NCz}49d)d9)Unc~4&;ol5@lF6pnRBpG2~F+IqbPk%g(|yVxmTI%=;SW!uZ} z_cqFk9@C1iM?jp+j9cT{2aG)ej6F&-_%YyYKQ-~^opDvua684+fU6`K&3DE+-$^me zw{g`9IVHtp)l8;Es;TH5`SH64&O>-eSxKhCO^>`rZ)@dcdo|8+X~nWW*k7;{N*UUC zGhG|_*}x2KAh*tdFdqO657JZ~#Hu^wXk)aajj1ke%yG0a$4L^+$D-V&ssaR-T4Xa1CzzOr!@Ty|T0Z4QK zR{?pXWTt60U{3sPs^IUyHU2K_`uFhq{`X+aVFMv+`#a8^4BS@H4n+f1ru{nrkwv9l5GC zEr?F4HGY&zE_``%j%vefS!U&8Rk^TZU<5!@qU(-zfoeSHuv_z;tvvl;vI;!=M8aoEE zU@O{|CAE_}pr)qyUhkyx^}0b}GHkV~Thzz!=~K6g!O?o1tiOTUD|`o4-IvHKZZ5mF zV*PL$K8|NfeL^L7b3cjO+wg2QwmEKx#_v)0st43VsJCDL{eu4cg#F!@)PTM^pbo01 f)K^h&JnB5nRBpPht=2B5vuw>ifh5j literal 20940 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 diff --git a/target/lions-user-manager-server-impl-quarkus-1.0.0.jar b/target/lions-user-manager-server-impl-quarkus-1.0.0.jar deleted file mode 100644 index 34fc61b7ca8a506e58d486786477b515c2ecab84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32935 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 Mfq`YZ{(SU*0DYjwNdN!< diff --git a/target/lions-user-manager-server-impl-quarkus-dev.jar b/target/lions-user-manager-server-impl-quarkus-dev.jar new file mode 100644 index 0000000000000000000000000000000000000000..0be35783b96343e2cf2cb3b2748eb0ded05d38c7 GIT binary patch literal 6344 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 literal 0 HcmV?d00001