@axinom/mosaic-cli 0.27.0-rc.6 → 0.27.0-rc.7

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/dist/cli/index.js CHANGED
@@ -12,6 +12,7 @@ const msg_codegen_1 = require("../commands/msg-codegen");
12
12
  const msg_diff_1 = require("../commands/msg-diff");
13
13
  const pg_dump_1 = require("../commands/pg-dump");
14
14
  const publish_schema_to_db_1 = require("../commands/publish-schema-to-db");
15
+ const service_1 = require("../commands/service");
15
16
  const unpublish_pilet_1 = require("../commands/unpublish-pilet");
16
17
  const run = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
17
18
  yargs
@@ -26,7 +27,8 @@ const run = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
26
27
  .command(create_extension_config_1.createExtensionConfigCommand)
27
28
  .command(graphql_diff_1.graphqlDiff)
28
29
  .command(hosting_1.hosting)
29
- .command(unpublish_pilet_1.unpublishPilet);
30
+ .command(unpublish_pilet_1.unpublishPilet)
31
+ .command(service_1.service);
30
32
  //adding cli extensions:
31
33
  yield Promise.all((0, create_extension_config_1.getExtensions)().map((library) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
32
34
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;AAAA,+BAA+B;AAC/B,iEAA6D;AAC7D,iFAG6C;AAC7C,mEAA8D;AAC9D,2DAAuD;AACvD,iDAA8C;AAC9C,yDAAqD;AACrD,mDAA+C;AAC/C,iDAA6C;AAC7C,2EAAqE;AACrE,iEAA6D;AAEtD,MAAM,GAAG,GAAG,GAAwB,EAAE;IAC3C,KAAK;SACF,UAAU,CAAC,QAAQ,CAAC;SACpB,GAAG,EAAE;SACL,OAAO,CAAC,gCAAc,CAAC;SACvB,OAAO,CAAC,iCAAc,CAAC;SACvB,OAAO,CAAC,wCAAiB,CAAC;SAC1B,OAAO,CAAC,gBAAM,CAAC;SACf,OAAO,CAAC,wBAAU,CAAC;SACnB,OAAO,CAAC,kBAAO,CAAC;SAChB,OAAO,CAAC,sDAA4B,CAAC;SACrC,OAAO,CAAC,0BAAW,CAAC;SACpB,OAAO,CAAC,iBAAO,CAAC;SAChB,OAAO,CAAC,gCAAc,CAAC,CAAC;IAE3B,wBAAwB;IACxB,MAAM,OAAO,CAAC,GAAG,CACf,IAAA,uCAAa,GAAE,CAAC,GAAG,CAAC,CAAO,OAAO,EAAE,EAAE;QACpC,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,YAAY,EAAE;gBAChB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;aACJ;SACF;QAAC,OAAO,KAAK,EAAE;YACd,gEAAgE;SACjE;IACH,CAAC,CAAA,CAAC,CACH,CAAC;IAEF,KAAK;SACF,aAAa,EAAE;SACf,IAAI,EAAE;SACN,MAAM,CAAC,wDAAwD,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC,CAAA,CAAC;AAnCW,QAAA,GAAG,OAmCd"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;AAAA,+BAA+B;AAC/B,iEAA6D;AAC7D,iFAG6C;AAC7C,mEAA8D;AAC9D,2DAAuD;AACvD,iDAA8C;AAC9C,yDAAqD;AACrD,mDAA+C;AAC/C,iDAA6C;AAC7C,2EAAqE;AACrE,iDAA8C;AAC9C,iEAA6D;AAEtD,MAAM,GAAG,GAAG,GAAwB,EAAE;IAC3C,KAAK;SACF,UAAU,CAAC,QAAQ,CAAC;SACpB,GAAG,EAAE;SACL,OAAO,CAAC,gCAAc,CAAC;SACvB,OAAO,CAAC,iCAAc,CAAC;SACvB,OAAO,CAAC,wCAAiB,CAAC;SAC1B,OAAO,CAAC,gBAAM,CAAC;SACf,OAAO,CAAC,wBAAU,CAAC;SACnB,OAAO,CAAC,kBAAO,CAAC;SAChB,OAAO,CAAC,sDAA4B,CAAC;SACrC,OAAO,CAAC,0BAAW,CAAC;SACpB,OAAO,CAAC,iBAAO,CAAC;SAChB,OAAO,CAAC,gCAAc,CAAC;SACvB,OAAO,CAAC,iBAAO,CAAC,CAAC;IAEpB,wBAAwB;IACxB,MAAM,OAAO,CAAC,GAAG,CACf,IAAA,uCAAa,GAAE,CAAC,GAAG,CAAC,CAAO,OAAO,EAAE,EAAE;QACpC,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,YAAY,EAAE;gBAChB,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC;aACJ;SACF;QAAC,OAAO,KAAK,EAAE;YACd,gEAAgE;SACjE;IACH,CAAC,CAAA,CAAC,CACH,CAAC;IAEF,KAAK;SACF,aAAa,EAAE;SACf,IAAI,EAAE;SACN,MAAM,CAAC,wDAAwD,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC,CAAA,CAAC;AApCW,QAAA,GAAG,OAoCd"}
@@ -0,0 +1,2 @@
1
+ import { CommandModule } from 'yargs';
2
+ export declare const service: CommandModule<unknown, unknown>;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.service = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const chalk_1 = require("chalk");
6
+ const sync_permissions_1 = require("./sync-permissions");
7
+ exports.service = {
8
+ command: 'service',
9
+ describe: 'General commands related to Mosaic services.',
10
+ builder: (yargs) => yargs
11
+ .command('sync-permissions', 'Synchronize permissions for a given service with ID Service.', syncPermissions)
12
+ .demandCommand(),
13
+ handler: (_args) => {
14
+ console.log('Please pick a sub command related to Mosaic services.');
15
+ },
16
+ };
17
+ const syncPermissions = {
18
+ builder: (yargs) => {
19
+ return yargs
20
+ .option('serviceId', {
21
+ describe: 'Service ID the permissions should be synchronized to. If no value is explicity given, environment variable SERVICE_ID will be used.',
22
+ alias: 'i',
23
+ string: true,
24
+ })
25
+ .option('idServiceAuthBaseURL', {
26
+ describe: 'ID Service Authentication Endpoint Base URL. If no value is explicity given, environment variable ID_SERVICE_AUTH_BASE_URL will be used.',
27
+ alias: 'a',
28
+ string: true,
29
+ })
30
+ .option('permissionDefinitionJsonPath', {
31
+ describe: 'Path to permission-definition.json file. The default location is src/generated/security/permission-definition.json',
32
+ alias: 'p',
33
+ string: true,
34
+ })
35
+ .option('clientId', {
36
+ describe: 'Client ID of a Service Account which has Synchronize Permission permission assigned. If no value is explicity given, environment variable SERVICE_ACCOUNT_CLIENT_ID will be used.',
37
+ alias: 'c',
38
+ string: true,
39
+ })
40
+ .option('clientSecret', {
41
+ describe: 'Client Secret for the above Client ID. If no value is explicity given, environment variable SERVICE_ACCOUNT_CLIENT_SECRET will be used.',
42
+ alias: 's',
43
+ string: true,
44
+ });
45
+ },
46
+ handler: (args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
47
+ const [validatedArgs, errorMessages] = (0, sync_permissions_1.validateArgs)(args);
48
+ if (errorMessages.length > 0) {
49
+ console.log((0, chalk_1.red)('Some required arguments are missing.'));
50
+ errorMessages.map((message) => {
51
+ console.log((0, chalk_1.yellow)(`${message}`));
52
+ });
53
+ console.log();
54
+ }
55
+ else {
56
+ yield (0, sync_permissions_1.synchronizePermissions)(validatedArgs);
57
+ }
58
+ }),
59
+ };
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/service/index.ts"],"names":[],"mappings":";;;;AAAA,iCAAoC;AAEpC,yDAA0E;AAG7D,QAAA,OAAO,GAAoC;IACtD,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,8CAA8C;IACxD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CACN,kBAAkB,EAClB,8DAA8D,EAC9D,eAAe,CAChB;SACA,aAAa,EAAE;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;CACF,CAAC;AAEF,MAAM,eAAe,GAAsD;IACzE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,KAAK;aACT,MAAM,CAAC,WAAW,EAAE;YACnB,QAAQ,EACN,qIAAqI;YACvI,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,sBAAsB,EAAE;YAC9B,QAAQ,EACN,0IAA0I;YAC5I,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,8BAA8B,EAAE;YACtC,QAAQ,EACN,oHAAoH;YACtH,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,UAAU,EAAE;YAClB,QAAQ,EACN,mLAAmL;YACrL,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC;aACD,MAAM,CAAC,cAAc,EAAE;YACtB,QAAQ,EACN,yIAAyI;YAC3I,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,CAAO,IAAI,EAAE,EAAE;QACtB,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,IAAA,+BAAY,EAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,IAAA,WAAG,EAAC,sCAAsC,CAAC,CAAC,CAAC;YACzD,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5B,OAAO,CAAC,GAAG,CAAC,IAAA,cAAM,EAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,EAAE,CAAC;SACf;aAAM;YACL,MAAM,IAAA,yCAAsB,EAAC,aAAa,CAAC,CAAC;SAC7C;IACH,CAAC,CAAA;CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Options to Synchronize Permissions
3
+ */
4
+ export interface GetSyncPermissionsOptions {
5
+ serviceId?: string;
6
+ idServiceAuthBaseURL?: string;
7
+ permissionDefinitionJsonPath?: string;
8
+ clientId?: string;
9
+ clientSecret?: string;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=sync-permissions-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-permissions-options.js","sourceRoot":"","sources":["../../../src/commands/service/sync-permissions-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { GetSyncPermissionsOptions } from './sync-permissions-options';
2
+ export declare const validateArgs: (args: GetSyncPermissionsOptions) => [Required<GetSyncPermissionsOptions>, string[]];
3
+ export declare const synchronizePermissions: (args: Required<GetSyncPermissionsOptions>) => Promise<void>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.synchronizePermissions = exports.validateArgs = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const mosaic_id_link_be_1 = require("@axinom/mosaic-id-link-be");
6
+ const mosaic_service_common_1 = require("@axinom/mosaic-service-common");
7
+ const chalk_1 = require("chalk");
8
+ const fs = require("fs");
9
+ const validateArgs = (args) => {
10
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
11
+ const errorMessages = [];
12
+ const serviceId = (_b = (_a = args.serviceId) !== null && _a !== void 0 ? _a : process.env.SERVICE_ID) !== null && _b !== void 0 ? _b : '';
13
+ const idServiceAuthBaseURL = (_d = (_c = args.idServiceAuthBaseURL) !== null && _c !== void 0 ? _c : process.env.ID_SERVICE_AUTH_BASE_URL) !== null && _d !== void 0 ? _d : '';
14
+ const permissionDefinitionJsonPath = (_e = args.permissionDefinitionJsonPath) !== null && _e !== void 0 ? _e : `./src/generated/security/permission-definition.json`;
15
+ const clientId = (_g = (_f = args.clientId) !== null && _f !== void 0 ? _f : process.env.SERVICE_ACCOUNT_CLIENT_ID) !== null && _g !== void 0 ? _g : '';
16
+ const clientSecret = (_j = (_h = args.clientSecret) !== null && _h !== void 0 ? _h : process.env.SERVICE_ACCOUNT_CLIENT_SECRET) !== null && _j !== void 0 ? _j : '';
17
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(serviceId)) {
18
+ errorMessages.push('[serviceId] is required.');
19
+ }
20
+ else if (serviceId.startsWith('ax-')) {
21
+ errorMessages.push(`[serviceId] cannot start with ax-`);
22
+ }
23
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(idServiceAuthBaseURL)) {
24
+ errorMessages.push('[idServiceBaseURL] is required.');
25
+ }
26
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(clientId)) {
27
+ errorMessages.push('[clientId] is required.');
28
+ }
29
+ if ((0, mosaic_service_common_1.isNullOrWhitespace)(clientSecret)) {
30
+ errorMessages.push('[clientSecret] is required.');
31
+ }
32
+ return [
33
+ {
34
+ serviceId,
35
+ idServiceAuthBaseURL,
36
+ permissionDefinitionJsonPath,
37
+ clientId,
38
+ clientSecret,
39
+ },
40
+ errorMessages,
41
+ ];
42
+ };
43
+ exports.validateArgs = validateArgs;
44
+ const synchronizePermissions = (args) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
45
+ try {
46
+ const serviceAccountToken = yield (0, mosaic_id_link_be_1.getServiceAccountToken)(args.idServiceAuthBaseURL, args.clientId, args.clientSecret);
47
+ console.log((0, chalk_1.yellow)(`Reading permissions from ${args.permissionDefinitionJsonPath}`));
48
+ const permissionDefinition = JSON.parse(fs.readFileSync(args.permissionDefinitionJsonPath, 'utf-8'));
49
+ if (permissionDefinition === undefined ||
50
+ permissionDefinition.permissions.length === 0) {
51
+ console.log((0, chalk_1.yellow)(`No Permission Definition found in ${args.permissionDefinitionJsonPath}. Cannot proceed with permission synchronization.`));
52
+ return;
53
+ }
54
+ const permissionSyncResults = yield (0, mosaic_id_link_be_1.synchronizePermissions)(args.idServiceAuthBaseURL, serviceAccountToken.accessToken, args.serviceId, permissionDefinition);
55
+ console.log((0, chalk_1.green)(`Permissions synchronized successfully for Service [${args.serviceId}].`));
56
+ console.log((0, chalk_1.green)(JSON.stringify(permissionSyncResults, null, 2)));
57
+ }
58
+ catch (error) {
59
+ (0, mosaic_service_common_1.assertError)(error);
60
+ console.log((0, chalk_1.red)(`Error while performing permission synchronization for Service ID [${args.serviceId}].`));
61
+ console.log((0, chalk_1.red)(JSON.stringify(error.message)));
62
+ }
63
+ });
64
+ exports.synchronizePermissions = synchronizePermissions;
65
+ //# sourceMappingURL=sync-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-permissions.js","sourceRoot":"","sources":["../../../src/commands/service/sync-permissions.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axinom/mosaic-cli",
3
- "version": "0.27.0-rc.6",
3
+ "version": "0.27.0-rc.7",
4
4
  "description": "The Axinom Mosaic CLI",
