Merge remote-tracking branch 'refs/remotes/origin/main'

This commit is contained in:
Alex Villa Ema 2026-06-29 19:42:56 +02:00
commit 4ca6e72ab6
4 changed files with 201 additions and 1 deletions

128
SOLUCIONES_IMPLEMENTADAS.md Normal file
View File

@ -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

View File

@ -19,7 +19,7 @@
<description>Backend para la web de recursos católicos</description>
<properties>
<java.version>25</java.version>
<java.version>21</java.version>
</properties>
<dependencies>

View File

@ -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);
}
}
}

View File

@ -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<List<UsuarioDTO>> listarUsuarios() {
List<UsuarioDTO> usuarios = usuarioRepository.findAll()
.stream()
.map(UsuarioDTO::from)
.toList();
return ResponseEntity.ok(usuarios);
}
}