fix(change-password): force entity refresh in response to avoid stale mustChangePassword
CI / Build Native (push) Successful in 7m2s
CI / Build Native (push) Successful in 7m2s
El cambio-password persistia bien a la DB (login con la nueva pass daba 200 OK), pero la respuesta del endpoint seguia reportando mustChangePassword: true. Era un problema de Panache/Hibernate cache: la user entity quedaba cacheada en el persistence context con el estado pre-cambio, y User.findById() siguiente devolvia esa misma instancia cacheada. Fix: despues de findById, forzar refresh desde DB con User.getEntityManager().refresh(refreshed). Asi el response refleja el estado actual real de la fila.
This commit is contained in:
@@ -90,12 +90,17 @@ public class AuthResource {
|
||||
if (jwt.isEmpty()) return Response.status(401).build();
|
||||
Optional<User> user = authService.getEntityFromToken(jwt.get());
|
||||
if (user.isEmpty()) return Response.status(401).build();
|
||||
User current = user.get();
|
||||
AuthService.ChangePasswordResult result = authService.changePassword(
|
||||
user.get().id, body.currentPassword(), body.newPassword());
|
||||
current.id, body.currentPassword(), body.newPassword());
|
||||
switch (result) {
|
||||
case OK:
|
||||
User refreshed = User.findById(user.get().id);
|
||||
// Refetch fresh desde DB porque la version cacheada en el
|
||||
// persistence context tenia mustChangePassword=true (estado
|
||||
// previo al cambio). Mejor un read fresco.
|
||||
User refreshed = User.findById(current.id);
|
||||
if (refreshed == null) return Response.status(401).build();
|
||||
User.getEntityManager().refresh(refreshed);
|
||||
String newToken = authService.buildToken(refreshed.id);
|
||||
return Response.ok(AuthService.toAuthMe(refreshed))
|
||||
.cookie(buildAuthCookie(newToken))
|
||||
|
||||
Reference in New Issue
Block a user