Servicio API de pastebin ultra liviana construida con AWS Lambda, DynamoDB, MinIO y Redis. Contiene desarrollo backend en la nube, incluyendo autenticación, almacenamiento distribuido, y cacheo inteligente.
Los usuarios pueden crear "pastes" (fragmentos de texto o código) y compartirlos mediante una URL única. Soporta niveles de expiración, visibilidad (público, privado, oculto) y control de acceso por tipo de usuario (free/premium). El sistema incluye autenticación JWT y almacenamiento de usuarios en DynamoDB, uso de MinIO como almacenamiento de objetos y Redis como sistema de cache.
| Tecnología | Uso principal |
|---|---|
| AWS Lambda | Lógica backend sin servidores |
| API Gateway | Exposición de endpoints HTTP |
| DynamoDB | Almacenamiento de usuarios y metadata |
| MinIO (S3-like) | Almacenamiento de contenidos |
| Redis | Cache de consultas populares |
| JWT | Autenticación segura de usuarios |
| TypeScript | Tipado estricto y mantenibilidad |
| Serverless Framework | Organización y despliegue de funciones |
- Autenticación y planes de usuario (
freeopremium) - Alto rendimiento con cache en Redis
- Almacenamiento desacoplado (texto en MinIO, metadata en DynamoDB)
- Autorización por visibilidad y expiración
- Regeneración de IDs únicos tipo Base62
- Desplegable en AWS con Serverless Framework
Todos los servicios se levantan con docker-compose, lo cual permite replicar un entorno de producción local en segundos. El sistema utiliza Serverless Framework con funciones Lambda, DynamoDB, S3 y Redis, emulados mediante LocalStack, MinIO y Redis para desarrollo local.
Testing Automatizado: Se incluyen pruebas e2e (end-to-end) con usuarios reales (registro + login), validando que el flujo completo funcione correctamente.
Test CI/CD con GitHub Actions: Integración continua al hacer push/pull request sobre main, ejecutando tests de extremo a extremo con Jest y supertest.
Despliegue desacoplado: Separación clara entre workflows de test (test-localstack.yml) y de deploy (deploy.yml).
- Docker + docker-compose
- Node.js 20+
- Serverless Framework
minio,redisylocalstackcorriendo en local (simulan los servicios AWS)
-
Instalar dependencias
npm install
-
Levantar entorno
docker-compose up
-
Ejecutar el backend
sls offline start
POST /api/v1/register→ Crear usuarioPOST /api/v1/login→ Obtener JWTPOST /api/v1/pastes→ Crear nuevo paste (con token)GET /api/v1/pastes?pasteId=xyz→ Obtener contenido (con cache)
curl -X POST http://localhost:3000/local/api/v1/register \
-H "Content-Type: application/json" \
-d '{
"email": "fer@example.com",
"password": "123456"
}'curl -X POST http://localhost:3000/local/api/v1/login \
-H "Content-Type: application/json" \
-d '{
"email": "fer@example.com",
"password": "123456"
}'Guardá el
tokenJWT que te devuelve para los siguientes pasos.
curl -X POST http://localhost:3000/local/api/v1/pastes/api/v1/pastes \
-H "Content-Type: application/json" \
-d '{
"title": "Mi paste público",
"content": "Este es un paste público",
"contentType": "text/plain",
"visibility": "public",
"expireType": "never"
}'curl -X POST http://localhost:3000/local/api/v1/pastes/api/v1/pastes \
-H "Authorization: Bearer <JWT_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"title": "Paste privado",
"content": "Contenido secreto",
"contentType": "text/plain",
"visibility": "private",
"expireType": "1d"
}'Reemplazá
<JWT_TOKEN>por el valor que obtuviste en el login.
curl -X POST http://localhost:3000/local/api/v1/pastes/api/v1/pastes \
-H "Authorization: Bearer <JWT_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"title": "Paste premium",
"content": "Contenido premium",
"contentType": "text/plain",
"visibility": "private",
"expireType": "1m"
}'Asegurate de que el usuario tenga
plan: "premium"en DynamoDB, o simulalo manualmente por ahora.
curl -X GET "http://localhost:3000/local/api/v1/pastes/api/v1/pastes?pasteId=<PASTE_ID>"Reemplazá <PASTE_ID> por el ID que obtuviste en los pasos anteriores.