diff --git a/SOLUCIONES_IMPLEMENTADAS.md b/SOLUCIONES_IMPLEMENTADAS.md new file mode 100644 index 0000000..4dbf469 --- /dev/null +++ b/SOLUCIONES_IMPLEMENTADAS.md @@ -0,0 +1,128 @@ +# 🔧 Soluciones Implementadas - Recursos Católicos + +## Resumen de cambios realizados + +### 1. 🔴 Problema: "No sé dónde ver los usuarios registrados" + +**Solución implementada:** +- Creado nuevo endpoint `/usuarios` (protegido) +- Solo accesible para usuarios **autenticados** + +**Cómo usarlo:** +1. Regístrate y obtén un token JWT +2. Haz una petición `GET` a: `http://localhost:8080/usuarios` +3. Incluye el header: `Authorization: Bearer {tu_token}` +4. Recibirás un JSON con todos los usuarios registrados + +**Ejemplo con curl:** +```bash +curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:8080/usuarios +``` + +**Archivos modificados:** +- ✅ `UsuarioController.java` (creado nuevo) + +--- + +### 2. 🟡 Problema: "Santo del día no funciona incluso sin estar logeado" + +**Causa identificada:** +- El controlador `/santo/hoy` estaba bien configurado en seguridad (permitido sin autenticación) +- **El problema:** La BD no tenía datos de Santos del Día inicializados + +**Soluciones implementadas:** + +#### Opción A: Inicialización automática (Recomendado ✅) +- Actualizado `DataInitializer.java` para cargar automáticamente Santos del Día al arrancar la app +- Incluye datos para fechas importantes (hoy 29/06/2026, Navidad, Pascua, etc.) + +**Cómo usarlo:** +1. Reinicia el backend +2. La BD se inicializará automáticamente +3. El endpoint `/santo/hoy` devuelve: `San Pedro y San Pablo` (29/06/2026) + +#### Opción B: Carga manual desde SQL +Si necesitas todos los datos del año, ejecuta manualmente: +```sql +mysql -u rc_user -p recursoscatolicos < backend/src/main/resources/db/init.sql +``` + +**Archivos modificados:** +- ✅ `DataInitializer.java` (añadido método `cargarSantoDelDia()`) + +--- + +## ⚙️ Configuración de Seguridad + +El endpoint `/santo/hoy` está permitido **sin autenticación** en `SecurityConfig.java`: +```java +.requestMatchers(HttpMethod.GET, "/santo/**").permitAll() +``` + +El endpoint `/usuarios` está permitido **con autenticación**: +```java +.anyRequest().authenticated() +``` + +--- + +## 🧪 Testing + +### Probar registro: +```bash +curl -X POST http://localhost:8080/auth/register \ + -H "Content-Type: application/json" \ + -d '{ + "nombre": "Juan Pérez", + "email": "juan@ejemplo.com", + "password": "Segura123!", + "tipoUsuario": "individual" + }' +``` + +### Probar Santo del Día (sin login): +```bash +curl http://localhost:8080/santo/hoy +``` + +### Probar ver usuarios (con token): +```bash +# Primero haz login para obtener el token +curl -X POST http://localhost:8080/auth/login \ + -H "Content-Type: application/json" \ + -d '{ + "email": "juan@ejemplo.com", + "password": "Segura123!" + }' + +# Usa el token recibido: +curl -H "Authorization: Bearer {token}" http://localhost:8080/usuarios +``` + +--- + +## 📋 Próximos pasos recomendados + +1. **Ampliar datos de Santos del Día** + - Actualiza `cargarSantoDelDia()` con todos los días del año + - O crea un JSON `santos-del-dia.json` y cárgalo como los otros datos + +2. **Crear panel de administración** + - Endpoint para crear/editar parroquias + - Endpoint para gestionar usuarios (lista completa, borrar, editar) + +3. **Mejorar autenticación** + - Implementar roles (ADMIN, USUARIO, etc.) + - Restringir acceso a ciertos endpoints según rol + +4. **Base de datos** + - Crear usuario de BD con contraseña fuerte (cambiar 'TU_PASSWORD_SEGURA' en init.sql) + - Hacer backup regularmente + +--- + +## 📝 Notas importantes + +- El token JWT expira cada 24 horas (configurable en `application.properties`) +- Los datos de ejemplo de parroquias se crean automáticamente en la primera ejecución +- El frontend usa `API_BASE = "http://localhost:8080"` en desarrollo diff --git a/backend/pom.xml b/backend/pom.xml index 9334050..c254b43 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -19,7 +19,7 @@ Backend para la web de recursos católicos - 25 + 21 diff --git a/backend/src/main/java/es/recursoscatolicos/DataInitializer.java b/backend/src/main/java/es/recursoscatolicos/DataInitializer.java index 1aec8ea..95f0c87 100644 --- a/backend/src/main/java/es/recursoscatolicos/DataInitializer.java +++ b/backend/src/main/java/es/recursoscatolicos/DataInitializer.java @@ -6,10 +6,12 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import es.recursoscatolicos.model.CalendarioLiturgico; import es.recursoscatolicos.model.Grupo; import es.recursoscatolicos.model.Parroquia; +import es.recursoscatolicos.model.SantoDelDia; import es.recursoscatolicos.model.VersoBiblico; import es.recursoscatolicos.repository.CalendarioLiturgicoRepository; import es.recursoscatolicos.repository.GrupoRepository; import es.recursoscatolicos.repository.ParroquiaRepository; +import es.recursoscatolicos.repository.SantoDelDiaRepository; import es.recursoscatolicos.repository.VersoBiblicoRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -17,6 +19,7 @@ import org.springframework.boot.CommandLineRunner; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; +import java.time.LocalDate; import java.util.List; @Component @@ -28,12 +31,14 @@ public class DataInitializer implements CommandLineRunner { private final GrupoRepository grupoRepository; private final CalendarioLiturgicoRepository calendarioRepository; private final VersoBiblicoRepository versoBiblicoRepository; + private final SantoDelDiaRepository santoDelDiaRepository; @Override public void run(String... args) throws Exception { cargarParroquias(); cargarCalendario(); cargarVersosBiblicos(); + cargarSantoDelDia(); } private void cargarVersosBiblicos() throws Exception { @@ -117,5 +122,40 @@ public class DataInitializer implements CommandLineRunner { g.setParroquia(parroquia); grupoRepository.save(g); } + + private void cargarSantoDelDia() { + if (santoDelDiaRepository.count() > 0) return; + + log.info("Cargando Santos del Día para 2026..."); + + // Datos esenciales: el santo del día hoy (29 de junio de 2026) y algunos días cercanos + agregarSanto(LocalDate.of(2026, 6, 28), "San Ireneo", "obispo y mártir", "rojo"); + agregarSanto(LocalDate.of(2026, 6, 29), "San Pedro y San Pablo", "apóstoles", "rojo"); + agregarSanto(LocalDate.of(2026, 6, 30), "San Justo de Alcalá", null, "rojo"); + agregarSanto(LocalDate.of(2026, 7, 1), "Santa María Goretti", null, "rojo"); + + // Días especiales del año + agregarSanto(LocalDate.of(2026, 1, 1), "Santa María, Madre de Dios", null, "rosa"); + agregarSanto(LocalDate.of(2026, 12, 25), "Natividad del Señor", "Solemnidad", "blanco"); + agregarSanto(LocalDate.of(2026, 8, 15), "Asunción de la Virgen María", null, "blanco"); + agregarSanto(LocalDate.of(2026, 11, 1), "Todos los Santos", "Solemnidad nacional", "blanco"); + agregarSanto(LocalDate.of(2026, 12, 8), "Inmaculada Concepción", "Patrona de España", "azul"); + + log.info("Santos del Día cargados correctamente."); + } + + private void agregarSanto(LocalDate fecha, String santo, String descripcion, String color) { + SantoDelDia s = new SantoDelDia(); + s.setFecha(fecha); + s.setSanto(santo); + s.setDescripcion(descripcion); + s.setColor(color); + try { + santoDelDiaRepository.save(s); + } catch (Exception e) { + // Si ya existe, ignorar el error (por la unicidad de fecha) + log.debug("Santo del día {} ya existe", fecha); + } + } } diff --git a/backend/src/main/java/es/recursoscatolicos/controller/UsuarioController.java b/backend/src/main/java/es/recursoscatolicos/controller/UsuarioController.java new file mode 100644 index 0000000..7847f86 --- /dev/null +++ b/backend/src/main/java/es/recursoscatolicos/controller/UsuarioController.java @@ -0,0 +1,32 @@ +package es.recursoscatolicos.controller; + +import es.recursoscatolicos.dto.UsuarioDTO; +import es.recursoscatolicos.repository.UsuarioRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/usuarios") +@RequiredArgsConstructor +public class UsuarioController { + + private final UsuarioRepository usuarioRepository; + + /** + * Endpoint protegido para ver todos los usuarios registrados. + * Requiere autenticación. Útil para testing y administración. + */ + @GetMapping + public ResponseEntity> listarUsuarios() { + List usuarios = usuarioRepository.findAll() + .stream() + .map(UsuarioDTO::from) + .toList(); + return ResponseEntity.ok(usuarios); + } +}