Commit 02bf53ab by Rubén Ramírez

fix: [BibliotecaPersona]: Corregido el código para ñadir, modificar y borrar en las listas.

Correción en el token que se manda
parent abde01f1
package com.ujaen.tfg.mangaffinity.repositorios;
import com.ujaen.tfg.mangaffinity.entidades.BibliotecaPersonal;
import com.ujaen.tfg.mangaffinity.entidades.BibliotecaPersonalRecurso;
import com.ujaen.tfg.mangaffinity.entidades.Categoria;
import com.ujaen.tfg.mangaffinity.entidades.Recurso;
import com.ujaen.tfg.mangaffinity.excepciones.RecursoSinCategoria;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
......@@ -20,6 +22,7 @@ public class RepositorioBibliotecaPersonalRecurso {
em.persist(bibliotecaPersonalRecurso);
}
@Transactional(readOnly = true)
public List<BibliotecaPersonalRecurso> listarPorCategoria(Long bibliotecaPersonalId, Categoria categoria) {
return em.createQuery(
......@@ -31,13 +34,16 @@ public class RepositorioBibliotecaPersonalRecurso {
}
public void eliminarRecursoDeBiblioteca(Long bibliotecaPersonalId, Long recursoId) {
em.createQuery("DELETE FROM BibliotecaPersonalRecurso bpr WHERE bpr.bibliotecaPersonal.id = :bibliotecaPersonalId AND bpr.recurso.id = :recursoId")
int deleted = em.createQuery("DELETE FROM BibliotecaPersonalRecurso bpr WHERE bpr.bibliotecaPersonal.id = :bibliotecaPersonalId AND bpr.recurso.id = :recursoId")
.setParameter("bibliotecaPersonalId", bibliotecaPersonalId)
.setParameter("recursoId", recursoId)
.executeUpdate();
}
public void actualizarCategoriaRecurso(Long bibliotecaPersonalId, Long recursoId, Categoria nuevaCategoria) {
int updated = em.createQuery("UPDATE BibliotecaPersonalRecurso bpr SET bpr.categoria = :nuevaCategoria WHERE bpr.bibliotecaPersonal.id = :bibliotecaPersonalId AND bpr.recurso.id = :recursoId")
.setParameter("nuevaCategoria", nuevaCategoria)
......@@ -50,4 +56,13 @@ public class RepositorioBibliotecaPersonalRecurso {
}
}
public BibliotecaPersonal obtenerBibliotecaPorId(Long bibliotecaPersonalId) {
return em.find(BibliotecaPersonal.class, bibliotecaPersonalId);
}
public Recurso obtenerRecursoPorId(Long recursoId) {
return em.find(Recurso.class, recursoId);
}
}
......@@ -66,49 +66,70 @@ public class BibliotecaPersonalController {
}
}
@PutMapping("/{usuarioId}/recursos/{recursoId}/categoria")
public ResponseEntity<String> modificarCategoriaDeRecurso(
@PathVariable Long usuarioId,
@PathVariable Long recursoId,
@RequestBody DTORecursoEnBiblioteca dtoRecurso) {
@GetMapping("/{usuarioId}/recursos/categoria/{categoria}")
public ResponseEntity<List<DTORecursoEnBiblioteca>> listarRecursosPorCategoria(
@PathVariable Long usuarioId, @PathVariable String categoria) { // 🔥 Ahora es String
try {
BibliotecaPersonal biblioteca = servicioUsuarios.obtenerBibliotecaDeUsuario(usuarioId);
if (biblioteca == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
boolean existe = servicioBibliotecaPersonal.listarPorCategoria(biblioteca.getId(), dtoRecurso.getCategoria())
.stream()
.anyMatch(bpr -> bpr.getRecurso().getId().equals(recursoId));
if (!existe) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
Categoria categoriaEnum;
try {
categoriaEnum = Categoria.valueOf(categoria.toUpperCase());
} catch (IllegalArgumentException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); // ⚠ Si la categoría no es válida
}
servicioBibliotecaPersonal.modificarCategoria(biblioteca.getId(), recursoId, dtoRecurso.getCategoria());
return ResponseEntity.status(HttpStatus.OK).build();
List<BibliotecaPersonalRecurso> recursos = servicioBibliotecaPersonal.listarPorCategoria(biblioteca.getId(), categoriaEnum);
List<DTORecursoEnBiblioteca> dtoRecursos = recursos.stream()
.map(bpr -> new DTORecursoEnBiblioteca(
bpr.getRecurso().getId(),
bpr.getRecurso().getTitulo(),
bpr.getCategoria(),
bpr.getRecurso().getFotoUrl() // 🔥 Aquí añadimos la imagen
))
.collect(Collectors.toList());
return ResponseEntity.ok(dtoRecursos);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
@GetMapping("/{usuarioId}/recursos/categoria/{categoria}")
public ResponseEntity<List<DTORecursoEnBiblioteca>> listarRecursosPorCategoria(
@PathVariable Long usuarioId, @PathVariable Categoria categoria) {
@PutMapping("/{usuarioId}/recursos/{recursoId}/categoria")
public ResponseEntity<String> cambiarCategoria(
@PathVariable Long usuarioId,
@PathVariable Long recursoId,
@RequestBody DTORecursoEnBiblioteca dtoRecurso) {
try {
BibliotecaPersonal biblioteca = servicioUsuarios.obtenerBibliotecaDeUsuario(usuarioId);
if (biblioteca == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
if (biblioteca == null) return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
List<BibliotecaPersonalRecurso> recursos = servicioBibliotecaPersonal.listarPorCategoria(biblioteca.getId(), categoria);
List<DTORecursoEnBiblioteca> dtoRecursos = recursos.stream()
.map(bpr -> new DTORecursoEnBiblioteca(bpr.getRecurso().getId(), bpr.getRecurso().getTitulo(), bpr.getCategoria()))
.collect(Collectors.toList());
servicioBibliotecaPersonal.cambiarCategoriaRecurso(biblioteca.getId(), recursoId, dtoRecurso.getCategoria());
return ResponseEntity.status(HttpStatus.OK).build();
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
return ResponseEntity.ok(dtoRecursos);
@DeleteMapping("/{usuarioId}/recursos/{recursoId}")
public ResponseEntity<String> eliminarRecursoDeBiblioteca(
@PathVariable Long usuarioId,
@PathVariable Long recursoId) {
try {
BibliotecaPersonal biblioteca = servicioUsuarios.obtenerBibliotecaDeUsuario(usuarioId);
if (biblioteca == null) return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
servicioBibliotecaPersonal.eliminarRecursoDeBiblioteca(biblioteca.getId(), recursoId);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); // Código 204 para eliminación exitosa
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
}
......@@ -15,10 +15,12 @@ public class DTORecursoEnBiblioteca {
private Long recursoId;
private String titulo;
private Categoria categoria;
private String fotoUrl;
public DTORecursoEnBiblioteca(Long recursoId, String titulo, Categoria categoria) {
public DTORecursoEnBiblioteca(Long recursoId, String titulo, Categoria categoria, String fotoUrl) {
this.recursoId = recursoId;
this.titulo = titulo;
this.categoria = categoria;
this.fotoUrl = fotoUrl;
}
}
......@@ -41,6 +41,7 @@ public class JwtFilter extends OncePerRequestFilter {
try {
Claims claims = jwtUtil.decodeJWT(token);
request.setAttribute("claims", claims);
request.setAttribute("userId", claims.get("id"));
// Extraemos el rol del token y lo convertimos en GrantedAuthority
String rol = (String) claims.get("rol");
......
......@@ -27,16 +27,22 @@ public class JwtUtil {
private static final long EXPIRATION_TIME = 86400000; // 1 día en milisegundos
// Genera un token JWT con los datos
public String generateToken(Map<String, Object> claims, String subject) {
public String generateToken(Long userId, String email, String nombreUsuario, String rol) {
return Jwts.builder()
.setClaims(claims)
.setSubject(subject)
.setIssuedAt(new Date()) // Fecha de emisión
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // Expiración del token
.signWith(secretKey) // Firmar el token con la misma clave
.setClaims(Map.of(
"id", userId,
"nombreUsuario", nombreUsuario,
"email", email,
"rol", rol
))
.setSubject(email)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(secretKey)
.compact();
}
// Decodifica el JWT
public Claims decodeJWT(String token) {
try {
......
......@@ -33,5 +33,32 @@ public class ServicioBibliotecaPersonal {
public void modificarCategoria(Long bibliotecaPersonalId, Long recursoId, Categoria nuevaCategoria) {
repositorioBibliotecaPersonalRecurso.actualizarCategoriaRecurso(bibliotecaPersonalId, recursoId, nuevaCategoria);
}
@Transactional
public void cambiarCategoriaRecurso(Long bibliotecaPersonalId, Long recursoId, Categoria nuevaCategoria) {
// Eliminar la entrada existente en cualquier categoría
eliminarRecursoDeBiblioteca(bibliotecaPersonalId, recursoId);
// Obtener la bibliotecaPersonal y el recurso desde el repositorio
BibliotecaPersonal bibliotecaPersonal = repositorioBibliotecaPersonalRecurso.obtenerBibliotecaPorId(bibliotecaPersonalId);
if (bibliotecaPersonal == null) {
throw new IllegalArgumentException("Biblioteca personal no encontrada para el ID: " + bibliotecaPersonalId);
}
Recurso recurso = repositorioBibliotecaPersonalRecurso.obtenerRecursoPorId(recursoId);
if (recurso == null) {
throw new IllegalArgumentException("Recurso no encontrado para el ID: " + recursoId);
}
// Añadir el recurso a la nueva categoría
BibliotecaPersonalRecurso bibliotecaRecurso = new BibliotecaPersonalRecurso(bibliotecaPersonal, recurso, nuevaCategoria);
repositorioBibliotecaPersonalRecurso.anadirRecursoBiblioteca(bibliotecaRecurso);
}
@Transactional
public void eliminarRecursoDeBiblioteca(Long bibliotecaPersonalId, Long recursoId) {
repositorioBibliotecaPersonalRecurso.eliminarRecursoDeBiblioteca(bibliotecaPersonalId, recursoId);
}
}
......@@ -100,7 +100,8 @@ public class ServicioUsuarios {
claims.put("rol", rol);
// Generamos el token JWT
String token = jwtUtil.generateToken(claims, usuario.get().getEmail());
String token = jwtUtil.generateToken(usuario.get().getId(), usuario.get().getEmail(), usuario.get().getNombreUsuario(), usuario.get().getRol());
return new DTOLoginRespuesta(token, usuario.get().getEmail(), usuario.get().getNombreUsuario());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment