scripts/change_app_owner.ts
Rama main · réplica de lectura del repositorio original.
import type { Database } from '../supabase/functions/_backend/utils/supabase.types.ts'
/// <reference lib="deno.ns" />
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<Database>(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()