Browse Source

Cleaning up deployments into the app DB, moving API keys to be in global DB (which will be tenancy managed) and adding concept of platform info DB.

master
mike12345567 5 years ago
parent
commit
f6a133e556
  1. 8
      packages/auth/src/db/utils.js
  2. 32
      packages/server/src/api/controllers/apikeys.js
  3. 21
      packages/server/src/api/controllers/deploy/index.js
  4. 38
      packages/server/src/db/builder.js
  5. 9
      packages/server/src/db/utils.js

8
packages/auth/src/db/utils.js

@ -11,9 +11,13 @@ exports.ViewNames = {
exports.StaticDatabases = {
GLOBAL: {
name: "global-db",
docs: {
apiKeys: "apikeys",
},
},
DEPLOYMENTS: {
name: "deployments",
// contains information about tenancy and so on
PLATFORM_INFO: {
name: "global-info",
},
}

32
packages/server/src/api/controllers/apikeys.js

@ -1,8 +1,32 @@
const builderDB = require("../../db/builder")
const CouchDB = require("../../db")
const { StaticDatabases } = require("@budibase/auth/db")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
const KEYS_DOC = StaticDatabases.GLOBAL.docs.apiKeys
async function getBuilderMainDoc() {
const db = new CouchDB(GLOBAL_DB)
try {
return await db.get(KEYS_DOC)
} catch (err) {
// doesn't exist yet, nothing to get
return {
_id: KEYS_DOC,
}
}
}
async function setBuilderMainDoc(doc) {
// make sure to override the ID
doc._id = KEYS_DOC
const db = new CouchDB(GLOBAL_DB)
return db.put(doc)
}
exports.fetch = async function (ctx) {
try {
const mainDoc = await builderDB.getBuilderMainDoc()
const mainDoc = await getBuilderMainDoc()
ctx.body = mainDoc.apiKeys ? mainDoc.apiKeys : {}
} catch (err) {
/* istanbul ignore next */
@ -15,12 +39,12 @@ exports.update = async function (ctx) {
const value = ctx.request.body.value
try {
const mainDoc = await builderDB.getBuilderMainDoc()
const mainDoc = await getBuilderMainDoc()
if (mainDoc.apiKeys == null) {
mainDoc.apiKeys = {}
}
mainDoc.apiKeys[key] = value
const resp = await builderDB.setBuilderMainDoc(mainDoc)
const resp = await setBuilderMainDoc(mainDoc)
ctx.body = {
_id: resp.id,
_rev: resp.rev,

21
packages/server/src/api/controllers/deploy/index.js

@ -1,6 +1,6 @@
const PouchDB = require("../../../db")
const CouchDB = require("../../../db")
const Deployment = require("./Deployment")
const { Replication, StaticDatabases } = require("@budibase/auth/db")
const { Replication } = require("@budibase/auth/db")
const { DocumentTypes } = require("../../../db/utils")
// the max time we can wait for an invalidation to complete before considering it failed
@ -31,11 +31,12 @@ async function checkAllDeployments(deployments) {
async function storeDeploymentHistory(deployment) {
const appId = deployment.getAppId()
const deploymentJSON = deployment.getJSON()
const db = new PouchDB(StaticDatabases.DEPLOYMENTS.name)
const db = new CouchDB(appId)
let deploymentDoc
try {
deploymentDoc = await db.get(appId)
// theres only one deployment doc per app database
deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
} catch (err) {
deploymentDoc = { _id: appId, history: {} }
}
@ -67,7 +68,7 @@ async function deployApp(deployment) {
})
await replication.replicate()
const db = new PouchDB(productionAppId)
const db = new CouchDB(productionAppId)
const appDoc = await db.get(DocumentTypes.APP_METADATA)
appDoc.appId = productionAppId
appDoc.instance._id = productionAppId
@ -98,8 +99,9 @@ async function deployApp(deployment) {
exports.fetchDeployments = async function (ctx) {
try {
const db = new PouchDB(StaticDatabases.DEPLOYMENTS.name)
const deploymentDoc = await db.get(ctx.appId)
const appId = ctx.appId
const db = new CouchDB(appId)
const deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
const { updated, deployments } = await checkAllDeployments(
deploymentDoc,
ctx.user
@ -115,8 +117,9 @@ exports.fetchDeployments = async function (ctx) {
exports.deploymentProgress = async function (ctx) {
try {
const db = new PouchDB(StaticDatabases.DEPLOYMENTS.name)
const deploymentDoc = await db.get(ctx.appId)
const appId = ctx.appId
const db = new CouchDB(appId)
const deploymentDoc = await db.get(DocumentTypes.DEPLOYMENTS)
ctx.body = deploymentDoc[ctx.params.deploymentId]
} catch (err) {
ctx.throw(

38
packages/server/src/db/builder.js

@ -1,38 +0,0 @@
const CouchDB = require("./index")
const { StaticDatabases } = require("./utils")
const env = require("../environment")
const SELF_HOST_ERR = "Unable to access builder DB/doc - not self hosted."
const BUILDER_DB = StaticDatabases.BUILDER
/**
* This is the builder database, right now this is a single, static database
* that is present across the whole system and determines some core functionality
* for the builder (e.g. storage of API keys). This has been limited to self hosting
* as it doesn't make as much sense against the currently design Cloud system.
*/
exports.getBuilderMainDoc = async () => {
if (!env.SELF_HOSTED) {
throw SELF_HOST_ERR
}
const db = new CouchDB(BUILDER_DB.name)
try {
return await db.get(BUILDER_DB.baseDoc)
} catch (err) {
// doesn't exist yet, nothing to get
return {
_id: BUILDER_DB.baseDoc,
}
}
}
exports.setBuilderMainDoc = async doc => {
if (!env.SELF_HOSTED) {
throw SELF_HOST_ERR
}
// make sure to override the ID
doc._id = BUILDER_DB.baseDoc
const db = new CouchDB(BUILDER_DB.name)
return db.put(doc)
}

9
packages/server/src/db/utils.js

@ -34,6 +34,7 @@ const DocumentTypes = {
DATASOURCE: "datasource",
DATASOURCE_PLUS: "datasource_plus",
QUERY: "query",
DEPLOYMENTS: "deployments",
}
const ViewNames = {
@ -49,13 +50,7 @@ const SearchIndexes = {
ROWS: "rows",
}
exports.StaticDatabases = {
BUILDER: {
name: "builder-db",
baseDoc: "builder-doc",
},
...StaticDatabases,
}
exports.StaticDatabases = StaticDatabases
const BudibaseInternalDB = {
_id: "bb_internal",

Loading…
Cancel
Save