1
0
Fork 0
mirror of synced 2024-05-04 12:33:42 +12:00

Some minor updates after running qa-core tests, found some issues that likely exists before context update.

This commit is contained in:
mike12345567 2022-11-17 16:30:38 +00:00
parent fcb6f985a6
commit 318233d812
6 changed files with 68 additions and 63 deletions

View file

@ -26,7 +26,7 @@ export * from "./tenancy"
* Generates a new app ID. * Generates a new app ID.
* @returns {string} The new app ID which the app doc can be stored under. * @returns {string} The new app ID which the app doc can be stored under.
*/ */
export const generateAppID = (tenantId = null) => { export const generateAppID = (tenantId?: string | null) => {
let id = APP_PREFIX let id = APP_PREFIX
if (tenantId) { if (tenantId) {
id += `${tenantId}${SEPARATOR}` id += `${tenantId}${SEPARATOR}`
@ -251,7 +251,7 @@ export function generateRoleID(id: any) {
/** /**
* Gets parameters for retrieving a role, this is a utility function for the getDocParams function. * Gets parameters for retrieving a role, this is a utility function for the getDocParams function.
*/ */
export function getRoleParams(roleId = null, otherProps = {}) { export function getRoleParams(roleId?: string | null, otherProps = {}) {
return getDocParams(DocumentType.ROLE, roleId, otherProps) return getDocParams(DocumentType.ROLE, roleId, otherProps)
} }

View file

@ -14,17 +14,16 @@ import {
DocumentType, DocumentType,
AppStatus, AppStatus,
} from "../../db/utils" } from "../../db/utils"
const { import {
BUILTIN_ROLE_IDS, db as dbCore,
AccessController, roles,
} = require("@budibase/backend-core/roles") cache,
const { CacheKeys, bustCache } = require("@budibase/backend-core/cache") tenancy,
const { context,
getAllApps, errors,
isDevAppID, events,
getProdAppID, migrations,
Replication, } from "@budibase/backend-core"
} = require("@budibase/backend-core/db")
import { USERS_TABLE_SCHEMA } from "../../constants" import { USERS_TABLE_SCHEMA } from "../../constants"
import { removeAppFromUserRoles } from "../../utilities/workerRequests" import { removeAppFromUserRoles } from "../../utilities/workerRequests"
import { clientLibraryPath, stringToReadStream } from "../../utilities" import { clientLibraryPath, stringToReadStream } from "../../utilities"
@ -34,15 +33,11 @@ import {
backupClientLibrary, backupClientLibrary,
revertClientLibrary, revertClientLibrary,
} from "../../utilities/fileSystem/clientLibrary" } from "../../utilities/fileSystem/clientLibrary"
const { getTenantId, isMultiTenant } = require("@budibase/backend-core/tenancy")
import { syncGlobalUsers } from "./user" import { syncGlobalUsers } from "./user"
const { app: appCache } = require("@budibase/backend-core/cache")
import { cleanupAutomations } from "../../automations/utils" import { cleanupAutomations } from "../../automations/utils"
import { context } from "@budibase/backend-core"
import { checkAppMetadata } from "../../automations/logging" import { checkAppMetadata } from "../../automations/logging"
import { getUniqueRows } from "../../utilities/usageQuota/rows" import { getUniqueRows } from "../../utilities/usageQuota/rows"
import { quotas, groups } from "@budibase/pro" import { quotas, groups } from "@budibase/pro"
import { errors, events, migrations } from "@budibase/backend-core"
import { App, Layout, Screen, MigrationType } from "@budibase/types" import { App, Layout, Screen, MigrationType } from "@budibase/types"
import { BASE_LAYOUT_PROP_IDS } from "../../constants/layouts" import { BASE_LAYOUT_PROP_IDS } from "../../constants/layouts"
import { enrichPluginURLs } from "../../utilities/plugins" import { enrichPluginURLs } from "../../utilities/plugins"
@ -75,7 +70,7 @@ async function getScreens() {
function getUserRoleId(ctx: any) { function getUserRoleId(ctx: any) {
return !ctx.user.role || !ctx.user.role._id return !ctx.user.role || !ctx.user.role._id
? BUILTIN_ROLE_IDS.PUBLIC ? roles.BUILTIN_ROLE_IDS.PUBLIC
: ctx.user.role._id : ctx.user.role._id
} }
@ -123,7 +118,7 @@ const checkAppName = (
} }
async function createInstance(template: any) { async function createInstance(template: any) {
const tenantId = isMultiTenant() ? getTenantId() : null const tenantId = tenancy.isMultiTenant() ? tenancy.getTenantId() : null
const baseAppId = generateAppID(tenantId) const baseAppId = generateAppID(tenantId)
const appId = generateDevAppID(baseAppId) const appId = generateDevAppID(baseAppId)
await context.updateAppId(appId) await context.updateAppId(appId)
@ -162,7 +157,7 @@ async function createInstance(template: any) {
export const fetch = async (ctx: any) => { export const fetch = async (ctx: any) => {
const dev = ctx.query && ctx.query.status === AppStatus.DEV const dev = ctx.query && ctx.query.status === AppStatus.DEV
const all = ctx.query && ctx.query.status === AppStatus.ALL const all = ctx.query && ctx.query.status === AppStatus.ALL
const apps = await getAllApps({ dev, all }) const apps = (await dbCore.getAllApps({ dev, all })) as App[]
const appIds = apps const appIds = apps
.filter((app: any) => app.status === "development") .filter((app: any) => app.status === "development")
@ -187,7 +182,7 @@ export const fetch = async (ctx: any) => {
export const fetchAppDefinition = async (ctx: any) => { export const fetchAppDefinition = async (ctx: any) => {
const layouts = await getLayouts() const layouts = await getLayouts()
const userRoleId = getUserRoleId(ctx) const userRoleId = getUserRoleId(ctx)
const accessController = new AccessController() const accessController = new roles.AccessController()
const screens = await accessController.checkScreensAccess( const screens = await accessController.checkScreensAccess(
await getScreens(), await getScreens(),
userRoleId userRoleId
@ -211,7 +206,7 @@ export const fetchAppPackage = async (ctx: any) => {
// Only filter screens if the user is not a builder // Only filter screens if the user is not a builder
if (!(ctx.user.builder && ctx.user.builder.global)) { if (!(ctx.user.builder && ctx.user.builder.global)) {
const userRoleId = getUserRoleId(ctx) const userRoleId = getUserRoleId(ctx)
const accessController = new AccessController() const accessController = new roles.AccessController()
screens = await accessController.checkScreensAccess(screens, userRoleId) screens = await accessController.checkScreensAccess(screens, userRoleId)
} }
@ -224,7 +219,7 @@ export const fetchAppPackage = async (ctx: any) => {
} }
const performAppCreate = async (ctx: any) => { const performAppCreate = async (ctx: any) => {
const apps = await getAllApps({ dev: true }) const apps = await dbCore.getAllApps({ dev: true })
const name = ctx.request.body.name const name = ctx.request.body.name
checkAppName(ctx, apps, name) checkAppName(ctx, apps, name)
const url = getAppUrl(ctx) const url = getAppUrl(ctx)
@ -254,7 +249,7 @@ const performAppCreate = async (ctx: any) => {
url: url, url: url,
template: templateKey, template: templateKey,
instance, instance,
tenantId: getTenantId(), tenantId: tenancy.getTenantId(),
updatedAt: new Date().toISOString(), updatedAt: new Date().toISOString(),
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),
status: AppStatus.DEV, status: AppStatus.DEV,
@ -313,7 +308,7 @@ const performAppCreate = async (ctx: any) => {
await createApp(appId) await createApp(appId)
} }
await appCache.invalidateAppMetadata(appId, newApplication) await cache.app.invalidateAppMetadata(appId, newApplication)
return newApplication return newApplication
} }
@ -343,7 +338,7 @@ const creationEvents = async (request: any, app: App) => {
} }
const appPostCreate = async (ctx: any, app: App) => { const appPostCreate = async (ctx: any, app: App) => {
const tenantId = getTenantId() const tenantId = tenancy.getTenantId()
await migrations.backPopulateMigrations({ await migrations.backPopulateMigrations({
type: MigrationType.APP, type: MigrationType.APP,
tenantId, tenantId,
@ -356,7 +351,9 @@ const appPostCreate = async (ctx: any, app: App) => {
const rowCount = rows ? rows.length : 0 const rowCount = rows ? rows.length : 0
if (rowCount) { if (rowCount) {
try { try {
await quotas.addRows(rowCount) await context.doInAppContext(app.appId, () => {
return quotas.addRows(rowCount)
})
} catch (err: any) { } catch (err: any) {
if (err.code && err.code === errors.codes.USAGE_LIMIT_EXCEEDED) { if (err.code && err.code === errors.codes.USAGE_LIMIT_EXCEEDED) {
// this import resulted in row usage exceeding the quota // this import resulted in row usage exceeding the quota
@ -374,7 +371,7 @@ const appPostCreate = async (ctx: any, app: App) => {
export const create = async (ctx: any) => { export const create = async (ctx: any) => {
const newApplication = await quotas.addApp(() => performAppCreate(ctx)) const newApplication = await quotas.addApp(() => performAppCreate(ctx))
await appPostCreate(ctx, newApplication) await appPostCreate(ctx, newApplication)
await bustCache(CacheKeys.CHECKLIST) await cache.bustCache(cache.CacheKeys.CHECKLIST)
ctx.body = newApplication ctx.body = newApplication
ctx.status = 200 ctx.status = 200
} }
@ -382,7 +379,7 @@ export const create = async (ctx: any) => {
// This endpoint currently operates as a PATCH rather than a PUT // This endpoint currently operates as a PATCH rather than a PUT
// Thus name and url fields are handled only if present // Thus name and url fields are handled only if present
export const update = async (ctx: any) => { export const update = async (ctx: any) => {
const apps = await getAllApps({ dev: true }) const apps = await dbCore.getAllApps({ dev: true })
// validation // validation
const name = ctx.request.body.name const name = ctx.request.body.name
if (name) { if (name) {
@ -455,7 +452,7 @@ const destroyApp = async (ctx: any) => {
let isUnpublish = ctx.query && ctx.query.unpublish let isUnpublish = ctx.query && ctx.query.unpublish
if (isUnpublish) { if (isUnpublish) {
appId = getProdAppID(appId) appId = dbCore.getProdAppID(appId)
} }
const db = isUnpublish ? context.getProdAppDB() : context.getAppDB() const db = isUnpublish ? context.getProdAppDB() : context.getAppDB()
@ -481,7 +478,7 @@ const destroyApp = async (ctx: any) => {
else { else {
await removeAppFromUserRoles(ctx, appId) await removeAppFromUserRoles(ctx, appId)
} }
await appCache.invalidateAppMetadata(appId) await cache.app.invalidateAppMetadata(appId)
return result return result
} }
@ -517,12 +514,12 @@ export const sync = async (ctx: any, next: any) => {
} }
const appId = ctx.params.appId const appId = ctx.params.appId
if (!isDevAppID(appId)) { if (!dbCore.isDevAppID(appId)) {
ctx.throw(400, "This action cannot be performed for production apps") ctx.throw(400, "This action cannot be performed for production apps")
} }
// replicate prod to dev // replicate prod to dev
const prodAppId = getProdAppID(appId) const prodAppId = dbCore.getProdAppID(appId)
// specific case, want to make sure setup is skipped // specific case, want to make sure setup is skipped
const prodDb = context.getProdAppDB({ skip_setup: true }) const prodDb = context.getProdAppDB({ skip_setup: true })
@ -536,7 +533,7 @@ export const sync = async (ctx: any, next: any) => {
return next() return next()
} }
const replication = new Replication({ const replication = new dbCore.Replication({
source: prodAppId, source: prodAppId,
target: appId, target: appId,
}) })
@ -577,7 +574,7 @@ export const updateAppPackage = async (appPackage: any, appId: any) => {
await db.put(newAppPackage) await db.put(newAppPackage)
// remove any cached metadata, so that it will be updated // remove any cached metadata, so that it will be updated
await appCache.invalidateAppMetadata(appId) await cache.app.invalidateAppMetadata(appId)
return newAppPackage return newAppPackage
}) })
} }

View file

@ -1,5 +1,4 @@
const { getAllApps } = require("@budibase/backend-core/db") import { db as dbCore, context } from "@budibase/backend-core"
const { doInAppContext } = require("@budibase/backend-core/context")
import { search as stringSearch, addRev } from "./utils" import { search as stringSearch, addRev } from "./utils"
import * as controller from "../application" import * as controller from "../application"
import { Application } from "../../../definitions/common" import { Application } from "../../../definitions/common"
@ -15,15 +14,22 @@ function fixAppID(app: Application, params: any) {
} }
async function setResponseApp(ctx: any) { async function setResponseApp(ctx: any) {
if (ctx.body && ctx.body.appId && (!ctx.params || !ctx.params.appId)) { const appId = ctx.body?.appId
ctx.params = { appId: ctx.body.appId } if (appId && (!ctx.params || !ctx.params.appId)) {
ctx.params = { appId }
}
if (appId) {
await context.doInContext(appId, () => {
return controller.fetchAppPackage(ctx)
})
} else {
return controller.fetchAppPackage(ctx)
} }
await controller.fetchAppPackage(ctx)
} }
export async function search(ctx: any, next: any) { export async function search(ctx: any, next: any) {
const { name } = ctx.request.body const { name } = ctx.request.body
const apps = await getAllApps({ all: true }) const apps = await dbCore.getAllApps({ all: true })
ctx.body = stringSearch(apps, name) ctx.body = stringSearch(apps, name)
await next() await next()
} }
@ -41,7 +47,7 @@ export async function create(ctx: any, next: any) {
} }
export async function read(ctx: any, next: any) { export async function read(ctx: any, next: any) {
await doInAppContext(ctx.params.appId, async () => { await context.doInAppContext(ctx.params.appId, async () => {
await setResponseApp(ctx) await setResponseApp(ctx)
await next() await next()
}) })
@ -49,7 +55,7 @@ export async function read(ctx: any, next: any) {
export async function update(ctx: any, next: any) { export async function update(ctx: any, next: any) {
ctx.request.body = await addRev(fixAppID(ctx.request.body, ctx.params)) ctx.request.body = await addRev(fixAppID(ctx.request.body, ctx.params))
await doInAppContext(ctx.params.appId, async () => { await context.doInAppContext(ctx.params.appId, async () => {
await controller.update(ctx) await controller.update(ctx)
await setResponseApp(ctx) await setResponseApp(ctx)
await next() await next()
@ -57,7 +63,7 @@ export async function update(ctx: any, next: any) {
} }
export async function destroy(ctx: any, next: any) { export async function destroy(ctx: any, next: any) {
await doInAppContext(ctx.params.appId, async () => { await context.doInAppContext(ctx.params.appId, async () => {
// get the app before deleting it // get the app before deleting it
await setResponseApp(ctx) await setResponseApp(ctx)
const body = ctx.body const body = ctx.body

View file

@ -1,4 +1,4 @@
import { Document } from "../document" import { User, Document } from "../"
export type AppMetadataErrors = { [key: string]: string[] } export type AppMetadataErrors = { [key: string]: string[] }
@ -16,6 +16,7 @@ export interface App extends Document {
theme?: string theme?: string
customTheme?: AppCustomTheme customTheme?: AppCustomTheme
revertableVersion?: string revertableVersion?: string
lockedBy?: User
navigation?: AppNavigation navigation?: AppNavigation
automationErrors?: AppMetadataErrors automationErrors?: AppMetadataErrors
icon?: AppIcon icon?: AppIcon

View file

@ -70,7 +70,7 @@ describe("Internal API - Application creation, update, publish and delete", () =
await config.applications.publish(<string>app.url) await config.applications.publish(<string>app.url)
// check published app renders // check published app renders
config.applications.api.appId = db.getProdAppID(app.appId) config.applications.api.appId = db.getProdAppID(app.appId!)
await config.applications.canRender() await config.applications.canRender()
// unpublish app // unpublish app

View file

@ -390,7 +390,7 @@
jest-util "^28.1.3" jest-util "^28.1.3"
slash "^3.0.0" slash "^3.0.0"
"@jest/core@^28.0.2", "@jest/core@^28.1.3": "@jest/core@^28.1.1", "@jest/core@^28.1.3":
version "28.1.3" version "28.1.3"
resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7"
integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==
@ -573,7 +573,7 @@
slash "^3.0.0" slash "^3.0.0"
write-file-atomic "^4.0.1" write-file-atomic "^4.0.1"
"@jest/types@^28.1.3": "@jest/types@^28.1.1", "@jest/types@^28.1.3":
version "28.1.3" version "28.1.3"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b"
integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==
@ -2299,7 +2299,7 @@ jest-circus@^28.1.3:
slash "^3.0.0" slash "^3.0.0"
stack-utils "^2.0.3" stack-utils "^2.0.3"
jest-cli@^28.0.2: jest-cli@^28.1.1:
version "28.1.3" version "28.1.3"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2"
integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==
@ -2666,14 +2666,15 @@ jest-worker@^28.1.3:
merge-stream "^2.0.0" merge-stream "^2.0.0"
supports-color "^8.0.0" supports-color "^8.0.0"
jest@28.0.2: jest@28.1.1:
version "28.0.2" version "28.1.1"
resolved "https://registry.yarnpkg.com/jest/-/jest-28.0.2.tgz#41385ca21d009708bb9fc65e08663110e08e2cc0" resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e"
integrity sha512-COUtjybolW4koQvO7kCfq5kgbeeU5WbSJfVZprz4zbS8AL32+RAZZTUjBEyRRdpsXqss/pHIvSL7/P+LyMYHXg== integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA==
dependencies: dependencies:
"@jest/core" "^28.0.2" "@jest/core" "^28.1.1"
"@jest/types" "^28.1.1"
import-local "^3.0.2" import-local "^3.0.2"
jest-cli "^28.0.2" jest-cli "^28.1.1"
jmespath@0.15.0: jmespath@0.15.0:
version "0.15.0" version "0.15.0"
@ -4351,10 +4352,10 @@ ts-jest@28.0.8:
semver "7.x" semver "7.x"
yargs-parser "^21.0.1" yargs-parser "^21.0.1"
ts-node@10.9.1: ts-node@10.8.1:
version "10.9.1" version "10.8.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066"
integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==
dependencies: dependencies:
"@cspotcode/source-map-support" "^0.8.0" "@cspotcode/source-map-support" "^0.8.0"
"@tsconfig/node10" "^1.0.7" "@tsconfig/node10" "^1.0.7"
@ -4370,10 +4371,10 @@ ts-node@10.9.1:
v8-compile-cache-lib "^3.0.1" v8-compile-cache-lib "^3.0.1"
yn "3.1.1" yn "3.1.1"
tsconfig-paths@4.1.0: tsconfig-paths@4.0.0:
version "4.1.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz#f8ef7d467f08ae3a695335bf1ece088c5538d2c1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz#1082f5d99fd127b72397eef4809e4dd06d229b64"
integrity sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow== integrity sha512-SLBg2GBKlR6bVtMgJJlud/o3waplKtL7skmLkExomIiaAtLGtVsoXIqP3SYdjbcH9lq/KVv7pMZeCBpLYOit6Q==
dependencies: dependencies:
json5 "^2.2.1" json5 "^2.2.1"
minimist "^1.2.6" minimist "^1.2.6"