# API CartecWeb (Node.js)

Versión en Node.js de la API pública CartecWeb. Misma lógica que la API Laravel: OT, clientes, vehículos, GPS. Sin dependencia de PHP ni tiempo de espera por sesión Laravel.

## Requisitos

- Node.js >= 12
- MySQL (acceso a base de datos `revisa` y opcionalmente `gpsimple`)

## Instalación

```bash
cd node_api
cp .env.example .env
# Editar .env con DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE
npm install
npm start
```

Por defecto escucha en el puerto 3000 en todas las interfaces (`HOST=0.0.0.0`), para poder llamar la API desde otra máquina. Configurable con `PORT` y `HOST` en `.env`. Si el firewall lo permite, desde fuera: `http://<IP_MAQUINA>:3000/api/health`.

### PM2 (producción, puerto 3000)

```bash
cd node_api
npm run pm2:start
# Ver logs: npm run pm2:logs
# Reiniciar: npm run pm2:restart
```

## Variables de entorno (.env)

| Variable | Descripción |
|----------|-------------|
| `PORT` | Puerto (default 3000) |
| `HOST` | Interfaz de escucha (default 0.0.0.0 para acceso externo) |
| `CORS_ORIGIN` | Origen CORS (default *; poner un dominio si quieres restringir) |
| `DB_HOST` | Host MySQL principal |
| `DB_PORT` | Puerto MySQL (3306) |
| `DB_USER` | Usuario MySQL |
| `DB_PASSWORD` | Contraseña |
| `DB_DATABASE` | Base de datos (revisa) |
| `GPS_DB_HOST` | (Opcional) Host BD gpsimple |
| `GPS_DB_USER` | (Opcional) Usuario gpsimple |
| `GPS_DB_PASSWORD` | (Opcional) Contraseña gpsimple |
| `GPS_DB_DATABASE` | (Opcional) gpsimple |

Si no configuras `GPS_*`, los endpoints `/api/gps/*` y `/api/tecnicos` responderán 503.

## Endpoints (misma API que Laravel)

- `GET /api/health` — Estado (opcional `?db=1` para probar BD)
- `GET /api/ot/list` — Listar OT (query: `estado`, `rut_tecnico`, `limit`)
- `GET /api/ot/latest` — Últimas 10 OT
- `GET /api/ot/:id` — Detalle OT
- `POST /api/ot/create` — Crear OT
- `PATCH /api/ot/:id/complete` — Completar OT (firma opcional)
- `GET /api/cliente/:rut` — Cliente por RUT
- `GET /api/gps/position/:imei` — Posición GPS (requiere GPS_DB_*)
- `GET /api/gps/info/:id` — Info GPS (requiere GPS_DB_*)
- `GET /api/tecnicos` — Listar técnicos (requiere GPS_DB_*)
- `GET /api/vehiculo/vin/:vin` — Datos vehículo por VIN (Carcloud)
- `POST /api/auth/token` — Obtener JWT (body: `{"apiKey": "<JWT_API_KEY>"}` si está definido)
- `GET /api/test/protected` — Test: requiere `Authorization: Bearer <token>`

**Referencia compacta:** ver `API.md` en esta carpeta.

## Ejemplo crear OT

```bash
curl -X POST "http://localhost:3000/api/ot/create" \
  -H "Content-Type: application/json" \
  -d '{
    "cliente": {"rut": "12345678-5", "nombre": "Test", "direccion": "Av. Test 123", "comuna": "Santiago"},
    "tecnico": {"rut": "11111111-1"},
    "servicio": {"presGPS": "gpsimple", "tiposerv": "instalacion_gps", "taller_install": "domicilio"},
    "vehiculos": [{"patente": "TEST99"}]
  }'
```

## Conexión MySQL

- **Timeout**: 10 segundos por conexión. Si la BD no responde, la API no se cuelga.
- **Pool**: 10 conexiones para revisa, 5 para gpsimple.

## Documentación completa

Ver `../docs/API_PUBLICA.md` para parámetros y ejemplos en español.
