diff --git a/supabase/functions/confirm-account-deletion/index.ts b/supabase/functions/confirm-account-deletion/index.ts index facc7fe2..8f5f39c5 100644 --- a/supabase/functions/confirm-account-deletion/index.ts +++ b/supabase/functions/confirm-account-deletion/index.ts @@ -102,6 +102,42 @@ serve(async (req) => { console.error('Error deleting user roles:', rolesError); } + // Get profile to check for avatar before deletion + const { data: profile } = await supabaseAdmin + .from('profiles') + .select('avatar_image_id') + .eq('user_id', user.id) + .maybeSingle(); + + // Delete avatar from Cloudflare Images if it exists + if (profile?.avatar_image_id) { + const cloudflareAccountId = Deno.env.get('VITE_CLOUDFLARE_ACCOUNT_ID'); + const cloudflareApiToken = Deno.env.get('CLOUDFLARE_API_TOKEN'); + + if (cloudflareAccountId && cloudflareApiToken) { + try { + console.log(`Deleting avatar image: ${profile.avatar_image_id}`); + const deleteResponse = await fetch( + `https://api.cloudflare.com/client/v4/accounts/${cloudflareAccountId}/images/v1/${profile.avatar_image_id}`, + { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${cloudflareApiToken}`, + }, + } + ); + + if (!deleteResponse.ok) { + console.error('Failed to delete avatar from Cloudflare:', await deleteResponse.text()); + } else { + console.log('Avatar deleted from Cloudflare successfully'); + } + } catch (avatarError) { + console.error('Error deleting avatar from Cloudflare:', avatarError); + } + } + } + // Delete profile const { error: profileError } = await supabaseAdmin .from('profiles') diff --git a/supabase/functions/process-scheduled-deletions/index.ts b/supabase/functions/process-scheduled-deletions/index.ts index 8f1f3531..be2b5a3a 100644 --- a/supabase/functions/process-scheduled-deletions/index.ts +++ b/supabase/functions/process-scheduled-deletions/index.ts @@ -75,6 +75,42 @@ serve(async (req) => { .delete() .eq('user_id', deletion.user_id); + // Get profile to check for avatar before deletion + const { data: profile } = await supabaseAdmin + .from('profiles') + .select('avatar_image_id') + .eq('user_id', deletion.user_id) + .maybeSingle(); + + // Delete avatar from Cloudflare Images if it exists + if (profile?.avatar_image_id) { + const cloudflareAccountId = Deno.env.get('VITE_CLOUDFLARE_ACCOUNT_ID'); + const cloudflareApiToken = Deno.env.get('CLOUDFLARE_API_TOKEN'); + + if (cloudflareAccountId && cloudflareApiToken) { + try { + console.log(`Deleting avatar image: ${profile.avatar_image_id}`); + const deleteResponse = await fetch( + `https://api.cloudflare.com/client/v4/accounts/${cloudflareAccountId}/images/v1/${profile.avatar_image_id}`, + { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${cloudflareApiToken}`, + }, + } + ); + + if (!deleteResponse.ok) { + console.error('Failed to delete avatar from Cloudflare:', await deleteResponse.text()); + } else { + console.log('Avatar deleted from Cloudflare successfully'); + } + } catch (avatarError) { + console.error('Error deleting avatar from Cloudflare:', avatarError); + } + } + } + // Delete profile await supabaseAdmin .from('profiles')