@appsemble/cli 0.29.10 → 0.30.1
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/README.md +10 -10
- package/commands/app/create.d.ts +1 -1
- package/commands/app/create.js +5 -5
- package/commands/{team → group}/create.d.ts +3 -3
- package/commands/{team → group}/create.js +5 -5
- package/commands/{team → group}/delete.d.ts +3 -3
- package/commands/{team → group}/delete.js +5 -5
- package/commands/{team → group}/index.d.ts +2 -2
- package/commands/{team → group}/index.js +4 -4
- package/commands/{team → group}/member/delete.d.ts +3 -3
- package/commands/{team → group}/member/delete.js +5 -5
- package/commands/{team → group}/member/index.d.ts +1 -1
- package/commands/{team → group}/member/index.js +1 -3
- package/commands/{team → group}/member/invite.d.ts +3 -3
- package/commands/{team → group}/member/invite.js +5 -5
- package/commands/{team → group}/update.d.ts +3 -3
- package/commands/{team → group}/update.js +7 -7
- package/commands/migrateAppDefinitions.d.ts +13 -0
- package/commands/migrateAppDefinitions.js +73 -0
- package/commands/serve.d.ts +1 -1
- package/commands/serve.js +16 -16
- package/index.js +4 -2
- package/lib/app.js +13 -3
- package/lib/app.test.js +10 -7
- package/lib/asset.js +4 -2
- package/lib/asset.test.js +3 -1
- package/lib/block.test.js +2 -1
- package/lib/createServers.js +3 -1
- package/lib/group.d.ts +61 -0
- package/lib/group.js +55 -0
- package/lib/{team.test.js → group.test.js} +121 -137
- package/lib/organization.test.js +5 -4
- package/lib/resource.js +3 -1
- package/lib/resource.test.js +2 -1
- package/lib/serverImport.d.ts +1 -1
- package/package.json +6 -6
- package/server/argv.d.ts +4 -4
- package/server/argv.js +1 -1
- package/server/controllers/apps/actions/index.d.ts +5 -0
- package/server/controllers/apps/actions/index.js +6 -0
- package/server/controllers/apps/actions/proxyDelete.d.ts +2 -0
- package/server/controllers/apps/actions/proxyDelete.js +4 -0
- package/server/controllers/apps/actions/proxyGet.d.ts +2 -0
- package/server/controllers/apps/actions/proxyGet.js +4 -0
- package/server/controllers/apps/actions/proxyPatch.d.ts +2 -0
- package/server/controllers/apps/actions/proxyPatch.js +4 -0
- package/server/controllers/apps/actions/proxyPost.d.ts +2 -0
- package/server/controllers/apps/actions/proxyPost.js +4 -0
- package/server/controllers/apps/actions/proxyPut.d.ts +2 -0
- package/server/controllers/apps/actions/proxyPut.js +4 -0
- package/server/controllers/apps/index.d.ts +2 -0
- package/server/controllers/apps/index.js +3 -0
- package/server/controllers/apps/members/current/getCurrentAppMember.d.ts +2 -0
- package/server/controllers/apps/members/current/getCurrentAppMember.js +4 -0
- package/server/controllers/apps/members/current/index.d.ts +1 -0
- package/server/controllers/apps/members/current/index.js +2 -0
- package/server/controllers/apps/members/index.d.ts +1 -0
- package/server/controllers/apps/members/index.js +2 -0
- package/server/controllers/common/apps/assets/getAppAssetById.d.ts +2 -0
- package/server/controllers/common/apps/assets/getAppAssetById.js +4 -0
- package/server/controllers/common/apps/assets/index.d.ts +1 -0
- package/server/controllers/common/apps/assets/index.js +2 -0
- package/server/controllers/common/apps/groups/getAppGroups.d.ts +2 -0
- package/server/controllers/common/apps/groups/getAppGroups.js +4 -0
- package/server/controllers/common/apps/groups/index.d.ts +1 -0
- package/server/controllers/common/apps/groups/index.js +2 -0
- package/server/controllers/common/apps/index.d.ts +5 -0
- package/server/controllers/common/apps/index.js +6 -0
- package/server/controllers/common/apps/messages/getAppMessages.d.ts +2 -0
- package/server/controllers/common/apps/messages/getAppMessages.js +4 -0
- package/server/controllers/common/apps/messages/index.d.ts +1 -0
- package/server/controllers/common/apps/messages/index.js +2 -0
- package/server/controllers/common/apps/resources/countAppResources.d.ts +2 -0
- package/server/controllers/common/apps/resources/countAppResources.js +4 -0
- package/server/controllers/common/apps/resources/createAppResource.d.ts +2 -0
- package/server/controllers/common/apps/resources/createAppResource.js +4 -0
- package/server/controllers/common/apps/resources/deleteAppResource.d.ts +2 -0
- package/server/controllers/common/apps/resources/deleteAppResource.js +4 -0
- package/server/controllers/common/apps/resources/getAppResourceById.d.ts +2 -0
- package/server/controllers/common/apps/resources/getAppResourceById.js +4 -0
- package/server/controllers/common/apps/resources/index.d.ts +6 -0
- package/server/controllers/common/apps/resources/index.js +7 -0
- package/server/controllers/common/apps/resources/queryAppResources.d.ts +2 -0
- package/server/controllers/common/apps/resources/queryAppResources.js +4 -0
- package/server/controllers/common/apps/resources/updateAppResource.d.ts +2 -0
- package/server/controllers/common/apps/resources/updateAppResource.js +4 -0
- package/server/controllers/common/apps/variables/getAppVariables.js +4 -0
- package/server/controllers/common/apps/variables/index.d.ts +1 -0
- package/server/controllers/common/apps/variables/index.js +2 -0
- package/server/controllers/common/index.d.ts +1 -0
- package/server/controllers/common/index.js +2 -0
- package/server/controllers/index.d.ts +3 -8
- package/server/controllers/index.js +3 -8
- package/server/controllers/main/apps/assets/createAppAsset.d.ts +2 -0
- package/server/controllers/main/apps/assets/createAppAsset.js +4 -0
- package/server/controllers/main/apps/assets/index.d.ts +1 -0
- package/server/controllers/main/apps/assets/index.js +2 -0
- package/server/controllers/main/apps/index.d.ts +1 -0
- package/server/controllers/main/apps/index.js +2 -0
- package/server/controllers/main/index.d.ts +1 -0
- package/server/controllers/main/index.js +2 -0
- package/server/options/checkAppMemberAppPermissions.d.ts +1 -0
- package/server/options/checkAppMemberAppPermissions.js +4 -0
- package/server/options/checkAppPermissions.d.ts +1 -0
- package/server/options/checkAppPermissions.js +4 -0
- package/server/options/checkAuthSubjectAppPermissions.d.ts +1 -0
- package/server/options/checkAuthSubjectAppPermissions.js +4 -0
- package/server/options/checkUserOrganizationPermissions.d.ts +1 -0
- package/server/options/checkUserOrganizationPermissions.js +4 -0
- package/server/options/getAppGroups.d.ts +2 -0
- package/server/options/getAppGroups.js +4 -0
- package/server/options/getCurrentAppMember.d.ts +3 -0
- package/server/options/getCurrentAppMember.js +4 -0
- package/server/options/index.d.ts +6 -5
- package/server/options/index.js +6 -5
- package/server/options/options.js +7 -6
- package/templates/apps/empty/app-definition.yaml +2 -2
- package/templates/blocks/mini-jsx/package.json +1 -1
- package/templates/blocks/preact/package.json +2 -2
- package/templates/blocks/vanilla/package.json +1 -1
- package/commands/team/member/update.d.ts +0 -16
- package/commands/team/member/update.js +0 -46
- package/lib/team.d.ts +0 -61
- package/lib/team.js +0 -83
- package/server/controllers/action.d.ts +0 -6
- package/server/controllers/action.js +0 -8
- package/server/controllers/appMembers.d.ts +0 -2
- package/server/controllers/appMembers.js +0 -4
- package/server/controllers/appMessages.d.ts +0 -2
- package/server/controllers/appMessages.js +0 -4
- package/server/controllers/appVariables.js +0 -4
- package/server/controllers/assets.d.ts +0 -4
- package/server/controllers/assets.js +0 -6
- package/server/controllers/oauth2Provider.d.ts +0 -2
- package/server/controllers/oauth2Provider.js +0 -4
- package/server/controllers/resources.d.ts +0 -7
- package/server/controllers/resources.js +0 -9
- package/server/controllers/teams.d.ts +0 -2
- package/server/controllers/teams.js +0 -4
- package/server/options/checkRole.d.ts +0 -1
- package/server/options/checkRole.js +0 -2
- package/server/options/checkRole.test.d.ts +0 -1
- package/server/options/checkRole.test.js +0 -13
- package/server/options/getAppMembers.d.ts +0 -3
- package/server/options/getAppMembers.js +0 -4
- package/server/options/getAppTeams.d.ts +0 -2
- package/server/options/getAppTeams.js +0 -4
- package/server/options/getAppUserInfo.d.ts +0 -3
- package/server/options/getAppUserInfo.js +0 -4
- package/server/options/verifyResourceActionPermission.d.ts +0 -1
- package/server/options/verifyResourceActionPermission.js +0 -2
- /package/lib/{team.test.d.ts → group.test.d.ts} +0 -0
- /package/server/controllers/{appVariables.d.ts → common/apps/variables/getAppVariables.d.ts} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { createServer, createTestUser, models, setArgv, useTestDatabase } from '@appsemble/server';
|
|
2
|
-
import {
|
|
1
|
+
import { createServer, createTestAppMember, createTestUser, models, setArgv, useTestDatabase, } from '@appsemble/server';
|
|
2
|
+
import { PredefinedOrganizationRole } from '@appsemble/types';
|
|
3
3
|
import { setTestApp } from 'axios-test-instance';
|
|
4
4
|
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { createGroup, deleteGroup, deleteMember, inviteMember, resolveAnnotations, updateGroup, updateMember, } from './group.js';
|
|
5
6
|
import { initAxios } from './initAxios.js';
|
|
6
|
-
import { createTeam, deleteMember, deleteTeam, inviteMember, resolveAnnotations, updateMember, updateTeam, } from './team.js';
|
|
7
7
|
import { authorizeCLI } from './testUtils.js';
|
|
8
|
-
const { App, AppMember, BlockVersion,
|
|
8
|
+
const { App, AppMember, BlockVersion, Group, GroupInvite, GroupMember, Organization, OrganizationMember, } = models;
|
|
9
9
|
const argv = { host: 'http://localhost', secret: 'test', aesSecret: 'testSecret' };
|
|
10
10
|
let user;
|
|
11
11
|
let organization;
|
|
@@ -29,7 +29,7 @@ beforeEach(async () => {
|
|
|
29
29
|
await OrganizationMember.create({
|
|
30
30
|
OrganizationId: organization.id,
|
|
31
31
|
UserId: user.id,
|
|
32
|
-
role:
|
|
32
|
+
role: PredefinedOrganizationRole.Owner,
|
|
33
33
|
});
|
|
34
34
|
await Organization.create({ id: 'appsemble', name: 'Appsemble' });
|
|
35
35
|
await BlockVersion.create({
|
|
@@ -49,14 +49,14 @@ beforeEach(async () => {
|
|
|
49
49
|
afterAll(() => {
|
|
50
50
|
vi.useRealTimers();
|
|
51
51
|
});
|
|
52
|
-
describe('
|
|
53
|
-
it('should create a new
|
|
52
|
+
describe('createGroup', () => {
|
|
53
|
+
it('should create a new group', async () => {
|
|
54
54
|
const app = await App.create({
|
|
55
55
|
definition: {
|
|
56
56
|
name: 'Test App',
|
|
57
57
|
defaultPage: 'Test Page',
|
|
58
58
|
security: {
|
|
59
|
-
|
|
59
|
+
groups: {
|
|
60
60
|
join: 'anyone',
|
|
61
61
|
invite: [],
|
|
62
62
|
},
|
|
@@ -74,19 +74,20 @@ describe('createTeam', () => {
|
|
|
74
74
|
vapidPrivateKey: 'b',
|
|
75
75
|
OrganizationId: organization.id,
|
|
76
76
|
});
|
|
77
|
-
const clientCredentials = await authorizeCLI('
|
|
78
|
-
await
|
|
77
|
+
const clientCredentials = await authorizeCLI('groups:write', testApp);
|
|
78
|
+
await createGroup({
|
|
79
79
|
appId: app.id,
|
|
80
80
|
name: 'test',
|
|
81
81
|
remote: testApp.defaults.baseURL,
|
|
82
82
|
clientCredentials,
|
|
83
83
|
});
|
|
84
|
-
const
|
|
85
|
-
expect(
|
|
84
|
+
const group = await Group.findOne();
|
|
85
|
+
expect(group).toMatchInlineSnapshot(`
|
|
86
86
|
{
|
|
87
87
|
"AppId": 1,
|
|
88
88
|
"annotations": null,
|
|
89
89
|
"created": 1970-01-01T00:00:00.000Z,
|
|
90
|
+
"demo": false,
|
|
90
91
|
"id": 1,
|
|
91
92
|
"name": "test",
|
|
92
93
|
"updated": 1970-01-01T00:00:00.000Z,
|
|
@@ -94,8 +95,8 @@ describe('createTeam', () => {
|
|
|
94
95
|
`);
|
|
95
96
|
});
|
|
96
97
|
it('should throw if app does not exist', async () => {
|
|
97
|
-
const clientCredentials = await authorizeCLI('
|
|
98
|
-
await expect(() =>
|
|
98
|
+
const clientCredentials = await authorizeCLI('groups:write', testApp);
|
|
99
|
+
await expect(() => createGroup({
|
|
99
100
|
appId: 1,
|
|
100
101
|
name: 'test',
|
|
101
102
|
remote: testApp.defaults.baseURL,
|
|
@@ -103,14 +104,14 @@ describe('createTeam', () => {
|
|
|
103
104
|
})).rejects.toThrow('Request failed with status code 404');
|
|
104
105
|
});
|
|
105
106
|
});
|
|
106
|
-
describe('
|
|
107
|
-
it('should delete a
|
|
107
|
+
describe('deleteGroup', () => {
|
|
108
|
+
it('should delete a group', async () => {
|
|
108
109
|
const app = await App.create({
|
|
109
110
|
definition: {
|
|
110
111
|
name: 'Test App',
|
|
111
112
|
defaultPage: 'Test Page',
|
|
112
113
|
security: {
|
|
113
|
-
|
|
114
|
+
groups: {
|
|
114
115
|
join: 'anyone',
|
|
115
116
|
invite: [],
|
|
116
117
|
},
|
|
@@ -128,37 +129,38 @@ describe('deleteTeam', () => {
|
|
|
128
129
|
vapidPrivateKey: 'b',
|
|
129
130
|
OrganizationId: organization.id,
|
|
130
131
|
});
|
|
131
|
-
const
|
|
132
|
+
const group = await Group.create({
|
|
132
133
|
AppId: app.id,
|
|
133
134
|
name: 'test',
|
|
134
135
|
});
|
|
135
|
-
const clientCredentials = await authorizeCLI('
|
|
136
|
-
await
|
|
136
|
+
const clientCredentials = await authorizeCLI('groups:write', testApp);
|
|
137
|
+
await deleteGroup({
|
|
137
138
|
appId: app.id,
|
|
138
|
-
id:
|
|
139
|
+
id: group.id,
|
|
139
140
|
remote: testApp.defaults.baseURL,
|
|
140
141
|
clientCredentials,
|
|
141
142
|
});
|
|
142
|
-
expect(
|
|
143
|
+
expect(group).toMatchInlineSnapshot(`
|
|
143
144
|
{
|
|
144
145
|
"AppId": 1,
|
|
145
146
|
"annotations": null,
|
|
146
147
|
"created": 1970-01-01T00:00:00.000Z,
|
|
148
|
+
"demo": false,
|
|
147
149
|
"id": 1,
|
|
148
150
|
"name": "test",
|
|
149
151
|
"updated": 1970-01-01T00:00:00.000Z,
|
|
150
152
|
}
|
|
151
153
|
`);
|
|
152
|
-
const
|
|
153
|
-
expect(
|
|
154
|
+
const foundGroup = await Group.findOne();
|
|
155
|
+
expect(foundGroup).toBeNull();
|
|
154
156
|
});
|
|
155
|
-
it('should throw an error if the
|
|
157
|
+
it('should throw an error if the group does not exist', async () => {
|
|
156
158
|
const app = await App.create({
|
|
157
159
|
definition: {
|
|
158
160
|
name: 'Test App',
|
|
159
161
|
defaultPage: 'Test Page',
|
|
160
162
|
security: {
|
|
161
|
-
|
|
163
|
+
groups: {
|
|
162
164
|
join: 'anyone',
|
|
163
165
|
invite: [],
|
|
164
166
|
},
|
|
@@ -176,18 +178,18 @@ describe('deleteTeam', () => {
|
|
|
176
178
|
vapidPrivateKey: 'b',
|
|
177
179
|
OrganizationId: organization.id,
|
|
178
180
|
});
|
|
179
|
-
const clientCredentials = await authorizeCLI('
|
|
180
|
-
await expect(() =>
|
|
181
|
+
const clientCredentials = await authorizeCLI('groups:write', testApp);
|
|
182
|
+
await expect(() => deleteGroup({ appId: app.id, id: 1, remote: testApp.defaults.baseURL, clientCredentials })).rejects.toThrow('Request failed with status code 404');
|
|
181
183
|
});
|
|
182
184
|
});
|
|
183
|
-
describe('
|
|
184
|
-
it('should update a
|
|
185
|
+
describe('updateGroup', () => {
|
|
186
|
+
it('should update a group', async () => {
|
|
185
187
|
const app = await App.create({
|
|
186
188
|
definition: {
|
|
187
189
|
name: 'Test App',
|
|
188
190
|
defaultPage: 'Test Page',
|
|
189
191
|
security: {
|
|
190
|
-
|
|
192
|
+
groups: {
|
|
191
193
|
join: 'anyone',
|
|
192
194
|
invite: [],
|
|
193
195
|
},
|
|
@@ -205,36 +207,37 @@ describe('updateTeam', () => {
|
|
|
205
207
|
vapidPrivateKey: 'b',
|
|
206
208
|
OrganizationId: organization.id,
|
|
207
209
|
});
|
|
208
|
-
const
|
|
210
|
+
const group = await Group.create({
|
|
209
211
|
AppId: app.id,
|
|
210
212
|
name: 'test',
|
|
211
213
|
});
|
|
212
|
-
await authorizeCLI('
|
|
213
|
-
await
|
|
214
|
+
await authorizeCLI('groups:write', testApp);
|
|
215
|
+
await updateGroup({
|
|
214
216
|
appId: app.id,
|
|
215
|
-
id:
|
|
217
|
+
id: group.id,
|
|
216
218
|
remote: testApp.defaults.baseURL,
|
|
217
219
|
name: 'test2',
|
|
218
220
|
});
|
|
219
|
-
await
|
|
220
|
-
expect(
|
|
221
|
+
await group.reload();
|
|
222
|
+
expect(group).toMatchInlineSnapshot(`
|
|
221
223
|
{
|
|
222
224
|
"AppId": 1,
|
|
223
225
|
"annotations": null,
|
|
224
226
|
"created": 1970-01-01T00:00:00.000Z,
|
|
227
|
+
"demo": false,
|
|
225
228
|
"id": 1,
|
|
226
229
|
"name": "test2",
|
|
227
230
|
"updated": 1970-01-01T00:00:00.000Z,
|
|
228
231
|
}
|
|
229
232
|
`);
|
|
230
233
|
});
|
|
231
|
-
it('should throw an error if the
|
|
234
|
+
it('should throw an error if the group does not exist', async () => {
|
|
232
235
|
const app = await App.create({
|
|
233
236
|
definition: {
|
|
234
237
|
name: 'Test App',
|
|
235
238
|
defaultPage: 'Test Page',
|
|
236
239
|
security: {
|
|
237
|
-
|
|
240
|
+
groups: {
|
|
238
241
|
join: 'anyone',
|
|
239
242
|
invite: [],
|
|
240
243
|
},
|
|
@@ -252,15 +255,15 @@ describe('updateTeam', () => {
|
|
|
252
255
|
vapidPrivateKey: 'b',
|
|
253
256
|
OrganizationId: organization.id,
|
|
254
257
|
});
|
|
255
|
-
const
|
|
258
|
+
const group = await Group.create({
|
|
256
259
|
AppId: app.id,
|
|
257
260
|
name: 'test',
|
|
258
261
|
});
|
|
259
|
-
await
|
|
260
|
-
const clientCredentials = await authorizeCLI('
|
|
261
|
-
await expect(() =>
|
|
262
|
+
await group.destroy();
|
|
263
|
+
const clientCredentials = await authorizeCLI('groups:write', testApp);
|
|
264
|
+
await expect(() => updateGroup({
|
|
262
265
|
appId: app.id,
|
|
263
|
-
id:
|
|
266
|
+
id: group.id,
|
|
264
267
|
remote: testApp.defaults.baseURL,
|
|
265
268
|
name: 'test2',
|
|
266
269
|
clientCredentials,
|
|
@@ -272,7 +275,7 @@ describe('updateTeam', () => {
|
|
|
272
275
|
name: 'Test App',
|
|
273
276
|
defaultPage: 'Test Page',
|
|
274
277
|
security: {
|
|
275
|
-
|
|
278
|
+
groups: {
|
|
276
279
|
join: 'anyone',
|
|
277
280
|
invite: [],
|
|
278
281
|
},
|
|
@@ -290,26 +293,26 @@ describe('updateTeam', () => {
|
|
|
290
293
|
vapidPrivateKey: 'b',
|
|
291
294
|
OrganizationId: organization.id,
|
|
292
295
|
});
|
|
293
|
-
const
|
|
296
|
+
const group = await Group.create({
|
|
294
297
|
AppId: app.id,
|
|
295
298
|
name: 'test',
|
|
296
299
|
});
|
|
297
|
-
await expect(() =>
|
|
300
|
+
await expect(() => updateGroup({
|
|
298
301
|
appId: app.id,
|
|
299
|
-
id:
|
|
302
|
+
id: group.id,
|
|
300
303
|
remote: testApp.defaults.baseURL,
|
|
301
304
|
name: 'test2',
|
|
302
305
|
})).rejects.toThrow('Request failed with status code 401');
|
|
303
306
|
});
|
|
304
307
|
});
|
|
305
308
|
describe('inviteMember', () => {
|
|
306
|
-
it('should invite a member to a
|
|
309
|
+
it('should invite a member to a group', async () => {
|
|
307
310
|
const app = await App.create({
|
|
308
311
|
definition: {
|
|
309
312
|
name: 'Test App',
|
|
310
313
|
defaultPage: 'Test Page',
|
|
311
314
|
security: {
|
|
312
|
-
|
|
315
|
+
groups: {
|
|
313
316
|
join: 'anyone',
|
|
314
317
|
invite: [],
|
|
315
318
|
},
|
|
@@ -327,7 +330,7 @@ describe('inviteMember', () => {
|
|
|
327
330
|
vapidPrivateKey: 'b',
|
|
328
331
|
OrganizationId: organization.id,
|
|
329
332
|
});
|
|
330
|
-
const
|
|
333
|
+
const group = await Group.create({
|
|
331
334
|
AppId: app.id,
|
|
332
335
|
name: 'test',
|
|
333
336
|
});
|
|
@@ -338,33 +341,34 @@ describe('inviteMember', () => {
|
|
|
338
341
|
role: 'Manager',
|
|
339
342
|
name: user.name,
|
|
340
343
|
});
|
|
341
|
-
await authorizeCLI('
|
|
344
|
+
await authorizeCLI('groups:write', testApp);
|
|
342
345
|
await inviteMember({
|
|
343
346
|
appId: app.id,
|
|
344
|
-
id:
|
|
347
|
+
id: group.id,
|
|
345
348
|
remote: testApp.defaults.baseURL,
|
|
346
|
-
user: user.
|
|
349
|
+
user: user.primaryEmail,
|
|
347
350
|
});
|
|
348
|
-
const
|
|
349
|
-
expect(
|
|
350
|
-
|
|
351
|
+
const invite = await GroupInvite.findOne();
|
|
352
|
+
expect(invite.dataValues).toMatchInlineSnapshot({
|
|
353
|
+
key: expect.any(String),
|
|
351
354
|
}, `
|
|
352
355
|
{
|
|
353
|
-
"
|
|
354
|
-
"TeamId": 1,
|
|
356
|
+
"GroupId": 1,
|
|
355
357
|
"created": 1970-01-01T00:00:00.000Z,
|
|
356
|
-
"
|
|
358
|
+
"email": "test@example.com",
|
|
359
|
+
"key": Any<String>,
|
|
360
|
+
"role": "Member",
|
|
357
361
|
"updated": 1970-01-01T00:00:00.000Z,
|
|
358
362
|
}
|
|
359
363
|
`);
|
|
360
364
|
});
|
|
361
|
-
it('should throw an error if the
|
|
365
|
+
it('should throw an error if the group does not exist', async () => {
|
|
362
366
|
const app = await App.create({
|
|
363
367
|
definition: {
|
|
364
368
|
name: 'Test App',
|
|
365
369
|
defaultPage: 'Test Page',
|
|
366
370
|
security: {
|
|
367
|
-
|
|
371
|
+
groups: {
|
|
368
372
|
join: 'anyone',
|
|
369
373
|
invite: [],
|
|
370
374
|
},
|
|
@@ -382,54 +386,23 @@ describe('inviteMember', () => {
|
|
|
382
386
|
vapidPrivateKey: 'b',
|
|
383
387
|
OrganizationId: organization.id,
|
|
384
388
|
});
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
it('should throw an error if the team does not exist', async () => {
|
|
393
|
-
const app = await App.create({
|
|
394
|
-
definition: {
|
|
395
|
-
name: 'Test App',
|
|
396
|
-
defaultPage: 'Test Page',
|
|
397
|
-
security: {
|
|
398
|
-
teams: {
|
|
399
|
-
join: 'anyone',
|
|
400
|
-
invite: [],
|
|
401
|
-
},
|
|
402
|
-
default: {
|
|
403
|
-
role: 'Reader',
|
|
404
|
-
policy: 'everyone',
|
|
405
|
-
},
|
|
406
|
-
roles: {
|
|
407
|
-
Reader: {},
|
|
408
|
-
},
|
|
409
|
-
},
|
|
410
|
-
},
|
|
411
|
-
path: 'test-app',
|
|
412
|
-
vapidPublicKey: 'a',
|
|
413
|
-
vapidPrivateKey: 'b',
|
|
414
|
-
OrganizationId: organization.id,
|
|
415
|
-
});
|
|
416
|
-
const team = await Team.create({
|
|
417
|
-
AppId: app.id,
|
|
418
|
-
name: 'test',
|
|
419
|
-
});
|
|
420
|
-
await team.destroy();
|
|
421
|
-
await authorizeCLI('teams:write', testApp);
|
|
422
|
-
await expect(() => inviteMember({ appId: app.id, id: team.id, remote: testApp.defaults.baseURL, user: user.id })).rejects.toThrow('Request failed with status code 404');
|
|
389
|
+
await authorizeCLI('groups:write', testApp);
|
|
390
|
+
await expect(() => inviteMember({
|
|
391
|
+
appId: app.id,
|
|
392
|
+
id: 10,
|
|
393
|
+
remote: testApp.defaults.baseURL,
|
|
394
|
+
user: user.primaryEmail,
|
|
395
|
+
})).rejects.toThrow('Request failed with status code 400');
|
|
423
396
|
});
|
|
424
397
|
});
|
|
425
398
|
describe('updateMember', () => {
|
|
426
|
-
it('should update role of a
|
|
399
|
+
it('should update role of a group member', async () => {
|
|
427
400
|
const app = await App.create({
|
|
428
401
|
definition: {
|
|
429
402
|
name: 'Test App',
|
|
430
403
|
defaultPage: 'Test Page',
|
|
431
404
|
security: {
|
|
432
|
-
|
|
405
|
+
groups: {
|
|
433
406
|
join: 'anyone',
|
|
434
407
|
invite: [],
|
|
435
408
|
},
|
|
@@ -447,7 +420,7 @@ describe('updateMember', () => {
|
|
|
447
420
|
vapidPrivateKey: 'b',
|
|
448
421
|
OrganizationId: organization.id,
|
|
449
422
|
});
|
|
450
|
-
const
|
|
423
|
+
const group = await Group.create({
|
|
451
424
|
AppId: app.id,
|
|
452
425
|
name: 'test',
|
|
453
426
|
});
|
|
@@ -458,29 +431,29 @@ describe('updateMember', () => {
|
|
|
458
431
|
role: 'Manager',
|
|
459
432
|
name: user.name,
|
|
460
433
|
});
|
|
461
|
-
const
|
|
462
|
-
|
|
434
|
+
const groupMember = await GroupMember.create({
|
|
435
|
+
GroupId: group.id,
|
|
463
436
|
AppMemberId: member.id,
|
|
464
437
|
});
|
|
465
|
-
await authorizeCLI('
|
|
438
|
+
await authorizeCLI('groups:write', testApp);
|
|
466
439
|
await updateMember({
|
|
467
440
|
appId: app.id,
|
|
468
441
|
remote: testApp.defaults.baseURL,
|
|
469
|
-
user:
|
|
470
|
-
role:
|
|
471
|
-
id:
|
|
442
|
+
user: groupMember.id,
|
|
443
|
+
role: 'GroupMembersManager',
|
|
444
|
+
id: group.id,
|
|
472
445
|
});
|
|
473
|
-
expect(
|
|
474
|
-
await
|
|
475
|
-
expect(
|
|
446
|
+
expect(groupMember.role).toBe('Member');
|
|
447
|
+
await groupMember.reload();
|
|
448
|
+
expect(groupMember.role).toBe('GroupMembersManager');
|
|
476
449
|
});
|
|
477
|
-
it('should throw an error if the user is not a
|
|
450
|
+
it('should throw an error if the user is not a GroupMember', async () => {
|
|
478
451
|
const app = await App.create({
|
|
479
452
|
definition: {
|
|
480
453
|
name: 'Test App',
|
|
481
454
|
defaultPage: 'Test Page',
|
|
482
455
|
security: {
|
|
483
|
-
|
|
456
|
+
groups: {
|
|
484
457
|
join: 'anyone',
|
|
485
458
|
invite: [],
|
|
486
459
|
},
|
|
@@ -498,7 +471,7 @@ describe('updateMember', () => {
|
|
|
498
471
|
vapidPrivateKey: 'b',
|
|
499
472
|
OrganizationId: organization.id,
|
|
500
473
|
});
|
|
501
|
-
const
|
|
474
|
+
const group = await Group.create({
|
|
502
475
|
AppId: app.id,
|
|
503
476
|
name: 'test',
|
|
504
477
|
});
|
|
@@ -509,24 +482,24 @@ describe('updateMember', () => {
|
|
|
509
482
|
role: 'Manager',
|
|
510
483
|
name: user.name,
|
|
511
484
|
});
|
|
512
|
-
await authorizeCLI('
|
|
485
|
+
await authorizeCLI('groups:write', testApp);
|
|
513
486
|
await expect(() => updateMember({
|
|
514
487
|
appId: app.id,
|
|
515
488
|
remote: testApp.defaults.baseURL,
|
|
516
489
|
user: user.id,
|
|
517
|
-
role:
|
|
518
|
-
id:
|
|
519
|
-
})).rejects.toThrow('Request failed with status code
|
|
490
|
+
role: 'GroupMembersManager',
|
|
491
|
+
id: group.id,
|
|
492
|
+
})).rejects.toThrow('Request failed with status code 404');
|
|
520
493
|
});
|
|
521
494
|
});
|
|
522
495
|
describe('deleteMember', () => {
|
|
523
|
-
it('should delete a
|
|
496
|
+
it('should delete a group member', async () => {
|
|
524
497
|
const app = await App.create({
|
|
525
498
|
definition: {
|
|
526
499
|
name: 'Test App',
|
|
527
500
|
defaultPage: 'Test Page',
|
|
528
501
|
security: {
|
|
529
|
-
|
|
502
|
+
groups: {
|
|
530
503
|
join: 'anyone',
|
|
531
504
|
invite: [],
|
|
532
505
|
},
|
|
@@ -544,7 +517,7 @@ describe('deleteMember', () => {
|
|
|
544
517
|
vapidPrivateKey: 'b',
|
|
545
518
|
OrganizationId: organization.id,
|
|
546
519
|
});
|
|
547
|
-
const
|
|
520
|
+
const group = await Group.create({
|
|
548
521
|
AppId: app.id,
|
|
549
522
|
name: 'test',
|
|
550
523
|
});
|
|
@@ -552,30 +525,36 @@ describe('deleteMember', () => {
|
|
|
552
525
|
email: user.primaryEmail,
|
|
553
526
|
AppId: app.id,
|
|
554
527
|
UserId: user.id,
|
|
555
|
-
role: '
|
|
528
|
+
role: 'Maintainer',
|
|
556
529
|
name: user.name,
|
|
557
530
|
});
|
|
558
|
-
await
|
|
559
|
-
|
|
531
|
+
await authorizeCLI('groups:write', testApp);
|
|
532
|
+
await createTestUser('test2@example.com');
|
|
533
|
+
const member2 = await createTestAppMember(app.id, 'test2@example.com');
|
|
534
|
+
await GroupMember.create({
|
|
535
|
+
GroupId: group.id,
|
|
560
536
|
AppMemberId: member.id,
|
|
561
537
|
});
|
|
562
|
-
await
|
|
538
|
+
const { id: groupMemberId } = await GroupMember.create({
|
|
539
|
+
GroupId: group.id,
|
|
540
|
+
AppMemberId: member2.id,
|
|
541
|
+
});
|
|
563
542
|
await deleteMember({
|
|
564
|
-
id:
|
|
543
|
+
id: group.id,
|
|
565
544
|
appId: app.id,
|
|
566
|
-
user:
|
|
545
|
+
user: groupMemberId,
|
|
567
546
|
remote: testApp.defaults.baseURL,
|
|
568
547
|
});
|
|
569
|
-
const
|
|
570
|
-
expect(
|
|
548
|
+
const foundGroupMember = await GroupMember.findByPk(groupMemberId);
|
|
549
|
+
expect(foundGroupMember).toBeNull();
|
|
571
550
|
});
|
|
572
|
-
it('should throw an error if the
|
|
551
|
+
it('should throw an error if the GroupMember does not exist', async () => {
|
|
573
552
|
const app = await App.create({
|
|
574
553
|
definition: {
|
|
575
554
|
name: 'Test App',
|
|
576
555
|
defaultPage: 'Test Page',
|
|
577
556
|
security: {
|
|
578
|
-
|
|
557
|
+
groups: {
|
|
579
558
|
join: 'anyone',
|
|
580
559
|
invite: [],
|
|
581
560
|
},
|
|
@@ -593,7 +572,7 @@ describe('deleteMember', () => {
|
|
|
593
572
|
vapidPrivateKey: 'b',
|
|
594
573
|
OrganizationId: organization.id,
|
|
595
574
|
});
|
|
596
|
-
const
|
|
575
|
+
const group = await Group.create({
|
|
597
576
|
AppId: app.id,
|
|
598
577
|
name: 'test',
|
|
599
578
|
});
|
|
@@ -604,12 +583,17 @@ describe('deleteMember', () => {
|
|
|
604
583
|
role: 'Manager',
|
|
605
584
|
name: user.name,
|
|
606
585
|
});
|
|
607
|
-
await authorizeCLI('
|
|
608
|
-
await expect(() => deleteMember({
|
|
586
|
+
await authorizeCLI('groups:write', testApp);
|
|
587
|
+
await expect(() => deleteMember({
|
|
588
|
+
appId: app.id,
|
|
589
|
+
remote: testApp.defaults.baseURL,
|
|
590
|
+
user: user.id,
|
|
591
|
+
id: group.id,
|
|
592
|
+
})).rejects.toThrow('Request failed with status code 404');
|
|
609
593
|
});
|
|
610
594
|
});
|
|
611
595
|
describe('resolveAnnotations', () => {
|
|
612
|
-
it('should resolve
|
|
596
|
+
it('should resolve group annotations', () => {
|
|
613
597
|
const unresolvedAnnotations = ['foo=bar', 'hello=world'];
|
|
614
598
|
const annotations = resolveAnnotations(unresolvedAnnotations);
|
|
615
599
|
expect(annotations).toMatchObject({
|
|
@@ -622,4 +606,4 @@ describe('resolveAnnotations', () => {
|
|
|
622
606
|
expect(() => resolveAnnotations(unresolvedAnnotations)).toThrow('One of the annotations did not follow the pattern of key=value');
|
|
623
607
|
});
|
|
624
608
|
});
|
|
625
|
-
//# sourceMappingURL=
|
|
609
|
+
//# sourceMappingURL=group.test.js.map
|
package/lib/organization.test.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createFixtureStream, readFixture } from '@appsemble/node-utils';
|
|
2
2
|
import { createServer, createTestUser, models, setArgv, useTestDatabase } from '@appsemble/server';
|
|
3
|
+
import { PredefinedOrganizationRole } from '@appsemble/types';
|
|
3
4
|
import { setTestApp } from 'axios-test-instance';
|
|
4
5
|
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
6
|
import { initAxios } from './initAxios.js';
|
|
@@ -73,7 +74,7 @@ describe('updateOrganization', () => {
|
|
|
73
74
|
await OrganizationMember.create({
|
|
74
75
|
OrganizationId: organization.id,
|
|
75
76
|
UserId: user.id,
|
|
76
|
-
role:
|
|
77
|
+
role: PredefinedOrganizationRole.Owner,
|
|
77
78
|
});
|
|
78
79
|
await authorizeCLI('organizations:write', testApp);
|
|
79
80
|
await updateOrganization({
|
|
@@ -109,7 +110,7 @@ describe('updateOrganization', () => {
|
|
|
109
110
|
await OrganizationMember.create({
|
|
110
111
|
OrganizationId: organization.id,
|
|
111
112
|
UserId: user.id,
|
|
112
|
-
role:
|
|
113
|
+
role: PredefinedOrganizationRole.Owner,
|
|
113
114
|
});
|
|
114
115
|
await organization.destroy();
|
|
115
116
|
await authorizeCLI('organizations:write', testApp);
|
|
@@ -130,7 +131,7 @@ describe('updateOrganization', () => {
|
|
|
130
131
|
await OrganizationMember.create({
|
|
131
132
|
OrganizationId: organization.id,
|
|
132
133
|
UserId: user.id,
|
|
133
|
-
role:
|
|
134
|
+
role: PredefinedOrganizationRole.Owner,
|
|
134
135
|
});
|
|
135
136
|
await expect(() => updateOrganization({
|
|
136
137
|
id: organization.id,
|
|
@@ -171,7 +172,7 @@ describe('upsertOrganization', () => {
|
|
|
171
172
|
await OrganizationMember.create({
|
|
172
173
|
OrganizationId: organization.id,
|
|
173
174
|
UserId: user.id,
|
|
174
|
-
role:
|
|
175
|
+
role: PredefinedOrganizationRole.Owner,
|
|
175
176
|
});
|
|
176
177
|
await authorizeCLI('organizations:write', testApp);
|
|
177
178
|
await upsertOrganization({
|
package/lib/resource.js
CHANGED
|
@@ -16,12 +16,13 @@ export async function publishResource({ appId, definition, path, publishedResour
|
|
|
16
16
|
}
|
|
17
17
|
logger.info(`Publishing resource(s) from ${path}`);
|
|
18
18
|
let data;
|
|
19
|
-
const endpoint = `/api/apps/${appId}
|
|
19
|
+
const endpoint = `/api/apps/${appId}/resources/${type}`;
|
|
20
20
|
try {
|
|
21
21
|
if (csv) {
|
|
22
22
|
const response = await axios.post(endpoint, resources, {
|
|
23
23
|
baseURL: remote,
|
|
24
24
|
headers: { 'content-type': 'text/csv' },
|
|
25
|
+
params: { seed },
|
|
25
26
|
});
|
|
26
27
|
data = response.data;
|
|
27
28
|
}
|
|
@@ -37,6 +38,7 @@ export async function publishResource({ appId, definition, path, publishedResour
|
|
|
37
38
|
}), {
|
|
38
39
|
baseURL: remote,
|
|
39
40
|
headers: { 'content-type': 'application/json' },
|
|
41
|
+
params: { seed },
|
|
40
42
|
});
|
|
41
43
|
data = response.data;
|
|
42
44
|
}
|
package/lib/resource.test.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolveFixture } from '@appsemble/node-utils';
|
|
2
2
|
import { createServer, createTestUser, models, setArgv, useTestDatabase } from '@appsemble/server';
|
|
3
|
+
import { PredefinedOrganizationRole } from '@appsemble/types';
|
|
3
4
|
import { setTestApp } from 'axios-test-instance';
|
|
4
5
|
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
6
|
import { initAxios } from './initAxios.js';
|
|
@@ -29,7 +30,7 @@ beforeEach(async () => {
|
|
|
29
30
|
await OrganizationMember.create({
|
|
30
31
|
OrganizationId: organization.id,
|
|
31
32
|
UserId: user.id,
|
|
32
|
-
role:
|
|
33
|
+
role: PredefinedOrganizationRole.Owner,
|
|
33
34
|
});
|
|
34
35
|
await Organization.create({ id: 'appsemble', name: 'Appsemble' });
|
|
35
36
|
});
|
package/lib/serverImport.d.ts
CHANGED
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
* @param members The names of the exported member to import.
|
|
5
5
|
* @returns The exported member.
|
|
6
6
|
*/
|
|
7
|
-
export declare function serverImport<T extends 'checkDownMigrations' | 'checkMigrations' | 'cleanupDemoUsers' | 'cleanupResourcesAndAssets' | 'fuzzMigrations' | 'migrate' | 'runCronJobs' | 'scaleContainers' | 'setArgv' | 'start'>(...members: T[]): Promise<Record<T, any>>;
|
|
7
|
+
export declare function serverImport<T extends 'checkDownMigrations' | 'checkMigrations' | 'cleanupDemoUsers' | 'cleanupResourcesAndAssets' | 'fuzzMigrations' | 'migrate' | 'migrateAppDefinitions' | 'runCronJobs' | 'scaleContainers' | 'setArgv' | 'start'>(...members: T[]): Promise<Record<T, any>>;
|