API REST con autenticacion JWT y gestion de tareas por usuario.
Cada usuario solo puede crear, ver, actualizar y eliminar sus propias tareas.
Repo hecho con fines de aprendizaje de NestJS
- NestJS
- TypeORM
- SQLite
- Passport + JWT
- class-validator
- Node.js 20+
- Yarn 1.22+
- Clonar el repositorio.
- Instalar dependencias.
- Crear archivo .env.
- Ejecutar la API.
Comandos (copiar y pegar):
git clone <URL_DEL_REPO>
cd first-app
yarn installCrear un archivo .env en la raiz del proyecto (copiar y pegar):
cat > .env << 'EOF'
JWT_SECRET=tu_clave_super_secreta
JWT_REFRESH_SECRET=tu_clave_super_secreta_refresh
PORT=3000
EOFNotas:
- JWT_SECRET es obligatorio para firmar y validar tokens.
- JWT_REFRESH_SECRET es recomendado para refresh tokens. Si no existe, se reutiliza JWT_SECRET.
- PORT es opcional. Si no se define, se usa 3000.
yarn start:devTambien puedes usar:
yarn startColeccion Bruno incluida en el repo:
- bruno/first-app-api
Como usarla en Bruno:
- Abrir Bruno.
- Open Collection.
- Seleccionar la carpeta bruno/first-app-api.
- Elegir el environment Local.
Base URL:
http://localhost:3000
Variables del environment Local en Bruno:
- baseUrl = http://localhost:3000
- token = (vacio al inicio, se llena despues del login)
- refreshToken = (vacio al inicio, se llena despues del login)
- taskId = 1
POST /auth/register
Configuracion en Bruno:
- Method: POST
- URL: {{baseUrl}}/auth/register
- Headers:
- Content-Type: application/json
- Body (raw, JSON):
{
"email": "test1@mail.com",
"password": "Test1234",
"fullName": "Test User"
}Respuesta esperada:
- usuario creado
- token
- refreshToken
POST /auth/login
Configuracion en Bruno:
- Method: POST
- URL: {{baseUrl}}/auth/login
- Headers:
- Content-Type: application/json
- Body (raw, JSON):
{
"email": "test1@mail.com",
"password": "Test1234"
}Guarda el token de la respuesta en la variable token. Guarda tambien refreshToken en la variable refreshToken.
GET /auth/check-status
Configuracion en Bruno:
- Method: GET
- URL: {{baseUrl}}/auth/check-status
- Auth: Bearer Token
- Token: {{token}}
POST /auth/refresh-token
Configuracion en Bruno:
- Method: POST
- URL: {{baseUrl}}/auth/refresh-token
- Headers:
- Content-Type: application/json
- Body (raw, JSON):
{
"refreshToken": "{{refreshToken}}"
}Guarda los nuevos valores token y refreshToken en token y refreshToken.
Todos estos endpoints requieren token:
- POST /tasks
- GET /tasks
- GET /tasks/:id
- PATCH /tasks/:id
- PATCH /tasks/:id/restore
- DELETE /tasks/:id
En Bruno, para todos estos requests:
- Auth: Bearer Token
- Token: {{token}}
Crear tarea:
- Method: POST
- URL: {{baseUrl}}/tasks
- Headers:
- Content-Type: application/json
- Body (raw, JSON):
{
"title": "Aprender Nest",
"description": "Practicar JWT y ownership",
"status": "OPEN"
}Listar tareas del usuario autenticado:
- Method: GET
- URL: {{baseUrl}}/tasks?limit=10&offset=0
Ver una tarea por id:
- Method: GET
- URL: {{baseUrl}}/tasks/{{taskId}}
Actualizar una tarea:
- Method: PATCH
- URL: {{baseUrl}}/tasks/{{taskId}}
- Headers:
- Content-Type: application/json
- Body (raw, JSON):
{
"status": "IN_PROGRESS"
}Eliminar una tarea:
- Method: DELETE
- URL: {{baseUrl}}/tasks/{{taskId}}
Restaurar una tarea eliminada (soft delete):
- Method: PATCH
- URL: {{baseUrl}}/tasks/{{taskId}}/restore
El seed borra usuarios y tareas existentes, y crea datos de prueba nuevos.
Configuracion en Bruno:
- Method: POST
- URL: {{baseUrl}}/seed
Respuesta esperada:
- resumen de usuarios y tareas insertadas
- credenciales de prueba para login
GET /tasks permite query params opcionales:
- limit (number)
- offset (number)
- status (OPEN | IN_PROGRESS | DONE)
Ejemplo:
GET /tasks?limit=10&offset=0&status=OPEN
- Endpoints de tareas protegidos con JWT.
- Cada tarea queda asociada al usuario autenticado.
- Un usuario no puede acceder ni modificar tareas de otro usuario.
- Validaciones globales activas con whitelist y forbidNonWhitelisted.
yarn build
yarn start
yarn start:dev
yarn test
yarn test:e2eVerifica que exista el archivo .env con JWT_SECRET en la raiz.
El puerto 3000 ya esta en uso.
Opciones:
- cerrar el proceso que ya usa ese puerto
- cambiar PORT en el archivo .env
Si hiciste cambios grandes de entidades durante desarrollo local, puedes eliminar db.sqlite para recrear esquema limpio con synchronize.