AGENTS.md - Guía para Agentes de IA en Tarea5PAUF-PeliculasMongo
Arquitectura General
Esta es una API REST de películas construida con Spring Boot 4.0.3, Java 25 y MongoDB. La arquitectura sigue el patrón MVC con servicios de negocio e integra autenticación JWT con Spring Security.
Componentes principales:
- Modelos (
models/): Entidades de dominio con documentos embebidos (comentarios, valoraciones en películas; favoritas en usuarios) y referencias DBRef. - Repositorios (
repositories/): Interfaces que extiendenMongoRepositorypara operaciones CRUD básicas. - Servicios (
services/): Lógica de negocio, conversiones DTO y manejo de relaciones embebidas. - Controladores (
controllers/): Endpoints REST con CORS habilitado globalmente. - DTOs (
dtos/): Objetos de transferencia para respuestas, evitando exponer entidades internas. - Seguridad (
security/): NUEVO - Componentes JWT (generación, validación, filtro). - Configuración (
config/): NUEVO - Configuración de Spring Security con JWT.
Patrones de datos:
- Documentos embebidos para listas (ej.
Pelicula.comentarioscomoList<Comentario>). - Referencias DBRef en embebidos (ej.
Comentario.autorcon@DBRefy@JsonIdentityReference(alwaysAsId = true)). - Inicialización de listas vacías en servicios al guardar entidades nuevas.
Convenciones de Código
- Lombok obligatorio: Todas las clases usan
@Setter,@Getter,@AllArgsConstructor,@NoArgsConstructor,@Builder. VerPelicula.java. - Inyección de dependencias: Usa
@Autowireden servicios y controladores. Ejemplo enPeliculaService.java. - Manejo de fechas: Servicios preservan fechas existentes en actualizaciones; asignan
LocalDate.now()en creaciones. VerPeliculaService.save(). - Conversiones DTO: Servicios convierten entidades a DTOs para respuestas. Ejemplo:
PeliculaService.convertirDTO()mapea listas embebidas a DTOs. - CORS: Controladores anotados con
@CrossOrigin(origins = "*")para desarrollo. - Seguridad: NUEVO - Contraseñas cifradas con BCrypt. Tokens JWT de 24 horas. Rutas públicas:
/api/auth/login,/api/auth/register. Resto requiere JWT válido en headerAuthorization: Bearer <token>.
Flujos de Trabajo Críticos
- Construcción:
mvn clean installpara compilar;mvn spring-boot:runpara ejecutar. Requiere Maven wrapper (mvnw). - Base de datos: MongoDB en
localhost:27017, colecciones "peliculas" y "usuarios". Configurado enapplication.propertiesconspring.mongodb.uri. - Pruebas: Ejecutar con
mvn test. VerApiPaginaPeliculasApplicationTests.javapara pruebas básicas. - Debugging: Usar logs de Spring; verificar serialización JSON con
@JsonIdentityInfocomentado en modelos. - Autenticación: NUEVO - Registrar usuario en
/api/auth/register, obtener token en/api/auth/login, enviar token en header Authorization de requests posteriores.
Puntos de Integración
- Relaciones embebidas: Agregar comentarios/valoraciones actualiza el documento padre. Ejemplo:
PeliculaService.addComentario()busca usuario por ID y embebido en película. - Favoritas: Simples objetos embebidos en
Usuario.favoritas, sin referencias complejas. VerUsuarioService.addFavorita(). - Serialización: Evita ciclos con
@JsonIdentityReferenceen referencias DBRef. - Autenticación: NUEVO -
JwtTokenProvidergenera/valida tokens;JwtAuthenticationFilterextrae e inyecta en contexto de seguridad;SecurityConfigdefine rutas públicas/protegidas.
Archivos clave para entender flujos:
PeliculaService.java: Lógica de embebidos y conversiones. MODIFICADO - Incluye conversión a ComentarioDTO/ValoracionDTO con autorNombre y métodofindAllPaginated().PeliculaController.java: Endpoints REST y manejo de DTOs. MODIFICADO -GET /api/peliculassoporta paginación opcional (page,size,sortBy,direction) sin romper el comportamiento sin parámetros.UsuarioService.java: MODIFICADO - Incluye métodosregister(),authenticateUser(),emailExists(),getFavoritasPeliculas(),updateUsuario()(cifra contraseña con BCrypt si se envía nueva).UsuarioController.java: MODIFICADO -updateUsuario()delega al servicio. Incluye endpoints/me,/me/favoritasy delete de favoritas.AuthController.java: NUEVO - Endpoints/api/auth/loginy/api/auth/register.application.properties: Configuración MongoDB y JWT (app.jwt.secret,app.jwt.expiration).pom.xml: Dependencias (Lombok, Spring Data MongoDB, Spring Security, JJWT 0.12.3).
IMPLEMENTACIÓN DE JWT (2026-04-01)
Clases Creadas:
-
com.ricardo.peliculas.security.JwtTokenProvider- Genera tokens JWT con userId y expiración de 24h
- Valida y extrae información de tokens
- Usa JJWT 0.12.3 y SecretKey de 256 bits
-
com.ricardo.peliculas.security.JwtAuthenticationFilter- Filtro que se ejecuta en cada request
- Extrae token del header
Authorization: Bearer <token> - Inyecta autenticación en
SecurityContextHolder
-
com.ricardo.peliculas.config.SecurityConfig- Configura Spring Security con política STATELESS
- Define rutas públicas:
/api/auth/login,/api/auth/register - Resto de rutas requieren autenticación JWT
- Bean
PasswordEncoder(BCryptPasswordEncoder)
-
com.ricardo.peliculas.controllers.AuthController- NUEVO - Controlador específico para autenticación
- Endpoints:
POST /api/auth/register,POST /api/auth/login - Responsable de registro y login públicos
-
com.ricardo.peliculas.dtos.LoginRequest- DTO con campos
emailypassword
- DTO con campos
-
com.ricardo.peliculas.dtos.RegisterRequest- DTO con campos
nombre,email,password
- DTO con campos
-
com.ricardo.peliculas.dtos.AuthResponse- DTO de respuesta con
token,id,nombre,email,fechaRegistro
- DTO de respuesta con
Archivos Modificados:
-
pom.xml- Agregadas dependencias:
spring-boot-starter-security,jjwt-api,jjwt-impl,jjwt-jackson,spring-security-test
- Agregadas dependencias:
-
UsuarioRepository.java- Agregado método
Optional<Usuario> findByEmail(String email)para búsqueda en login/register
- Agregado método
-
UsuarioService.java- Inyectado
PasswordEncoder - Agregado
Optional<Usuario> register(RegisterRequest)- registra usuario con contraseña cifrada - Agregado
Optional<Usuario> authenticateUser(String email, String password)- valida credenciales - Agregado
boolean emailExists(String email)- verifica email duplicado
- Inyectado
-
UsuarioController.java- MODIFICADO - Removidos endpoints de autenticación (movidos a AuthController)
- Solo mantiene CRUD de usuarios y gestión de favoritas
- Incluye nuevos endpoints para usuario autenticado:
/me,/me/favoritas - MODIFICADO - updateUsuario() preserva campos no enviados
-
application.properties- Agregadas propiedades:
app.jwt.secret,app.jwt.expiration=86400000(24h)
- Agregadas propiedades:
Objetivo del Cambio:
Implementar autenticación y autorización con JWT manteniendo la estructura existente del proyecto. Permitir registro e inicio de sesión seguro con contraseñas cifradas en BCrypt. Proteger endpoints sensibles mediante tokens JWT sin romper endpoints existentes.
HISTORIAL COMPLETO DE IMPLEMENTACIONES (2026-04-01)
1) Reubicación de autenticación en AuthController
Clases Creadas:
com.ricardo.peliculas.controllers.AuthController- Endpoint público
POST /api/auth/register - Endpoint público
POST /api/auth/login
- Endpoint público
Archivos Modificados:
UsuarioController.java- Removidos endpoints de auth que estaban bajo
/api/usuarios/... - Mantenido solo CRUD de usuarios y favoritas
- Removidos endpoints de auth que estaban bajo
Objetivo del Cambio:
Alinear rutas públicas reales con SecurityConfig (/api/auth/login y /api/auth/register) para resolver acceso no público por path incorrecto.
2) Endpoints del usuario autenticado
Archivos Modificados:
-
UsuarioController.java- Agregado
GET /api/usuarios/me - Agregado
GET /api/usuarios/me/favoritas - Obtención de
userIddesdeSecurityContextHolder
- Agregado
-
UsuarioService.java- Agregado método
getFavoritasPeliculas(String userId) - Reutiliza
PeliculaServicepara devolverPeliculaValComDTO
- Agregado método
Objetivo del Cambio:
Permitir al frontend consultar datos y favoritas del usuario autenticado sin exponer contraseña ni requerir el id por URL.
3) Enriquecimiento de respuesta de películas con nombre de autor
Clases Creadas:
-
com.ricardo.peliculas.dtos.ComentarioDTO- Campos:
autorId,autorNombre,texto,fechaComentario
- Campos:
-
com.ricardo.peliculas.dtos.ValoracionDTO- Campos:
autorId,autorNombre,puntuacion,fechaValoracion
- Campos:
Archivos Modificados:
-
PeliculaValComDTO.java- Cambiado
comentariosaList<ComentarioDTO> - Cambiado
valoracionesaList<ValoracionDTO>
- Cambiado
-
PeliculaService.javaconvertirDTO()ahora incluyeautorNombrepara comentarios y valoraciones
Objetivo del Cambio:
Evitar llamadas extra desde React para resolver nombres de autores al mostrar comentarios y valoraciones.
4) Corrección de CORS para frontend React
Archivos Modificados:
SecurityConfig.java- Añadido bean
CorsConfigurationSource - Origen permitido:
http://localhost:5174 - Métodos permitidos:
GET,POST,PUT,DELETE,OPTIONS - Headers permitidos:
Authorization,Content-Type,Accept,X-Requested-With - Integrado con
.cors(...)enSecurityFilterChain
- Añadido bean
Objetivo del Cambio:
Resolver bloqueo de preflight y habilitar login/register desde React sin romper JWT ni rutas protegidas.
5) Actualización parcial segura de usuario (PUT)
Archivos Modificados:
-
UsuarioController.javaupdateUsuario()delega al servicio
-
UsuarioService.java- Agregado
updateUsuario(String id, Usuario usuarioData) - Preserva campos no enviados (
nombre,email,password, másfavoritas/fechaRegistrosegún lógica existente) - Si llega contraseña nueva, la cifra con
PasswordEncoder(BCrypt)
- Agregado
Objetivo del Cambio:
Mantener comportamiento de actualización parcial sin pérdida de datos y evitando persistir contraseñas en texto plano.
6) Eliminación de favoritas por endpoint REST
Archivos Modificados:
UsuarioController.java- Agregado
DELETE /api/usuarios/{usuarioId}/favoritas/{peliculaId} - Reutiliza
usuarioService.removeFavorita(...)
- Agregado
Objetivo del Cambio:
Completar CRUD de favoritas con eliminación explícita mediante endpoint dedicado.
7) Paginación opcional en GET /api/peliculas
Archivos Modificados:
-
PeliculaController.javaGET /api/peliculasacepta params opcionales:page,size,sortBy,direction- Sin
page/size: devuelve todo (comportamiento original) - Con
page/size: devuelve contenido paginado + metadatos
-
PeliculaService.java- Agregado
findAllPaginated(int page, int size, String sortBy, String direction) - Usa
PageRequestySort
- Agregado
Objetivo del Cambio:
Agregar paginación/ordenación sin romper integraciones existentes que dependen de la lista completa sin parámetros.
Resumen Global del Día
- Se mantuvo la estructura MVC y paquetes existentes.
- Se evitó romper endpoints previos; los cambios fueron incrementales y compatibles.
- Se centralizó la lógica sensible (cifrado/actualización) en servicios.
- Se reforzó integración frontend-backend (CORS, JWT, respuestas enriquecidas).