5
5
  "author": "Axinom",
6
6
  "license": "PROPRIETARY",
@@ -33,8 +33,8 @@
33
33
  "@asyncapi/diff": "^0.4.1",
34
34
  "@asyncapi/modelina": "^1.8.4",
35
35
  "@asyncapi/parser": "^2.0.2",
36
- "@axinom/mosaic-id-link-be": "^0.15.0-rc.6",
37
- "@axinom/mosaic-service-common": "^0.43.0-rc.6",
36
+ "@axinom/mosaic-id-link-be": "^0.15.0-rc.7",
37
+ "@axinom/mosaic-service-common": "^0.43.0-rc.7",
38
38
  "@graphql-inspector/core": "^3.1.2",
39
39
  "@stoplight/spectral-core": "^1.18.3",
40
40
  "@stoplight/spectral-parsers": "^1.0.3",
@@ -70,5 +70,5 @@
70
70
  "publishConfig": {
71
71
  "access": "public"
72
72
  },
73
- "gitHead": "ca05604aba530bf74ad298b542b6fd1596f839c2"
73
+ "gitHead": "24ecd6ea27bdbd59e67064ce7ecd778997bbb89c"
74
74
  }
package/src/cli/index.ts CHANGED
@@ -11,6 +11,7 @@ import { msgCodegen } from '../commands/msg-codegen';
11
11
  import { msgDiff } from '../commands/msg-diff';
