From c462b072243c4fb8fc831773ce68c622ba4012a4 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 10:34:38 +0200 Subject: [PATCH 01/45] Create deploy qa workflow --- .github/workflows/deploy-qa.yml | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/deploy-qa.yml diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml new file mode 100644 index 0000000000..9fa8a0cd3f --- /dev/null +++ b/.github/workflows/deploy-qa.yml @@ -0,0 +1,35 @@ +name: Deploy QA + +on: + push: + branches: + - master + workflow_dispatch: + +env: + BRANCH: ${{ github.event.pull_request.head.ref }} + BASE_BRANCH: ${{ github.event.pull_request.base.ref}} + PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} + NX_BASE_BRANCH: origin/${{ github.base_ref }} + USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' && github.base_ref != 'master'}} + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +jobs: + trigger-deploy-to-qa-env: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Get the current budibase release version + id: version + run: | + release_version=$(cat lerna.json | jq -r '.version') + echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV + + - uses: passeidireto/trigger-external-workflow-action@main + env: + PAYLOAD_VERSION: ${{ github.sha }} + REF_NAME: ${{ github.ref_name}} + with: + repository: budibase/budibase-deploys + event: budicloud-qa-deploy + github_pat: ${{ secrets.GH_ACCESS_TOKEN }} From ec76388de4a1093bdd9a00e64b280cac491c937a Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 10:37:22 +0200 Subject: [PATCH 02/45] Use event v2 --- .github/workflows/deploy-qa.yml | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index 9fa8a0cd3f..97a662d2f8 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -6,30 +6,15 @@ on: - master workflow_dispatch: -env: - BRANCH: ${{ github.event.pull_request.head.ref }} - BASE_BRANCH: ${{ github.event.pull_request.base.ref}} - PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - NX_BASE_BRANCH: origin/${{ github.base_ref }} - USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' && github.base_ref != 'master'}} - NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} - jobs: trigger-deploy-to-qa-env: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Get the current budibase release version - id: version - run: | - release_version=$(cat lerna.json | jq -r '.version') - echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV - - - uses: passeidireto/trigger-external-workflow-action@main + - uses: peter-evans/repository-dispatch@v2 env: PAYLOAD_VERSION: ${{ github.sha }} REF_NAME: ${{ github.ref_name}} with: repository: budibase/budibase-deploys - event: budicloud-qa-deploy - github_pat: ${{ secrets.GH_ACCESS_TOKEN }} + event-type: budicloud-qa-deploy-v2 + token: ${{ secrets.GH_ACCESS_TOKEN }} From d9e9f369858fe11c92f4b52c9c07bf10488da56e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 10:38:01 +0200 Subject: [PATCH 03/45] test --- .github/workflows/deploy-qa.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index 97a662d2f8..3cbe366f08 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -4,6 +4,7 @@ on: push: branches: - master + - BUDI-7641/remove-npm-from-apps-worker-docker workflow_dispatch: jobs: From c5b37ae0c73c9b42ec682c8fdbb5791d3a232163 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 10:42:45 +0200 Subject: [PATCH 04/45] Push --- .github/workflows/deploy-qa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index 3cbe366f08..74b06faefe 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -3,8 +3,8 @@ name: Deploy QA on: push: branches: - - master - BUDI-7641/remove-npm-from-apps-worker-docker + - master workflow_dispatch: jobs: From 65fea6d680038e52c422076737cf4bdbbc36effd Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 10:44:24 +0200 Subject: [PATCH 05/45] Fix branch name --- .github/workflows/deploy-qa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index 74b06faefe..d4bbb1c36a 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -3,8 +3,8 @@ name: Deploy QA on: push: branches: - - BUDI-7641/remove-npm-from-apps-worker-docker - master + - BUDI-7641/push_v2_images_to_qa workflow_dispatch: jobs: From e701bd2b89153ff446e943c265bfdbb65917b84d Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 12:38:52 +0200 Subject: [PATCH 06/45] Ref name in master --- .github/workflows/deploy-qa.yml | 2 +- .github/workflows/release-master.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index d4bbb1c36a..a3fff65f35 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -17,5 +17,5 @@ jobs: REF_NAME: ${{ github.ref_name}} with: repository: budibase/budibase-deploys - event-type: budicloud-qa-deploy-v2 + event-type: budicloud-qa-deploy token: ${{ secrets.GH_ACCESS_TOKEN }} diff --git a/.github/workflows/release-master.yml b/.github/workflows/release-master.yml index 4acd5088d2..9ab8530341 100644 --- a/.github/workflows/release-master.yml +++ b/.github/workflows/release-master.yml @@ -123,6 +123,7 @@ jobs: - uses: passeidireto/trigger-external-workflow-action@main env: PAYLOAD_VERSION: ${{ env.RELEASE_VERSION }} + REF_NAME: ${{ github.ref_name}} with: repository: budibase/budibase-deploys event: budicloud-qa-deploy From bc8e84b8156468b8440cda65a54d7169c8a6bacf Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 20 Oct 2023 12:19:04 +0100 Subject: [PATCH 07/45] Fixing datasource error states causing a datasource to fail to be built fully - this was simply a frontend issue of the error not being handled on creation. --- packages/builder/src/stores/backend/datasources.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/builder/src/stores/backend/datasources.js b/packages/builder/src/stores/backend/datasources.js index 11184f2caa..c0c37a7651 100644 --- a/packages/builder/src/stores/backend/datasources.js +++ b/packages/builder/src/stores/backend/datasources.js @@ -81,9 +81,9 @@ export function createDatasourcesStore() { })) } - const updateDatasource = response => { + const updateDatasource = (response, { ignoreErrors } = {}) => { const { datasource, errors } = response - if (errors && Object.keys(errors).length > 0) { + if (!ignoreErrors && errors && Object.keys(errors).length > 0) { throw new TableImportError(errors) } replaceDatasource(datasource._id, datasource) @@ -137,7 +137,7 @@ export function createDatasourcesStore() { fetchSchema: integration.plus, }) - return updateDatasource(response) + return updateDatasource(response, { ignoreErrors: true }) } const update = async ({ integration, datasource }) => { From 1478ef503ade59f2aa172ec1c3a059019ee97e6a Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 13:31:50 +0200 Subject: [PATCH 08/45] Don't use nx cloud locally --- nx.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/nx.json b/nx.json index fef6893f9d..618395ec90 100644 --- a/nx.json +++ b/nx.json @@ -3,14 +3,16 @@ "default": { "runner": "nx-cloud", "options": { - "cacheableOperations": ["build", "test", "check:types"], - "accessToken": "MmM4OGYxNzItMDBlYy00ZmE3LTk4MTYtNmJhYWMyZjBjZTUyfHJlYWQ=" + "cacheableOperations": ["build", "test", "check:types"] } } }, "targetDefaults": { "build": { - "inputs": ["{workspaceRoot}/scripts/build.js"] + "inputs": [ + "{workspaceRoot}/scripts/build.js", + "{workspaceRoot}/lerna.json" + ] } } } From 1b3ba9a4022b0a2a0d4767d63d68b075575d8634 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 13:32:54 +0200 Subject: [PATCH 09/45] Don't use nx cloud on ci --- .github/workflows/budibase_ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 1580be338e..c73d013b78 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -19,7 +19,6 @@ env: PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} NX_BASE_BRANCH: origin/${{ github.base_ref }} USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' && github.base_ref != 'master'}} - NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} jobs: lint: From f1365121843cf07aa489d2d9f4886e929999ccde Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 14:03:43 +0200 Subject: [PATCH 10/45] Clean pipeline --- .github/workflows/deploy-qa.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index a3fff65f35..d850d289ff 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -4,7 +4,6 @@ on: push: branches: - master - - BUDI-7641/push_v2_images_to_qa workflow_dispatch: jobs: From 70f6f861d011bae826c6f10ebfd827dd51d740f5 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 14:03:43 +0200 Subject: [PATCH 11/45] Clean pipeline --- .github/workflows/deploy-qa.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy-qa.yml b/.github/workflows/deploy-qa.yml index a3fff65f35..d850d289ff 100644 --- a/.github/workflows/deploy-qa.yml +++ b/.github/workflows/deploy-qa.yml @@ -4,7 +4,6 @@ on: push: branches: - master - - BUDI-7641/push_v2_images_to_qa workflow_dispatch: jobs: From e5aefa83eccff6ee630b9aec3c7d571f36e7660c Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 15:13:29 +0200 Subject: [PATCH 12/45] Fix single image dockerfile --- hosting/single/Dockerfile.v2 | 1 + 1 file changed, 1 insertion(+) diff --git a/hosting/single/Dockerfile.v2 b/hosting/single/Dockerfile.v2 index ad11545a22..a983f10044 100644 --- a/hosting/single/Dockerfile.v2 +++ b/hosting/single/Dockerfile.v2 @@ -26,6 +26,7 @@ RUN ./scripts/removeWorkspaceDependencies.sh packages/worker/package.json # We will never want to sync pro, but the script is still required RUN echo '' > scripts/syncProPackage.js RUN jq 'del(.scripts.postinstall)' package.json > temp.json && mv temp.json package.json +RUN ./scripts/removeWorkspaceDependencies.sh package.json RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --production # copy the actual code From 36a33bc19299b3fdbb6e44670798b27d38449287 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 15:15:52 +0200 Subject: [PATCH 13/45] Use nx affected on PRs --- .github/workflows/budibase_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index c73d013b78..77867c8617 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -18,7 +18,7 @@ env: BASE_BRANCH: ${{ github.event.pull_request.base.ref}} PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} NX_BASE_BRANCH: origin/${{ github.base_ref }} - USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' && github.base_ref != 'master'}} + USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' }} jobs: lint: From 2d1e01998a320c9dfe048f228b0baf99d864caed Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 15:16:48 +0200 Subject: [PATCH 14/45] Use nx affected on PRs --- .github/workflows/budibase_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index c73d013b78..77867c8617 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -18,7 +18,7 @@ env: BASE_BRANCH: ${{ github.event.pull_request.base.ref}} PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} NX_BASE_BRANCH: origin/${{ github.base_ref }} - USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' && github.base_ref != 'master'}} + USE_NX_AFFECTED: ${{ github.event_name == 'pull_request' }} jobs: lint: From 0010e07b47112aba01c890b53415bcf09a9847e2 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Fri, 20 Oct 2023 13:29:13 +0000 Subject: [PATCH 15/45] Bump version to 2.11.40 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index e01e5ae03e..75db3b9b55 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.39", + "version": "2.11.40", "npmClient": "yarn", "packages": [ "packages/*" From 961913b88a3208924eba14a9602b853d9e6de8ce Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 16:21:35 +0200 Subject: [PATCH 16/45] Use version from environment --- packages/backend-core/src/environment.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index 3894bdd0f7..4fb8b5fdca 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -49,7 +49,6 @@ function httpLogging() { } function getPackageJsonFields(): { - VERSION: string SERVICE_NAME: string } { function findFileInAncestors( @@ -75,12 +74,11 @@ function getPackageJsonFields(): { const content = readFileSync(packageJsonFile!, "utf-8") const parsedContent = JSON.parse(content) return { - VERSION: parsedContent.version, SERVICE_NAME: parsedContent.name, } } catch { // throwing an error here is confusing/causes backend-core to be hard to import - return { VERSION: "", SERVICE_NAME: "" } + return { SERVICE_NAME: "" } } } @@ -173,6 +171,7 @@ const environment = { ENABLE_SSO_MAINTENANCE_MODE: selfHosted ? process.env.ENABLE_SSO_MAINTENANCE_MODE : false, + VERSION: process.env.VERSION!, ...getPackageJsonFields(), DISABLE_PINO_LOGGER: process.env.DISABLE_PINO_LOGGER, OFFLINE_MODE: process.env.OFFLINE_MODE, From 56ae857d498908c95c2c8e8146455ca170eaf8b0 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 16:21:48 +0200 Subject: [PATCH 17/45] Add version to dev .env --- packages/server/scripts/dev/manage.js | 1 + packages/worker/scripts/dev/manage.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/server/scripts/dev/manage.js b/packages/server/scripts/dev/manage.js index 5db45040bf..13639b6bfd 100644 --- a/packages/server/scripts/dev/manage.js +++ b/packages/server/scripts/dev/manage.js @@ -47,6 +47,7 @@ async function init() { TENANT_FEATURE_FLAGS: "*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR", HTTP_MIGRATIONS: "0", HTTP_LOGGING: "0", + VERSION: "0.0.0+local", } let envFile = "" Object.keys(envFileJson).forEach(key => { diff --git a/packages/worker/scripts/dev/manage.js b/packages/worker/scripts/dev/manage.js index ecf5defd47..9e6a57d4bf 100644 --- a/packages/worker/scripts/dev/manage.js +++ b/packages/worker/scripts/dev/manage.js @@ -31,6 +31,7 @@ async function init() { TENANT_FEATURE_FLAGS: "*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR", ENABLE_EMAIL_TEST_MODE: 1, HTTP_LOGGING: 0, + VERSION: "0.0.0+local", } let envFile = "" Object.keys(envFileJson).forEach(key => { From 04a2bbc61aba8016d84b649273a60dc3c7c6effb Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 20 Oct 2023 15:45:35 +0100 Subject: [PATCH 18/45] Two fixes here - a quick fix for the builder side panel, making sure it fills up with users correctly (not all, but enough to make it look more pleasant) as well as dropping user search endpoint permissions to allow basic users to access it for user columns. --- packages/backend-core/src/users/db.ts | 10 +++++----- packages/backend-core/src/users/users.ts | 9 ++++++--- .../_components/BuilderSidePanel.svelte | 3 ++- packages/types/src/api/web/user.ts | 1 + .../worker/src/api/controllers/global/users.ts | 7 ++++++- .../src/api/routes/global/tests/users.spec.ts | 6 +++++- packages/worker/src/api/routes/global/users.ts | 3 ++- packages/worker/src/tests/api/users.ts | 14 ++++++++++---- 8 files changed, 37 insertions(+), 16 deletions(-) diff --git a/packages/backend-core/src/users/db.ts b/packages/backend-core/src/users/db.ts index 8bb6300d4e..daa09bee6f 100644 --- a/packages/backend-core/src/users/db.ts +++ b/packages/backend-core/src/users/db.ts @@ -164,14 +164,14 @@ export class UserDB { } } - static async getUsersByAppAccess(appId?: string) { - const opts: any = { + static async getUsersByAppAccess(opts: { appId?: string; limit?: number }) { + const params: any = { include_docs: true, - limit: 50, + limit: opts.limit || 50, } let response: User[] = await usersCore.searchGlobalUsersByAppAccess( - appId, - opts + opts.appId, + params ) return response } diff --git a/packages/backend-core/src/users/users.ts b/packages/backend-core/src/users/users.ts index a64997224e..bad108ab84 100644 --- a/packages/backend-core/src/users/users.ts +++ b/packages/backend-core/src/users/users.ts @@ -19,6 +19,7 @@ import { SearchUsersRequest, User, ContextUser, + DatabaseQueryOpts, } from "@budibase/types" import { getGlobalDB } from "../context" import * as context from "../context" @@ -241,12 +242,14 @@ export const paginatedUsers = async ({ bookmark, query, appId, + limit, }: SearchUsersRequest = {}) => { const db = getGlobalDB() + const pageLimit = limit ? limit + 1 : PAGE_LIMIT + 1 // get one extra document, to have the next page - const opts: any = { + const opts: DatabaseQueryOpts = { include_docs: true, - limit: PAGE_LIMIT + 1, + limit: pageLimit, } // add a startkey if the page was specified (anchor) if (bookmark) { @@ -269,7 +272,7 @@ export const paginatedUsers = async ({ const response = await db.allDocs(getGlobalUserParams(null, opts)) userList = response.rows.map((row: any) => row.doc) } - return pagination(userList, PAGE_LIMIT, { + return pagination(userList, pageLimit, { paginate: true, property, getKey, diff --git a/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte b/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte index c93a41f541..a7d9584330 100644 --- a/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte @@ -114,8 +114,9 @@ query: { appId: query || !filterByAppAccess ? null : prodAppId, email: query, - paginated: query || !filterByAppAccess ? null : false, }, + limit: 50, + paginate: query || !filterByAppAccess ? null : false, }) await usersFetch.refresh() diff --git a/packages/types/src/api/web/user.ts b/packages/types/src/api/web/user.ts index a1e039cfd7..3a5bd16bdf 100644 --- a/packages/types/src/api/web/user.ts +++ b/packages/types/src/api/web/user.ts @@ -55,6 +55,7 @@ export interface SearchUsersRequest { bookmark?: string query?: SearchQuery appId?: string + limit?: number paginate?: boolean } diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index 8de3a1444e..bfe9bdf284 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -189,7 +189,10 @@ export const destroy = async (ctx: any) => { export const getAppUsers = async (ctx: Ctx) => { const body = ctx.request.body - const users = await userSdk.db.getUsersByAppAccess(body?.appId) + const users = await userSdk.db.getUsersByAppAccess({ + appId: body.appId, + limit: body.limit, + }) ctx.body = { data: users } } @@ -203,8 +206,10 @@ export const search = async (ctx: Ctx) => { } if (body.paginate === false) { + console.log("not paginated") await getAppUsers(ctx) } else { + console.log("paginated") const paginated = await userSdk.core.paginatedUsers(body) // user hashed password shouldn't ever be returned for (let user of paginated.data) { diff --git a/packages/worker/src/api/routes/global/tests/users.spec.ts b/packages/worker/src/api/routes/global/tests/users.spec.ts index a446d10ed0..846b98a7ae 100644 --- a/packages/worker/src/api/routes/global/tests/users.spec.ts +++ b/packages/worker/src/api/routes/global/tests/users.spec.ts @@ -569,9 +569,13 @@ describe("/api/global/users", () => { { query: { equal: { firstName: user.firstName } }, }, - 501 + { status: 501 } ) }) + + it("should throw an error if public query performed", async () => { + await config.api.users.searchUsers({}, { status: 403, noHeaders: true }) + }) }) describe("DELETE /api/global/users/:userId", () => { diff --git a/packages/worker/src/api/routes/global/users.ts b/packages/worker/src/api/routes/global/users.ts index a57f7834ac..3c9cfd2f41 100644 --- a/packages/worker/src/api/routes/global/users.ts +++ b/packages/worker/src/api/routes/global/users.ts @@ -72,7 +72,8 @@ router ) .get("/api/global/users", auth.builderOrAdmin, controller.fetch) - .post("/api/global/users/search", auth.builderOrAdmin, controller.search) + // search can be used by any user now, to retrieve users for user column + .post("/api/global/users/search", controller.search) .delete("/api/global/users/:id", auth.adminOnly, controller.destroy) .get( "/api/global/users/count/:appId", diff --git a/packages/worker/src/tests/api/users.ts b/packages/worker/src/tests/api/users.ts index b2a19bcb28..ca25e2f9ca 100644 --- a/packages/worker/src/tests/api/users.ts +++ b/packages/worker/src/tests/api/users.ts @@ -134,13 +134,19 @@ export class UserAPI extends TestAPI { .expect(status ? status : 200) } - searchUsers = ({ query }: { query?: SearchQuery }, status = 200) => { - return this.request + searchUsers = ( + { query }: { query?: SearchQuery }, + opts?: { status?: number; noHeaders?: boolean } + ) => { + const req = this.request .post("/api/global/users/search") - .set(this.config.defaultHeaders()) .send({ query }) .expect("Content-Type", /json/) - .expect(status ? status : 200) + .expect(opts?.status ? opts.status : 200) + if (!opts?.noHeaders) { + req.set(this.config.defaultHeaders()) + } + return req } getUser = (userId: string, opts?: TestAPIOpts) => { From 8c744ea7a99ab68e7388094ab74c6fc5ba708e78 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 20 Oct 2023 15:57:45 +0100 Subject: [PATCH 19/45] PR comments. --- packages/worker/src/api/controllers/global/users.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index bfe9bdf284..de1a605890 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -206,10 +206,8 @@ export const search = async (ctx: Ctx) => { } if (body.paginate === false) { - console.log("not paginated") await getAppUsers(ctx) } else { - console.log("paginated") const paginated = await userSdk.core.paginatedUsers(body) // user hashed password shouldn't ever be returned for (let user of paginated.data) { From 8a939dd3e60cb8dc5f0d9e8703fd5a41c7879e1c Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:02:24 +0200 Subject: [PATCH 20/45] Update pro submodule ref --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 570d14aa44..56d968bfe6 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 570d14aa44aa88f4d053856322210f0008ba5c76 +Subproject commit 56d968bfe6998e1077d3fce4eb1c9e483d1d6fc9 From 97fc794a2b198f2466dd1ec41e4371de8fd8a224 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Fri, 20 Oct 2023 15:15:17 +0000 Subject: [PATCH 21/45] Bump version to 2.11.41 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 75db3b9b55..4b2bbb05d5 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.40", + "version": "2.11.41", "npmClient": "yarn", "packages": [ "packages/*" From 4c19ad1ca7f27c9713b9551bd4711aee6b081685 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:19:35 +0200 Subject: [PATCH 22/45] Add versions to server/worker docker v2 --- hosting/docker-compose.build.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hosting/docker-compose.build.yaml b/hosting/docker-compose.build.yaml index e192620b59..19ce9b5473 100644 --- a/hosting/docker-compose.build.yaml +++ b/hosting/docker-compose.build.yaml @@ -7,6 +7,8 @@ services: build: context: .. dockerfile: packages/server/Dockerfile.v2 + args: + - VERSION=0.0.0+dev-docker container_name: build-bbapps environment: SELF_HOSTED: 1 @@ -30,13 +32,13 @@ services: depends_on: - worker-service - redis-service - # volumes: - # - /some/path/to/plugins:/plugins worker-service: build: context: .. dockerfile: packages/worker/Dockerfile.v2 + args: + - VERSION=0.0.0+dev-docker container_name: build-bbworker environment: SELF_HOSTED: 1 From 9dacb5849b126b69ae5006a39205719dd6e79a35 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:19:44 +0200 Subject: [PATCH 23/45] Add versions to server/worker docker v2 --- packages/server/Dockerfile.v2 | 4 ++++ packages/worker/Dockerfile.v2 | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/server/Dockerfile.v2 b/packages/server/Dockerfile.v2 index d5a86b037d..339cefcc45 100644 --- a/packages/server/Dockerfile.v2 +++ b/packages/server/Dockerfile.v2 @@ -67,6 +67,10 @@ COPY packages/server/docker_run.sh . COPY packages/server/builder/ builder/ COPY packages/server/client/ client/ +ARG VERSION +RUN test -n "$VERSION" +ENV VERSION=$VERSION + EXPOSE 4001 # have to add node environment production after install diff --git a/packages/worker/Dockerfile.v2 b/packages/worker/Dockerfile.v2 index 0d60db6fc5..20fcd4a69b 100644 --- a/packages/worker/Dockerfile.v2 +++ b/packages/worker/Dockerfile.v2 @@ -50,4 +50,8 @@ ENV POSTHOG_TOKEN=phc_bIjZL7oh2GEUd2vqvTBH8WvrX0fWTFQMs6H5KQxiUxU ENV TENANT_FEATURE_FLAGS=*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR ENV ACCOUNT_PORTAL_URL=https://account.budibase.app +ARG VERSION +RUN test -n "$VERSION" +ENV VERSION=$VERSION + CMD ["./docker_run.sh"] From 133e4752576c27bd2f41f68578236aa31b7a48e4 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:20:14 +0200 Subject: [PATCH 24/45] Add version to single image --- hosting/single/Dockerfile.v2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hosting/single/Dockerfile.v2 b/hosting/single/Dockerfile.v2 index a983f10044..ecc223be15 100644 --- a/hosting/single/Dockerfile.v2 +++ b/hosting/single/Dockerfile.v2 @@ -118,6 +118,9 @@ EXPOSE 443 EXPOSE 2222 VOLUME /data +ARG VERSION +RUN test -n "$VERSION" +ENV VERSION=$VERSION HEALTHCHECK --interval=15s --timeout=15s --start-period=45s CMD "/healthcheck.sh" From 6ff11a82994719c556c3e68d46a5c5d35a5a57bf Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:23:16 +0200 Subject: [PATCH 25/45] Fix local docker singleimage build --- scripts/build-single-image.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/build-single-image.sh b/scripts/build-single-image.sh index cb2c29deac..216d758fae 100755 --- a/scripts/build-single-image.sh +++ b/scripts/build-single-image.sh @@ -1,3 +1,4 @@ #!/bin/bash yarn build --scope @budibase/server --scope @budibase/worker -docker build -f hosting/single/Dockerfile.v2 -t budibase:latest . +version=$(./scripts/getCurrentVersion.sh) +docker build -f hosting/single/Dockerfile.v2 -t budibase:latest --build-arg VERSION=$version . From 5ee1d73e8160d13862a1dd8f6883d2073380745e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:25:30 +0200 Subject: [PATCH 26/45] Add args to build --- packages/server/package.json | 2 +- packages/worker/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index 0bc3618a08..0636eebe77 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -18,7 +18,7 @@ "test": "bash scripts/test.sh", "test:memory": "jest --maxWorkers=2 --logHeapUsage --forceExit", "test:watch": "jest --watch", - "build:docker": "yarn build && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION", + "build:docker": "yarn build && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION --build-arg VERSION=$BUDIBASE_RELEASE_VERSION", "run:docker": "node dist/index.js", "run:docker:cluster": "pm2-runtime start pm2.config.js", "dev:stack:up": "node scripts/dev/manage.js up", diff --git a/packages/worker/package.json b/packages/worker/package.json index 1eee3f020f..0a75eac522 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -20,7 +20,7 @@ "run:docker": "node dist/index.js", "debug": "yarn build && node --expose-gc --inspect=9223 dist/index.js", "run:docker:cluster": "pm2-runtime start pm2.config.js", - "build:docker": "yarn build && docker build . -t worker-service --label version=$BUDIBASE_RELEASE_VERSION", + "build:docker": "yarn build && docker build . -t worker-service --label version=$BUDIBASE_RELEASE_VERSION --build-arg VERSION=$BUDIBASE_RELEASE_VERSION", "dev:stack:init": "node ./scripts/dev/manage.js init", "dev:builder": "npm run dev:stack:init && nodemon", "dev:built": "yarn run dev:stack:init && yarn run run:docker", From 8db11ac174805355c1961defd7588629811de63f Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:27:42 +0200 Subject: [PATCH 27/45] Add version to test image pipeline --- .github/workflows/release-singleimage-test.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-singleimage-test.yml b/.github/workflows/release-singleimage-test.yml index 79b9afdd44..3d6c0d2b3c 100644 --- a/.github/workflows/release-singleimage-test.yml +++ b/.github/workflows/release-singleimage-test.yml @@ -54,6 +54,7 @@ jobs: push: true pull: true platforms: linux/amd64,linux/arm64 + build-args: VERSION=0.0.0+test tags: budibase/budibase-test:test file: ./hosting/single/Dockerfile.v2 cache-from: type=registry,ref=budibase/budibase-test:test @@ -64,6 +65,8 @@ jobs: context: . push: true platforms: linux/amd64 - build-args: TARGETBUILD=aas + build-args: | + TARGETBUILD=aas + VERSION=0.0.0+test tags: budibase/budibase-test:aas file: ./hosting/single/Dockerfile.v2 From d1f0e8fca0b4577e8ec0defa39f269727e793d77 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 17:53:23 +0200 Subject: [PATCH 28/45] Fix tests --- packages/server/src/tests/jestEnv.ts | 1 + packages/worker/src/tests/jestEnv.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/server/src/tests/jestEnv.ts b/packages/server/src/tests/jestEnv.ts index 34c51009aa..c1f32eeec9 100644 --- a/packages/server/src/tests/jestEnv.ts +++ b/packages/server/src/tests/jestEnv.ts @@ -9,3 +9,4 @@ process.env.LOG_LEVEL = process.env.LOG_LEVEL || "error" process.env.MOCK_REDIS = "1" process.env.PLATFORM_URL = "http://localhost:10000" process.env.REDIS_PASSWORD = "budibase" +process.env.VERSION = "0.0.0+jest" diff --git a/packages/worker/src/tests/jestEnv.ts b/packages/worker/src/tests/jestEnv.ts index 9153676b8e..f6de4e0fd2 100644 --- a/packages/worker/src/tests/jestEnv.ts +++ b/packages/worker/src/tests/jestEnv.ts @@ -10,3 +10,4 @@ process.env.PLATFORM_URL = "http://localhost:10000" process.env.INTERNAL_API_KEY = "tet" process.env.DISABLE_ACCOUNT_PORTAL = "0" process.env.MOCK_REDIS = "1" +process.env.VERSION = "0.0.0+jest" From 71869badfa26e57035582bca3f3d670a9fc7a8c0 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 19:19:35 +0200 Subject: [PATCH 29/45] Fix tests --- packages/server/src/api/routes/tests/debug.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/debug.spec.ts b/packages/server/src/api/routes/tests/debug.spec.ts index 23ee43fc73..26e98d93f9 100644 --- a/packages/server/src/api/routes/tests/debug.spec.ts +++ b/packages/server/src/api/routes/tests/debug.spec.ts @@ -41,7 +41,7 @@ describe("/component", () => { .expect("Content-Type", /json/) .expect(200) expect(res.body).toEqual({ - budibaseVersion: "0.0.0", + budibaseVersion: "0.0.0+jest", cpuArch: "arm64", cpuCores: 1, cpuInfo: "test", From e7459bb5e704685338032509334933f9fd80dede Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 20 Oct 2023 20:42:58 +0200 Subject: [PATCH 30/45] Fix test --- packages/server/src/api/routes/tests/dev.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/server/src/api/routes/tests/dev.spec.js b/packages/server/src/api/routes/tests/dev.spec.js index 111f3dbd5b..af1dc82a9d 100644 --- a/packages/server/src/api/routes/tests/dev.spec.js +++ b/packages/server/src/api/routes/tests/dev.spec.js @@ -1,6 +1,6 @@ const setup = require("./utilities") const { events } = require("@budibase/backend-core") -const version = require("../../../../package.json").version + describe("/dev", () => { let request = setup.getRequest() @@ -32,9 +32,9 @@ describe("/dev", () => { .expect("Content-Type", /json/) .expect(200) - expect(res.body.version).toBe(version) + expect(res.body.version).toBe('0.0.0+jest') expect(events.installation.versionChecked).toBeCalledTimes(1) - expect(events.installation.versionChecked).toBeCalledWith(version) + expect(events.installation.versionChecked).toBeCalledWith('0.0.0+jest') }) }) }) \ No newline at end of file From 4ee1fd0f7ad53a5ed6c08d202826a2b227adf4c1 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 23 Oct 2023 12:23:44 +0200 Subject: [PATCH 31/45] Default to package.json --- packages/backend-core/src/environment.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index 4fb8b5fdca..a0905fb0f5 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -49,6 +49,7 @@ function httpLogging() { } function getPackageJsonFields(): { + VERSION: string SERVICE_NAME: string } { function findFileInAncestors( @@ -74,11 +75,12 @@ function getPackageJsonFields(): { const content = readFileSync(packageJsonFile!, "utf-8") const parsedContent = JSON.parse(content) return { + VERSION: process.env.VERSION || parsedContent.version, SERVICE_NAME: parsedContent.name, } } catch { // throwing an error here is confusing/causes backend-core to be hard to import - return { SERVICE_NAME: "" } + return { VERSION: process.env.VERSION || "", SERVICE_NAME: "" } } } @@ -171,7 +173,6 @@ const environment = { ENABLE_SSO_MAINTENANCE_MODE: selfHosted ? process.env.ENABLE_SSO_MAINTENANCE_MODE : false, - VERSION: process.env.VERSION!, ...getPackageJsonFields(), DISABLE_PINO_LOGGER: process.env.DISABLE_PINO_LOGGER, OFFLINE_MODE: process.env.OFFLINE_MODE, From 648410348d2c2f0c9a3ce1e2d2a34b0ca4f5f80e Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Mon, 23 Oct 2023 13:27:59 +0200 Subject: [PATCH 32/45] [Revert] [Added] Per user per creator changes --- .../backend-core/src/cache/writethrough.ts | 4 +- packages/backend-core/src/users/db.ts | 116 ++++++++---------- packages/backend-core/src/users/users.ts | 13 -- packages/backend-core/src/users/utils.ts | 1 - .../tests/core/users/users.spec.js | 54 -------- .../core/utilities/structures/licenses.ts | 13 -- .../tests/core/utilities/structures/quotas.ts | 5 +- packages/pro | 2 +- .../src/migrations/functions/syncQuotas.ts | 2 - .../functions/usageQuotas/syncCreators.ts | 13 -- .../usageQuotas/tests/syncCreators.spec.ts | 26 ---- .../shared-core/src/sdk/documents/users.ts | 25 ---- packages/types/src/documents/global/quotas.ts | 1 - packages/types/src/sdk/featureFlag.ts | 3 - packages/types/src/sdk/licensing/billing.ts | 7 -- packages/types/src/sdk/licensing/plan.ts | 4 - packages/types/src/sdk/licensing/quota.ts | 2 - 17 files changed, 55 insertions(+), 236 deletions(-) delete mode 100644 packages/backend-core/tests/core/users/users.spec.js delete mode 100644 packages/server/src/migrations/functions/usageQuotas/syncCreators.ts delete mode 100644 packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts diff --git a/packages/backend-core/src/cache/writethrough.ts b/packages/backend-core/src/cache/writethrough.ts index c331d791a6..e64c116663 100644 --- a/packages/backend-core/src/cache/writethrough.ts +++ b/packages/backend-core/src/cache/writethrough.ts @@ -119,8 +119,8 @@ export class Writethrough { this.writeRateMs = writeRateMs } - async put(doc: any, writeRateMs: number = this.writeRateMs) { - return put(this.db, doc, writeRateMs) + async put(doc: any) { + return put(this.db, doc, this.writeRateMs) } async get(id: string) { diff --git a/packages/backend-core/src/users/db.ts b/packages/backend-core/src/users/db.ts index daa09bee6f..a2539e836e 100644 --- a/packages/backend-core/src/users/db.ts +++ b/packages/backend-core/src/users/db.ts @@ -25,17 +25,12 @@ import { import { getAccountHolderFromUserIds, isAdmin, - isCreator, validateUniqueUser, } from "./utils" import { searchExistingEmails } from "./lookup" import { hash } from "../utils" -type QuotaUpdateFn = ( - change: number, - creatorsChange: number, - cb?: () => Promise -) => Promise +type QuotaUpdateFn = (change: number, cb?: () => Promise) => Promise type GroupUpdateFn = (groupId: string, userIds: string[]) => Promise type FeatureFn = () => Promise type GroupGetFn = (ids: string[]) => Promise @@ -250,8 +245,7 @@ export class UserDB { } const change = dbUser ? 0 : 1 // no change if there is existing user - const creatorsChange = isCreator(dbUser) !== isCreator(user) ? 1 : 0 - return UserDB.quotas.addUsers(change, creatorsChange, async () => { + return UserDB.quotas.addUsers(change, async () => { await validateUniqueUser(email, tenantId) let builtUser = await UserDB.buildUser(user, opts, tenantId, dbUser) @@ -313,7 +307,6 @@ export class UserDB { let usersToSave: any[] = [] let newUsers: any[] = [] - let newCreators: any[] = [] const emails = newUsersRequested.map((user: User) => user.email) const existingEmails = await searchExistingEmails(emails) @@ -334,66 +327,59 @@ export class UserDB { } newUser.userGroups = groups newUsers.push(newUser) - if (isCreator(newUser)) { - newCreators.push(newUser) - } } const account = await accountSdk.getAccountByTenantId(tenantId) - return UserDB.quotas.addUsers( - newUsers.length, - newCreators.length, - async () => { - // create the promises array that will be called by bulkDocs - newUsers.forEach((user: any) => { - usersToSave.push( - UserDB.buildUser( - user, - { - hashPassword: true, - requirePassword: user.requirePassword, - }, - tenantId, - undefined, // no dbUser - account - ) + return UserDB.quotas.addUsers(newUsers.length, async () => { + // create the promises array that will be called by bulkDocs + newUsers.forEach((user: any) => { + usersToSave.push( + UserDB.buildUser( + user, + { + hashPassword: true, + requirePassword: user.requirePassword, + }, + tenantId, + undefined, // no dbUser + account ) - }) + ) + }) - const usersToBulkSave = await Promise.all(usersToSave) - await usersCore.bulkUpdateGlobalUsers(usersToBulkSave) + const usersToBulkSave = await Promise.all(usersToSave) + await usersCore.bulkUpdateGlobalUsers(usersToBulkSave) - // Post-processing of bulk added users, e.g. events and cache operations - for (const user of usersToBulkSave) { - // TODO: Refactor to bulk insert users into the info db - // instead of relying on looping tenant creation - await platform.users.addUser(tenantId, user._id, user.email) - await eventHelpers.handleSaveEvents(user, undefined) - } - - const saved = usersToBulkSave.map(user => { - return { - _id: user._id, - email: user.email, - } - }) - - // now update the groups - if (Array.isArray(saved) && groups) { - const groupPromises = [] - const createdUserIds = saved.map(user => user._id) - for (let groupId of groups) { - groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds)) - } - await Promise.all(groupPromises) - } - - return { - successful: saved, - unsuccessful, - } + // Post-processing of bulk added users, e.g. events and cache operations + for (const user of usersToBulkSave) { + // TODO: Refactor to bulk insert users into the info db + // instead of relying on looping tenant creation + await platform.users.addUser(tenantId, user._id, user.email) + await eventHelpers.handleSaveEvents(user, undefined) } - ) + + const saved = usersToBulkSave.map(user => { + return { + _id: user._id, + email: user.email, + } + }) + + // now update the groups + if (Array.isArray(saved) && groups) { + const groupPromises = [] + const createdUserIds = saved.map(user => user._id) + for (let groupId of groups) { + groupPromises.push(UserDB.groups.addUsers(groupId, createdUserIds)) + } + await Promise.all(groupPromises) + } + + return { + successful: saved, + unsuccessful, + } + }) } static async bulkDelete(userIds: string[]): Promise { @@ -433,12 +419,11 @@ export class UserDB { _deleted: true, })) const dbResponse = await usersCore.bulkUpdateGlobalUsers(toDelete) - const creatorsToDelete = usersToDelete.filter(isCreator) + await UserDB.quotas.removeUsers(toDelete.length) for (let user of usersToDelete) { await bulkDeleteProcessing(user) } - await UserDB.quotas.removeUsers(toDelete.length, creatorsToDelete.length) // Build Response // index users by id @@ -487,8 +472,7 @@ export class UserDB { await db.remove(userId, dbUser._rev) - const creatorsToDelete = isCreator(dbUser) ? 1 : 0 - await UserDB.quotas.removeUsers(1, creatorsToDelete) + await UserDB.quotas.removeUsers(1) await eventHelpers.handleDeleteEvents(dbUser) await cache.user.invalidateUser(userId) await sessions.invalidateSessions(userId, { reason: "deletion" }) diff --git a/packages/backend-core/src/users/users.ts b/packages/backend-core/src/users/users.ts index bad108ab84..30b9e0a45f 100644 --- a/packages/backend-core/src/users/users.ts +++ b/packages/backend-core/src/users/users.ts @@ -287,19 +287,6 @@ export async function getUserCount() { return response.total_rows } -export async function getCreatorCount() { - let creators = 0 - async function iterate(startPage?: string) { - const page = await paginatedUsers({ bookmark: startPage }) - creators += page.data.filter(isCreator).length - if (page.hasNextPage) { - await iterate(page.nextPage) - } - } - await iterate() - return creators -} - // used to remove the builder/admin permissions, for processing the // user as an app user (they may have some specific role/group export function removePortalUserPermissions(user: User | ContextUser) { diff --git a/packages/backend-core/src/users/utils.ts b/packages/backend-core/src/users/utils.ts index 0ef4b77998..af0e8e10c7 100644 --- a/packages/backend-core/src/users/utils.ts +++ b/packages/backend-core/src/users/utils.ts @@ -10,7 +10,6 @@ import { getAccountByTenantId } from "../accounts" // extract from shared-core to make easily accessible from backend-core export const isBuilder = sdk.users.isBuilder export const isAdmin = sdk.users.isAdmin -export const isCreator = sdk.users.isCreator export const isGlobalBuilder = sdk.users.isGlobalBuilder export const isAdminOrBuilder = sdk.users.isAdminOrBuilder export const hasAdminPermissions = sdk.users.hasAdminPermissions diff --git a/packages/backend-core/tests/core/users/users.spec.js b/packages/backend-core/tests/core/users/users.spec.js deleted file mode 100644 index ae7109344a..0000000000 --- a/packages/backend-core/tests/core/users/users.spec.js +++ /dev/null @@ -1,54 +0,0 @@ -const _ = require('lodash/fp') -const {structures} = require("../../../tests") - -jest.mock("../../../src/context") -jest.mock("../../../src/db") - -const context = require("../../../src/context") -const db = require("../../../src/db") - -const {getCreatorCount} = require('../../../src/users/users') - -describe("Users", () => { - - let getGlobalDBMock - let getGlobalUserParamsMock - let paginationMock - - beforeEach(() => { - jest.resetAllMocks() - - getGlobalDBMock = jest.spyOn(context, "getGlobalDB") - getGlobalUserParamsMock = jest.spyOn(db, "getGlobalUserParams") - paginationMock = jest.spyOn(db, "pagination") - }) - - it("Retrieves the number of creators", async () => { - const getUsers = (offset, limit, creators = false) => { - const range = _.range(offset, limit) - const opts = creators ? {builder: {global: true}} : undefined - return range.map(() => structures.users.user(opts)) - } - const page1Data = getUsers(0, 8) - const page2Data = getUsers(8, 12, true) - getGlobalDBMock.mockImplementation(() => ({ - name : "fake-db", - allDocs: () => ({ - rows: [...page1Data, ...page2Data] - }) - })) - paginationMock.mockImplementationOnce(() => ({ - data: page1Data, - hasNextPage: true, - nextPage: "1" - })) - paginationMock.mockImplementation(() => ({ - data: page2Data, - hasNextPage: false, - nextPage: undefined - })) - const creatorsCount = await getCreatorCount() - expect(creatorsCount).toBe(4) - expect(paginationMock).toHaveBeenCalledTimes(2) - }) -}) diff --git a/packages/backend-core/tests/core/utilities/structures/licenses.ts b/packages/backend-core/tests/core/utilities/structures/licenses.ts index bb452f9ad5..5cce84edfd 100644 --- a/packages/backend-core/tests/core/utilities/structures/licenses.ts +++ b/packages/backend-core/tests/core/utilities/structures/licenses.ts @@ -72,11 +72,6 @@ export function quotas(): Quotas { value: 1, triggers: [], }, - creators: { - name: "Creators", - value: 1, - triggers: [], - }, userGroups: { name: "User Groups", value: 1, @@ -123,10 +118,6 @@ export function customer(): Customer { export function subscription(): Subscription { return { amount: 10000, - amounts: { - user: 10000, - creator: 0, - }, cancelAt: undefined, currency: "usd", currentPeriodEnd: 0, @@ -135,10 +126,6 @@ export function subscription(): Subscription { duration: PriceDuration.MONTHLY, pastDueAt: undefined, quantity: 0, - quantities: { - user: 0, - creator: 0, - }, status: "active", } } diff --git a/packages/backend-core/tests/core/utilities/structures/quotas.ts b/packages/backend-core/tests/core/utilities/structures/quotas.ts index 8d0b05fe1e..e82117053f 100644 --- a/packages/backend-core/tests/core/utilities/structures/quotas.ts +++ b/packages/backend-core/tests/core/utilities/structures/quotas.ts @@ -1,6 +1,6 @@ import { MonthlyQuotaName, QuotaUsage } from "@budibase/types" -export const usage = (users: number = 0, creators: number = 0): QuotaUsage => { +export const usage = (): QuotaUsage => { return { _id: "usage_quota", quotaReset: new Date().toISOString(), @@ -58,8 +58,7 @@ export const usage = (users: number = 0, creators: number = 0): QuotaUsage => { usageQuota: { apps: 0, plugins: 0, - users, - creators, + users: 0, userGroups: 0, rows: 0, triggers: {}, diff --git a/packages/pro b/packages/pro index 56d968bfe6..1e43861b7e 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 56d968bfe6998e1077d3fce4eb1c9e483d1d6fc9 +Subproject commit 1e43861b7ed7141284ab63a0cf5bd494ec3ab2d1 diff --git a/packages/server/src/migrations/functions/syncQuotas.ts b/packages/server/src/migrations/functions/syncQuotas.ts index 83a7670e78..67f38ba929 100644 --- a/packages/server/src/migrations/functions/syncQuotas.ts +++ b/packages/server/src/migrations/functions/syncQuotas.ts @@ -3,7 +3,6 @@ import * as syncApps from "./usageQuotas/syncApps" import * as syncRows from "./usageQuotas/syncRows" import * as syncPlugins from "./usageQuotas/syncPlugins" import * as syncUsers from "./usageQuotas/syncUsers" -import * as syncCreators from "./usageQuotas/syncCreators" /** * Synchronise quotas to the state of the db. @@ -14,6 +13,5 @@ export const run = async () => { await syncRows.run() await syncPlugins.run() await syncUsers.run() - await syncCreators.run() }) } diff --git a/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts b/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts deleted file mode 100644 index ce53be925a..0000000000 --- a/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { users } from "@budibase/backend-core" -import { quotas } from "@budibase/pro" -import { QuotaUsageType, StaticQuotaName } from "@budibase/types" - -export const run = async () => { - const creatorCount = await users.getCreatorCount() - console.log(`Syncing creator count: ${creatorCount}`) - await quotas.setUsage( - creatorCount, - StaticQuotaName.CREATORS, - QuotaUsageType.STATIC - ) -} diff --git a/packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts b/packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts deleted file mode 100644 index 75fa9f217e..0000000000 --- a/packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import TestConfig from "../../../../tests/utilities/TestConfiguration" -import * as syncCreators from "../syncCreators" -import { quotas } from "@budibase/pro" - -describe("syncCreators", () => { - let config = new TestConfig(false) - - beforeEach(async () => { - await config.init() - }) - - afterAll(config.end) - - it("syncs creators", async () => { - return config.doInContext(null, async () => { - await config.createUser({ admin: true }) - - await syncCreators.run() - - const usageDoc = await quotas.getQuotaUsage() - // default + additional creator - const creatorsCount = 2 - expect(usageDoc.usageQuota.creators).toBe(creatorsCount) - }) - }) -}) diff --git a/packages/shared-core/src/sdk/documents/users.ts b/packages/shared-core/src/sdk/documents/users.ts index b58994aa46..03d86daa85 100644 --- a/packages/shared-core/src/sdk/documents/users.ts +++ b/packages/shared-core/src/sdk/documents/users.ts @@ -6,7 +6,6 @@ import { InternalTable, } from "@budibase/types" import { getProdAppID } from "./applications" -import * as _ from "lodash/fp" // checks if a user is specifically a builder, given an app ID export function isBuilder(user: User | ContextUser, appId?: string): boolean { @@ -59,18 +58,6 @@ export function hasAppBuilderPermissions(user?: User | ContextUser): boolean { return !isGlobalBuilder && appLength != null && appLength > 0 } -export function hasAppCreatorPermissions(user?: User | ContextUser): boolean { - if (!user) { - return false - } - return _.flow( - _.get("roles"), - _.values, - _.find(x => ["CREATOR", "ADMIN"].includes(x)), - x => !!x - )(user) -} - // checks if a user is capable of building any app export function hasBuilderPermissions(user?: User | ContextUser): boolean { if (!user) { @@ -87,18 +74,6 @@ export function hasAdminPermissions(user?: User | ContextUser): boolean { return !!user.admin?.global } -export function isCreator(user?: User | ContextUser): boolean { - if (!user) { - return false - } - return ( - isGlobalBuilder(user) || - hasAdminPermissions(user) || - hasAppBuilderPermissions(user) || - hasAppCreatorPermissions(user) - ) -} - export function getGlobalUserID(userId?: string): string | undefined { if (typeof userId !== "string") { return userId diff --git a/packages/types/src/documents/global/quotas.ts b/packages/types/src/documents/global/quotas.ts index 4eb1168f7d..61410f7435 100644 --- a/packages/types/src/documents/global/quotas.ts +++ b/packages/types/src/documents/global/quotas.ts @@ -32,7 +32,6 @@ export interface StaticUsage { [StaticQuotaName.APPS]: number [StaticQuotaName.PLUGINS]: number [StaticQuotaName.USERS]: number - [StaticQuotaName.CREATORS]: number [StaticQuotaName.USER_GROUPS]: number [StaticQuotaName.ROWS]: number triggers: { diff --git a/packages/types/src/sdk/featureFlag.ts b/packages/types/src/sdk/featureFlag.ts index e3935bc7ee..53aa4842c4 100644 --- a/packages/types/src/sdk/featureFlag.ts +++ b/packages/types/src/sdk/featureFlag.ts @@ -1,8 +1,5 @@ export enum FeatureFlag { LICENSING = "LICENSING", - // Feature IDs in Posthog - PER_CREATOR_PER_USER_PRICE = "18873", - PER_CREATOR_PER_USER_PRICE_ALERT = "18530", } export interface TenantFeatureFlags { diff --git a/packages/types/src/sdk/licensing/billing.ts b/packages/types/src/sdk/licensing/billing.ts index bcbc7abd18..35f366c811 100644 --- a/packages/types/src/sdk/licensing/billing.ts +++ b/packages/types/src/sdk/licensing/billing.ts @@ -5,17 +5,10 @@ export interface Customer { currency: string | null | undefined } -export interface SubscriptionItems { - user: number | undefined - creator: number | undefined -} - export interface Subscription { amount: number - amounts: SubscriptionItems | undefined currency: string quantity: number - quantities: SubscriptionItems | undefined duration: PriceDuration cancelAt: number | null | undefined currentPeriodStart: number diff --git a/packages/types/src/sdk/licensing/plan.ts b/packages/types/src/sdk/licensing/plan.ts index 1604dfb8af..3e214a01ff 100644 --- a/packages/types/src/sdk/licensing/plan.ts +++ b/packages/types/src/sdk/licensing/plan.ts @@ -4,9 +4,7 @@ export enum PlanType { PRO = "pro", /** @deprecated */ TEAM = "team", - /** @deprecated */ PREMIUM = "premium", - PREMIUM_PLUS = "premium_plus", BUSINESS = "business", ENTERPRISE = "enterprise", } @@ -28,12 +26,10 @@ export interface AvailablePrice { currency: string duration: PriceDuration priceId: string - type?: string } export enum PlanModel { PER_USER = "perUser", - PER_CREATOR_PER_USER = "per_creator_per_user", DAY_PASS = "dayPass", } diff --git a/packages/types/src/sdk/licensing/quota.ts b/packages/types/src/sdk/licensing/quota.ts index 85700f167b..73afa1ed05 100644 --- a/packages/types/src/sdk/licensing/quota.ts +++ b/packages/types/src/sdk/licensing/quota.ts @@ -14,7 +14,6 @@ export enum StaticQuotaName { ROWS = "rows", APPS = "apps", USERS = "users", - CREATORS = "creators", USER_GROUPS = "userGroups", PLUGINS = "plugins", } @@ -68,7 +67,6 @@ export type StaticQuotas = { [StaticQuotaName.ROWS]: Quota [StaticQuotaName.APPS]: Quota [StaticQuotaName.USERS]: Quota - [StaticQuotaName.CREATORS]: Quota [StaticQuotaName.USER_GROUPS]: Quota [StaticQuotaName.PLUGINS]: Quota } From a285fb1d4027ca70d77a953ba16bcb74179ba8e1 Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Mon, 23 Oct 2023 13:33:27 +0200 Subject: [PATCH 33/45] Missed code in merge --- packages/backend-core/src/users/users.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/backend-core/src/users/users.ts b/packages/backend-core/src/users/users.ts index 30b9e0a45f..d259d5b560 100644 --- a/packages/backend-core/src/users/users.ts +++ b/packages/backend-core/src/users/users.ts @@ -14,16 +14,15 @@ import { } from "../db" import { BulkDocsResponse, + ContextUser, SearchQuery, SearchQueryOperators, SearchUsersRequest, User, - ContextUser, DatabaseQueryOpts, } from "@budibase/types" -import { getGlobalDB } from "../context" import * as context from "../context" -import { isCreator } from "./utils" +import { getGlobalDB } from "../context" type GetOpts = { cleanup?: boolean } From a22aea63a372f32a9a2089fd783cd72ced667378 Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Mon, 23 Oct 2023 13:33:56 +0200 Subject: [PATCH 34/45] Update pro submodule --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 1e43861b7e..ee222c4694 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 1e43861b7ed7141284ab63a0cf5bd494ec3ab2d1 +Subproject commit ee222c4694c71716eeb1257f37467fc2231ee166 From 0cc7cc67a388db38fbb03bbcf2adb1ce3ed3b364 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 23 Oct 2023 13:53:18 +0200 Subject: [PATCH 35/45] Renames --- .github/workflows/release-singleimage-test.yml | 4 ++-- hosting/docker-compose.build.yaml | 4 ++-- hosting/single/Dockerfile.v2 | 6 +++--- packages/server/Dockerfile.v2 | 6 +++--- packages/server/package.json | 2 +- packages/worker/Dockerfile.v2 | 6 +++--- packages/worker/package.json | 2 +- scripts/build-single-image.sh | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/release-singleimage-test.yml b/.github/workflows/release-singleimage-test.yml index 3d6c0d2b3c..c3a14226ce 100644 --- a/.github/workflows/release-singleimage-test.yml +++ b/.github/workflows/release-singleimage-test.yml @@ -54,7 +54,7 @@ jobs: push: true pull: true platforms: linux/amd64,linux/arm64 - build-args: VERSION=0.0.0+test + build-args: BUDIBASE_VERSION=0.0.0+test tags: budibase/budibase-test:test file: ./hosting/single/Dockerfile.v2 cache-from: type=registry,ref=budibase/budibase-test:test @@ -67,6 +67,6 @@ jobs: platforms: linux/amd64 build-args: | TARGETBUILD=aas - VERSION=0.0.0+test + BUDIBASE_VERSION=0.0.0+test tags: budibase/budibase-test:aas file: ./hosting/single/Dockerfile.v2 diff --git a/hosting/docker-compose.build.yaml b/hosting/docker-compose.build.yaml index 19ce9b5473..7ead001a1c 100644 --- a/hosting/docker-compose.build.yaml +++ b/hosting/docker-compose.build.yaml @@ -8,7 +8,7 @@ services: context: .. dockerfile: packages/server/Dockerfile.v2 args: - - VERSION=0.0.0+dev-docker + - BUDIBASE_VERSION=0.0.0+dev-docker container_name: build-bbapps environment: SELF_HOSTED: 1 @@ -38,7 +38,7 @@ services: context: .. dockerfile: packages/worker/Dockerfile.v2 args: - - VERSION=0.0.0+dev-docker + - BUDIBASE_VERSION=0.0.0+dev-docker container_name: build-bbworker environment: SELF_HOSTED: 1 diff --git a/hosting/single/Dockerfile.v2 b/hosting/single/Dockerfile.v2 index ecc223be15..3b994ce0e6 100644 --- a/hosting/single/Dockerfile.v2 +++ b/hosting/single/Dockerfile.v2 @@ -118,9 +118,9 @@ EXPOSE 443 EXPOSE 2222 VOLUME /data -ARG VERSION -RUN test -n "$VERSION" -ENV VERSION=$VERSION +ARG BUDIBASE_VERSION +RUN test -n "$BUDIBASE_VERSION" +ENV BUDIBASE_VERSION=$VERSION HEALTHCHECK --interval=15s --timeout=15s --start-period=45s CMD "/healthcheck.sh" diff --git a/packages/server/Dockerfile.v2 b/packages/server/Dockerfile.v2 index 339cefcc45..341fe5ee34 100644 --- a/packages/server/Dockerfile.v2 +++ b/packages/server/Dockerfile.v2 @@ -67,9 +67,9 @@ COPY packages/server/docker_run.sh . COPY packages/server/builder/ builder/ COPY packages/server/client/ client/ -ARG VERSION -RUN test -n "$VERSION" -ENV VERSION=$VERSION +ARG BUDIBASE_VERSION +RUN test -n "$BUDIBASE_VERSION" +ENV BUDIBASE_VERSION=$VERSION EXPOSE 4001 diff --git a/packages/server/package.json b/packages/server/package.json index 0636eebe77..4a858f3be9 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -18,7 +18,7 @@ "test": "bash scripts/test.sh", "test:memory": "jest --maxWorkers=2 --logHeapUsage --forceExit", "test:watch": "jest --watch", - "build:docker": "yarn build && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION --build-arg VERSION=$BUDIBASE_RELEASE_VERSION", + "build:docker": "yarn build && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION --build-arg BUDIBASE_VERSION=$BUDIBASE_RELEASE_VERSION", "run:docker": "node dist/index.js", "run:docker:cluster": "pm2-runtime start pm2.config.js", "dev:stack:up": "node scripts/dev/manage.js up", diff --git a/packages/worker/Dockerfile.v2 b/packages/worker/Dockerfile.v2 index 20fcd4a69b..ed3817e89d 100644 --- a/packages/worker/Dockerfile.v2 +++ b/packages/worker/Dockerfile.v2 @@ -50,8 +50,8 @@ ENV POSTHOG_TOKEN=phc_bIjZL7oh2GEUd2vqvTBH8WvrX0fWTFQMs6H5KQxiUxU ENV TENANT_FEATURE_FLAGS=*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR ENV ACCOUNT_PORTAL_URL=https://account.budibase.app -ARG VERSION -RUN test -n "$VERSION" -ENV VERSION=$VERSION +ARG BUDIBASE_VERSION +RUN test -n "$BUDIBASE_VERSION" +ENV BUDIBASE_VERSION=$VERSION CMD ["./docker_run.sh"] diff --git a/packages/worker/package.json b/packages/worker/package.json index 0a75eac522..205bf3309a 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -20,7 +20,7 @@ "run:docker": "node dist/index.js", "debug": "yarn build && node --expose-gc --inspect=9223 dist/index.js", "run:docker:cluster": "pm2-runtime start pm2.config.js", - "build:docker": "yarn build && docker build . -t worker-service --label version=$BUDIBASE_RELEASE_VERSION --build-arg VERSION=$BUDIBASE_RELEASE_VERSION", + "build:docker": "yarn build && docker build . -t worker-service --label version=$BUDIBASE_RELEASE_VERSION --build-arg BUDIBASE_VERSION=$BUDIBASE_RELEASE_VERSION", "dev:stack:init": "node ./scripts/dev/manage.js init", "dev:builder": "npm run dev:stack:init && nodemon", "dev:built": "yarn run dev:stack:init && yarn run run:docker", diff --git a/scripts/build-single-image.sh b/scripts/build-single-image.sh index 216d758fae..ed3d9a8ed6 100755 --- a/scripts/build-single-image.sh +++ b/scripts/build-single-image.sh @@ -1,4 +1,4 @@ #!/bin/bash yarn build --scope @budibase/server --scope @budibase/worker version=$(./scripts/getCurrentVersion.sh) -docker build -f hosting/single/Dockerfile.v2 -t budibase:latest --build-arg VERSION=$version . +docker build -f hosting/single/Dockerfile.v2 -t budibase:latest --build-arg BUDIBASE_VERSION=$version . From 3c16e820354c9b8b9ee03ad8e34ad304fb504d60 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 23 Oct 2023 13:55:23 +0200 Subject: [PATCH 36/45] Comment docker --- hosting/single/Dockerfile.v2 | 1 + packages/server/Dockerfile.v2 | 1 + packages/worker/Dockerfile.v2 | 1 + 3 files changed, 3 insertions(+) diff --git a/hosting/single/Dockerfile.v2 b/hosting/single/Dockerfile.v2 index 3b994ce0e6..66ce0f1c4d 100644 --- a/hosting/single/Dockerfile.v2 +++ b/hosting/single/Dockerfile.v2 @@ -119,6 +119,7 @@ EXPOSE 2222 VOLUME /data ARG BUDIBASE_VERSION +# Ensuring the version argument is sent RUN test -n "$BUDIBASE_VERSION" ENV BUDIBASE_VERSION=$VERSION diff --git a/packages/server/Dockerfile.v2 b/packages/server/Dockerfile.v2 index 341fe5ee34..5035dc748f 100644 --- a/packages/server/Dockerfile.v2 +++ b/packages/server/Dockerfile.v2 @@ -68,6 +68,7 @@ COPY packages/server/builder/ builder/ COPY packages/server/client/ client/ ARG BUDIBASE_VERSION +# Ensuring the version argument is sent RUN test -n "$BUDIBASE_VERSION" ENV BUDIBASE_VERSION=$VERSION diff --git a/packages/worker/Dockerfile.v2 b/packages/worker/Dockerfile.v2 index ed3817e89d..78eba2d3d8 100644 --- a/packages/worker/Dockerfile.v2 +++ b/packages/worker/Dockerfile.v2 @@ -51,6 +51,7 @@ ENV TENANT_FEATURE_FLAGS=*:LICENSING,*:USER_GROUPS,*:ONBOARDING_TOUR ENV ACCOUNT_PORTAL_URL=https://account.budibase.app ARG BUDIBASE_VERSION +# Ensuring the version argument is sent RUN test -n "$BUDIBASE_VERSION" ENV BUDIBASE_VERSION=$VERSION From 3c85f1ce9e4b476062ffc5147f9c1e8bd73fc1f8 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 23 Oct 2023 13:55:58 +0200 Subject: [PATCH 37/45] Fix after renames --- packages/backend-core/src/environment.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index a0905fb0f5..ed882fe96a 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -75,12 +75,12 @@ function getPackageJsonFields(): { const content = readFileSync(packageJsonFile!, "utf-8") const parsedContent = JSON.parse(content) return { - VERSION: process.env.VERSION || parsedContent.version, + VERSION: process.env.BUDIBASE_VERSION || parsedContent.version, SERVICE_NAME: parsedContent.name, } } catch { // throwing an error here is confusing/causes backend-core to be hard to import - return { VERSION: process.env.VERSION || "", SERVICE_NAME: "" } + return { VERSION: process.env.BUDIBASE_VERSION || "", SERVICE_NAME: "" } } } From e3b342da57eac0f62b061f3c089a8f7c8f91bd0a Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 23 Oct 2023 13:57:23 +0200 Subject: [PATCH 38/45] Fix after renames --- hosting/single/Dockerfile.v2 | 2 +- packages/server/Dockerfile.v2 | 2 +- packages/worker/Dockerfile.v2 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hosting/single/Dockerfile.v2 b/hosting/single/Dockerfile.v2 index 66ce0f1c4d..5b07a51b27 100644 --- a/hosting/single/Dockerfile.v2 +++ b/hosting/single/Dockerfile.v2 @@ -121,7 +121,7 @@ VOLUME /data ARG BUDIBASE_VERSION # Ensuring the version argument is sent RUN test -n "$BUDIBASE_VERSION" -ENV BUDIBASE_VERSION=$VERSION +ENV BUDIBASE_VERSION=$BUDIBASE_VERSION HEALTHCHECK --interval=15s --timeout=15s --start-period=45s CMD "/healthcheck.sh" diff --git a/packages/server/Dockerfile.v2 b/packages/server/Dockerfile.v2 index 5035dc748f..881c21299e 100644 --- a/packages/server/Dockerfile.v2 +++ b/packages/server/Dockerfile.v2 @@ -70,7 +70,7 @@ COPY packages/server/client/ client/ ARG BUDIBASE_VERSION # Ensuring the version argument is sent RUN test -n "$BUDIBASE_VERSION" -ENV BUDIBASE_VERSION=$VERSION +ENV BUDIBASE_VERSION=$BUDIBASE_VERSION EXPOSE 4001 diff --git a/packages/worker/Dockerfile.v2 b/packages/worker/Dockerfile.v2 index 78eba2d3d8..a8be432827 100644 --- a/packages/worker/Dockerfile.v2 +++ b/packages/worker/Dockerfile.v2 @@ -53,6 +53,6 @@ ENV ACCOUNT_PORTAL_URL=https://account.budibase.app ARG BUDIBASE_VERSION # Ensuring the version argument is sent RUN test -n "$BUDIBASE_VERSION" -ENV BUDIBASE_VERSION=$VERSION +ENV BUDIBASE_VERSION=$BUDIBASE_VERSION CMD ["./docker_run.sh"] From 453c0744be8d8b3721a2d760d56dcd616d8abf76 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 23 Oct 2023 15:20:44 +0200 Subject: [PATCH 39/45] Fix tests --- packages/server/src/tests/jestEnv.ts | 2 +- packages/worker/src/tests/jestEnv.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/tests/jestEnv.ts b/packages/server/src/tests/jestEnv.ts index c1f32eeec9..4763208c54 100644 --- a/packages/server/src/tests/jestEnv.ts +++ b/packages/server/src/tests/jestEnv.ts @@ -9,4 +9,4 @@ process.env.LOG_LEVEL = process.env.LOG_LEVEL || "error" process.env.MOCK_REDIS = "1" process.env.PLATFORM_URL = "http://localhost:10000" process.env.REDIS_PASSWORD = "budibase" -process.env.VERSION = "0.0.0+jest" +process.env.BUDIBASE_VERSION = "0.0.0+jest" diff --git a/packages/worker/src/tests/jestEnv.ts b/packages/worker/src/tests/jestEnv.ts index f6de4e0fd2..9bd258c43c 100644 --- a/packages/worker/src/tests/jestEnv.ts +++ b/packages/worker/src/tests/jestEnv.ts @@ -10,4 +10,4 @@ process.env.PLATFORM_URL = "http://localhost:10000" process.env.INTERNAL_API_KEY = "tet" process.env.DISABLE_ACCOUNT_PORTAL = "0" process.env.MOCK_REDIS = "1" -process.env.VERSION = "0.0.0+jest" +process.env.BUDIBASE_VERSION = "0.0.0+jest" From bc4dd8e1c99fafb335dc79daa78e47ded56e9498 Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Mon, 23 Oct 2023 15:43:44 +0200 Subject: [PATCH 40/45] Update pro submodule --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index ee222c4694..f7e7cffe42 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit ee222c4694c71716eeb1257f37467fc2231ee166 +Subproject commit f7e7cffe422086d9449c2075a74a378c16caff9d From 7623ffd11e6340bb732b6e00398f4dc37862e1f9 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Mon, 23 Oct 2023 14:13:18 +0000 Subject: [PATCH 41/45] Bump version to 2.11.42 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 4b2bbb05d5..4fd5161891 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.41", + "version": "2.11.42", "npmClient": "yarn", "packages": [ "packages/*" From f643bc5ee8e94ba6c9db62b25a2320589699090f Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Tue, 24 Oct 2023 10:24:00 +0200 Subject: [PATCH 42/45] Keep only migrations --- packages/backend-core/src/users/users.ts | 16 +++++++++++- packages/backend-core/src/users/utils.ts | 1 + .../core/utilities/structures/licenses.ts | 5 ++++ .../tests/core/utilities/structures/quotas.ts | 5 ++-- packages/pro | 2 +- .../src/migrations/functions/syncQuotas.ts | 2 ++ .../functions/usageQuotas/syncCreators.ts | 14 ++++++++++ .../usageQuotas/tests/syncCreators.spec.ts | 26 +++++++++++++++++++ .../shared-core/src/sdk/documents/users.ts | 25 ++++++++++++++++++ packages/types/src/documents/global/quotas.ts | 1 + packages/types/src/sdk/licensing/quota.ts | 2 ++ 11 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 packages/server/src/migrations/functions/usageQuotas/syncCreators.ts create mode 100644 packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts diff --git a/packages/backend-core/src/users/users.ts b/packages/backend-core/src/users/users.ts index d259d5b560..6237c23972 100644 --- a/packages/backend-core/src/users/users.ts +++ b/packages/backend-core/src/users/users.ts @@ -21,8 +21,9 @@ import { User, DatabaseQueryOpts, } from "@budibase/types" -import * as context from "../context" import { getGlobalDB } from "../context" +import * as context from "../context" +import { isCreator } from "./utils" type GetOpts = { cleanup?: boolean } @@ -286,6 +287,19 @@ export async function getUserCount() { return response.total_rows } +export async function getCreatorCount() { + let creators = 0 + async function iterate(startPage?: string) { + const page = await paginatedUsers({ bookmark: startPage }) + creators += page.data.filter(isCreator).length + if (page.hasNextPage) { + await iterate(page.nextPage) + } + } + await iterate() + return creators +} + // used to remove the builder/admin permissions, for processing the // user as an app user (they may have some specific role/group export function removePortalUserPermissions(user: User | ContextUser) { diff --git a/packages/backend-core/src/users/utils.ts b/packages/backend-core/src/users/utils.ts index af0e8e10c7..0ef4b77998 100644 --- a/packages/backend-core/src/users/utils.ts +++ b/packages/backend-core/src/users/utils.ts @@ -10,6 +10,7 @@ import { getAccountByTenantId } from "../accounts" // extract from shared-core to make easily accessible from backend-core export const isBuilder = sdk.users.isBuilder export const isAdmin = sdk.users.isAdmin +export const isCreator = sdk.users.isCreator export const isGlobalBuilder = sdk.users.isGlobalBuilder export const isAdminOrBuilder = sdk.users.isAdminOrBuilder export const hasAdminPermissions = sdk.users.hasAdminPermissions diff --git a/packages/backend-core/tests/core/utilities/structures/licenses.ts b/packages/backend-core/tests/core/utilities/structures/licenses.ts index 5cce84edfd..0e34f2e9bb 100644 --- a/packages/backend-core/tests/core/utilities/structures/licenses.ts +++ b/packages/backend-core/tests/core/utilities/structures/licenses.ts @@ -72,6 +72,11 @@ export function quotas(): Quotas { value: 1, triggers: [], }, + creators: { + name: "Creators", + value: 1, + triggers: [], + }, userGroups: { name: "User Groups", value: 1, diff --git a/packages/backend-core/tests/core/utilities/structures/quotas.ts b/packages/backend-core/tests/core/utilities/structures/quotas.ts index e82117053f..8d0b05fe1e 100644 --- a/packages/backend-core/tests/core/utilities/structures/quotas.ts +++ b/packages/backend-core/tests/core/utilities/structures/quotas.ts @@ -1,6 +1,6 @@ import { MonthlyQuotaName, QuotaUsage } from "@budibase/types" -export const usage = (): QuotaUsage => { +export const usage = (users: number = 0, creators: number = 0): QuotaUsage => { return { _id: "usage_quota", quotaReset: new Date().toISOString(), @@ -58,7 +58,8 @@ export const usage = (): QuotaUsage => { usageQuota: { apps: 0, plugins: 0, - users: 0, + users, + creators, userGroups: 0, rows: 0, triggers: {}, diff --git a/packages/pro b/packages/pro index f7e7cffe42..271c1b38a5 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit f7e7cffe422086d9449c2075a74a378c16caff9d +Subproject commit 271c1b38a54ba2fd787caa741e437b80d032c9c9 diff --git a/packages/server/src/migrations/functions/syncQuotas.ts b/packages/server/src/migrations/functions/syncQuotas.ts index 67f38ba929..83a7670e78 100644 --- a/packages/server/src/migrations/functions/syncQuotas.ts +++ b/packages/server/src/migrations/functions/syncQuotas.ts @@ -3,6 +3,7 @@ import * as syncApps from "./usageQuotas/syncApps" import * as syncRows from "./usageQuotas/syncRows" import * as syncPlugins from "./usageQuotas/syncPlugins" import * as syncUsers from "./usageQuotas/syncUsers" +import * as syncCreators from "./usageQuotas/syncCreators" /** * Synchronise quotas to the state of the db. @@ -13,5 +14,6 @@ export const run = async () => { await syncRows.run() await syncPlugins.run() await syncUsers.run() + await syncCreators.run() }) } diff --git a/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts b/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts new file mode 100644 index 0000000000..bcc94bf139 --- /dev/null +++ b/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts @@ -0,0 +1,14 @@ +import { users } from "@budibase/backend-core" +import { quotas } from "@budibase/pro" +import { QuotaUsageType, StaticQuotaName } from "@budibase/types" + +export const run = async () => { + console.log("XXXXXXXXXXXXXXXXXXX2222222222") + const creatorCount = await users.getCreatorCount() + console.log(`Syncing creator count: ${creatorCount}`) + await quotas.setUsage( + creatorCount, + StaticQuotaName.CREATORS, + QuotaUsageType.STATIC + ) +} diff --git a/packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts b/packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts new file mode 100644 index 0000000000..75fa9f217e --- /dev/null +++ b/packages/server/src/migrations/functions/usageQuotas/tests/syncCreators.spec.ts @@ -0,0 +1,26 @@ +import TestConfig from "../../../../tests/utilities/TestConfiguration" +import * as syncCreators from "../syncCreators" +import { quotas } from "@budibase/pro" + +describe("syncCreators", () => { + let config = new TestConfig(false) + + beforeEach(async () => { + await config.init() + }) + + afterAll(config.end) + + it("syncs creators", async () => { + return config.doInContext(null, async () => { + await config.createUser({ admin: true }) + + await syncCreators.run() + + const usageDoc = await quotas.getQuotaUsage() + // default + additional creator + const creatorsCount = 2 + expect(usageDoc.usageQuota.creators).toBe(creatorsCount) + }) + }) +}) diff --git a/packages/shared-core/src/sdk/documents/users.ts b/packages/shared-core/src/sdk/documents/users.ts index 03d86daa85..b58994aa46 100644 --- a/packages/shared-core/src/sdk/documents/users.ts +++ b/packages/shared-core/src/sdk/documents/users.ts @@ -6,6 +6,7 @@ import { InternalTable, } from "@budibase/types" import { getProdAppID } from "./applications" +import * as _ from "lodash/fp" // checks if a user is specifically a builder, given an app ID export function isBuilder(user: User | ContextUser, appId?: string): boolean { @@ -58,6 +59,18 @@ export function hasAppBuilderPermissions(user?: User | ContextUser): boolean { return !isGlobalBuilder && appLength != null && appLength > 0 } +export function hasAppCreatorPermissions(user?: User | ContextUser): boolean { + if (!user) { + return false + } + return _.flow( + _.get("roles"), + _.values, + _.find(x => ["CREATOR", "ADMIN"].includes(x)), + x => !!x + )(user) +} + // checks if a user is capable of building any app export function hasBuilderPermissions(user?: User | ContextUser): boolean { if (!user) { @@ -74,6 +87,18 @@ export function hasAdminPermissions(user?: User | ContextUser): boolean { return !!user.admin?.global } +export function isCreator(user?: User | ContextUser): boolean { + if (!user) { + return false + } + return ( + isGlobalBuilder(user) || + hasAdminPermissions(user) || + hasAppBuilderPermissions(user) || + hasAppCreatorPermissions(user) + ) +} + export function getGlobalUserID(userId?: string): string | undefined { if (typeof userId !== "string") { return userId diff --git a/packages/types/src/documents/global/quotas.ts b/packages/types/src/documents/global/quotas.ts index 61410f7435..4eb1168f7d 100644 --- a/packages/types/src/documents/global/quotas.ts +++ b/packages/types/src/documents/global/quotas.ts @@ -32,6 +32,7 @@ export interface StaticUsage { [StaticQuotaName.APPS]: number [StaticQuotaName.PLUGINS]: number [StaticQuotaName.USERS]: number + [StaticQuotaName.CREATORS]: number [StaticQuotaName.USER_GROUPS]: number [StaticQuotaName.ROWS]: number triggers: { diff --git a/packages/types/src/sdk/licensing/quota.ts b/packages/types/src/sdk/licensing/quota.ts index 73afa1ed05..85700f167b 100644 --- a/packages/types/src/sdk/licensing/quota.ts +++ b/packages/types/src/sdk/licensing/quota.ts @@ -14,6 +14,7 @@ export enum StaticQuotaName { ROWS = "rows", APPS = "apps", USERS = "users", + CREATORS = "creators", USER_GROUPS = "userGroups", PLUGINS = "plugins", } @@ -67,6 +68,7 @@ export type StaticQuotas = { [StaticQuotaName.ROWS]: Quota [StaticQuotaName.APPS]: Quota [StaticQuotaName.USERS]: Quota + [StaticQuotaName.CREATORS]: Quota [StaticQuotaName.USER_GROUPS]: Quota [StaticQuotaName.PLUGINS]: Quota } From dbc903f3e69648b41cfa8d46de16c4785408d6ef Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Tue, 24 Oct 2023 12:03:07 +0200 Subject: [PATCH 43/45] Remove console.log --- .../server/src/migrations/functions/usageQuotas/syncCreators.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts b/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts index bcc94bf139..ce53be925a 100644 --- a/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts +++ b/packages/server/src/migrations/functions/usageQuotas/syncCreators.ts @@ -3,7 +3,6 @@ import { quotas } from "@budibase/pro" import { QuotaUsageType, StaticQuotaName } from "@budibase/types" export const run = async () => { - console.log("XXXXXXXXXXXXXXXXXXX2222222222") const creatorCount = await users.getCreatorCount() console.log(`Syncing creator count: ${creatorCount}`) await quotas.setUsage( From 5c1710b5dabd1eb44f26958c9cca6e110e1e66fc Mon Sep 17 00:00:00 2001 From: jvcalderon Date: Tue, 24 Oct 2023 12:15:28 +0200 Subject: [PATCH 44/45] Update pro submodule --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 271c1b38a5..d24c0dc3a3 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 271c1b38a54ba2fd787caa741e437b80d032c9c9 +Subproject commit d24c0dc3a30014cbe61860252aa48104cad36376 From 0610117d87b2be2843d78c3265f78fdc2a18824a Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 24 Oct 2023 10:54:33 +0000 Subject: [PATCH 45/45] Bump version to 2.11.43 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 4fd5161891..11e4e7627a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.42", + "version": "2.11.43", "npmClient": "yarn", "packages": [ "packages/*"