Este proyecto es una API REST de demostración que utiliza Quarkus, Kotlin y GraalVM para crear un microservicio de gestión de películas.
- Quarkus: Framework Java nativo para la nube
- Kotlin: Lenguaje de programación moderno y conciso
- GraalVM: Máquina virtual de alto rendimiento
- PostgreSQL: Base de datos relacional
- Docker: Contenedorización de la aplicación
- Hibernate ORM: Mapeo objeto-relacional
- Panache: Simplificación del acceso a datos
- Jackson: Serialización/deserialización JSON
- Java 21 con GraalVM (recomendado GraalVM 21.0.7 o superior)
- Docker y Docker Compose
- Maven
-
Clonar el repositorio:
git clone [email protected]:mchapper/quarkus-kotlin-graalvm.git cd quarkus-kotlin-graalvm
-
Compilar el proyecto:
mvn clean package -Pnative -Dquarkus.native.container-build=true
-
Iniciar los servicios con Docker Compose:
docker-compose up --build
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/movies | Obtener todas las películas |
| GET | /api/movies/{id} | Obtener una película por ID |
| POST | /api/movies | Crear una nueva película |
| PUT | /api/movies/{id} | Actualizar una película existente |
| DELETE | /api/movies/{id} | Eliminar una película |
-
Crear una película:
curl -X POST http://localhost:8080/api/movies \ -H "Content-Type: application/json" \ -d '{ "title": "Inception", "director": "Christopher Nolan", "year": 2010, "genre": "Sci-Fi" }'
-
Listar todas las películas:
curl http://localhost:8080/api/movies
-
Obtener una película por ID:
curl http://localhost:8080/api/movies/{id} -
Actualizar una película:
curl -X PUT http://localhost:8080/api/movies/{id} \ -H "Content-Type: application/json" \ -d '{ "title": "Inception", "director": "Christopher Nolan", "year": 2010, "genre": "Ciencia Ficción" }' -
Eliminar una película:
curl -X DELETE http://localhost:8080/api/movies/{id}
src/
├── main/
│ ├── kotlin/
│ │ └── com/
│ │ └── movies/
│ │ └── api/
│ │ ├── MovieEntity.kt # Entidad JPA
│ │ ├── MovieDTO.kt # Objeto de transferencia de datos
│ │ ├── MovieRepository.kt # Repositorio Panache
│ │ ├── MovieService.kt # Lógica de negocio
│ │ └── MovieResource.kt # Endpoints REST
│ └── resources/
│ └── application.properties # Configuración
└── test/
└── kotlin/
└── com/
└── movies/
└── api/
├── MovieResourceTest.kt # Tests de endpoints REST
└── MovieServiceTest.kt # Tests de lógica de negocio
La aplicación utiliza PostgreSQL con las siguientes configuraciones por defecto:
- Host: localhost
- Puerto: 5432
- Base de datos: movies
- Usuario: postgres
- Contraseña: postgres
El proyecto incluye un docker-compose.yml que configura:
- Servicio PostgreSQL
- Servicio de la aplicación Quarkus
- Volumen persistente para la base de datos
-
Compilar la aplicación nativa:
mvn clean package -Pnative -Dquarkus.native.container-build=true
-
Iniciar los servicios:
docker-compose up --build
La aplicación estará disponible en http://localhost:8080
El proyecto incluye tests unitarios para validar la funcionalidad de la API. Los tests están escritos usando JUnit 5 y MockK para el mocking.
Para ejecutar los tests unitarios:
mvn clean testEl proyecto utiliza JaCoCo para generar reportes de cobertura de código. Después de ejecutar los tests, puedes encontrar el reporte en:
target/site/jacoco/index.html
Los tests están organizados en:
MovieResourceTest: Tests para los endpoints RESTMovieServiceTest: Tests para la lógica de negocio
Para ejecutar los tests y generar el reporte de cobertura:
mvn clean test jacoco:reportPara detener y eliminar todos los contenedores, volúmenes y redes creados por docker-compose:
docker-compose down -vEste comando:
- Detiene todos los contenedores
- Elimina los contenedores
- Elimina los volúmenes (incluyendo la base de datos)
- Elimina las redes creadas
Si solo quieres detener los contenedores sin eliminar los volúmenes (para mantener los datos de la base de datos):
docker-compose down- La aplicación utiliza carga perezosa (lazy loading) para las entidades
- Los DTOs están configurados para serialización/deserialización JSON
- La base de datos se inicializa automáticamente al primer inicio
- Los logs están configurados para mostrar información detallada
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE.md para más detalles.