@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
package/lib/app.js
CHANGED
|
@@ -278,7 +278,7 @@ export async function publishSeedResources(path, app, remote) {
|
|
|
278
278
|
if (existsSync(resourcesPath)) {
|
|
279
279
|
logger.info(`Deleting existing seed resources from app ${app.id}`);
|
|
280
280
|
try {
|
|
281
|
-
await axios.delete(`/api/apps/${app.id}/
|
|
281
|
+
await axios.delete(`/api/apps/${app.id}/resources`, { baseURL: remote });
|
|
282
282
|
const resourceFiles = await readdir(resourcesPath, { withFileTypes: true });
|
|
283
283
|
const resourcesToPublish = [];
|
|
284
284
|
const publishedResourcesIds = {};
|
|
@@ -328,7 +328,11 @@ export async function publishSeedAssets(path, app, remote, assetsClonable) {
|
|
|
328
328
|
if (existsSync(assetsPath)) {
|
|
329
329
|
logger.info(`Deleting existing seed assets from app ${app.id}`);
|
|
330
330
|
try {
|
|
331
|
-
await axios.delete(`/api/apps/${app.id}/
|
|
331
|
+
await axios.delete(`/api/apps/${app.id}/assets`, {
|
|
332
|
+
data: [],
|
|
333
|
+
baseURL: remote,
|
|
334
|
+
params: { seed: true },
|
|
335
|
+
});
|
|
332
336
|
const assetFiles = await readdir(assetsPath);
|
|
333
337
|
const normalizedPaths = assetFiles.map((assetFile) => normalizePath(join(assetsPath, assetFile)));
|
|
334
338
|
const files = await fg(normalizedPaths, { absolute: true, onlyFiles: true });
|
|
@@ -804,6 +808,9 @@ export async function publishApp({ clientCredentials, context, dryRun, modifyCon
|
|
|
804
808
|
if (resources) {
|
|
805
809
|
authScope += ' resources:write';
|
|
806
810
|
}
|
|
811
|
+
if (assets) {
|
|
812
|
+
authScope += ' assets:write';
|
|
813
|
+
}
|
|
807
814
|
await authenticate(remote, authScope, clientCredentials);
|
|
808
815
|
let data;
|
|
809
816
|
try {
|
|
@@ -852,7 +859,7 @@ export async function publishApp({ clientCredentials, context, dryRun, modifyCon
|
|
|
852
859
|
if (Array.isArray(rcCollections)) {
|
|
853
860
|
for (const collectionId of rcCollections) {
|
|
854
861
|
try {
|
|
855
|
-
await axios.post(`/api/
|
|
862
|
+
await axios.post(`/api/app-collections/${collectionId}/apps`, { AppId: data.id }, {
|
|
856
863
|
baseURL: remote,
|
|
857
864
|
});
|
|
858
865
|
logger.info(`Successfully added app to collection ${collectionId}`);
|
|
@@ -961,6 +968,9 @@ export async function updateApp({ clientCredentials, context, force, path, ...op
|
|
|
961
968
|
if (resources) {
|
|
962
969
|
authScope += ' resources:write';
|
|
963
970
|
}
|
|
971
|
+
if (assets) {
|
|
972
|
+
authScope += ' assets:write';
|
|
973
|
+
}
|
|
964
974
|
await authenticate(remote, authScope, clientCredentials);
|
|
965
975
|
if (appLock) {
|
|
966
976
|
logger.info(`Setting AppLock to ${appLock}`);
|
package/lib/app.test.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { writeFile } from 'node:fs/promises';
|
|
2
2
|
import { readFixture, resolveFixture } from '@appsemble/node-utils';
|
|
3
3
|
import { createServer, createTestUser, models, setArgv, useTestDatabase } from '@appsemble/server';
|
|
4
|
+
import { PredefinedOrganizationRole } from '@appsemble/types';
|
|
4
5
|
import { ISODateTimePattern } from '@appsemble/utils';
|
|
5
6
|
import { setTestApp } from 'axios-test-instance';
|
|
6
7
|
import FormData from 'form-data';
|
|
@@ -32,7 +33,7 @@ beforeEach(async () => {
|
|
|
32
33
|
await OrganizationMember.create({
|
|
33
34
|
OrganizationId: organization.id,
|
|
34
35
|
UserId: user.id,
|
|
35
|
-
role:
|
|
36
|
+
role: PredefinedOrganizationRole.Owner,
|
|
36
37
|
});
|
|
37
38
|
await Organization.create({ id: 'appsemble', name: 'Appsemble' });
|
|
38
39
|
await BlockVersion.create({
|
|
@@ -212,7 +213,7 @@ describe('publishApp', () => {
|
|
|
212
213
|
});
|
|
213
214
|
it('should publish app with resources and assets', async () => {
|
|
214
215
|
vi.useRealTimers();
|
|
215
|
-
const clientCredentials = await authorizeCLI('apps:write resources:write', testApp);
|
|
216
|
+
const clientCredentials = await authorizeCLI('apps:write resources:write assets:write', testApp);
|
|
216
217
|
await publishApp({
|
|
217
218
|
path: resolveFixture('apps/test'),
|
|
218
219
|
organization: organization.id,
|
|
@@ -367,7 +368,7 @@ describe('publishApp', () => {
|
|
|
367
368
|
visibility: 'public',
|
|
368
369
|
});
|
|
369
370
|
vi.useRealTimers();
|
|
370
|
-
const clientCredentials = await authorizeCLI('apps:write resources:write', testApp);
|
|
371
|
+
const clientCredentials = await authorizeCLI('apps:write resources:write assets:write', testApp);
|
|
371
372
|
await publishApp({
|
|
372
373
|
path: resolveFixture('apps/test'),
|
|
373
374
|
organization: organization.id,
|
|
@@ -526,7 +527,7 @@ describe('publishApp', () => {
|
|
|
526
527
|
});
|
|
527
528
|
it('should publish app with app variant patches applied', async () => {
|
|
528
529
|
vi.useRealTimers();
|
|
529
|
-
const clientCredentials = await authorizeCLI('apps:write resources:write', testApp);
|
|
530
|
+
const clientCredentials = await authorizeCLI('apps:write resources:write assets:write', testApp);
|
|
530
531
|
await publishApp({
|
|
531
532
|
path: resolveFixture('apps/test'),
|
|
532
533
|
organization: organization.id,
|
|
@@ -752,6 +753,7 @@ describe('publishApp', () => {
|
|
|
752
753
|
});
|
|
753
754
|
expect(appSamlSecret.toJSON()).toStrictEqual({
|
|
754
755
|
emailAttribute: 'email',
|
|
756
|
+
emailVerifiedAttribute: null,
|
|
755
757
|
entityId: 'http://localhost:1234',
|
|
756
758
|
icon: 'redhat',
|
|
757
759
|
id: 1,
|
|
@@ -987,7 +989,7 @@ describe('updateApp', () => {
|
|
|
987
989
|
});
|
|
988
990
|
it('should update app with resources and assets', async () => {
|
|
989
991
|
vi.useRealTimers();
|
|
990
|
-
const clientCredentials = await authorizeCLI('apps:write resources:write', testApp);
|
|
992
|
+
const clientCredentials = await authorizeCLI('apps:write resources:write assets:write', testApp);
|
|
991
993
|
await updateApp({
|
|
992
994
|
id: app.id,
|
|
993
995
|
path: resolveFixture('apps/test'),
|
|
@@ -1143,7 +1145,7 @@ describe('updateApp', () => {
|
|
|
1143
1145
|
visibility: 'public',
|
|
1144
1146
|
});
|
|
1145
1147
|
vi.useRealTimers();
|
|
1146
|
-
const clientCredentials = await authorizeCLI('apps:write resources:write', testApp);
|
|
1148
|
+
const clientCredentials = await authorizeCLI('apps:write resources:write assets:write', testApp);
|
|
1147
1149
|
await updateApp({
|
|
1148
1150
|
path: resolveFixture('apps/test'),
|
|
1149
1151
|
id: app.id,
|
|
@@ -1304,7 +1306,7 @@ describe('updateApp', () => {
|
|
|
1304
1306
|
});
|
|
1305
1307
|
it('should update app with app variant patches applied', async () => {
|
|
1306
1308
|
vi.useRealTimers();
|
|
1307
|
-
const clientCredentials = await authorizeCLI('apps:write resources:write', testApp);
|
|
1309
|
+
const clientCredentials = await authorizeCLI('apps:write resources:write assets:write', testApp);
|
|
1308
1310
|
await updateApp({
|
|
1309
1311
|
path: resolveFixture('apps/test'),
|
|
1310
1312
|
id: app.id,
|
|
@@ -1532,6 +1534,7 @@ describe('updateApp', () => {
|
|
|
1532
1534
|
});
|
|
1533
1535
|
expect(appSamlSecret.toJSON()).toStrictEqual({
|
|
1534
1536
|
emailAttribute: 'email',
|
|
1537
|
+
emailVerifiedAttribute: null,
|
|
1535
1538
|
entityId: 'http://localhost:1234',
|
|
1536
1539
|
icon: 'redhat',
|
|
1537
1540
|
id: 1,
|
package/lib/asset.js
CHANGED
|
@@ -12,8 +12,10 @@ export async function publishAsset({ appId, clonable, name, path, remote, seed,
|
|
|
12
12
|
if (name) {
|
|
13
13
|
formData.append('name', normalize(name));
|
|
14
14
|
}
|
|
15
|
-
const
|
|
16
|
-
|
|
15
|
+
const { data: { id }, } = await axios.post(`/api/apps/${appId}/assets`, formData, {
|
|
16
|
+
baseURL: remote,
|
|
17
|
+
params: { seed },
|
|
18
|
+
});
|
|
17
19
|
logger.info(`Published asset ${id}${name ? ` with name ${normalize(name)}` : ''}`);
|
|
18
20
|
}
|
|
19
21
|
catch (error) {
|
package/lib/asset.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 { publishAsset } from './asset.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
|
});
|
|
@@ -63,6 +64,7 @@ describe('publishAsset', () => {
|
|
|
63
64
|
{
|
|
64
65
|
"AppId": 1,
|
|
65
66
|
"AppMemberId": null,
|
|
67
|
+
"GroupId": null,
|
|
66
68
|
"ResourceId": null,
|
|
67
69
|
"clonable": false,
|
|
68
70
|
"created": 1970-01-01T00:00:00.000Z,
|
package/lib/block.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 concat from 'concat-stream';
|
|
5
6
|
import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
@@ -31,7 +32,7 @@ beforeEach(async () => {
|
|
|
31
32
|
await OrganizationMember.create({
|
|
32
33
|
OrganizationId: organization.id,
|
|
33
34
|
UserId: user.id,
|
|
34
|
-
role:
|
|
35
|
+
role: PredefinedOrganizationRole.Owner,
|
|
35
36
|
});
|
|
36
37
|
await Organization.create({ id: 'appsemble', name: 'Appsemble' });
|
|
37
38
|
});
|
package/lib/createServers.js
CHANGED
|
@@ -36,7 +36,9 @@ export function createApiServer({ context }) {
|
|
|
36
36
|
app.use(compress());
|
|
37
37
|
}
|
|
38
38
|
app.use(compose([
|
|
39
|
-
conditional((ctx) => ctx.path.startsWith('/api') ||
|
|
39
|
+
conditional((ctx) => ctx.path.startsWith('/api') ||
|
|
40
|
+
ctx.path === '/auth/oauth2/token' ||
|
|
41
|
+
/\/apps\/\d+\/auth\/oauth2\/token/.test(ctx.path), cors()),
|
|
40
42
|
koas(api(version, argv), [
|
|
41
43
|
parameters(),
|
|
42
44
|
bodyParser(),
|
package/lib/group.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type AppRole } from '@appsemble/types';
|
|
2
|
+
interface SharedGroupParams {
|
|
3
|
+
/**
|
|
4
|
+
* The ID of the app to create the group for.
|
|
5
|
+
*/
|
|
6
|
+
appId: number;
|
|
7
|
+
/**
|
|
8
|
+
* The remote server to create the group on.
|
|
9
|
+
*/
|
|
10
|
+
remote: string;
|
|
11
|
+
/**
|
|
12
|
+
* The client credentials used to authenticate
|
|
13
|
+
*/
|
|
14
|
+
clientCredentials?: string;
|
|
15
|
+
}
|
|
16
|
+
interface SharedExistingGroupParams extends SharedGroupParams {
|
|
17
|
+
/**
|
|
18
|
+
* The ID of the group.
|
|
19
|
+
*/
|
|
20
|
+
id: number;
|
|
21
|
+
}
|
|
22
|
+
interface SharedGroupMemberParams extends SharedExistingGroupParams {
|
|
23
|
+
/**
|
|
24
|
+
* The ID or email address of the group member.
|
|
25
|
+
*/
|
|
26
|
+
user: string;
|
|
27
|
+
}
|
|
28
|
+
interface UpdateGroupMemberParams extends SharedGroupMemberParams {
|
|
29
|
+
/**
|
|
30
|
+
* The new role of the group member.
|
|
31
|
+
*/
|
|
32
|
+
role: AppRole;
|
|
33
|
+
}
|
|
34
|
+
interface UpdateGroupParams extends SharedExistingGroupParams {
|
|
35
|
+
/**
|
|
36
|
+
* The new name of the group.
|
|
37
|
+
*/
|
|
38
|
+
name?: string;
|
|
39
|
+
/**
|
|
40
|
+
* The list of annotations to apply in key=value format.
|
|
41
|
+
*/
|
|
42
|
+
annotations?: string[];
|
|
43
|
+
}
|
|
44
|
+
interface CreateGroupParams extends SharedGroupParams {
|
|
45
|
+
/**
|
|
46
|
+
* The name of the group.
|
|
47
|
+
*/
|
|
48
|
+
name: string;
|
|
49
|
+
/**
|
|
50
|
+
* The list of annotations to apply in key=value format.
|
|
51
|
+
*/
|
|
52
|
+
annotations?: string[];
|
|
53
|
+
}
|
|
54
|
+
export declare function resolveAnnotations(annotations: string[]): Record<string, string>;
|
|
55
|
+
export declare function createGroup({ annotations, appId, clientCredentials, name, remote, }: CreateGroupParams): Promise<void>;
|
|
56
|
+
export declare function deleteGroup({ clientCredentials, id, remote, }: SharedExistingGroupParams): Promise<void>;
|
|
57
|
+
export declare function updateGroup({ annotations, id, name, remote, }: UpdateGroupParams): Promise<void>;
|
|
58
|
+
export declare function inviteMember({ id, remote, user }: SharedGroupMemberParams): Promise<void>;
|
|
59
|
+
export declare function updateMember({ id, remote, role, user, }: UpdateGroupMemberParams): Promise<void>;
|
|
60
|
+
export declare function deleteMember({ id, user }: SharedGroupMemberParams): Promise<void>;
|
|
61
|
+
export {};
|
package/lib/group.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { AppsembleError, authenticate, logger } from '@appsemble/node-utils';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
export function resolveAnnotations(annotations) {
|
|
4
|
+
const annotationRegex = /^\w+=.+$/;
|
|
5
|
+
if (annotations.some((a) => !annotationRegex.test(a))) {
|
|
6
|
+
throw new AppsembleError('One of the annotations did not follow the pattern of key=value');
|
|
7
|
+
}
|
|
8
|
+
return annotations.length
|
|
9
|
+
? Object.fromEntries(annotations.map((annotation) => {
|
|
10
|
+
const [key, ...value] = annotation.split('=');
|
|
11
|
+
return [key, value.join('=')];
|
|
12
|
+
}))
|
|
13
|
+
: undefined;
|
|
14
|
+
}
|
|
15
|
+
export async function createGroup({ annotations = [], appId, clientCredentials, name, remote, }) {
|
|
16
|
+
logger.info(`Creating group ${name}`);
|
|
17
|
+
await authenticate(remote, 'groups:write', clientCredentials);
|
|
18
|
+
const { data: { id }, } = await axios.post(`/api/apps/${appId}/groups`, {
|
|
19
|
+
name,
|
|
20
|
+
annotations: resolveAnnotations(annotations),
|
|
21
|
+
}, { baseURL: remote });
|
|
22
|
+
logger.info(`Successfully created group ${name} with ID ${id}`);
|
|
23
|
+
}
|
|
24
|
+
export async function deleteGroup({ clientCredentials, id, remote, }) {
|
|
25
|
+
await authenticate(remote, 'groups:write', clientCredentials);
|
|
26
|
+
logger.info(`Deleting group ${id}`);
|
|
27
|
+
await axios.delete(`/api/groups/${id}`, { baseURL: remote });
|
|
28
|
+
logger.info(`Successfully deleted group ${id}`);
|
|
29
|
+
}
|
|
30
|
+
export async function updateGroup({ annotations = [], id, name, remote, }) {
|
|
31
|
+
logger.info(`Updating group ${id}`);
|
|
32
|
+
await axios.patch(`/api/groups/${id}`, {
|
|
33
|
+
name,
|
|
34
|
+
annotations: resolveAnnotations(annotations),
|
|
35
|
+
}, { baseURL: remote });
|
|
36
|
+
logger.info(`Successfully updated group ${id}`);
|
|
37
|
+
}
|
|
38
|
+
export async function inviteMember({ id, remote, user }) {
|
|
39
|
+
logger.info(`Inviting ${user} to group ${id}`);
|
|
40
|
+
await axios.post(`/api/groups/${id}/invites`, [{ email: user, role: 'Member' }], {
|
|
41
|
+
baseURL: remote,
|
|
42
|
+
});
|
|
43
|
+
logger.info(`Successfully invited ${user} to group ${id}`);
|
|
44
|
+
}
|
|
45
|
+
export async function updateMember({ id, remote, role, user, }) {
|
|
46
|
+
logger.info(`Updating ${user}’s role in group ${id} to ${role}`);
|
|
47
|
+
await axios.put(`/api/group-members/${user}/role`, { role }, { baseURL: remote });
|
|
48
|
+
logger.info(`Successfully updated ${user} in group ${id}`);
|
|
49
|
+
}
|
|
50
|
+
export async function deleteMember({ id, user }) {
|
|
51
|
+
logger.info(`Deleting ${user} to group ${id}`);
|
|
52
|
+
await axios.delete(`/api/group-members/${user}?selectedGroupId=${id}`);
|
|
53
|
+
logger.info(`Successfully deleted ${user} from group ${id}`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=group.js.map
|