Spaces:
Sleeping
Sleeping
| import { supabase } from './client'; | |
| import { logger } from '../utils/logger'; | |
| export interface JobEvent { | |
| id: string; | |
| job_id: string; | |
| identity_id: string | null; | |
| level: 'info' | 'warning' | 'error'; | |
| step: string; | |
| message: string; | |
| metadata: Record<string, unknown> | null; | |
| created_at: string; | |
| } | |
| export interface JobEventInsert { | |
| job_id: string; | |
| identity_id: string | null; | |
| level: 'info' | 'warning' | 'error'; | |
| step: string; | |
| message: string; | |
| metadata?: Record<string, unknown>; | |
| } | |
| /** | |
| * Insert a new event into the job event log. | |
| */ | |
| export async function insertJobEvent(event: JobEventInsert): Promise<void> { | |
| const { error } = await supabase | |
| .from('turnitin_job_events') | |
| .insert({ | |
| job_id: event.job_id, | |
| identity_id: event.identity_id, | |
| level: event.level, | |
| step: event.step, | |
| message: event.message, | |
| metadata: event.metadata || {}, | |
| }); | |
| if (error) { | |
| logger.error('Failed to insert job event', { | |
| jobId: event.job_id, | |
| step: event.step, | |
| error: error.message, | |
| }); | |
| throw error; | |
| } | |
| } | |
| /** | |
| * Retrieve all events for a given job, ordered by creation time. | |
| */ | |
| export async function getJobEvents(jobId: string): Promise<JobEvent[]> { | |
| const { data, error } = await supabase | |
| .from('turnitin_job_events') | |
| .select('*') | |
| .eq('job_id', jobId) | |
| .order('created_at', { ascending: true }); | |
| if (error) { | |
| logger.error('Failed to get job events', { jobId, error: error.message }); | |
| throw error; | |
| } | |
| return (data as JobEvent[]) || []; | |
| } | |