## Novasis Backend

API backend construido con NestJS, Prisma y Redis. Incluye autenticación JWT con refresh tokens, colas BullMQ, envío de emails, cache de referenciales y documentación Swagger.

## Requisitos

- Node.js 20+
- pnpm 10+ (o npm)
- PostgreSQL (configurado en `DATABASE_URL`)
- Redis (cache/colas/refresh tokens)

## Instalación

1. Instalar dependencias

```bash
pnpm install
# o
npm install
```

2. Variables de entorno (.env)

Crear un archivo `.env` en la raíz con los siguientes valores mínimos (ajusta según tu entorno):

```env
# Server
PORT=3000

# Base de datos
DATABASE_URL="postgresql://user:pass@localhost:5432/smartfactvoice?schema=public"

# Redis
REDIS_URL="redis://localhost:6379"

# JWT Access
JWT_SECRET="clave_segura"
JWT_EXPIRES_IN=86400            # segundos (1 día)

# JWT Refresh
JWT_REFRESH_SECRET="clave_refresh_segura"
JWT_REFRESH_EXPIRES_IN=604800   # segundos (7 días)

# Mailer (ejemplo SMTP)
MAIL_HOST=smtp.tu-proveedor.com
MAIL_PORT=587
MAIL_USER=usuario
MAIL_PASS=clave
MAIL_FROM="Novasis <no-reply@tu-dominio.com>"

# App Key (para AppTokenGuard)
APP_KEY="tu_app_key"
```

3. Prisma (BD)

```bash
pnpm prisma generate
# Producción (aplicar migraciones existentes)
pnpm prisma migrate deploy
# Desarrollo (crear/actualizar migraciones)
pnpm prisma migrate dev
```

4. Levantar servicios externos

- Asegúrate de que PostgreSQL y Redis estén ejecutándose y accesibles según tu `.env`.

## Ejecutar la aplicación

```bash
# Desarrollo (watch)
pnpm start:dev

# Desarrollo (sin watch)
pnpm start

# Producción
pnpm build && pnpm start:prod
```

Salida esperada:

- Swagger en `http://localhost:3000/docs`
- Rutas bajo prefijo `/api/v1` (según configuración del proyecto)

## Documentación Swagger

Swagger está habilitado en `/docs` con:

- Bearer Auth (JWT) para rutas protegidas.
- ApiKey `x-app-key` (si usas `@ApiSecurity('AppKey')`) para endpoints que requieren AppTokenGuard.

Ejemplo de uso en Swagger:

1. Autoriza con `AppKey` (si aplica) e ingresa tu `x-app-key`.
2. Realiza `POST /api/v1/auth/login` con `usuario` y `password`.
3. Copia `access_token` y usa “Authorize” (Bearer) con `Bearer <token>` para acceder a rutas protegidas.

## Autenticación

- `POST /api/v1/auth/login`: devuelve `access_token`, `refresh_token`, `expires_in`, `refresh_expires_in`.
- `POST /api/v1/auth/refresh`: recibe `refresh_token` y emite nuevos tokens (rotación del refresh token en Redis).
- `POST /api/v1/auth/logout`: invalida el `refresh_token` (borra el jti en Redis).
- Endpoints con `AppTokenGuard` exigen header `x-app-key: <APP_KEY>`.

## Endpoints principales

- Auth
  - `POST /api/v1/auth/register`
  - `POST /api/v1/auth/login`
  - `POST /api/v1/auth/refresh`
  - `POST /api/v1/auth/logout`
- Códigos de Verificación
  - `POST /api/v1/codigos-verificacion/enviar-codigo`
  - `POST /api/v1/codigos-verificacion/verificar`
  - `GET  /api/v1/codigos-verificacion/privado` (JWT)
- Referenciales
  - `GET  /api/v1/referenciales`

## Scripts útiles

```bash
pnpm lint
pnpm test
pnpm test:e2e
pnpm test:cov
```

## Solución de problemas

- EADDRINUSE 3000: cambia `PORT` o libera el puerto.
- Cannot find module: reinstala dependencias (`pnpm install`) y recompila (`pnpm build`).
- Prisma no genera: revisa `DATABASE_URL` y ejecuta `pnpm prisma generate`.
- Redis no disponible: valida `REDIS_URL` y que el servicio esté activo.
- JWT expira de inmediato: asegúrate que `JWT_EXPIRES_IN` y `JWT_REFRESH_EXPIRES_IN` sean numéricos (segundos).

## Licencia

MIT
