Este repositorio implementa la prueba descrita en el documento adjunto: aplicación web responsive con autenticación JWT, CRUD de usuarios y listado de Pokémon consumiendo PokeAPI, usando:
- Frontend: Next.js + React + Redux
- Backend: NestJS + Prisma + MySQL
Requisitos funcionales (según el enunciado):
- Registro y login con JWT, rutas protegidas, expiración y manejo de errores.
- CRUD de usuarios con validaciones y acceso por autenticación.
- Listado de Pokémon con paginación/carga incremental y manejo de errores.
- Testing (unitario e integración) y documentación.
- El backend emite un JWT con expiración (por defecto 15m) y lo guarda en una cookie HttpOnly (
access_token). - El frontend llama al backend con
credentials: 'include', y protege rutas del cliente usandoRequireAuth. - Al expirar la sesión, el backend responde
401y el frontend redirige a/login.
- Backend
POST /auth/registerPOST /auth/loginPOST /auth/logoutGET /auth/me(protegido)GET/POST/PUT/DELETE /users(CRUD protegido)
- Frontend
/loginy/register/dashboard/users(CRUD)/pokemon(PokeAPI, carga incremental)
docker compose up --build- Frontend:
http://localhost:3000 - Backend:
http://localhost:4000 - MySQL:
localhost:3306
En otra terminal:
docker compose exec backend npm run prisma:generate
docker compose exec backend npm run prisma:migrateNota:
prisma migrate devcrea/actualiza el esquema en MySQL.
cd backend
cp .env.example .env
npm install
npm run prisma:generate
npm run prisma:migrate
npm run start:devcd frontend
cp .env.local.example .env.local
npm install
npm run dev- DTOs con
class-validator(email, minLength password, etc.). - Rutas protegidas con
JwtAuthGuarden backend. - Manejo de expiración de token por JWT (y cookie maxAge). Si expira: respuesta
401. - CORS con
credentials: truepara permitir cookies entre frontend/backend en entorno local.
Unit tests (servicios) con mocks de Prisma:
cd backend
npm testTest básico sobre apiFetch:
cd frontend
npm test- Incluye
Dockerfileparabackendyfrontend, ydocker-compose.ymlpara levantar la plataforma. - Para producción, se recomienda:
JWT_SECRETfuertesecure: truepara cookies- configurar dominios/CORS acorde al entorno