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>
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
import { serverSupabaseServiceRole, serverSupabaseClient } from '#supabase/server'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const client = await serverSupabaseClient(event)
|
|
const { data: { user } } = await client.auth.getUser()
|
|
if (!user) throw createError({ statusCode: 401, message: 'No autenticado' })
|
|
|
|
const id = getRouterParam(event, 'id')
|
|
if (!id) throw createError({ statusCode: 400, message: 'ID requerido' })
|
|
|
|
const body = await readBody(event)
|
|
const allowed = ['name', 'interval_hours', 'is_active', 'expires_at', 'search_params', 'route_summary']
|
|
const patch: Record<string, unknown> = {}
|
|
|
|
for (const key of allowed) {
|
|
if (body[key] !== undefined) patch[key] = body[key]
|
|
}
|
|
|
|
if (patch.interval_hours) {
|
|
patch.interval_hours = Math.min(Math.max(patch.interval_hours as number, 6), 168)
|
|
}
|
|
|
|
if (Object.keys(patch).length === 0) {
|
|
throw createError({ statusCode: 400, message: 'Nada que actualizar' })
|
|
}
|
|
|
|
// Si cambian los parametros de busqueda, forzar ejecucion inmediata
|
|
if (patch.search_params) {
|
|
patch.next_run_at = new Date().toISOString()
|
|
}
|
|
|
|
const supabase = serverSupabaseServiceRole(event)
|
|
|
|
const { data, error } = await supabase
|
|
.from('tracked_searches')
|
|
.update(patch as never)
|
|
.eq('id', id)
|
|
.eq('user_id', user.id)
|
|
.select()
|
|
.single()
|
|
|
|
if (error) throw createError({ statusCode: 500, message: error.message })
|
|
if (!data) throw createError({ statusCode: 404, message: 'Busqueda no encontrada' })
|
|
|
|
return data
|
|
})
|