diff --git a/lerna.json b/lerna.json index 253545c23d..76b7afa3b7 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.6.19-alpha.54", + "version": "2.6.23", "npmClient": "yarn", "packages": [ "packages/backend-core", diff --git a/packages/backend-core/src/events/identification.ts b/packages/backend-core/src/events/identification.ts index 5c02e5db9e..5eb11d1354 100644 --- a/packages/backend-core/src/events/identification.ts +++ b/packages/backend-core/src/events/identification.ts @@ -86,6 +86,7 @@ const getCurrentIdentity = async (): Promise => { installationId, tenantId, environment, + realTenantId: context.getTenantId(), hostInfo: userContext.hostInfo, } } else { diff --git a/packages/pro b/packages/pro index cd06642b86..65a626155b 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit cd06642b860111aa1bd3443ee10076ca3abf03c3 +Subproject commit 65a626155bbb4702b8dd4dbe06e99f2c47d47698 diff --git a/packages/server/src/automations/steps/queryRows.ts b/packages/server/src/automations/steps/queryRows.ts index 28da430858..1abb8c6a31 100644 --- a/packages/server/src/automations/steps/queryRows.ts +++ b/packages/server/src/automations/steps/queryRows.ts @@ -14,6 +14,7 @@ import { SearchFilters, Table, } from "@budibase/types" +import { db as dbCore } from "@budibase/backend-core" enum SortOrder { ASCENDING = "ascending", @@ -121,7 +122,11 @@ function typeCoercion(filters: SearchFilters, table: Table) { const searchParam = filters[key] if (typeof searchParam === "object") { for (let [property, value] of Object.entries(searchParam)) { - const column = table.schema[property] + // We need to strip numerical prefixes here, so that we can look up + // the correct field name in the schema + const columnName = dbCore.removeKeyNumbering(property) + const column = table.schema[columnName] + // convert string inputs if (!column || typeof value !== "string") { continue diff --git a/packages/server/src/integrations/snowflake.ts b/packages/server/src/integrations/snowflake.ts index 73d3d4f6af..698795c2b7 100644 --- a/packages/server/src/integrations/snowflake.ts +++ b/packages/server/src/integrations/snowflake.ts @@ -38,6 +38,9 @@ const SCHEMA: Integration = { type: "password", required: true, }, + role: { + type: "string", + }, warehouse: { type: "string", required: true, diff --git a/packages/server/src/sdk/users/utils.ts b/packages/server/src/sdk/users/utils.ts index 7f7f0b4809..619a7199cd 100644 --- a/packages/server/src/sdk/users/utils.ts +++ b/packages/server/src/sdk/users/utils.ts @@ -7,7 +7,7 @@ import { InternalTables, } from "../../db/utils" import { isEqual } from "lodash" -import { ContextUser, UserMetadata, User } from "@budibase/types" +import { ContextUser, UserMetadata, User, Database } from "@budibase/types" export function combineMetadataAndUser( user: ContextUser, @@ -51,8 +51,10 @@ export function combineMetadataAndUser( return null } -export async function rawUserMetadata() { - const db = context.getAppDB() +export async function rawUserMetadata(db?: Database) { + if (!db) { + db = context.getAppDB() + } return ( await db.allDocs( getUserMetadataParams(null, { @@ -64,30 +66,36 @@ export async function rawUserMetadata() { export async function syncGlobalUsers() { // sync user metadata - const db = context.getAppDB() - const resp = await Promise.all([getGlobalUsers(), rawUserMetadata()]) - const users = resp[0] as User[] - const metadata = resp[1] as UserMetadata[] - const toWrite = [] - for (let user of users) { - const combined = combineMetadataAndUser(user, metadata) - if (combined) { - toWrite.push(combined) - } - } - let foundEmails: string[] = [] - for (let data of metadata) { - if (!data._id) { + const dbs = [context.getDevAppDB(), context.getProdAppDB()] + for (let db of dbs) { + if (!(await db.exists())) { continue } - const alreadyExisting = data.email && foundEmails.indexOf(data.email) !== -1 - const globalId = getGlobalIDFromUserMetadataID(data._id) - if (!users.find(user => user._id === globalId) || alreadyExisting) { - toWrite.push({ ...data, _deleted: true }) + const resp = await Promise.all([getGlobalUsers(), rawUserMetadata(db)]) + const users = resp[0] as User[] + const metadata = resp[1] as UserMetadata[] + const toWrite = [] + for (let user of users) { + const combined = combineMetadataAndUser(user, metadata) + if (combined) { + toWrite.push(combined) + } } - if (data.email) { - foundEmails.push(data.email) + let foundEmails: string[] = [] + for (let data of metadata) { + if (!data._id) { + continue + } + const alreadyExisting = + data.email && foundEmails.indexOf(data.email) !== -1 + const globalId = getGlobalIDFromUserMetadataID(data._id) + if (!users.find(user => user._id === globalId) || alreadyExisting) { + toWrite.push({ ...data, _deleted: true }) + } + if (data.email) { + foundEmails.push(data.email) + } } + await db.bulkDocs(toWrite) } - await db.bulkDocs(toWrite) } diff --git a/packages/server/src/utilities/global.ts b/packages/server/src/utilities/global.ts index 21e86a28b9..93b7fc1207 100644 --- a/packages/server/src/utilities/global.ts +++ b/packages/server/src/utilities/global.ts @@ -122,11 +122,8 @@ export async function getGlobalUsers( delete user.forceResetPassword return user }) - if (!appId) { - return globalUsers - } - if (opts?.noProcessing) { + if (opts?.noProcessing || !appId) { return globalUsers } else { // pass in the groups, meaning we don't actually need to retrieve them for