Repositorio con múltiples proyectos de aprendizaje en Spring Boot, incluyendo APIs REST completas con autenticación JWT, gestión de eventos, sistema de portfolio con Spring Security y más.
API REST para gestión de portfolios profesionales con información personal, educación, experiencia laboral y habilidades.
- Spring Boot 4.1.0
- Spring Data JDBC
- Spring Security
- PostgreSQL
- Thymeleaf (vistas web)
- Lombok
- Bean Validation
- Java 21
- Maven 3.9+ (o usar
./mvnw) - PostgreSQL 15+
-
Navegar al proyecto
cd portfolio -
Configurar variables de entorno
cp .env.example .env
Editar
.envcon tus credenciales de PostgreSQL:PG_URL_DATABASE=jdbc:postgresql://YOUR_PG_HOST/YOUR_PG_DATABASE?sslmode=require&channelBinding=require PG_USER=YOUR_PG_USER PG_PASSWORD=YOUR_PG_PASSWORD
-
Iniciar la aplicación
./mvnw spring-boot:run
-
Acceder a la aplicación
http://localhost:8080
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/test-personal-info/all |
Obtener toda la información personal |
GET |
/api/test-personal-info/{id} |
Obtener información personal por ID |
POST |
/api/test-personal-info |
Crear nueva información personal |
PUT |
/api/test-personal-info/{id} |
Actualizar información personal |
DELETE |
/api/test-personal-info/{id} |
Eliminar información personal |
Ejemplo de body (POST/PUT):
{
"firstName": "Carlos",
"lastName": "Martinez",
"title": "Backend Developer",
"email": "carlos.martinez@example.com",
"phone": "+5491134567890",
"profileDescription": "Desarrollador backend especializado en Node.js y NestJS",
"profileImageUrl": "img/profile-placeholder.jpg",
"yearsOfExperience": 4,
"linkedinUrl": "https://linkedin.com/in/carlosmartinez",
"githubUrl": "https://github.com/carlosmartinez"
}| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/education |
Listar toda la educación |
GET |
/api/education/{id} |
Obtener educación por ID |
POST |
/api/education |
Crear nuevo registro de educación |
PUT |
/api/education/{id} |
Actualizar educación |
DELETE |
/api/education/{id} |
Eliminar educación |
Ejemplo de body (POST/PUT):
{
"degree": "Máster en Desarrollo Full Stack",
"institution": "Instituto Tecnológico Digital",
"startDate": "2022-09-15",
"endDate": "2023-07-30",
"description": "Formación avanzada en desarrollo web y APIs REST",
"personalInfoId": 1
}| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/experience |
Listar toda la experiencia laboral |
GET |
/api/experience/{id} |
Obtener experiencia por ID |
POST |
/api/experience |
Crear nueva experiencia |
PUT |
/api/experience/{id} |
Actualizar experiencia |
DELETE |
/api/experience/{id} |
Eliminar experiencia |
Ejemplo de body (POST/PUT):
{
"jobTitle": "Desarrollador Java Senior",
"companyName": "Tech Solutions S.A.",
"startDate": "2023-01-01",
"endDate": null,
"description": "Desarrollo y mantenimiento de aplicaciones empresariales",
"personalInfoId": 1
}| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/skill |
Listar todas las habilidades |
GET |
/api/skill/{id} |
Obtener habilidad por ID |
GET |
/api/skill/personal-info/{id} |
Obtener habilidades por Personal Info ID |
POST |
/api/skill |
Crear nueva habilidad |
PUT |
/api/skill/{id} |
Actualizar habilidad |
DELETE |
/api/skill/{id} |
Eliminar habilidad |
Ejemplo de body (POST/PUT):
{
"name": "Angular",
"levelPercentage": 85,
"iconClass": "fab fa-angular",
"personalInfoId": 1
}API REST para gestión de eventos con autenticación JWT, categorías, speakers y paginación. Incluye optimizaciones para evitar el problema N+1 y documentación Swagger/OpenAPI.
- Spring Boot 4.1.0
- Spring Data JPA
- Spring Security + JWT
- PostgreSQL / H2
- MapStruct (mapeo DTO)
- Lombok
- Bean Validation
- Swagger/OpenAPI 3 (documentación)
- Docker & Docker Compose
- Java 21
- Maven 3.9+ (o usar
./mvnw) - Docker & Docker Compose (para ejecutar con contenedor)
-
Navegar al proyecto
cd events-api -
Configurar variables de entorno
cp .env.example .env
Editar
.envcon tus credenciales:NEON_DB_URL=jdbc:postgresql://YOUR_HOST/YOUR_DATABASE NEON_DB_USER=YOUR_USER NEON_DB_PASSWORD=YOUR_PASSWORD JWT_SECRET=your_secret_key_here JWT_EXPIRATION=86400000
-
Iniciar la aplicación
./mvnw spring-boot:run
-
Construir e iniciar con Docker
cd events-api docker-compose up --build -
Acceder a la aplicación
http://localhost:8080 -
Acceder a la documentación Swagger
http://localhost:8080/swagger-ui/index.html
La API utiliza JWT (JSON Web Tokens) para la autenticación. Primero debes registrarte y luego iniciar sesión para obtener un token.
POST /api/v1/auth/register
{
"username": "testuser",
"password": "123456",
"email": "example@gmail.com",
"name": "Usuario Test",
"roles": ["ROLE_USER"]
}POST /api/v1/auth/login
{
"username": "admin",
"password": "123456"
}Respuesta:
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer"
}Para los siguientes endpoints, incluir el token en el header:
Authorization: Bearer {accessToken}
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/v1/events |
Listar eventos con paginación y filtros |
GET |
/api/v1/events?page=0&size=10 |
Eventos paginados |
GET |
/api/v1/events?name=Conferencia&page=0&size=5 |
Búsqueda con filtros |
GET |
/api/v1/events/{id} |
Obtener evento por ID |
GET |
/api/v1/events/problematic |
Demostración problema N+1 |
GET |
/api/v1/events/optimized-join-fetch |
Eventos optimizados (JOIN FETCH) |
GET |
/api/v1/events/optimized/all-details |
Eventos con todos los detalles optimizados |
POST |
/api/v1/events |
Crear nuevo evento |
PUT |
/api/v1/events/{id} |
Actualizar evento |
DELETE |
/api/v1/events/{id} |
Eliminar evento |
Ejemplo de body (POST/PUT):
{
"name": "Lanzamiento de Spring Boot 5.0",
"date": "2026-06-23",
"location": "Online",
"categoryId": 2,
"speakersIds": [1, 2]
}| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/v1/categories |
Listar todas las categorías |
GET |
/api/v1/categories/{id} |
Obtener categoría por ID |
POST |
/api/v1/categories |
Crear nueva categoría |
PUT |
/api/v1/categories/{id} |
Actualizar categoría |
DELETE |
/api/v1/categories/{id} |
Eliminar categoría |
Ejemplo de body (POST/PUT):
{
"name": "Tecnología",
"description": "Eventos relacionados con tecnología y software"
}| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/v1/speakers |
Listar todos los speakers |
GET |
/api/v1/speakers/{id} |
Obtener speaker por ID |
POST |
/api/v1/speakers |
Crear nuevo speaker |
PUT |
/api/v1/speakers/{id} |
Actualizar speaker |
DELETE |
/api/v1/speakers/{id} |
Eliminar speaker |
Ejemplo de body (POST/PUT):
{
"name": "Andrés Podadera",
"email": "andrespoda@gmail.com",
"bio": "Experto en Spring Boot y arquitectura de software"
}- Autenticación JWT: Sistema completo de registro y login con tokens JWT
- Optimización N+1: Endpoints con y sin optimización para demostrar el problema N+1 en JPA
- Paginación: Soporte de paginación en listados de eventos
- Filtros: Búsqueda de eventos por nombre y otros criterios
- Validación: Validación de datos con Bean Validation
- MapStruct: Mapeo automático entre entidades y DTOs
- Documentación OpenAPI: Swagger UI integrado
- Dockerizado: Listo para desplegar con Docker Compose
La colección completa de Postman con todos los endpoints, ejemplos de requests y tests automatizados está disponible en:
docs/Curso SpringBoot Portfolio.postman_collection.json
- Abrir Postman
- Ir a
File > Import - Seleccionar el archivo
Curso SpringBoot Portfolio.postman_collection.json - La colección incluye:
- ✅ Todos los endpoints de Portfolio API
- ✅ Todos los endpoints de Events API
- ✅ Configuración automática de tokens JWT
- ✅ Ejemplos de requests y responses
- ✅ Tests automatizados
- ✅ Visualizaciones de respuestas
Proyecto de ejercicios y prácticas adicionales de Spring Boot con Thymeleaf y modelo MVC.
Ejemplos y ejercicios de testing con JUnit en aplicaciones de consola Spring Boot.
Prácticas de testing con Mockito para crear mocks y tests unitarios efectivos.
Ejemplos de validación de datos con Bean Validation y anotaciones personalizadas.
Proyecto de integración entre Spring Boot y Angular con configuración de CORS.
- Los archivos
.envcontienen información sensible y NO deben subirse al repositorio - Las plantillas
.env.exampleestán versionadas como referencia - Cambiar las claves JWT por defecto en producción
- Usar contraseñas seguras en bases de datos productivas
- Configurar SSL/TLS en PostgreSQL para conexiones seguras
Java: Spring Boot - Guía definitiva
- Spring Boot Documentation
- Spring Security Documentation
- Spring Data JPA Documentation
- PostgreSQL Documentation
Este es un repositorio de aprendizaje personal. El código está disponible para fines educativos.
Este es un proyecto de aprendizaje personal, pero sugerencias y feedback son bienvenidos a través de issues.