API REST desarrollada con Spring Boot 3 para la gestión de frases célebres, sus autores y categorías. Incluye autenticación con roles (Spring Security + Basic Auth), paginación, validación de datos, sistema de valoraciones (like/dislike) por usuario, "frase del día" programable y documentación interactiva con Swagger.
Proyecto realizado como práctica del módulo de Acceso a Datos del ciclo DAM.
- CRUD completo de frases, autores y categorías con DTOs de entrada/salida.
- Autenticación y autorización por roles (
ADMINescribe,STANDARDsolo lee, ambos pueden votar). - Frase del día: cada frase puede tener una fecha programada (única) y consultarse por fecha.
- Valoraciones: cada usuario puede dar like/dislike a una frase (una valoración por usuario, actualizable).
- Contador de visitas: consultar una frase por id incrementa sus visitas.
- Búsqueda de frases por texto y ranking de las más votadas.
- Paginación y ordenación en los listados (parámetros estándar de Spring Data:
page,size,sort). - Manejo global de errores con respuestas de error uniformes.
- Datos de ejemplo precargados al arrancar (20 autores, 5 categorías, 50 frases).
| Tecnología | Uso |
|---|---|
| Java 17 | Lenguaje |
| Spring Boot 3.2 | Framework (Web, Validation) |
| Spring Data JPA / Hibernate | Persistencia |
| Spring Security | Autenticación Basic Auth + roles |
| PostgreSQL | Base de datos |
| springdoc-openapi | Documentación Swagger UI |
| Lombok | Reducción de boilerplate |
| Gradle (Kotlin DSL) | Build |
Todas las rutas cuelgan del prefijo /api/v1 y requieren autenticación (Basic Auth).
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| GET | /frases |
Listado paginado de frases | STANDARD / ADMIN |
| GET | /frases/{id} |
Detalle de una frase (incrementa visitas) | STANDARD / ADMIN |
| GET | /frases/dia?fecha=YYYY-MM-DD |
Frase del día (hoy si no se indica fecha) | STANDARD / ADMIN |
| GET | /frases/top?limit=10 |
Frases más votadas | STANDARD / ADMIN |
| GET | /frases/search?texto=... |
Búsqueda por texto (sin distinguir mayúsculas) | STANDARD / ADMIN |
| GET | /frases/liked |
Frases a las que el usuario autenticado dio like | STANDARD / ADMIN |
| POST | /frases |
Crear frase | ADMIN |
| POST | /frases/{id}/valoraciones |
Votar una frase (like/dislike) | STANDARD / ADMIN |
| PUT | /frases/{id} |
Actualizar frase | ADMIN |
| DELETE | /frases/{id} |
Borrar frase | ADMIN |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| GET | /autores |
Listado paginado de autores | STANDARD / ADMIN |
| GET | /autores/{id} |
Detalle de un autor | STANDARD / ADMIN |
| POST | /autores |
Crear autor | ADMIN |
| PUT | /autores/{id} |
Actualizar autor | ADMIN |
| DELETE | /autores/{id} |
Borrar autor | ADMIN |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| GET | /categorias |
Listado paginado de categorías | STANDARD / ADMIN |
| GET | /categorias/{id} |
Detalle de una categoría | STANDARD / ADMIN |
| GET | /categorias/{id}/frases |
Frases de una categoría (paginado) | STANDARD / ADMIN |
| POST | /categorias |
Crear categoría | ADMIN |
| PUT | /categorias/{id} |
Actualizar categoría | ADMIN |
| DELETE | /categorias/{id} |
Borrar categoría | ADMIN |
La API utiliza Basic Auth (contraseñas almacenadas con BCrypt). Usuarios precargados para pruebas:
| Username | Password | Rol | Permisos |
|---|---|---|---|
admin |
1234 |
ADMIN | Acceso total (GET, POST, PUT, DELETE) |
user |
1234 |
STANDARD | Solo lectura (GET) + votar frases |
- Java: JDK 17 o superior.
- Gradle: no hace falta instalarlo, se incluye el wrapper (
./gradlew). - Base de datos: PostgreSQL.
- Clonar el repositorio:
git clone https://github.com/devPatuel/API_Frases_Celebres.git cd API_Frases_Celebres - Configurar la base de datos:
- Arranca PostgreSQL y crea la base de datos
frases_db. - Ajusta la conexión en
src/main/resources/application.propertiessi tu entorno difiere de los valores por defecto (hostlocalhost:5433, usuarioroot, contraseñatest). - No hace falta crear tablas ni datos: al arrancar, Hibernate genera el esquema (
ddl-auto=create) y se cargan los datos de ejemplo dedata.sql.
- Arranca PostgreSQL y crea la base de datos
- Ejecutar la aplicación:
La API queda disponible en
./gradlew bootRun
http://localhost:8081.
Con la aplicación levantada:
- Swagger UI:
http://localhost:8081/swagger-ui/index.html - OpenAPI JSON:
http://localhost:8081/v3/api-docs
Consultar la frase programada para una fecha:
curl -u user:1234 "http://localhost:8081/api/v1/frases/dia?fecha=2023-10-27"{
"id": 1,
"texto": "La vida es aquello que te va sucediendo mientras te empeñas en hacer otros planes.",
"fechaProgramada": "2023-10-27",
"autorId": 1,
"autorNombre": "Albert Einstein",
"categoriaId": 1,
"categoriaNombre": "Vida",
"visitas": 120,
"cantidadVotos": 0
}Votar una frase (like):
curl -u user:1234 -X POST "http://localhost:8081/api/v1/frases/1/valoraciones" \
-H "Content-Type: application/json" \
-d '{"esLike": true}'src/main/java/com/jordipatuel/frasescelebres/
├── config/ # Configuración de seguridad y constantes
├── controller/rest/ # Controladores REST
├── dto/ # DTOs de entrada/salida
├── exception/ # Manejador global de excepciones
├── model/ # Entidades JPA
├── repository/ # Repositorios Spring Data
└── service/ # Lógica de negocio


