# Maritano

Scaffold inicial para un comparador de autos usados orientado a scraping, normalizacion y comparables de mercado.

## Stack

- `Nuxt 3` para frontend SSR y rutas Nitro.
- `Prisma + PostgreSQL` para listings, snapshots de precio y corridas de scraping.
- `Playwright + Cheerio` para scraping por fuente.
- Datos mock en el frontend para iterar hoy sin depender todavia de la base real.

## Primeros pasos

1. Instala dependencias:

```bash
npm install
```

2. Copia variables de entorno:

```bash
cp .env.example .env
```

3. Levanta PostgreSQL:

```bash
npm run db:up
```

4. Genera cliente Prisma y corre migraciones:

```bash
npm run prisma:generate
npm run prisma:migrate
```

Si ya tenias una base creada antes de agregar Salfa, ejecuta:

```bash
npm run db:add-salfa-source
```

5. Inicia la app en desarrollo:

```bash
npm run dev
```

6. Pobla PostgreSQL con datos scrapeados:

```bash
npm run ingest:source -- maritano
npm run ingest:source -- bruno-fritsch
npm run ingest:source -- salfa
npm run ingest:source -- salazar-israel
npm run ingest:source -- portillo-sur
npm run ingest:source -- sergio-escobar
```

O bien corre todas las fuentes configuradas:

```bash
npm run ingest:all
```

## Ejecucion en produccion

1. Genera el build:

```bash
npm run build
```

2. Levanta la app compilada:

```bash
npm run start
```

`npm run start` carga `.env` si existe, por lo que Prisma y el resto de runtime vars quedan disponibles tambien fuera de `dev`.

Si quieres exponerla en otro puerto, puedes hacerlo por ejemplo con:

```bash
PORT=3001 npm run start
```

Para publicar el servidor local con ngrok, define un `NGROK_AUTHTOKEN` real en `.env`
o en el entorno del servidor antes de correr:

```bash
npm run tunel
```

Si el token sigue como placeholder, `scripts/restart-ngrok.sh` ahora corta con un
mensaje explicito en vez de dejar un error de autenticacion ambiguo.

Para dejarlo automatico en un servidor con `systemd` de usuario:

```bash
npm run install:service
```

Eso crea `~/.config/systemd/user/comp-autos.service` y levanta la pila completa
con `npm run serve:stack`. Si quieres que arranque incluso sin sesion iniciada,
habilita linger con:

```bash
sudo loginctl enable-linger $USER
```

## Automatizacion con n8n (cron cada 6 horas)

1. Define token de automatizacion en `.env`:

```bash
SCRAPE_CRON_TOKEN=\"cambia-este-token-para-n8n\"
```

2. Levanta `n8n` junto al resto de servicios:

```bash
docker compose up -d n8n
```

3. Importa workflow:

- `n8n/workflows/scrapers-cron-6h.json`

4. En `n8n`, ajusta el nodo `Config Scraping` con:

- `baseUrl`: URL donde corre esta app (ejemplo: `http://host.docker.internal:3000`)
- `cronToken`: el mismo valor de `SCRAPE_CRON_TOKEN`

5. Activa el workflow.

Endpoint usado por n8n:

- `POST /api/cron/scrape-all`
- Header: `x-cron-token: <SCRAPE_CRON_TOKEN>`

Si prefieres cada 8 horas, cambia el cron del workflow de `6` a `8`.

## Estructura

- `pages/index.vue`: dashboard inicial del comparador.
- `server/api`: endpoints de preview y endpoints mock de busqueda/estadisticas mientras el comparador principal siga leyendo mocks.
- `prisma/schema.prisma`: modelo base para listings, vehiculo canonico, vendedor, imagenes, snapshots y crawl runs.
- `scraper/core`: contratos y normalizacion.
- `scraper/sources`: scrapers por fuente.
- `scripts`: entrypoints para ejecutar scraping desde CLI.

## Orden recomendado de implementacion

1. Reemplazar el scraper demo restante por fetch real de `Clicar`.
2. Persistir `SourceListing`, `PriceSnapshot` y `CrawlRun`.
3. Implementar matching de `CanonicalVehicle` y deduplicacion entre fuentes.
4. Cambiar `server/api/search` para leer de PostgreSQL en lugar de `mockListings`.
5. Agregar historial de precio y pagina detalle por auto.
# comp_autos
