mirror of https://github.com/Budibase/budibase.git
4 changed files with 84 additions and 87 deletions
@ -0,0 +1 @@ |
|||
module.exports = require("./src/tenancy/deprovision") |
|||
@ -0,0 +1,81 @@ |
|||
const { getGlobalUserParams, getAllApps } = require("../db/utils") |
|||
const { getDB, getCouch } = require("../db") |
|||
const { getGlobalDB } = require("./tenancy") |
|||
const { StaticDatabases } = require("../db/constants") |
|||
|
|||
const TENANT_DOC = StaticDatabases.PLATFORM_INFO.docs.tenants |
|||
const PLATFORM_INFO_DB = StaticDatabases.PLATFORM_INFO.name |
|||
|
|||
const removeTenantFromInfoDB = async tenantId => { |
|||
try { |
|||
const infoDb = getDB(PLATFORM_INFO_DB) |
|||
let tenants = await infoDb.get(TENANT_DOC) |
|||
tenants.tenantIds = tenants.tenantIds.filter(id => id !== tenantId) |
|||
|
|||
await infoDb.put(tenants) |
|||
} catch (err) { |
|||
console.error(`Error removing tenant ${tenantId} from info db`, err) |
|||
throw err |
|||
} |
|||
} |
|||
|
|||
const removeUsersFromInfoDB = async tenantId => { |
|||
try { |
|||
const globalDb = getGlobalDB(tenantId) |
|||
const infoDb = getDB(PLATFORM_INFO_DB) |
|||
const allUsers = await globalDb.allDocs( |
|||
getGlobalUserParams(null, { |
|||
include_docs: true, |
|||
}) |
|||
) |
|||
const allEmails = allUsers.rows.map(row => row.doc.email) |
|||
// get the id docs
|
|||
let keys = allUsers.rows.map(row => row.id) |
|||
// and the email docs
|
|||
keys = keys.concat(allEmails) |
|||
// retrieve the docs and delete them
|
|||
const userDocs = await infoDb.allDocs({ |
|||
keys, |
|||
include_docs: true, |
|||
}) |
|||
const toDelete = userDocs.rows.map(row => { |
|||
return { |
|||
...row.doc, |
|||
_deleted: true, |
|||
} |
|||
}) |
|||
await infoDb.bulkDocs(toDelete) |
|||
} catch (err) { |
|||
console.error(`Error removing tenant ${tenantId} users from info db`, err) |
|||
throw err |
|||
} |
|||
} |
|||
|
|||
const removeGlobalDB = async tenantId => { |
|||
try { |
|||
const globalDb = getGlobalDB(tenantId) |
|||
await globalDb.destroy() |
|||
} catch (err) { |
|||
console.error(`Error removing tenant ${tenantId} users from info db`, err) |
|||
throw err |
|||
} |
|||
} |
|||
|
|||
const removeTenantApps = async tenantId => { |
|||
try { |
|||
const apps = await getAllApps(getCouch(), { all: true }) |
|||
const destroyPromises = apps.map(app => getDB(app.appId).destroy()) |
|||
await Promise.allSettled(destroyPromises) |
|||
} catch (err) { |
|||
console.error(`Error removing tenant ${tenantId} apps`, err) |
|||
throw err |
|||
} |
|||
} |
|||
|
|||
// can't live in tenancy package due to circular dependency on db/utils
|
|||
exports.deleteTenant = async tenantId => { |
|||
await removeTenantFromInfoDB(tenantId) |
|||
await removeUsersFromInfoDB(tenantId) |
|||
await removeGlobalDB(tenantId) |
|||
await removeTenantApps(tenantId) |
|||
} |
|||
Loading…
Reference in new issue