import { task } from '@trigger.dev/sdk/v3';
import { google } from 'googleapis';
import { createAdminClient } from '@tuturuuu/supabase/next/server';
export const googleCalendarFullSync = task({
id: 'google-calendar-full-sync',
maxDuration: 300, // 5 minutes
run: async (payload: { wsId: string; userId: string }) => {
const supabase = createAdminClient();
// Acquire sync lock
const lockAcquired = await acquireSyncLock(payload.wsId);
if (!lockAcquired) {
throw new Error('Sync already in progress');
}
try {
// Get OAuth tokens
const { data: tokens } = await supabase
.from('calendar_auth_tokens')
.select('*')
.eq('user_id', payload.userId)
.single();
if (!tokens) throw new Error('No calendar tokens found');
// Initialize Google Calendar API
const oauth2Client = new google.auth.OAuth2();
oauth2Client.setCredentials({
access_token: tokens.access_token,
refresh_token: tokens.refresh_token,
});
const calendar = google.calendar({ version: 'v3', auth: oauth2Client });
// Fetch all events
const response = await calendar.events.list({
calendarId: 'primary',
maxResults: 2500,
singleEvents: true,
orderBy: 'startTime',
});
const events = response.data.items || [];
// Log sync start
const { data: syncLog } = await supabase
.from('workspace_calendar_sync_log')
.insert({
ws_id: payload.wsId,
sync_type: 'full',
started_at: new Date().toISOString(),
})
.select()
.single();
// Batch upsert events
for (let i = 0; i < events.length; i += 100) {
const batch = events.slice(i, i + 100);
await supabase
.from('workspace_calendar_events')
.upsert(
batch.map((event) => ({
ws_id: payload.wsId,
google_event_id: event.id,
title: event.summary,
description: event.description,
start_at: event.start?.dateTime || event.start?.date,
end_at: event.end?.dateTime || event.end?.date,
location: event.location,
creator_id: payload.userId,
})),
{
onConflict: 'google_event_id',
}
);
}
// Update sync token
await supabase
.from('calendar_sync_states')
.upsert({
ws_id: payload.wsId,
sync_token: response.data.nextSyncToken,
last_synced_at: new Date().toISOString(),
});
// Log sync completion
await supabase
.from('workspace_calendar_sync_log')
.update({
completed_at: new Date().toISOString(),
})
.eq('id', syncLog?.id);
return {
success: true,
eventsProcessed: events.length,
};
} catch (error) {
// Log error
await supabase
.from('workspace_calendar_sync_log')
.update({
completed_at: new Date().toISOString(),
error: (error as Error).message,
});
throw error;
} finally {
// Always release lock
await releaseSyncLock(payload.wsId);
}
},
});