Repository navigation
Expand file tree
/
Copy pathworker.ts
More file actions
76 lines (58 loc) · 2.35 KB
/
Copy pathworker.ts
File metadata and controls
76 lines (58 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import cron from 'node-cron';
import { createClient } from '@supabase/supabase-js';
import dotenv from 'dotenv';
// Load environment variables from .env.local
dotenv.config({ path: '.env.local' });
const SUPABASE_URL = process.env.SUPABASE_URL;
const SUPABASE_SERVICE_ROLE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY;
const SUPABASE_BUCKET_NAME = process.env.SUPABASE_BUCKET_NAME;
if (!SUPABASE_URL || !SUPABASE_SERVICE_ROLE_KEY || !SUPABASE_BUCKET_NAME) {
console.error('Missing required environment variables for worker.');
process.exit(1);
}
const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY);
console.log('Worker started: Node-Cron Garbage Collection Job is running...');
// Run every 5 minutes
cron.schedule('*/5 * * * *', async () => {
console.log(`[${new Date().toISOString()}] Running garbage collection job...`);
try {
const now = new Date().toISOString();
// Find expired images
const { data: expiredImages, error: fetchError } = await supabase
.from('ephemeral_images')
.select('storage_path')
.lt('expires_at', now);
if (fetchError) {
console.error('Error fetching expired images from Supabase DB:', fetchError);
return;
}
if (!expiredImages || expiredImages.length === 0) {
console.log('No expired images found.');
return;
}
console.log(`Found ${expiredImages.length} expired images to delete.`);
// Extract storage paths
const storagePaths = expiredImages.map(img => img.storage_path);
// Delete from Supabase bucket in a single batch
const { data, error } = await supabase.storage
.from(SUPABASE_BUCKET_NAME)
.remove(storagePaths);
if (error) {
console.error('Error deleting from Supabase bucket:', error);
return;
}
console.log(`Successfully deleted ${data?.length || 0} images from Supabase bucket.`);
// Remove documents from Supabase Database
const { error: deleteError } = await supabase
.from('ephemeral_images')
.delete()
.in('storage_path', storagePaths);
if (deleteError) {
console.error('Error deleting from Supabase DB:', deleteError);
} else {
console.log(`Successfully deleted documents from Supabase Database.`);
}
} catch (error) {
console.error('Error in garbage collection job:', error);
}
});