- Introducción
- Aclaración sobre la base de datos
- Lo más desafiante
- Pre-requisitos
- Guía de testing
- Variables de entorno
- Uso en desarrollo
- Docker compose
- CI/CD GitHub Actions
API REST en TypeScript + Fastify + Drizzle (SQLite) para gestionar canciones y playlists publicadas. Soporta CRUD de canciones, publicación automática de playlists, agregado de canciones con addedAt, y listados ordenados (playlists por publishedAt desc; canciones por addedAt desc). Incluye Docker, tests (Vitest) y RFC7807 para errores. La solución implementa un servicio de playlists minimalista pero “production-ready”: Fastify como servidor, Drizzle ORM con SQLite (archivo), validaciones con Zod, logging con pino, errores RFC7807, y pruebas con Vitest. Está containerizada y lista para correrse vía docker/docker compose.
Una decisión tal vez controversial fue mi elección de base de datos, utilizando el motor SQLite, por lo que la base de datos es una librería en vez de un servidor. Esto cambia algunos aspectos de la resolución del enunciado. Respondiendo el punto opcional 4, para el TP grupal esta elección puede resultar no óptima si se quiere presentar un MVP ya preparado para una carga escalable.
- Alinear ordenamientos exactos (playlists por
publishedAt descy canciones poraddedAt desc) para que coincidan con criterios de aceptación y pruebas E2E. - Hacer que la migración SQLite funcione igual en local, CI y contenedor (copiando el SQL al
disty creando el directorio de datos). - Mantener ESM + TypeScript sin fricciones (import paths,
moduleResolution,distlimpio para Docker).
- Node.js 20+
- npm 10+ (o tu manejador preferido; el proyecto usa
npm ci) - Docker 24+ (opcional, para contenedores)
- Docker Compose v2+ (opcional)
La base usa SQLite (archivo). No se requiere levantar un motor externo para desarrollo ni para CI.
Este repo usa Vitest. Documentación oficial:
👉 https://vitest.dev/guide
npx vitest run --reporter=verbose
Archivo .env.example incluido:
- HOST (por defecto 0.0.0.0)
- PORT (por defecto 8080)
- ENVIRONMENT (testing, dev, prod)
- DATABASE_URL (para SQLite: file:./data/melodia.sqlite)
Se dejó ejemplos de configuración si se migrase a una base de datos con motor de servidor como Posgres
Correr local:
npm start
Punto opcional 5
docker compose up --build -d
docker compose logs -f api
docker compose down
Punto opcional 6
Este repositorio incluye un flujo de CI/CD con GitHub Actions para automatizar la ejecución de tests y la construcción de la imagen Docker. Se ejecuta automáticamente en cada push o pull request hacia la rama main.
-
Node tests (Vitest)
- Instala dependencias (npm ci).
- Construye el proyecto (npm run build).
- Ejecuta todos los tests (unitarios y uno end-to-end) usando Vitest.
- Para la base de datos usa un archivo SQLite temporal (./data/ci.sqlite), por lo que no es necesario levantar un contenedor adicional.
-
Docker build
- Solo se corre si los tests pasaron.
- Construye la imagen Docker de la aplicación con el dockerfile incluido.
- No la pushea (solo la valida). Para producción, se puede extender para hacer push al registry deseado (ej. Docker Hub o GitHub Container Registry).
-
Variables de entorno en CI
- DATABASE_URL=file:./data/ci.sqlite → Usa un archivo SQLite descartable para las pruebas.
- NODE_ENV=test → Indica modo test.
- VITEST=true → Flag interno que puede usarse para condicionar el código a modo de testing.
-
Migración a producción
- Para producción se recomienda cambiar la base de datos a una en un contenedor separado, como Posgres.
- Se puede extender el workflow para hacer docker build y docker push hacia un registry, y desplegar automáticamente la imagen en un servidor o plataforma (ej. Fly.io, Railway, Kubernetes, etc).