From 8d814d43a1d6636c4bc985ee5dc9dc44f0e9f4db Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 14:22:27 +0000 Subject: [PATCH] Refactor avatar deletion logic --- .../confirm-account-deletion/index.ts | 36 +++++++++++++++++++ .../process-scheduled-deletions/index.ts | 36 +++++++++++++++++++ 2 files changed, 72 insertions(+) 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')