API REST desarrollada con Spring Boot que implementa autenticación y autorización mediante JWT y OAuth2. Incluye manejo de roles, pruebas unitarias e integración, documentación Swagger, y despliegue en AWS con Docker.
- 🔐 Autenticación y autorización con JWT + OAuth2
- 👥 Manejo de usuarios, roles y permisos (Admin/Dev/Invited)
- 📦 CRUD completo con control de acceso
- 📄 Documentación Swagger UI
- 🐳 Contenedores con Docker para backend y base de datos
- 🧪 Pruebas unitarias e integración (JUnit, Mockito, TestContainers)
- ☁️ Despliegue en AWS con ALB, Auto Scaling y EC2
⚠️ Manejo global de errores con@ControllerAdvice
- 🪵 Logging centralizado con SLF4J + Logback
- 🧬 Migraciones de base de datos automáticas con Flyway
Tecnología | Uso |
---|---|
Spring Boot | Framework principal |
Spring Security | Seguridad, JWT y OAuth2 |
Spring Data JPA | Persistencia con Hibernate |
MySQL | Base de datos relacional |
Flyway | Migraciones de esquema SQL |
Swagger/OpenAPI | Documentación automática de la API |
Docker + Compose | Contenedores para despliegue |
JUnit + Mockito | Pruebas unitarias |
TestContainers | Pruebas de integración reales |
AWS EC2 + ALB | Despliegue y escalabilidad |
- Java 17+
- Maven 3.8+
- Docker y Docker Compose
- Crear .env file con las variables de entorno necesarias (ver sección de Docker)
- Crear claves .pem para authentication con JWT y OAuth2 (ver sección de seguridad)
docker-compose up --build
Esto levantará el backend y una instancia de MySQL en Docker.
Método | Endpoint | Descripción |
---|---|---|
POST | /api/v1/auth/sign-up |
Registro de nuevos usuarios |
POST | /api/v1/auth/login |
Login y obtención de JWT |
Método | Endpoint | Descripción |
---|---|---|
GET | /api/v1/users |
Listar todos los usuarios |
GET | /api/v1/users/{id} |
Obtener usuario por ID |
POST | /api/v1/users |
Crear nuevo usuario |
PUT | /api/v1/users/{userId} |
Actualizar usuario |
DELETE | /api/v1/users/{id} |
Eliminar usuario |
Método | Endpoint | Descripción |
---|---|---|
GET | /api/v1/gemini/nickname/{name} |
Genera un apodo argentino usando IA |
GET /health
El proyecto cuenta con cobertura de pruebas en:
- Lógica de negocio (
service
) - Repositorios (
repository
) - Controladores (
controller
) - Seguridad (
JWT
, OAuth2) - Pruebas de integración con bases reales (
TestContainers
)
Ejecutar:
mvn test
FROM openjdk:17-jdk-slim
ARG JAR_FILE=target/api.rest-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app_api-rest-springboot.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar","app_api-rest-springboot.jar"]
services:
api.rest:
build: Project-API-REST-JWT-OAuth
mem_limit: 512m
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
SPRING_AI_OPENAI_API_KEY: ${SPRING_AI_OPENAI_API_KEY}
depends_on:
- user_db
user_db:
image: mysql:8.4
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: project-api-rest
restart: always
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ptest"]
timeout: 20s
retries: 15
interval: 5s
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Desplegado con:
- EC2 (Dockerizado)
- Load Balancer (ALB)
- Auto Scaling Groups
- Imagen Docker personalizada para el backend
src/
├── main/
│ ├── java/project/api/rest/
│ │ ├── controller/
│ │ ├── entity/
│ │ ├── service/
│ │ ├── security/
│ │ ├── dto/
│ │ ├── mapper/
│ │ ├── exceptions/
│ │ ├── config/
│ ├── resources/
│ ├── db/migration/ # Scripts de Flyway
│ └── application.yml
└── test/
├── integration/
├── controller/
└── service/