@budibase/worker 3.18.5 → 3.18.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/api/controllers/global/configs.ts +6 -3
- package/src/api/controllers/global/roles.ts +23 -20
- package/src/api/controllers/global/self.ts +8 -8
- package/src/api/routes/global/tests/auditLogs.spec.ts +2 -2
- package/src/api/routes/global/tests/roles.spec.ts +23 -21
- package/src/sdk/tenants/tenants.ts +5 -4
- package/src/tests/structures/groups.ts +7 -3
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/worker",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "3.18.
|
|
4
|
+
"version": "3.18.6",
|
|
5
5
|
"description": "Budibase background service",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -109,5 +109,5 @@
|
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
},
|
|
112
|
-
"gitHead": "
|
|
112
|
+
"gitHead": "0062775fce7e68e01263a9c5a5e94bf978da8746"
|
|
113
113
|
}
|
|
@@ -648,10 +648,13 @@ export async function configChecklist(ctx: Ctx<void, ConfigChecklistResponse>) {
|
|
|
648
648
|
cache.CacheKey.CHECKLIST,
|
|
649
649
|
env.CHECKLIST_CACHE_TTL,
|
|
650
650
|
async (): Promise<ConfigChecklistResponse> => {
|
|
651
|
-
let
|
|
651
|
+
let workspaces = []
|
|
652
652
|
if (!env.MULTI_TENANCY || tenantId) {
|
|
653
653
|
// Apps exist
|
|
654
|
-
|
|
654
|
+
workspaces = await dbCore.getAllWorkspaces({
|
|
655
|
+
idsOnly: true,
|
|
656
|
+
efficient: true,
|
|
657
|
+
})
|
|
655
658
|
}
|
|
656
659
|
|
|
657
660
|
// They have set up SMTP
|
|
@@ -673,7 +676,7 @@ export async function configChecklist(ctx: Ctx<void, ConfigChecklistResponse>) {
|
|
|
673
676
|
|
|
674
677
|
return {
|
|
675
678
|
apps: {
|
|
676
|
-
checked:
|
|
679
|
+
checked: workspaces.length > 0,
|
|
677
680
|
label: "Create your first app",
|
|
678
681
|
link: "/builder/portal/workspaces",
|
|
679
682
|
},
|
|
@@ -17,22 +17,22 @@ import sdk from "../../../sdk"
|
|
|
17
17
|
export async function fetch(ctx: Ctx<void, FetchGlobalRolesResponse>) {
|
|
18
18
|
const tenantId = ctx.user!.tenantId
|
|
19
19
|
await context.doInTenant(tenantId, async () => {
|
|
20
|
-
// always use the dev
|
|
21
|
-
const
|
|
20
|
+
// always use the dev workspaces as they'll be most up to date (true)
|
|
21
|
+
const workspaces = await dbCore.getAllWorkspaces({ all: true })
|
|
22
22
|
const promises = []
|
|
23
|
-
for (let
|
|
24
|
-
// use dev
|
|
25
|
-
promises.push(roles.getAllRoles(
|
|
23
|
+
for (let workspace of workspaces) {
|
|
24
|
+
// use dev workspace IDs
|
|
25
|
+
promises.push(roles.getAllRoles(workspace.appId))
|
|
26
26
|
}
|
|
27
27
|
const roleList = await Promise.all(promises)
|
|
28
28
|
const response: any = {}
|
|
29
|
-
for (let
|
|
30
|
-
const deployedAppId = dbCore.
|
|
29
|
+
for (let workspace of workspaces) {
|
|
30
|
+
const deployedAppId = dbCore.getProdWorkspaceID(workspace.appId)
|
|
31
31
|
response[deployedAppId] = {
|
|
32
32
|
roles: roleList.shift(),
|
|
33
|
-
name:
|
|
34
|
-
version:
|
|
35
|
-
url:
|
|
33
|
+
name: workspace.name,
|
|
34
|
+
version: workspace.version,
|
|
35
|
+
url: workspace.url,
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
ctx.body = response
|
|
@@ -41,16 +41,19 @@ export async function fetch(ctx: Ctx<void, FetchGlobalRolesResponse>) {
|
|
|
41
41
|
|
|
42
42
|
export async function find(ctx: Ctx<void, FindGlobalRoleResponse>) {
|
|
43
43
|
const appId = ctx.params.appId
|
|
44
|
-
await context.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
await context.doInWorkspaceContext(
|
|
45
|
+
dbCore.getDevWorkspaceID(appId),
|
|
46
|
+
async () => {
|
|
47
|
+
const db = context.getWorkspaceDB()
|
|
48
|
+
const app = await db.get<Workspace>(dbCore.DocumentType.APP_METADATA)
|
|
49
|
+
ctx.body = {
|
|
50
|
+
roles: await roles.getAllRoles(),
|
|
51
|
+
name: app.name,
|
|
52
|
+
version: app.version,
|
|
53
|
+
url: app.url,
|
|
54
|
+
}
|
|
52
55
|
}
|
|
53
|
-
|
|
56
|
+
)
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
export async function removeAppRole(ctx: Ctx<void, RemoveAppRoleResponse>) {
|
|
@@ -59,7 +62,7 @@ export async function removeAppRole(ctx: Ctx<void, RemoveAppRoleResponse>) {
|
|
|
59
62
|
const users = await sdk.users.db.allUsers()
|
|
60
63
|
const bulk = []
|
|
61
64
|
const cacheInvalidations = []
|
|
62
|
-
const prodAppId = dbCore.
|
|
65
|
+
const prodAppId = dbCore.getProdWorkspaceID(appId)
|
|
63
66
|
for (let user of users) {
|
|
64
67
|
let updated = false
|
|
65
68
|
if (user.roles[prodAppId]) {
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import * as userSdk from "../../../sdk/users"
|
|
2
1
|
import {
|
|
2
|
+
auth as authCore,
|
|
3
|
+
db as dbCore,
|
|
4
|
+
encryption,
|
|
3
5
|
features,
|
|
4
6
|
tenancy,
|
|
5
|
-
db as dbCore,
|
|
6
7
|
utils,
|
|
7
|
-
encryption,
|
|
8
|
-
auth as authCore,
|
|
9
8
|
} from "@budibase/backend-core"
|
|
10
|
-
import env from "../../../environment"
|
|
11
9
|
import { ai, groups } from "@budibase/pro"
|
|
12
10
|
import {
|
|
13
11
|
DevInfo,
|
|
@@ -20,6 +18,8 @@ import {
|
|
|
20
18
|
User,
|
|
21
19
|
UserCtx,
|
|
22
20
|
} from "@budibase/types"
|
|
21
|
+
import env from "../../../environment"
|
|
22
|
+
import * as userSdk from "../../../sdk/users"
|
|
23
23
|
|
|
24
24
|
const { newid } = utils
|
|
25
25
|
|
|
@@ -139,8 +139,8 @@ export const syncAppFavourites = async (processedAppIds: string[]) => {
|
|
|
139
139
|
const tenantId = tenancy.getTenantId()
|
|
140
140
|
const appPrefix =
|
|
141
141
|
tenantId === tenancy.DEFAULT_TENANT_ID
|
|
142
|
-
? dbCore.
|
|
143
|
-
: `${dbCore.
|
|
142
|
+
? dbCore.WORKSPACE_DEV_PREFIX
|
|
143
|
+
: `${dbCore.WORKSPACE_DEV_PREFIX}${tenantId}_`
|
|
144
144
|
|
|
145
145
|
const apps = await fetchAppsByIds(processedAppIds, appPrefix)
|
|
146
146
|
return apps?.reduce((acc: string[], app) => {
|
|
@@ -156,7 +156,7 @@ export const fetchAppsByIds = async (
|
|
|
156
156
|
processedAppIds: string[],
|
|
157
157
|
appPrefix: string
|
|
158
158
|
) => {
|
|
159
|
-
return await dbCore.
|
|
159
|
+
return await dbCore.getWorkspacesByIDs(
|
|
160
160
|
processedAppIds.map(appId => {
|
|
161
161
|
return `${appPrefix}${appId}`
|
|
162
162
|
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { mocks, structures } from "@budibase/backend-core/tests"
|
|
2
1
|
import { context, events } from "@budibase/backend-core"
|
|
2
|
+
import { mocks, structures } from "@budibase/backend-core/tests"
|
|
3
3
|
import { Event, IdentityType } from "@budibase/types"
|
|
4
4
|
import { TestConfiguration } from "../../../../tests"
|
|
5
5
|
|
|
@@ -36,7 +36,7 @@ describe("/api/global/auditlogs (%s)", () => {
|
|
|
36
36
|
for (let i = 0; i < USER_AUDIT_LOG_COUNT; i++) {
|
|
37
37
|
await events.user.created(structures.users.user())
|
|
38
38
|
}
|
|
39
|
-
await context.
|
|
39
|
+
await context.doInWorkspaceContext(APP_ID, async () => {
|
|
40
40
|
await events.app.created(structures.apps.app(APP_ID))
|
|
41
41
|
})
|
|
42
42
|
// fetch the user created events
|
|
@@ -16,19 +16,19 @@ jest.mock("@budibase/backend-core", () => {
|
|
|
16
16
|
},
|
|
17
17
|
context: {
|
|
18
18
|
...core.context,
|
|
19
|
-
|
|
19
|
+
getWorkspaceDB: jest.fn(),
|
|
20
20
|
},
|
|
21
21
|
}
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
let
|
|
25
|
-
let
|
|
24
|
+
let workspaceId: string
|
|
25
|
+
let workspaceDb: Database
|
|
26
26
|
const ROLE_NAME = "newRole"
|
|
27
27
|
|
|
28
28
|
async function addAppMetadata() {
|
|
29
|
-
await
|
|
29
|
+
await workspaceDb.put({
|
|
30
30
|
_id: "app_metadata",
|
|
31
|
-
appId:
|
|
31
|
+
appId: workspaceId,
|
|
32
32
|
name: "New App",
|
|
33
33
|
version: "version",
|
|
34
34
|
url: "url",
|
|
@@ -38,8 +38,8 @@ async function addAppMetadata() {
|
|
|
38
38
|
async function updateAppMetadata(
|
|
39
39
|
update: Partial<WithoutDocMetadata<Workspace>>
|
|
40
40
|
) {
|
|
41
|
-
const app = await
|
|
42
|
-
await
|
|
41
|
+
const app = await workspaceDb.get("app_metadata")
|
|
42
|
+
await workspaceDb.put({
|
|
43
43
|
...app,
|
|
44
44
|
...update,
|
|
45
45
|
})
|
|
@@ -60,13 +60,13 @@ describe("/api/global/roles", () => {
|
|
|
60
60
|
})
|
|
61
61
|
|
|
62
62
|
beforeEach(async () => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
63
|
+
workspaceId = db.generateWorkspaceID(config.tenantId)
|
|
64
|
+
workspaceDb = db.getDB(workspaceId)
|
|
65
|
+
const mockWorkspaceDB = context.getWorkspaceDB as jest.Mock
|
|
66
|
+
mockWorkspaceDB.mockReturnValue(workspaceDb)
|
|
67
67
|
|
|
68
68
|
await addAppMetadata()
|
|
69
|
-
await
|
|
69
|
+
await workspaceDb.put(role)
|
|
70
70
|
})
|
|
71
71
|
|
|
72
72
|
afterAll(async () => {
|
|
@@ -81,8 +81,10 @@ describe("/api/global/roles", () => {
|
|
|
81
81
|
it("retrieves roles", async () => {
|
|
82
82
|
const res = await config.api.roles.get()
|
|
83
83
|
expect(res.body).toBeDefined()
|
|
84
|
-
expect(res.body[
|
|
85
|
-
expect(res.body[
|
|
84
|
+
expect(res.body[workspaceId].roles.length).toEqual(5)
|
|
85
|
+
expect(res.body[workspaceId].roles.map((r: any) => r._id)).toContain(
|
|
86
|
+
ROLE_NAME
|
|
87
|
+
)
|
|
86
88
|
})
|
|
87
89
|
|
|
88
90
|
it.each(["3.0.0", "3.0.1", "3.1.0", "3.0.0+2146.b125a7c"])(
|
|
@@ -91,7 +93,7 @@ describe("/api/global/roles", () => {
|
|
|
91
93
|
await updateAppMetadata({ creationVersion })
|
|
92
94
|
const res = await config.api.roles.get()
|
|
93
95
|
expect(res.body).toBeDefined()
|
|
94
|
-
expect(res.body[
|
|
96
|
+
expect(res.body[workspaceId].roles.map((r: any) => r._id)).toEqual([
|
|
95
97
|
ROLE_NAME,
|
|
96
98
|
roles.BUILTIN_ROLE_IDS.ADMIN,
|
|
97
99
|
roles.BUILTIN_ROLE_IDS.BASIC,
|
|
@@ -106,7 +108,7 @@ describe("/api/global/roles", () => {
|
|
|
106
108
|
await updateAppMetadata({ creationVersion })
|
|
107
109
|
const res = await config.api.roles.get()
|
|
108
110
|
expect(res.body).toBeDefined()
|
|
109
|
-
expect(res.body[
|
|
111
|
+
expect(res.body[workspaceId].roles.map((r: any) => r._id)).toEqual([
|
|
110
112
|
ROLE_NAME,
|
|
111
113
|
roles.BUILTIN_ROLE_IDS.ADMIN,
|
|
112
114
|
roles.BUILTIN_ROLE_IDS.POWER,
|
|
@@ -122,7 +124,7 @@ describe("/api/global/roles", () => {
|
|
|
122
124
|
await updateAppMetadata({ creationVersion })
|
|
123
125
|
const res = await config.api.roles.get()
|
|
124
126
|
|
|
125
|
-
expect(res.body[
|
|
127
|
+
expect(res.body[workspaceId].roles.map((r: any) => r._id)).toEqual([
|
|
126
128
|
ROLE_NAME,
|
|
127
129
|
roles.BUILTIN_ROLE_IDS.ADMIN,
|
|
128
130
|
roles.BUILTIN_ROLE_IDS.POWER,
|
|
@@ -135,7 +137,7 @@ describe("/api/global/roles", () => {
|
|
|
135
137
|
|
|
136
138
|
describe("GET api/global/roles/:appId", () => {
|
|
137
139
|
it("finds a role by appId", async () => {
|
|
138
|
-
const res = await config.api.roles.find(
|
|
140
|
+
const res = await config.api.roles.find(workspaceId)
|
|
139
141
|
expect(res.body).toBeDefined()
|
|
140
142
|
expect(res.body.name).toEqual("New App")
|
|
141
143
|
})
|
|
@@ -160,9 +162,9 @@ describe("/api/global/roles", () => {
|
|
|
160
162
|
app_test: "role1",
|
|
161
163
|
}
|
|
162
164
|
const userResponse = await config.createUser(user)
|
|
163
|
-
const res = await config.api.roles.remove(
|
|
165
|
+
const res = await config.api.roles.remove(workspaceId)
|
|
164
166
|
const updatedUser = await config.api.users.getUser(userResponse._id!)
|
|
165
|
-
expect(updatedUser.body.roles).not.toHaveProperty(
|
|
167
|
+
expect(updatedUser.body.roles).not.toHaveProperty(workspaceId)
|
|
166
168
|
expect(res.body.message).toEqual("App role removed from all users")
|
|
167
169
|
})
|
|
168
170
|
|
|
@@ -170,7 +172,7 @@ describe("/api/global/roles", () => {
|
|
|
170
172
|
const builderUser = await createBuilderUser()
|
|
171
173
|
|
|
172
174
|
const res = await config.withUser(builderUser, () =>
|
|
173
|
-
config.api.roles.remove(
|
|
175
|
+
config.api.roles.remove(workspaceId, { status: 403 })
|
|
174
176
|
)
|
|
175
177
|
expect(res.body.message).toBe("Admin user only endpoint.")
|
|
176
178
|
})
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { db as dbCore, platform, tenancy } from "@budibase/backend-core"
|
|
2
2
|
import { quotas } from "@budibase/pro"
|
|
3
|
-
import { Workspace } from "@budibase/types"
|
|
4
3
|
|
|
5
4
|
export async function deleteTenant(tenantId: string) {
|
|
6
5
|
await quotas.bustCache()
|
|
@@ -21,9 +20,11 @@ async function removeGlobalDB(tenantId: string) {
|
|
|
21
20
|
|
|
22
21
|
async function removeTenantApps(tenantId: string) {
|
|
23
22
|
try {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
const workspaces = await dbCore.getAllWorkspaces({
|
|
24
|
+
all: true,
|
|
25
|
+
})
|
|
26
|
+
const destroyPromises = workspaces.map(workspace => {
|
|
27
|
+
const db = dbCore.getDB(workspace.appId)
|
|
27
28
|
return db.destroy()
|
|
28
29
|
})
|
|
29
30
|
await Promise.allSettled(destroyPromises)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { generator } from "@budibase/backend-core/tests"
|
|
2
1
|
import { db } from "@budibase/backend-core"
|
|
3
|
-
import {
|
|
2
|
+
import { generator } from "@budibase/backend-core/tests"
|
|
3
|
+
import { UserGroupRoles, UserGroup as UserGroupType } from "@budibase/types"
|
|
4
4
|
|
|
5
5
|
export function UserGroup(): UserGroupType {
|
|
6
6
|
const appsCount = generator.integer({ min: 0, max: 3 })
|
|
@@ -8,7 +8,11 @@ export function UserGroup(): UserGroupType {
|
|
|
8
8
|
(p: UserGroupRoles) => {
|
|
9
9
|
return {
|
|
10
10
|
...p,
|
|
11
|
-
[db.
|
|
11
|
+
[db.generateWorkspaceID()]: generator.pickone([
|
|
12
|
+
"ADMIN",
|
|
13
|
+
"POWER",
|
|
14
|
+
"BASIC",
|
|
15
|
+
]),
|
|
12
16
|
}
|
|
13
17
|
},
|
|
14
18
|
{}
|