Some checks failed
ci / ci (22, ubuntu-latest) (push) Has been cancelled
Nuxt 4 + Supabase + Flightics API. Incluye búsqueda de vuelos, inspiraciones, watchlist, tracking de precios y mapa interactivo. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4.3 KiB
4.3 KiB
Plan: Sistema de cola de busquedas y seguimiento de precios
Contexto
Vuelato tiene watchlist manual (check precio uno a uno) y busquedas recientes, pero no hay:
- Busquedas automaticas en segundo plano
- Historico de precios con graficos
- Cache de resultados entre usuarios
El usuario quiere un sistema completo: definir busquedas recurrentes desde la UI, ver fluctuaciones de precio en tablas/graficos, y ademas una capa de cache que evite llamadas duplicadas a Flightics (TTL 1h) reutilizable tanto por el worker como por busquedas manuales.
1. Esquema de base de datos
Archivo: supabase/migrations/00002_search_queue.sql
Tabla search_cache — Cache de resultados (publica, sin RLS)
idSERIAL PRIMARY KEYparams_hashTEXT UNIQUE — SHA-256 del JSON de SearchParams normalizadosearch_paramsJSONB — el payload completotripsJSONB — array completo de trips devueltoscheapest_priceNUMERIC(10,2)total_resultsINTEGERfetched_atTIMESTAMPTZ DEFAULT now()
Tabla tracked_searches — Busquedas recurrentes (RLS por user_id)
idUUID PK DEFAULT gen_random_uuid()user_idUUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADEnameTEXT NOT NULLsearch_paramsJSONB NOT NULLroute_summaryTEXT NOT NULLinterval_hoursINTEGER NOT NULL DEFAULT 24is_activeBOOLEAN DEFAULT truenext_run_atTIMESTAMPTZ DEFAULT now()last_run_atTIMESTAMPTZrun_countINTEGER DEFAULT 0last_errorTEXTexpires_atTIMESTAMPTZcreated_atTIMESTAMPTZ DEFAULT now()
Tabla search_runs — Log de ejecuciones (RLS via tracked_search_id)
idUUID PKtracked_search_idUUID NOT NULL REFERENCES tracked_searches(id) ON DELETE CASCADEstatusTEXT DEFAULT 'pending'cheapest_priceNUMERIC(10,2)total_trips_foundINTEGER DEFAULT 0top_tripsJSONBfrom_cacheBOOLEAN DEFAULT falseerror_messageTEXTstarted_atTIMESTAMPTZcompleted_atTIMESTAMPTZcreated_atTIMESTAMPTZ DEFAULT now()
Tabla price_snapshots — Datos para graficos (RLS via tracked_search_id)
idUUID PKtracked_search_idUUID NOT NULL REFERENCES tracked_searches(id) ON DELETE CASCADEsearch_run_idUUID NOT NULL REFERENCES search_runs(id) ON DELETE CASCADEcheapest_priceNUMERIC(10,2) NOT NULLavg_priceNUMERIC(10,2)median_priceNUMERIC(10,2)total_resultsINTEGER DEFAULT 0recorded_atTIMESTAMPTZ DEFAULT now()
2. Cache de busquedas — Flujo integrado
Hash de parametros (server/utils/search-hash.ts)
- Normaliza SearchParams (ordena keys, elimina
_poll), genera SHA-256 - Compartido entre
/api/searchy el worker
Endpoint /api/search modificado (cache-aware)
- Calcular params_hash
- Buscar en search_cache WHERE params_hash = hash AND fetched_at > now() - 1 hour
- Si hay cache fresco → devolver trips del cache
- Si no → llamar a Flightics, guardar en search_cache, devolver
Worker usa el mismo cache
- Lee cache antes de llamar a Flightics
- Escribe al cache tras cada busqueda nueva
3. Worker (server/plugins/search-worker.ts)
- Nitro plugin con
setInterval(processQueue, 60_000) - Mutex para evitar solapamiento
- Procesa hasta 5 jobs por ciclo con 10s entre cada uno
- Usa
server/utils/supabase-admin.ts(cliente Supabase con service_role sin H3 event)
4. API Endpoints (server/api/tracking/)
| Archivo | Metodo | Funcion |
|---|---|---|
index.get.ts |
GET | Listar tracked_searches con ultimo snapshot |
index.post.ts |
POST | Crear tracked_search |
[id].patch.ts |
PATCH | Editar configuracion |
[id].delete.ts |
DELETE | Eliminar + cascade |
[id]/history.get.ts |
GET | Price snapshots para graficos |
[id]/runs.get.ts |
GET | Log de ejecuciones |
5. Composable (app/composables/useTrackedSearches.ts)
Patron identico a useWatchlist.ts con watch(user) para auto-load/cleanup.