import { Pool } from 'pg' import { randomUUID } from 'crypto' import { createServiceClient } from './supabase/server' type LogLevel = 'all' | 'light' | 'mini' | 'off' const level = (process.env.LOG_LEVEL as LogLevel) || 'light' const LOCAL_DB_URL = process.env.LOCAL_DATABASE_URL let pool: Pool | null = null let logsTableReady = false if (LOCAL_DB_URL) { pool = new Pool({ connectionString: LOCAL_DB_URL }) } async function ensureLogsTable() { if (!pool || logsTableReady) return try { await pool.query(` CREATE TABLE IF NOT EXISTS logs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), created_at TIMESTAMP DEFAULT NOW(), lang VARCHAR, ip VARCHAR, user_agent VARCHAR, module VARCHAR, operation VARCHAR, data JSONB, error TEXT, level VARCHAR ); `) logsTableReady = true } catch (e) { console.error('[logger] Failed to ensure logs table:', e) } } export interface LogPayload { module: string operation: string data?: Record | null error?: string | null ip?: string | null userAgent?: string | null lang?: string | null } export async function logEvent(payload: LogPayload) { if (level === 'off') return const shouldIncludeUA = level === 'all' const shouldIncludeData = level === 'all' const row = { id: randomUUID(), created_at: new Date().toISOString(), lang: payload.lang ?? null, ip: payload.ip ?? null, user_agent: shouldIncludeUA ? payload.userAgent ?? null : null, module: payload.module, operation: payload.operation, data: shouldIncludeData ? payload.data ?? null : null, error: payload.error ?? null, level } // Prefer local DB if (pool) { await ensureLogsTable() try { await pool.query( 'INSERT INTO logs(id, created_at, lang, ip, user_agent, module, operation, data, error, level) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)', [row.id, row.created_at, row.lang, row.ip, row.user_agent, row.module, row.operation, row.data, row.error, row.level] ) return } catch (e) { console.error('[logger] Failed to insert log into local DB:', e) } } // Fallback to Supabase service-role if available try { if (process.env.SUPABASE_SERVICE_ROLE_KEY && process.env.SUPABASE_URL) { const supabase = await createServiceClient() // logs table není v generovaných typech; vlož jako any await supabase.from('logs' as any).insert(row as any) return } } catch (e) { console.error('[logger] Failed to insert log into Supabase:', e) } // Fallback to in-memory/console console.info('[logger] (fallback)', row) }