import type { Database } from '../supabase/functions/_backend/utils/supabase.types.ts' /// import { ensureFile } from 'https://deno.land/std/fs/ensure_file.ts' import { S3Client } from 'https://deno.land/x/s3_lite_client@0.7.0/mod.ts' import { createClient } from 'https://esm.sh/@supabase/supabase-js' const supabaseUrl = 'https://sb.capgo.app' const supabaseServiceRole = '***' const appToTransfer = 'com.demo.app' const newOwnerEmail = 'admin@capgo.app' async function main() { const s3client = new S3Client({ endPoint: '9ee3d7479a3c359681e3fab2c8cb22c0.r2.cloudflarestorage.com', useSSL: true, region: 'auto', accessKey: '***', secretKey: '***', bucket: 'capgo', }) const supabase = createClient(supabaseUrl, supabaseServiceRole, { auth: { autoRefreshToken: false, persistSession: false, detectSessionInUrl: false, }, }) const { data: oldUser, error: error1 } = await supabase.from('apps') .select('*') .eq('app_id', appToTransfer) .single() if (error1) throw error1 const { data: newUser, error: error2 } = await supabase.from('users') .select('*') .eq('email', newOwnerEmail) .single() if (error2) throw error1 const oldUserId = oldUser.user_id as string const newUserId = newUser.id as string console.log(`old id: ${JSON.stringify(oldUserId)}`) console.log(`new id: ${JSON.stringify(newUserId)}`) console.log('tmp dir: /tmp/move-tmp') try { await Deno.mkdir('/tmp/move-tmp') } catch (err) { if (!(err instanceof Deno.errors.AlreadyExists)) throw err } console.log(`Listing objects for ${oldUserId}`) for await (const obj of s3client.listObjects({ prefix: `apps/${oldUserId}/` })) { console.log(`Processing ${obj.key}`) const getObj = await s3client.getObject(obj.key) await ensureFile(`/tmp/move-tmp/${obj.key}`) const file = await Deno.create(`/tmp/move-tmp/${obj.key}`) await getObj.body?.pipeTo(file.writable) await s3client.copyObject({ sourceKey: obj.key }, obj.key.replace(oldUserId, newUserId)) await s3client.deleteObject(obj.key) } console.log('Updating user_id in apps') const { error: error3 } = await supabase.from('apps') .update({ user_id: newUserId }) .eq('user_id', oldUserId) if (error3) throw error3 console.log('Updating user_id in app_versions') const { error: error4 } = await supabase.from('app_versions') .update({ user_id: newUserId }) .eq('app_id', appToTransfer) if (error4) throw error4 console.log('Updating user_id in app_versions_meta') const { error: error5 } = await supabase.from('app_versions_meta') .update({ user_id: newUserId }) .eq('app_id', appToTransfer) if (error5) throw error5 console.log('Updating user_id in channel_devices') const { error: error6 } = await supabase.from('channel_devices') .update({ created_by: newUserId }) .eq('app_id', appToTransfer) if (error6) throw error6 console.log('Updating user_id in channels') const { error: error7 } = await supabase.from('channels') .update({ created_by: newUserId }) .eq('app_id', appToTransfer) if (error7) console.log(JSON.stringify(error7)) console.log('Updating user_id in devices_override') const { error: error8 } = await supabase.from('devices_override') .update({ created_by: newUserId }) .eq('app_id', appToTransfer) if (error8) console.log(JSON.stringify(error8)) } await main()