diff --git a/src/main/java/com/l2/shots/auth/BootstrapAdmin.java b/src/main/java/com/l2/shots/auth/BootstrapAdmin.java index 37b5e07..96cef92 100644 --- a/src/main/java/com/l2/shots/auth/BootstrapAdmin.java +++ b/src/main/java/com/l2/shots/auth/BootstrapAdmin.java @@ -4,6 +4,8 @@ import io.quarkus.runtime.StartupEvent; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -29,17 +31,28 @@ public class BootstrapAdmin { @Inject AuthService authService; + @Inject + EntityManager em; + @ConfigProperty(name = "app.bootstrap.admin.enabled", defaultValue = "true") boolean enabled; @ConfigProperty(name = "app.bootstrap.admin.username", defaultValue = "admin") String username; + @Transactional void onStart(@Observes StartupEvent ev) { if (!enabled) { LOG.info("Bootstrap admin disabled (app.bootstrap.admin.enabled=false)"); return; } + // El @Transactional + el toque al EntityManager fuerzan la inicialización + // del EntityManagerFactory (y por lo tanto la corrida del schema-gen) + // ANTES de preguntar `User.count()`. Sin esto, en un H2 fresco el + // SELECT count(*) FROM users se ejecuta antes de que Hibernate haya + // generado la tabla y falla con "Table USERS not found". + em.createNativeQuery("SELECT 1").getSingleResult(); + long count = User.count(); if (count > 0) { LOG.infof("Bootstrap admin skipped: %d users already exist", count); @@ -54,7 +67,6 @@ public class BootstrapAdmin { + "BOOTSTRAP-ADMIN-CHANGE This password MUST be changed on first login via POST /api/auth/change-password\n"; LOG.warn(banner); - // Backup a stdout por si algún pipeline colecta stdout pero no el logger JBoss. System.out.print(banner); System.out.flush(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6ec1aa6..cbc6fcb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,6 +10,10 @@ quarkus.datasource.username=sa quarkus.datasource.password= quarkus.hibernate-orm.database.generation=update quarkus.hibernate-orm.log.sql=false +# En Quarkus native, el schema-gen NO corre en startup por defecto en prod. +# Sin esto, `update` mode no crea las tablas en un H2 fresco y el primer +# `User.count()` en BootstrapAdmin falla con "Table USERS not found". +quarkus.hibernate-orm.schema-management.run-on-startup=true # JWT mp.jwt.verify.issuer=shot-crafter-calculator