diff --git a/packages/backend-core/src/db/constants.js b/packages/backend-core/src/db/constants.js index b41a9a9c08..5ee8033e05 100644 --- a/packages/backend-core/src/db/constants.js +++ b/packages/backend-core/src/db/constants.js @@ -14,6 +14,7 @@ exports.DocumentTypes = { APP_METADATA: `${PRE_APP}${exports.SEPARATOR}metadata`, ROLE: "role", MIGRATIONS: "migrations", + DEV_INFO: "devinfo", } exports.StaticDatabases = { diff --git a/packages/backend-core/src/db/utils.js b/packages/backend-core/src/db/utils.js index f5ea2f8486..abcd1dd75c 100644 --- a/packages/backend-core/src/db/utils.js +++ b/packages/backend-core/src/db/utils.js @@ -336,6 +336,14 @@ const getConfigParams = ({ type, workspace, user }, otherProps = {}) => { } } +/** + * Generates a new dev info document ID - this is scoped to a user. + * @returns {string} The new dev info ID which info for dev (like api key) can be stored under. + */ +const generateDevInfoID = userId => { + return `${DocumentTypes.DEV_INFO}${SEPARATOR}${userId}` +} + /** * Returns the most granular configuration document from the DB based on the type, workspace and userID passed. * @param {Object} db - db instance to query @@ -451,3 +459,4 @@ exports.generateConfigID = generateConfigID exports.getConfigParams = getConfigParams exports.getScopedFullConfig = getScopedFullConfig exports.generateNewUsageQuotaDoc = generateNewUsageQuotaDoc +exports.generateDevInfoID = generateDevInfoID diff --git a/packages/builder/src/components/settings/UpdateAPIKeyModal.svelte b/packages/builder/src/components/settings/UpdateAPIKeyModal.svelte index cb996df4f1..3a682078c8 100644 --- a/packages/builder/src/components/settings/UpdateAPIKeyModal.svelte +++ b/packages/builder/src/components/settings/UpdateAPIKeyModal.svelte @@ -7,11 +7,13 @@ async function generateAPIKey() { try { - await auth.generateAPIKey() + apiKey = await auth.generateAPIKey() notifications.success("New API key generated.") } catch (err) { notifications.error("Unable to generate new API key") } + // need to return false to keep modal open + return false } onMount(async () => { diff --git a/packages/builder/src/stores/portal/auth.js b/packages/builder/src/stores/portal/auth.js index d3dbb9f491..66ce326466 100644 --- a/packages/builder/src/stores/portal/auth.js +++ b/packages/builder/src/stores/portal/auth.js @@ -173,15 +173,12 @@ export function createAuthStore() { }) }, generateAPIKey: async () => { - return API.generateAPIKey() + const info = await API.generateAPIKey() + return info?.apiKey ? info.apiKey : null }, fetchAPIKey: async () => { const info = await API.fetchDeveloperInfo() - if (info?.apiKey) { - return info.apiKey - } else { - return null - } + return info?.apiKey ? info.apiKey : null }, } diff --git a/packages/worker/src/api/controllers/global/self.js b/packages/worker/src/api/controllers/global/self.js index d3f778878c..baf9b74e1d 100644 --- a/packages/worker/src/api/controllers/global/self.js +++ b/packages/worker/src/api/controllers/global/self.js @@ -1,11 +1,40 @@ +const { getGlobalDB } = require("@budibase/backend-core/tenancy") +const { generateDevInfoID } = require("@budibase/backend-core/db") +const { newid } = require("@budibase/backend-core/utils") + +function cleanupDevInfo(info) { + // user doesn't need to aware of dev doc info + delete info._id + delete info._rev + return info +} + exports.generateAPIKey = async ctx => { - ctx.body = { - apiKey: "a175402a-89fc-11ec-a8a3-0242ac120002", + const db = getGlobalDB() + const id = generateDevInfoID(ctx.user._id) + let devInfo + try { + devInfo = await db.get(id) + } catch (err) { + devInfo = { _id: id } } + devInfo.apiKey = newid() + await db.put(devInfo) + ctx.body = cleanupDevInfo(devInfo) } exports.fetchAPIKey = async ctx => { - ctx.body = { - apiKey: "a175402a-89fc-11ec-a8a3-0242ac120002", + const db = getGlobalDB() + const id = generateDevInfoID(ctx.user._id) + let devInfo + try { + devInfo = await db.get(id) + } catch (err) { + devInfo = { + _id: id, + apiKey: newid(), + } + await db.put(devInfo) } + ctx.body = cleanupDevInfo(devInfo) }