@budibase/worker 2.1.32-alpha.7 → 2.1.32
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 +23 -13
- package/{src/tests/jestSetup.ts → scripts/jestSetup.js} +3 -12
- package/scripts/localdomain.js +7 -33
- package/src/api/controllers/global/auth.ts +31 -35
- package/src/api/controllers/global/configs.js +17 -17
- package/src/api/controllers/global/self.ts +2 -2
- package/src/api/controllers/global/users.ts +1 -3
- package/src/api/controllers/system/{environment.ts → environment.js} +2 -3
- package/src/api/controllers/system/{status.ts → status.js} +3 -4
- package/src/api/controllers/system/tenants.ts +51 -8
- package/src/api/index.ts +6 -29
- package/src/api/routes/global/auth.js +39 -22
- package/src/api/routes/global/configs.js +9 -9
- package/src/api/routes/global/templates.ts +2 -2
- package/src/api/routes/global/tests/auth.spec.ts +64 -134
- package/src/api/routes/global/tests/configs.spec.ts +35 -34
- package/src/api/routes/global/tests/email.spec.ts +3 -4
- package/src/api/routes/global/tests/realEmail.spec.ts +3 -2
- package/src/api/routes/global/tests/self.spec.ts +4 -3
- package/src/api/routes/global/tests/users.spec.ts +43 -51
- package/src/api/routes/system/environment.js +8 -0
- package/src/api/routes/system/status.js +8 -0
- package/src/api/routes/system/tenants.js +12 -0
- package/src/api/routes/system/tests/accounts.spec.ts +6 -5
- package/src/constants/{index.ts → index.js} +64 -57
- package/src/constants/templates/index.js +2 -2
- package/src/db/index.js +11 -0
- package/src/index.ts +1 -1
- package/src/middleware/cloudRestricted.js +2 -2
- package/src/tests/TestConfiguration.ts +49 -98
- package/src/tests/api/accounts.ts +8 -5
- package/src/tests/api/auth.ts +6 -3
- package/src/tests/api/configs.ts +8 -15
- package/src/tests/api/email.ts +6 -3
- package/src/tests/api/index.ts +0 -15
- package/src/tests/api/self.ts +6 -11
- package/src/tests/api/users.ts +6 -38
- package/src/tests/index.ts +1 -5
- package/src/tests/structures/accounts.ts +24 -0
- package/src/tests/structures/configs.js +6 -6
- package/src/tests/structures/index.ts +2 -4
- package/src/tests/structures/users.ts +0 -1
- package/src/utilities/appService.js +3 -3
- package/src/utilities/{email.ts → email.js} +45 -78
- package/src/utilities/{redis.ts → redis.js} +24 -29
- package/src/utilities/templates.js +49 -0
- package/tsconfig.build.json +2 -2
- package/tsconfig.json +1 -3
- package/__mocks__/aws-sdk.ts +0 -15
- package/__mocks__/oauth.ts +0 -57
- package/coverage/clover.xml +0 -2160
- package/coverage/coverage-final.json +0 -78
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -431
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +0 -913
- package/coverage/lcov-report/src/api/controllers/global/configs.js.html +0 -1390
- package/coverage/lcov-report/src/api/controllers/global/email.js.html +0 -193
- package/coverage/lcov-report/src/api/controllers/global/index.html +0 -236
- package/coverage/lcov-report/src/api/controllers/global/license.ts.html +0 -187
- package/coverage/lcov-report/src/api/controllers/global/roles.js.html +0 -289
- package/coverage/lcov-report/src/api/controllers/global/self.ts.html +0 -577
- package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +0 -316
- package/coverage/lcov-report/src/api/controllers/global/users.ts.html +0 -796
- package/coverage/lcov-report/src/api/controllers/global/workspaces.js.html +0 -253
- package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +0 -148
- package/coverage/lcov-report/src/api/controllers/system/environment.ts.html +0 -124
- package/coverage/lcov-report/src/api/controllers/system/index.html +0 -191
- package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +0 -124
- package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +0 -124
- package/coverage/lcov-report/src/api/controllers/system/status.ts.html +0 -133
- package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +0 -154
- package/coverage/lcov-report/src/api/index.html +0 -116
- package/coverage/lcov-report/src/api/index.ts.html +0 -583
- package/coverage/lcov-report/src/api/routes/global/auth.js.html +0 -349
- package/coverage/lcov-report/src/api/routes/global/configs.js.html +0 -460
- package/coverage/lcov-report/src/api/routes/global/email.js.html +0 -196
- package/coverage/lcov-report/src/api/routes/global/index.html +0 -236
- package/coverage/lcov-report/src/api/routes/global/license.ts.html +0 -124
- package/coverage/lcov-report/src/api/routes/global/roles.js.html +0 -121
- package/coverage/lcov-report/src/api/routes/global/self.ts.html +0 -139
- package/coverage/lcov-report/src/api/routes/global/templates.ts.html +0 -196
- package/coverage/lcov-report/src/api/routes/global/users.js.html +0 -403
- package/coverage/lcov-report/src/api/routes/global/workspaces.js.html +0 -199
- package/coverage/lcov-report/src/api/routes/index.html +0 -116
- package/coverage/lcov-report/src/api/routes/index.ts.html +0 -193
- package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +0 -142
- package/coverage/lcov-report/src/api/routes/system/environment.ts.html +0 -109
- package/coverage/lcov-report/src/api/routes/system/index.html +0 -191
- package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +0 -142
- package/coverage/lcov-report/src/api/routes/system/restore.ts.html +0 -109
- package/coverage/lcov-report/src/api/routes/system/status.ts.html +0 -109
- package/coverage/lcov-report/src/api/routes/system/tenants.ts.html +0 -124
- package/coverage/lcov-report/src/api/routes/validation/index.html +0 -131
- package/coverage/lcov-report/src/api/routes/validation/index.ts.html +0 -88
- package/coverage/lcov-report/src/api/routes/validation/users.ts.html +0 -235
- package/coverage/lcov-report/src/constants/index.html +0 -116
- package/coverage/lcov-report/src/constants/index.ts.html +0 -613
- package/coverage/lcov-report/src/constants/templates/index.html +0 -116
- package/coverage/lcov-report/src/constants/templates/index.js.html +0 -304
- package/coverage/lcov-report/src/db/index.html +0 -116
- package/coverage/lcov-report/src/db/index.ts.html +0 -115
- package/coverage/lcov-report/src/environment.ts.html +0 -364
- package/coverage/lcov-report/src/index.html +0 -131
- package/coverage/lcov-report/src/index.ts.html +0 -397
- package/coverage/lcov-report/src/middleware/cloudRestricted.js.html +0 -136
- package/coverage/lcov-report/src/middleware/index.html +0 -116
- package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +0 -145
- package/coverage/lcov-report/src/migrations/functions/index.html +0 -116
- package/coverage/lcov-report/src/migrations/index.html +0 -116
- package/coverage/lcov-report/src/migrations/index.ts.html +0 -271
- package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +0 -262
- package/coverage/lcov-report/src/sdk/accounts/index.html +0 -131
- package/coverage/lcov-report/src/sdk/accounts/index.ts.html +0 -88
- package/coverage/lcov-report/src/sdk/index.html +0 -116
- package/coverage/lcov-report/src/sdk/index.ts.html +0 -106
- package/coverage/lcov-report/src/sdk/users/events.ts.html +0 -577
- package/coverage/lcov-report/src/sdk/users/index.html +0 -146
- package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -88
- package/coverage/lcov-report/src/sdk/users/users.ts.html +0 -1903
- package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +0 -1051
- package/coverage/lcov-report/src/tests/api/accounts.ts.html +0 -160
- package/coverage/lcov-report/src/tests/api/auth.ts.html +0 -220
- package/coverage/lcov-report/src/tests/api/base.ts.html +0 -133
- package/coverage/lcov-report/src/tests/api/configs.ts.html +0 -226
- package/coverage/lcov-report/src/tests/api/email.ts.html +0 -148
- package/coverage/lcov-report/src/tests/api/environment.ts.html +0 -130
- package/coverage/lcov-report/src/tests/api/index.html +0 -296
- package/coverage/lcov-report/src/tests/api/index.ts.html +0 -205
- package/coverage/lcov-report/src/tests/api/migrations.ts.html +0 -151
- package/coverage/lcov-report/src/tests/api/restore.ts.html +0 -127
- package/coverage/lcov-report/src/tests/api/self.ts.html +0 -163
- package/coverage/lcov-report/src/tests/api/status.ts.html +0 -121
- package/coverage/lcov-report/src/tests/api/tenants.ts.html +0 -130
- package/coverage/lcov-report/src/tests/api/users.ts.html +0 -511
- package/coverage/lcov-report/src/tests/controllers.js.html +0 -106
- package/coverage/lcov-report/src/tests/index.html +0 -146
- package/coverage/lcov-report/src/tests/index.ts.html +0 -139
- package/coverage/lcov-report/src/tests/mocks/email.js.html +0 -115
- package/coverage/lcov-report/src/tests/mocks/index.html +0 -131
- package/coverage/lcov-report/src/tests/mocks/index.ts.html +0 -106
- package/coverage/lcov-report/src/tests/structures/configs.js.html +0 -313
- package/coverage/lcov-report/src/tests/structures/groups.ts.html +0 -118
- package/coverage/lcov-report/src/tests/structures/index.html +0 -161
- package/coverage/lcov-report/src/tests/structures/index.ts.html +0 -151
- package/coverage/lcov-report/src/tests/structures/users.ts.html +0 -196
- package/coverage/lcov-report/src/utilities/appService.js.html +0 -184
- package/coverage/lcov-report/src/utilities/email.ts.html +0 -850
- package/coverage/lcov-report/src/utilities/fileSystem.js.html +0 -100
- package/coverage/lcov-report/src/utilities/index.html +0 -206
- package/coverage/lcov-report/src/utilities/index.js.html +0 -112
- package/coverage/lcov-report/src/utilities/redis.ts.html +0 -424
- package/coverage/lcov-report/src/utilities/templates.ts.html +0 -232
- package/coverage/lcov-report/src/utilities/users.js.html +0 -136
- package/coverage/lcov.info +0 -3986
- package/jest.config.ts +0 -29
- package/src/api/routes/global/tests/license.spec.ts +0 -31
- package/src/api/routes/global/tests/roles.spec.ts +0 -27
- package/src/api/routes/global/tests/templates.spec.ts +0 -35
- package/src/api/routes/global/tests/workspaces.spec.ts +0 -29
- package/src/api/routes/system/environment.ts +0 -8
- package/src/api/routes/system/status.ts +0 -8
- package/src/api/routes/system/tenants.ts +0 -13
- package/src/api/routes/system/tests/environment.spec.ts +0 -29
- package/src/api/routes/system/tests/migrations.spec.ts +0 -63
- package/src/api/routes/system/tests/restore.spec.ts +0 -36
- package/src/api/routes/system/tests/status.spec.ts +0 -48
- package/src/api/routes/system/tests/tenants.spec.ts +0 -61
- package/src/db/index.ts +0 -10
- package/src/middleware/tests/tenancy.spec.ts +0 -73
- package/src/tests/api/base.ts +0 -16
- package/src/tests/api/environment.ts +0 -15
- package/src/tests/api/migrations.ts +0 -22
- package/src/tests/api/restore.ts +0 -14
- package/src/tests/api/status.ts +0 -12
- package/src/tests/api/tenants.ts +0 -15
- package/src/utilities/templates.ts +0 -49
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
jest.mock("nodemailer")
|
|
2
|
-
import { TestConfiguration, mocks } from "../../../../tests"
|
|
2
|
+
import { TestConfiguration, API, mocks } from "../../../../tests"
|
|
3
3
|
import { events } from "@budibase/backend-core"
|
|
4
4
|
|
|
5
5
|
describe("/api/global/self", () => {
|
|
6
6
|
const config = new TestConfiguration()
|
|
7
|
+
const api = new API(config)
|
|
7
8
|
|
|
8
9
|
beforeAll(async () => {
|
|
9
10
|
await config.beforeAll()
|
|
@@ -23,7 +24,7 @@ describe("/api/global/self", () => {
|
|
|
23
24
|
await config.createSession(user)
|
|
24
25
|
|
|
25
26
|
delete user.password
|
|
26
|
-
const res = await
|
|
27
|
+
const res = await api.self.updateSelf(user)
|
|
27
28
|
|
|
28
29
|
const dbUser = await config.getUser(user.email)
|
|
29
30
|
user._rev = dbUser._rev
|
|
@@ -39,7 +40,7 @@ describe("/api/global/self", () => {
|
|
|
39
40
|
await config.createSession(user)
|
|
40
41
|
|
|
41
42
|
user.password = "newPassword"
|
|
42
|
-
const res = await
|
|
43
|
+
const res = await api.self.updateSelf(user)
|
|
43
44
|
|
|
44
45
|
const dbUser = await config.getUser(user.email)
|
|
45
46
|
user._rev = dbUser._rev
|
|
@@ -6,12 +6,14 @@ import {
|
|
|
6
6
|
mocks,
|
|
7
7
|
structures,
|
|
8
8
|
TENANT_1,
|
|
9
|
+
API,
|
|
9
10
|
} from "../../../../tests"
|
|
10
11
|
const sendMailMock = mocks.email.mock()
|
|
11
12
|
import { events, tenancy } from "@budibase/backend-core"
|
|
12
13
|
|
|
13
14
|
describe("/api/global/users", () => {
|
|
14
15
|
const config = new TestConfiguration()
|
|
16
|
+
const api = new API(config)
|
|
15
17
|
|
|
16
18
|
beforeAll(async () => {
|
|
17
19
|
await config.beforeAll()
|
|
@@ -28,10 +30,7 @@ describe("/api/global/users", () => {
|
|
|
28
30
|
describe("invite", () => {
|
|
29
31
|
it("should be able to generate an invitation", async () => {
|
|
30
32
|
const email = structures.users.newEmail()
|
|
31
|
-
const { code, res } = await
|
|
32
|
-
sendMailMock,
|
|
33
|
-
email
|
|
34
|
-
)
|
|
33
|
+
const { code, res } = await api.users.sendUserInvite(sendMailMock, email)
|
|
35
34
|
|
|
36
35
|
expect(res.body).toEqual({ message: "Invitation has been sent." })
|
|
37
36
|
expect(sendMailMock).toHaveBeenCalled()
|
|
@@ -40,7 +39,7 @@ describe("/api/global/users", () => {
|
|
|
40
39
|
})
|
|
41
40
|
|
|
42
41
|
it("should not be able to generate an invitation for existing user", async () => {
|
|
43
|
-
const { code, res } = await
|
|
42
|
+
const { code, res } = await api.users.sendUserInvite(
|
|
44
43
|
sendMailMock,
|
|
45
44
|
config.defaultUser!.email,
|
|
46
45
|
400
|
|
@@ -54,12 +53,9 @@ describe("/api/global/users", () => {
|
|
|
54
53
|
|
|
55
54
|
it("should be able to create new user from invite", async () => {
|
|
56
55
|
const email = structures.users.newEmail()
|
|
57
|
-
const { code } = await
|
|
58
|
-
sendMailMock,
|
|
59
|
-
email
|
|
60
|
-
)
|
|
56
|
+
const { code } = await api.users.sendUserInvite(sendMailMock, email)
|
|
61
57
|
|
|
62
|
-
const res = await
|
|
58
|
+
const res = await api.users.acceptInvite(code)
|
|
63
59
|
|
|
64
60
|
expect(res.body._id).toBeDefined()
|
|
65
61
|
const user = await config.getUser(email)
|
|
@@ -78,7 +74,7 @@ describe("/api/global/users", () => {
|
|
|
78
74
|
})
|
|
79
75
|
const request = [newUserInvite(), newUserInvite()]
|
|
80
76
|
|
|
81
|
-
const res = await
|
|
77
|
+
const res = await api.users.sendMultiUserInvite(request)
|
|
82
78
|
|
|
83
79
|
const body = res.body as InviteUsersResponse
|
|
84
80
|
expect(body.successful.length).toBe(2)
|
|
@@ -90,7 +86,7 @@ describe("/api/global/users", () => {
|
|
|
90
86
|
it("should not be able to generate an invitation for existing user", async () => {
|
|
91
87
|
const request = [{ email: config.defaultUser!.email, userInfo: {} }]
|
|
92
88
|
|
|
93
|
-
const res = await
|
|
89
|
+
const res = await api.users.sendMultiUserInvite(request)
|
|
94
90
|
|
|
95
91
|
const body = res.body as InviteUsersResponse
|
|
96
92
|
expect(body.successful.length).toBe(0)
|
|
@@ -106,7 +102,7 @@ describe("/api/global/users", () => {
|
|
|
106
102
|
const user = await config.createUser()
|
|
107
103
|
jest.clearAllMocks()
|
|
108
104
|
|
|
109
|
-
const response = await
|
|
105
|
+
const response = await api.users.bulkCreateUsers([user])
|
|
110
106
|
|
|
111
107
|
expect(response.created?.successful.length).toBe(0)
|
|
112
108
|
expect(response.created?.unsuccessful.length).toBe(1)
|
|
@@ -119,7 +115,7 @@ describe("/api/global/users", () => {
|
|
|
119
115
|
jest.resetAllMocks()
|
|
120
116
|
|
|
121
117
|
await tenancy.doInTenant(TENANT_1, async () => {
|
|
122
|
-
const response = await
|
|
118
|
+
const response = await api.users.bulkCreateUsers([user])
|
|
123
119
|
|
|
124
120
|
expect(response.created?.successful.length).toBe(0)
|
|
125
121
|
expect(response.created?.unsuccessful.length).toBe(1)
|
|
@@ -130,11 +126,11 @@ describe("/api/global/users", () => {
|
|
|
130
126
|
|
|
131
127
|
it("should ignore accounts using the same email", async () => {
|
|
132
128
|
const account = structures.accounts.account()
|
|
133
|
-
const resp = await
|
|
129
|
+
const resp = await api.accounts.saveMetadata(account)
|
|
134
130
|
const user = structures.users.user({ email: resp.email })
|
|
135
131
|
jest.clearAllMocks()
|
|
136
132
|
|
|
137
|
-
const response = await
|
|
133
|
+
const response = await api.users.bulkCreateUsers([user])
|
|
138
134
|
|
|
139
135
|
expect(response.created?.successful.length).toBe(0)
|
|
140
136
|
expect(response.created?.unsuccessful.length).toBe(1)
|
|
@@ -147,11 +143,7 @@ describe("/api/global/users", () => {
|
|
|
147
143
|
const admin = structures.users.adminUser()
|
|
148
144
|
const user = structures.users.user()
|
|
149
145
|
|
|
150
|
-
const response = await
|
|
151
|
-
builder,
|
|
152
|
-
admin,
|
|
153
|
-
user,
|
|
154
|
-
])
|
|
146
|
+
const response = await api.users.bulkCreateUsers([builder, admin, user])
|
|
155
147
|
|
|
156
148
|
expect(response.created?.successful.length).toBe(3)
|
|
157
149
|
expect(response.created?.successful[0].email).toBe(builder.email)
|
|
@@ -168,7 +160,7 @@ describe("/api/global/users", () => {
|
|
|
168
160
|
it("should be able to create a basic user", async () => {
|
|
169
161
|
const user = structures.users.user()
|
|
170
162
|
|
|
171
|
-
await
|
|
163
|
+
await api.users.saveUser(user)
|
|
172
164
|
|
|
173
165
|
expect(events.user.created).toBeCalledTimes(1)
|
|
174
166
|
expect(events.user.updated).not.toBeCalled()
|
|
@@ -179,7 +171,7 @@ describe("/api/global/users", () => {
|
|
|
179
171
|
it("should be able to create an admin user", async () => {
|
|
180
172
|
const user = structures.users.adminUser()
|
|
181
173
|
|
|
182
|
-
await
|
|
174
|
+
await api.users.saveUser(user)
|
|
183
175
|
|
|
184
176
|
expect(events.user.created).toBeCalledTimes(1)
|
|
185
177
|
expect(events.user.updated).not.toBeCalled()
|
|
@@ -190,7 +182,7 @@ describe("/api/global/users", () => {
|
|
|
190
182
|
it("should be able to create a builder user", async () => {
|
|
191
183
|
const user = structures.users.builderUser()
|
|
192
184
|
|
|
193
|
-
await
|
|
185
|
+
await api.users.saveUser(user)
|
|
194
186
|
|
|
195
187
|
expect(events.user.created).toBeCalledTimes(1)
|
|
196
188
|
expect(events.user.updated).not.toBeCalled()
|
|
@@ -205,7 +197,7 @@ describe("/api/global/users", () => {
|
|
|
205
197
|
app_456: "role2",
|
|
206
198
|
}
|
|
207
199
|
|
|
208
|
-
await
|
|
200
|
+
await api.users.saveUser(user)
|
|
209
201
|
|
|
210
202
|
const savedUser = await config.getUser(user.email)
|
|
211
203
|
expect(events.user.created).toBeCalledTimes(1)
|
|
@@ -221,7 +213,7 @@ describe("/api/global/users", () => {
|
|
|
221
213
|
delete user._id
|
|
222
214
|
delete user._rev
|
|
223
215
|
|
|
224
|
-
const response = await
|
|
216
|
+
const response = await api.users.saveUser(user, 400)
|
|
225
217
|
|
|
226
218
|
expect(response.body.message).toBe(`Unavailable`)
|
|
227
219
|
expect(events.user.created).toBeCalledTimes(0)
|
|
@@ -233,7 +225,7 @@ describe("/api/global/users", () => {
|
|
|
233
225
|
|
|
234
226
|
await tenancy.doInTenant(TENANT_1, async () => {
|
|
235
227
|
delete user._id
|
|
236
|
-
const response = await
|
|
228
|
+
const response = await api.users.saveUser(user, 400)
|
|
237
229
|
|
|
238
230
|
expect(response.body.message).toBe(`Unavailable`)
|
|
239
231
|
expect(events.user.created).toBeCalledTimes(0)
|
|
@@ -245,7 +237,7 @@ describe("/api/global/users", () => {
|
|
|
245
237
|
const account = structures.accounts.cloudAccount()
|
|
246
238
|
mocks.accounts.getAccount.mockReturnValueOnce(account)
|
|
247
239
|
|
|
248
|
-
const response = await
|
|
240
|
+
const response = await api.users.saveUser(user, 400)
|
|
249
241
|
|
|
250
242
|
expect(response.body.message).toBe(`Unavailable`)
|
|
251
243
|
expect(events.user.created).toBeCalledTimes(0)
|
|
@@ -253,20 +245,20 @@ describe("/api/global/users", () => {
|
|
|
253
245
|
|
|
254
246
|
it("should not be able to create a user with the same email and different casing", async () => {
|
|
255
247
|
const user = structures.users.user()
|
|
256
|
-
await
|
|
248
|
+
await api.users.saveUser(user)
|
|
257
249
|
|
|
258
250
|
user.email = user.email.toUpperCase()
|
|
259
|
-
await
|
|
251
|
+
await api.users.saveUser(user, 400)
|
|
260
252
|
|
|
261
253
|
expect(events.user.created).toBeCalledTimes(1)
|
|
262
254
|
})
|
|
263
255
|
|
|
264
256
|
it("should not be able to bulk create a user with the same email and different casing", async () => {
|
|
265
257
|
const user = structures.users.user()
|
|
266
|
-
await
|
|
258
|
+
await api.users.saveUser(user)
|
|
267
259
|
|
|
268
260
|
user.email = user.email.toUpperCase()
|
|
269
|
-
await
|
|
261
|
+
await api.users.bulkCreateUsers([user])
|
|
270
262
|
|
|
271
263
|
expect(events.user.created).toBeCalledTimes(1)
|
|
272
264
|
})
|
|
@@ -277,7 +269,7 @@ describe("/api/global/users", () => {
|
|
|
277
269
|
const user = await config.createUser()
|
|
278
270
|
jest.clearAllMocks()
|
|
279
271
|
|
|
280
|
-
await
|
|
272
|
+
await api.users.saveUser(user)
|
|
281
273
|
|
|
282
274
|
expect(events.user.created).not.toBeCalled()
|
|
283
275
|
expect(events.user.updated).toBeCalledTimes(1)
|
|
@@ -292,7 +284,7 @@ describe("/api/global/users", () => {
|
|
|
292
284
|
|
|
293
285
|
user.forceResetPassword = true
|
|
294
286
|
user.password = "tempPassword"
|
|
295
|
-
await
|
|
287
|
+
await api.users.saveUser(user)
|
|
296
288
|
|
|
297
289
|
expect(events.user.created).not.toBeCalled()
|
|
298
290
|
expect(events.user.updated).toBeCalledTimes(1)
|
|
@@ -305,7 +297,7 @@ describe("/api/global/users", () => {
|
|
|
305
297
|
const user = await config.createUser()
|
|
306
298
|
jest.clearAllMocks()
|
|
307
299
|
|
|
308
|
-
await
|
|
300
|
+
await api.users.saveUser(structures.users.adminUser(user))
|
|
309
301
|
|
|
310
302
|
expect(events.user.created).not.toBeCalled()
|
|
311
303
|
expect(events.user.updated).toBeCalledTimes(1)
|
|
@@ -317,7 +309,7 @@ describe("/api/global/users", () => {
|
|
|
317
309
|
const user = await config.createUser()
|
|
318
310
|
jest.clearAllMocks()
|
|
319
311
|
|
|
320
|
-
await
|
|
312
|
+
await api.users.saveUser(structures.users.builderUser(user))
|
|
321
313
|
|
|
322
314
|
expect(events.user.created).not.toBeCalled()
|
|
323
315
|
expect(events.user.updated).toBeCalledTimes(1)
|
|
@@ -331,7 +323,7 @@ describe("/api/global/users", () => {
|
|
|
331
323
|
user.admin!.global = false
|
|
332
324
|
user.builder!.global = false
|
|
333
325
|
|
|
334
|
-
await
|
|
326
|
+
await api.users.saveUser(user)
|
|
335
327
|
|
|
336
328
|
expect(events.user.created).not.toBeCalled()
|
|
337
329
|
expect(events.user.updated).toBeCalledTimes(1)
|
|
@@ -344,7 +336,7 @@ describe("/api/global/users", () => {
|
|
|
344
336
|
jest.clearAllMocks()
|
|
345
337
|
user.builder!.global = false
|
|
346
338
|
|
|
347
|
-
await
|
|
339
|
+
await api.users.saveUser(user)
|
|
348
340
|
|
|
349
341
|
expect(events.user.created).not.toBeCalled()
|
|
350
342
|
expect(events.user.updated).toBeCalledTimes(1)
|
|
@@ -360,7 +352,7 @@ describe("/api/global/users", () => {
|
|
|
360
352
|
app_456: "role2",
|
|
361
353
|
}
|
|
362
354
|
|
|
363
|
-
await
|
|
355
|
+
await api.users.saveUser(user)
|
|
364
356
|
|
|
365
357
|
const savedUser = await config.getUser(user.email)
|
|
366
358
|
expect(events.user.created).not.toBeCalled()
|
|
@@ -380,7 +372,7 @@ describe("/api/global/users", () => {
|
|
|
380
372
|
jest.clearAllMocks()
|
|
381
373
|
user.roles = {}
|
|
382
374
|
|
|
383
|
-
await
|
|
375
|
+
await api.users.saveUser(user)
|
|
384
376
|
|
|
385
377
|
const savedUser = await config.getUser(user.email)
|
|
386
378
|
expect(events.user.created).not.toBeCalled()
|
|
@@ -403,7 +395,7 @@ describe("/api/global/users", () => {
|
|
|
403
395
|
app_456: "role2-edit",
|
|
404
396
|
}
|
|
405
397
|
|
|
406
|
-
await
|
|
398
|
+
await api.users.saveUser(user)
|
|
407
399
|
|
|
408
400
|
const savedUser = await config.getUser(user.email)
|
|
409
401
|
expect(events.user.created).not.toBeCalled()
|
|
@@ -419,7 +411,7 @@ describe("/api/global/users", () => {
|
|
|
419
411
|
const user = await config.createUser(structures.users.user({ email }))
|
|
420
412
|
user.email = "new@test.com"
|
|
421
413
|
|
|
422
|
-
const response = await
|
|
414
|
+
const response = await api.users.saveUser(user, 400)
|
|
423
415
|
|
|
424
416
|
const dbUser = await config.getUser(email)
|
|
425
417
|
user.email = email
|
|
@@ -432,7 +424,7 @@ describe("/api/global/users", () => {
|
|
|
432
424
|
it("should not be able to bulk delete current user", async () => {
|
|
433
425
|
const user = await config.defaultUser!
|
|
434
426
|
|
|
435
|
-
const response = await
|
|
427
|
+
const response = await api.users.bulkDeleteUsers([user._id!], 400)
|
|
436
428
|
|
|
437
429
|
expect(response.message).toBe("Unable to delete self.")
|
|
438
430
|
expect(events.user.deleted).not.toBeCalled()
|
|
@@ -444,7 +436,7 @@ describe("/api/global/users", () => {
|
|
|
444
436
|
account.budibaseUserId = user._id!
|
|
445
437
|
mocks.accounts.getAccountByTenantId.mockReturnValue(account)
|
|
446
438
|
|
|
447
|
-
const response = await
|
|
439
|
+
const response = await api.users.bulkDeleteUsers([user._id!])
|
|
448
440
|
|
|
449
441
|
expect(response.deleted?.successful.length).toBe(0)
|
|
450
442
|
expect(response.deleted?.unsuccessful.length).toBe(1)
|
|
@@ -462,7 +454,7 @@ describe("/api/global/users", () => {
|
|
|
462
454
|
const builder = structures.users.builderUser()
|
|
463
455
|
const admin = structures.users.adminUser()
|
|
464
456
|
const user = structures.users.user()
|
|
465
|
-
const createdUsers = await
|
|
457
|
+
const createdUsers = await api.users.bulkCreateUsers([
|
|
466
458
|
builder,
|
|
467
459
|
admin,
|
|
468
460
|
user,
|
|
@@ -471,7 +463,7 @@ describe("/api/global/users", () => {
|
|
|
471
463
|
const toDelete = createdUsers.created?.successful.map(
|
|
472
464
|
u => u._id!
|
|
473
465
|
) as string[]
|
|
474
|
-
const response = await
|
|
466
|
+
const response = await api.users.bulkDeleteUsers(toDelete)
|
|
475
467
|
|
|
476
468
|
expect(response.deleted?.successful.length).toBe(3)
|
|
477
469
|
expect(response.deleted?.unsuccessful.length).toBe(0)
|
|
@@ -486,7 +478,7 @@ describe("/api/global/users", () => {
|
|
|
486
478
|
const user = await config.createUser()
|
|
487
479
|
jest.clearAllMocks()
|
|
488
480
|
|
|
489
|
-
await
|
|
481
|
+
await api.users.deleteUser(user._id!)
|
|
490
482
|
|
|
491
483
|
expect(events.user.deleted).toBeCalledTimes(1)
|
|
492
484
|
expect(events.user.permissionBuilderRemoved).not.toBeCalled()
|
|
@@ -497,7 +489,7 @@ describe("/api/global/users", () => {
|
|
|
497
489
|
const user = await config.createUser(structures.users.adminUser())
|
|
498
490
|
jest.clearAllMocks()
|
|
499
491
|
|
|
500
|
-
await
|
|
492
|
+
await api.users.deleteUser(user._id!)
|
|
501
493
|
|
|
502
494
|
expect(events.user.deleted).toBeCalledTimes(1)
|
|
503
495
|
expect(events.user.permissionBuilderRemoved).toBeCalledTimes(1)
|
|
@@ -508,7 +500,7 @@ describe("/api/global/users", () => {
|
|
|
508
500
|
const user = await config.createUser(structures.users.builderUser())
|
|
509
501
|
jest.clearAllMocks()
|
|
510
502
|
|
|
511
|
-
await
|
|
503
|
+
await api.users.deleteUser(user._id!)
|
|
512
504
|
|
|
513
505
|
expect(events.user.deleted).toBeCalledTimes(1)
|
|
514
506
|
expect(events.user.permissionBuilderRemoved).toBeCalledTimes(1)
|
|
@@ -520,7 +512,7 @@ describe("/api/global/users", () => {
|
|
|
520
512
|
const account = structures.accounts.cloudAccount()
|
|
521
513
|
mocks.accounts.getAccount.mockReturnValueOnce(account)
|
|
522
514
|
|
|
523
|
-
const response = await
|
|
515
|
+
const response = await api.users.deleteUser(user._id!, 400)
|
|
524
516
|
|
|
525
517
|
expect(response.body.message).toBe("Account holder cannot be deleted")
|
|
526
518
|
})
|
|
@@ -531,7 +523,7 @@ describe("/api/global/users", () => {
|
|
|
531
523
|
account.email = user.email
|
|
532
524
|
mocks.accounts.getAccount.mockReturnValueOnce(account)
|
|
533
525
|
|
|
534
|
-
const response = await
|
|
526
|
+
const response = await api.users.deleteUser(user._id!, 400)
|
|
535
527
|
|
|
536
528
|
expect(response.body.message).toBe("Unable to delete self.")
|
|
537
529
|
})
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const Router = require("@koa/router")
|
|
2
|
+
const controller = require("../../controllers/system/tenants")
|
|
3
|
+
const { adminOnly } = require("@budibase/backend-core/auth")
|
|
4
|
+
|
|
5
|
+
const router = new Router()
|
|
6
|
+
|
|
7
|
+
router
|
|
8
|
+
.get("/api/system/tenants/:tenantId/exists", controller.exists)
|
|
9
|
+
.get("/api/system/tenants", adminOnly, controller.fetch)
|
|
10
|
+
.delete("/api/system/tenants/:tenantId", adminOnly, controller.delete)
|
|
11
|
+
|
|
12
|
+
module.exports = router
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import sdk from "../../../../sdk"
|
|
2
|
-
import { TestConfiguration, structures } from "../../../../tests"
|
|
2
|
+
import { TestConfiguration, structures, API } from "../../../../tests"
|
|
3
3
|
import { v4 as uuid } from "uuid"
|
|
4
4
|
|
|
5
5
|
describe("accounts", () => {
|
|
6
6
|
const config = new TestConfiguration()
|
|
7
|
+
const api = new API(config)
|
|
7
8
|
|
|
8
9
|
beforeAll(async () => {
|
|
9
10
|
await config.beforeAll()
|
|
@@ -22,7 +23,7 @@ describe("accounts", () => {
|
|
|
22
23
|
it("saves account metadata", async () => {
|
|
23
24
|
let account = structures.accounts.account()
|
|
24
25
|
|
|
25
|
-
const response = await
|
|
26
|
+
const response = await api.accounts.saveMetadata(account)
|
|
26
27
|
|
|
27
28
|
const id = sdk.accounts.formatAccountMetadataId(account.accountId)
|
|
28
29
|
const metadata = await sdk.accounts.getMetadata(id)
|
|
@@ -33,9 +34,9 @@ describe("accounts", () => {
|
|
|
33
34
|
describe("destroyMetadata", () => {
|
|
34
35
|
it("destroys account metadata", async () => {
|
|
35
36
|
const account = structures.accounts.account()
|
|
36
|
-
await
|
|
37
|
+
await api.accounts.saveMetadata(account)
|
|
37
38
|
|
|
38
|
-
await
|
|
39
|
+
await api.accounts.destroyMetadata(account.accountId)
|
|
39
40
|
|
|
40
41
|
const deleted = await sdk.accounts.getMetadata(account.accountId)
|
|
41
42
|
expect(deleted).toBe(undefined)
|
|
@@ -44,7 +45,7 @@ describe("accounts", () => {
|
|
|
44
45
|
it("destroys account metadata that does not exist", async () => {
|
|
45
46
|
const id = uuid()
|
|
46
47
|
|
|
47
|
-
const response = await
|
|
48
|
+
const response = await api.accounts.destroyMetadata(id)
|
|
48
49
|
|
|
49
50
|
expect(response.status).toBe(204)
|
|
50
51
|
})
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
|
|
1
|
+
const { Configs } = require("@budibase/backend-core/constants")
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
exports.LOGO_URL =
|
|
4
4
|
"https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg"
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
ACTIVE
|
|
8
|
-
INACTIVE
|
|
6
|
+
exports.UserStatus = {
|
|
7
|
+
ACTIVE: "active",
|
|
8
|
+
INACTIVE: "inactive",
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
exports.Configs = Configs
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
LOGO
|
|
15
|
-
OIDC_LOGO
|
|
13
|
+
exports.ConfigUploads = {
|
|
14
|
+
LOGO: "logo",
|
|
15
|
+
OIDC_LOGO: "oidc_logo",
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
EMAIL
|
|
18
|
+
const TemplateTypes = {
|
|
19
|
+
EMAIL: "email",
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
BASE
|
|
24
|
-
PASSWORD_RECOVERY
|
|
25
|
-
INVITATION
|
|
26
|
-
WELCOME
|
|
27
|
-
CUSTOM
|
|
22
|
+
const EmailTemplatePurpose = {
|
|
23
|
+
BASE: "base",
|
|
24
|
+
PASSWORD_RECOVERY: "password_recovery",
|
|
25
|
+
INVITATION: "invitation",
|
|
26
|
+
WELCOME: "welcome",
|
|
27
|
+
CUSTOM: "custom",
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
PLATFORM_URL
|
|
32
|
-
COMPANY
|
|
33
|
-
LOGO_URL
|
|
34
|
-
EMAIL
|
|
35
|
-
USER
|
|
36
|
-
REQUEST
|
|
37
|
-
DOCS_URL
|
|
38
|
-
LOGIN_URL
|
|
39
|
-
CURRENT_YEAR
|
|
40
|
-
CURRENT_DATE
|
|
41
|
-
BODY
|
|
42
|
-
STYLES
|
|
43
|
-
RESET_URL
|
|
44
|
-
RESET_CODE
|
|
45
|
-
INVITE_URL
|
|
46
|
-
INVITE_CODE
|
|
47
|
-
CONTENTS
|
|
30
|
+
const InternalTemplateBindings = {
|
|
31
|
+
PLATFORM_URL: "platformUrl",
|
|
32
|
+
COMPANY: "company",
|
|
33
|
+
LOGO_URL: "logoUrl",
|
|
34
|
+
EMAIL: "email",
|
|
35
|
+
USER: "user",
|
|
36
|
+
REQUEST: "request",
|
|
37
|
+
DOCS_URL: "docsUrl",
|
|
38
|
+
LOGIN_URL: "loginUrl",
|
|
39
|
+
CURRENT_YEAR: "currentYear",
|
|
40
|
+
CURRENT_DATE: "currentDate",
|
|
41
|
+
BODY: "body",
|
|
42
|
+
STYLES: "styles",
|
|
43
|
+
RESET_URL: "resetUrl",
|
|
44
|
+
RESET_CODE: "resetCode",
|
|
45
|
+
INVITE_URL: "inviteUrl",
|
|
46
|
+
INVITE_CODE: "inviteUrl",
|
|
47
|
+
CONTENTS: "contents",
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
const TemplateBindings = {
|
|
51
51
|
PLATFORM_URL: {
|
|
52
|
-
name:
|
|
52
|
+
name: InternalTemplateBindings.PLATFORM_URL,
|
|
53
53
|
description: "The URL used to access the budibase platform",
|
|
54
54
|
},
|
|
55
55
|
COMPANY: {
|
|
56
|
-
name:
|
|
56
|
+
name: InternalTemplateBindings.COMPANY,
|
|
57
57
|
description: "The name of your organization",
|
|
58
58
|
},
|
|
59
59
|
LOGO_URL: {
|
|
60
|
-
name:
|
|
60
|
+
name: InternalTemplateBindings.LOGO_URL,
|
|
61
61
|
description: "The URL of your organizations logo.",
|
|
62
62
|
},
|
|
63
63
|
EMAIL: {
|
|
64
|
-
name:
|
|
64
|
+
name: InternalTemplateBindings.EMAIL,
|
|
65
65
|
description: "The recipients email address.",
|
|
66
66
|
},
|
|
67
67
|
USER: {
|
|
68
|
-
name:
|
|
68
|
+
name: InternalTemplateBindings.USER,
|
|
69
69
|
description: "The recipients user object.",
|
|
70
70
|
},
|
|
71
71
|
REQUEST: {
|
|
72
|
-
name:
|
|
72
|
+
name: InternalTemplateBindings.REQUEST,
|
|
73
73
|
description: "Additional request metadata.",
|
|
74
74
|
},
|
|
75
75
|
DOCS_URL: {
|
|
76
|
-
name:
|
|
76
|
+
name: InternalTemplateBindings.DOCS_URL,
|
|
77
77
|
description: "Organization documentation URL.",
|
|
78
78
|
},
|
|
79
79
|
LOGIN_URL: {
|
|
80
|
-
name:
|
|
80
|
+
name: InternalTemplateBindings.LOGIN_URL,
|
|
81
81
|
description: "The URL used to log into the organization budibase instance.",
|
|
82
82
|
},
|
|
83
83
|
CURRENT_YEAR: {
|
|
84
|
-
name:
|
|
84
|
+
name: InternalTemplateBindings.CURRENT_YEAR,
|
|
85
85
|
description: "The current year.",
|
|
86
86
|
},
|
|
87
87
|
CURRENT_DATE: {
|
|
88
|
-
name:
|
|
88
|
+
name: InternalTemplateBindings.CURRENT_DATE,
|
|
89
89
|
description: "The current date.",
|
|
90
90
|
},
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
[
|
|
93
|
+
const TemplateMetadata = {
|
|
94
|
+
[TemplateTypes.EMAIL]: [
|
|
95
95
|
{
|
|
96
96
|
name: "Base format",
|
|
97
97
|
description:
|
|
@@ -100,11 +100,11 @@ export const TemplateMetadata = {
|
|
|
100
100
|
purpose: EmailTemplatePurpose.BASE,
|
|
101
101
|
bindings: [
|
|
102
102
|
{
|
|
103
|
-
name:
|
|
103
|
+
name: InternalTemplateBindings.BODY,
|
|
104
104
|
description: "The main body of another email template.",
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
|
-
name:
|
|
107
|
+
name: InternalTemplateBindings.STYLES,
|
|
108
108
|
description: "The contents of the Styling email template.",
|
|
109
109
|
},
|
|
110
110
|
],
|
|
@@ -117,12 +117,12 @@ export const TemplateMetadata = {
|
|
|
117
117
|
purpose: EmailTemplatePurpose.PASSWORD_RECOVERY,
|
|
118
118
|
bindings: [
|
|
119
119
|
{
|
|
120
|
-
name:
|
|
120
|
+
name: InternalTemplateBindings.RESET_URL,
|
|
121
121
|
description:
|
|
122
122
|
"The URL the recipient must click to reset their password.",
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
|
-
name:
|
|
125
|
+
name: InternalTemplateBindings.RESET_CODE,
|
|
126
126
|
description:
|
|
127
127
|
"The temporary password reset code used in the recipients password reset URL.",
|
|
128
128
|
},
|
|
@@ -144,12 +144,12 @@ export const TemplateMetadata = {
|
|
|
144
144
|
purpose: EmailTemplatePurpose.INVITATION,
|
|
145
145
|
bindings: [
|
|
146
146
|
{
|
|
147
|
-
name:
|
|
147
|
+
name: InternalTemplateBindings.INVITE_URL,
|
|
148
148
|
description:
|
|
149
149
|
"The URL the recipient must click to accept the invitation and activate their account.",
|
|
150
150
|
},
|
|
151
151
|
{
|
|
152
|
-
name:
|
|
152
|
+
name: InternalTemplateBindings.INVITE_CODE,
|
|
153
153
|
description:
|
|
154
154
|
"The temporary invite code used in the recipients invitation URL.",
|
|
155
155
|
},
|
|
@@ -163,7 +163,7 @@ export const TemplateMetadata = {
|
|
|
163
163
|
purpose: EmailTemplatePurpose.CUSTOM,
|
|
164
164
|
bindings: [
|
|
165
165
|
{
|
|
166
|
-
name:
|
|
166
|
+
name: InternalTemplateBindings.CONTENTS,
|
|
167
167
|
description: "Custom content body.",
|
|
168
168
|
},
|
|
169
169
|
],
|
|
@@ -172,5 +172,12 @@ export const TemplateMetadata = {
|
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
// all purpose combined
|
|
175
|
-
|
|
176
|
-
|
|
175
|
+
exports.TemplatePurpose = {
|
|
176
|
+
...EmailTemplatePurpose,
|
|
177
|
+
}
|
|
178
|
+
exports.TemplateTypes = TemplateTypes
|
|
179
|
+
exports.EmailTemplatePurpose = EmailTemplatePurpose
|
|
180
|
+
exports.TemplateMetadata = TemplateMetadata
|
|
181
|
+
exports.TemplateBindings = TemplateBindings
|
|
182
|
+
exports.InternalTemplateBindings = InternalTemplateBindings
|
|
183
|
+
exports.GLOBAL_OWNER = "global"
|