12
12
  import { pgDump } from '../commands/pg-dump';
13
13
  import { publishSchemaToDb } from '../commands/publish-schema-to-db';
14
+ import { service } from '../commands/service';
14
15
  import { unpublishPilet } from '../commands/unpublish-pilet';
15
16
 
16
17
  export const run = async (): Promise<void> => {
@@ -26,7 +27,8 @@ export const run = async (): Promise<void> => {
26
27
  .command(createExtensionConfigCommand)
27
28
  .command(graphqlDiff)
28
29
  .command(hosting)
29
- .command(unpublishPilet);
30
+ .command(unpublishPilet)
31
+ .command(service);
30
32
 
31
33
  //adding cli extensions:
32
34
  await Promise.all(
@@ -0,0 +1,69 @@
1
+ import { red, yellow } from 'chalk';
2
+ import { CommandModule } from 'yargs';
3
+ import { synchronizePermissions, validateArgs } from './sync-permissions';
4
+ import { GetSyncPermissionsOptions } from './sync-permissions-options';
5
+
6
+ export const service: CommandModule<unknown, unknown> = {
7
+ command: 'service',
8
+ describe: 'General commands related to Mosaic services.',
9
+ builder: (yargs) =>
10
+ yargs
11
+ .command(
12
+ 'sync-permissions',
13
+ 'Synchronize permissions for a given service with ID Service.',
14
+ syncPermissions,
15
+ )
16
+ .demandCommand(),
17
+ handler: (_args) => {
18
+ console.log('Please pick a sub command related to Mosaic services.');
19
+ },
20
+ };
21
+
22
+ const syncPermissions: CommandModule<unknown, GetSyncPermissionsOptions> = {
23
+ builder: (yargs) => {
24
+ return yargs
25
+ .option('serviceId', {
26
+ describe:
27
+ 'Service ID the permissions should be synchronized to. If no value is explicity given, environment variable SERVICE_ID will be used.',
28
+ alias: 'i',
29
+ string: true,
30
+ })
31
+ .option('idServiceAuthBaseURL', {
32
+ describe:
33
+ 'ID Service Authentication Endpoint Base URL. If no value is explicity given, environment variable ID_SERVICE_AUTH_BASE_URL will be used.',
34
+ alias: 'a',
35
+ string: true,
36
+ })
37
+ .option('permissionDefinitionJsonPath', {
38
+ describe:
39
+ 'Path to permission-definition.json file. The default location is src/generated/security/permission-definition.json',
40
+ alias: 'p',
41
+ string: true,
42
+ })
43
+ .option('clientId', {
44
+ describe:
45
+ 'Client ID of a Service Account which has Synchronize Permission permission assigned. If no value is explicity given, environment variable SERVICE_ACCOUNT_CLIENT_ID will be used.',
46
+ alias: 'c',
47
+ string: true,
48
+ })
49
+ .option('clientSecret', {
50
+ describe:
51
+ 'Client Secret for the above Client ID. If no value is explicity given, environment variable SERVICE_ACCOUNT_CLIENT_SECRET will be used.',
52
+ alias: 's',
53
+ string: true,
54
+ });
55
+ },
56
+ handler: async (args) => {
57
+ const [validatedArgs, errorMessages] = validateArgs(args);
58
+ if (errorMessages.length > 0) {
59
+ console.log(red('Some required arguments are missing.'));
60
+ errorMessages.map((message) => {
61
+ console.log(yellow(`${message}`));
62
+ });
63
+
64
+ console.log();
65
+ } else {
66
+ await synchronizePermissions(validatedArgs);
67
+ }
68
+ },
69
+ };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Options to Synchronize Permissions
3
+ */
4
+ export interface GetSyncPermissionsOptions {
5
+ serviceId?: string;
6
+ idServiceAuthBaseURL?: string;
7
+ permissionDefinitionJsonPath?: string;
8
+ clientId?: string;
9
+ clientSecret?: string;
10
+ }
@@ -0,0 +1,106 @@
1
+ import {
2
+ getServiceAccountToken,
3
+ synchronizePermissions as synchronizePermissionsBe,
4
+ } from '@axinom/mosaic-id-link-be';
5
+ import { PermissionDefinition } from '@axinom/mosaic-id-utils';
6
+ import { assertError, isNullOrWhitespace } from '@axinom/mosaic-service-common';
7
+ import { green, red, yellow } from 'chalk';
8
+ import * as fs from 'fs';
9
+ import { GetSyncPermissionsOptions } from './sync-permissions-options';
10
+
11
+ export const validateArgs = (
12
+ args: GetSyncPermissionsOptions,
13
+ ): [Required<GetSyncPermissionsOptions>, string[]] => {
14
+ const errorMessages: string[] = [];
15
+
16
+ const serviceId = args.serviceId ?? process.env.SERVICE_ID ?? '';
17
+
18
+ const idServiceAuthBaseURL =
19
+ args.idServiceAuthBaseURL ?? process.env.ID_SERVICE_AUTH_BASE_URL ?? '';
20
+ const permissionDefinitionJsonPath =
21
+ args.permissionDefinitionJsonPath ??
22
+ `./src/generated/security/permission-definition.json`;
23
+ const clientId = args.clientId ?? process.env.SERVICE_ACCOUNT_CLIENT_ID ?? '';
24
+ const clientSecret =
25
+ args.clientSecret ?? process.env.SERVICE_ACCOUNT_CLIENT_SECRET ?? '';
26
+
27
+ if (isNullOrWhitespace(serviceId)) {
28
+ errorMessages.push('[serviceId] is required.');
29
+ } else if (serviceId.startsWith('ax-')) {
30
+ errorMessages.push(`[serviceId] cannot start with ax-`);
31
+ }
32
+ if (isNullOrWhitespace(idServiceAuthBaseURL)) {
33
+ errorMessages.push('[idServiceBaseURL] is required.');
34
+ }
35
+ if (isNullOrWhitespace(clientId)) {
36
+ errorMessages.push('[clientId] is required.');
37
+ }
38
+ if (isNullOrWhitespace(clientSecret)) {
39
+ errorMessages.push('[clientSecret] is required.');
40
+ }
41
+
42
+ return [
43
+ {
44
+ serviceId,
45
+ idServiceAuthBaseURL,
46
+ permissionDefinitionJsonPath,
47
+ clientId,
48
+ clientSecret,
49
+ },
50
+ errorMessages,
51
+ ];
52
+ };
53
+
54
+ export const synchronizePermissions = async (
55
+ args: Required<GetSyncPermissionsOptions>,
56
+ ): Promise<void> => {
57
+ try {
58
+ const serviceAccountToken = await getServiceAccountToken(
59
+ args.idServiceAuthBaseURL,
60
+ args.clientId,
61
+ args.clientSecret,
62
+ );
63
+
64
+ console.log(
65
+ yellow(`Reading permissions from ${args.permissionDefinitionJsonPath}`),
66
+ );
67
+
68
+ const permissionDefinition: PermissionDefinition = JSON.parse(
69
+ fs.readFileSync(args.permissionDefinitionJsonPath, 'utf-8'),
70
+ );
71
+
72
+ if (
73
+ permissionDefinition === undefined ||
74
+ permissionDefinition.permissions.length === 0
75
+ ) {
76
+ console.log(
77
+ yellow(
78
+ `No Permission Definition found in ${args.permissionDefinitionJsonPath}. Cannot proceed with permission synchronization.`,
79
+ ),
80
+ );
81
+ return;
82
+ }
83
+
84
+ const permissionSyncResults = await synchronizePermissionsBe(
85
+ args.idServiceAuthBaseURL,
86
+ serviceAccountToken.accessToken,
87
+ args.serviceId,
88
+ permissionDefinition,
89
+ );
90
+
91
+ console.log(
92
+ green(
93
+ `Permissions synchronized successfully for Service [${args.serviceId}].`,
94
+ ),
95
+ );
96
+ console.log(green(JSON.stringify(permissionSyncResults, null, 2)));
97
+ } catch (error) {
98
+ assertError(error);
99
+ console.log(
100
+ red(
101
+ `Error while performing permission synchronization for Service ID [${args.serviceId}].`,
102
+ ),
103
+ );
104
+ console.log(red(JSON.stringify(error.message)));
105
+ }
106
+ };