import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.57.4'; const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type', }; Deno.serve(async (req) => { // Handle CORS preflight requests if (req.method === 'OPTIONS') { return new Response(null, { headers: corsHeaders }); } try { // Create admin client with service role key const supabaseAdmin = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '', { auth: { autoRefreshToken: false, persistSession: false } } ); // Get the user from the authorization header const authHeader = req.headers.get('Authorization'); if (!authHeader) { console.error('Missing authorization header'); throw new Error('No authorization header provided. Please ensure you are logged in.'); } const token = authHeader.replace('Bearer ', ''); console.log('Attempting to verify user token...'); const { data: { user }, error: userError } = await supabaseAdmin.auth.getUser(token); if (userError) { console.error('Token verification failed:', userError); throw new Error('Invalid or expired session. Please refresh the page and try again.'); } if (!user) { console.error('No user found for token'); throw new Error('User not found. Please refresh the page and try again.'); } console.log(`Cancelling email change for user ${user.id}`, { currentEmail: user.email, newEmail: user.new_email }); // Call the database function to clear email change fields // This function has SECURITY DEFINER privileges to access auth.users const { data: cancelled, error: cancelError } = await supabaseAdmin .rpc('cancel_user_email_change', { _user_id: user.id }); if (cancelError || !cancelled) { console.error('Error cancelling email change:', cancelError); throw new Error('Unable to cancel email change: ' + (cancelError?.message || 'Unknown error')); } console.log(`Successfully cancelled email change for user ${user.id}`); // Log the cancellation in admin_audit_log const { error: auditError } = await supabaseAdmin .from('admin_audit_log') .insert({ admin_user_id: user.id, target_user_id: user.id, action: 'email_change_cancelled', details: { cancelled_at: new Date().toISOString(), current_email: user.email, }, }); if (auditError) { console.error('Error logging audit:', auditError); // Don't fail the request if audit logging fails } return new Response( JSON.stringify({ success: true, message: 'Email change cancelled successfully', user: { id: user.id, email: user.email, new_email: null, }, }), { headers: { ...corsHeaders, 'Content-Type': 'application/json' }, status: 200, } ); } catch (error) { console.error('Error in cancel-email-change function:', error); return new Response( JSON.stringify({ success: false, error: error.message, }), { headers: { ...corsHeaders, 'Content-Type': 'application/json' }, status: 400, } ); } });