@telia-ace/alliance-portal 1.0.6-next.7 → 1.0.7-next.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @telia-ace/alliance-portal
2
2
 
3
+ ## 1.0.7-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - cd44395: Support customer / workspace specific portals.
8
+ - Updated dependencies [cd44395]
9
+ - @telia-ace/alliance-internal-node-utilities@1.0.4-next.0
10
+
11
+ ## 1.0.6
12
+
13
+ ### Patch Changes
14
+
15
+ - e8eda01: Fix issue with user session cookie being too large.
16
+ - ba13c59: Use `.env` files for configuration during development instead of JS/TS modules.
17
+ - 0f20a09: Change to unformatted JSON logs.
18
+ - ba13c59: Set user as `system-admin` if user claims include ACE Enterprise Admin group/role.
19
+ - f2aafe4: Store user session in Redis cache to avoid hitting cookie size limits (https://github.com/telia-company/ace-alliance-sdk/issues/377).
20
+ - cb4647b: Fix incomprehensible unauthorized text for users with insufficient workspace access.
21
+ - f743a2b: Skip checking user claims for groups when `AUTH_SKIP_GROUP_CLAIM_CHECK` is set to `'true'`.
22
+ - Updated dependencies [0f20a09]
23
+ - Updated dependencies [ba11e1f]
24
+ - Updated dependencies [f2aafe4]
25
+ - Updated dependencies [828548a]
26
+ - Updated dependencies [c9b1488]
27
+ - @telia-ace/alliance-internal-node-utilities@1.0.3
28
+
3
29
  ## 1.0.6-next.7
4
30
 
5
31
  ### Patch Changes
@@ -1,103 +1,4 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.AppController = void 0;
16
- const axios_1 = require("@nestjs/axios");
17
- const common_1 = require("@nestjs/common");
18
- const config_1 = require("@nestjs/config");
19
- const alliance_internal_node_utilities_1 = require("@telia-ace/alliance-internal-node-utilities");
20
- const graphql_request_1 = require("graphql-request");
21
- const config_2 = require("./config");
22
- const graphql_1 = require("./graphql");
23
- let AppController = exports.AppController = class AppController {
24
- logger;
25
- configService;
26
- httpService;
27
- constructor(logger, configService, httpService) {
28
- this.logger = logger;
29
- this.configService = configService;
30
- this.httpService = httpService;
31
- }
32
- signin() { }
33
- catchall() {
34
- return '';
35
- }
36
- async cookiePolicy() {
37
- const policyUrl = this.configService.getOrThrow(config_2.ConfigKeys.WebprovisionsDistributionCookiePolicyUrl);
38
- const { data } = await this.httpService.axiosRef.get(policyUrl);
39
- return data;
40
- }
41
- async index(req, workspaceSlug) {
42
- let userHasAccess = false;
43
- try {
44
- const objectId = req.oidc.user.sub;
45
- const { user } = await (0, graphql_request_1.request)(this.configService.getOrThrow(alliance_internal_node_utilities_1.SharedConfigKeys.DbEndpoint), graphql_1.GetUserDocument, { objectId, workspaceSlug }, {
46
- authorization: (0, alliance_internal_node_utilities_1.createSystemUserToken)(this.configService),
47
- });
48
- userHasAccess = !!user.id;
49
- }
50
- catch { }
51
- if (!userHasAccess) {
52
- return htmlTemplate(unauthorizedPortalBody());
53
- }
54
- const distributionOptions = {};
55
- const distributionUrl = this.configService.getOrThrow(config_2.ConfigKeys.WebprovisionsDistributionUrl);
56
- if (!req.query['wp-tag'] && !req.query['wp-version']) {
57
- distributionOptions.tag = this.configService.getOrThrow(config_2.ConfigKeys.WebprovisionsTag);
58
- }
59
- this.logger.trace('opening portal', {
60
- user: req.oidc.user,
61
- distributionOptions,
62
- distributionUrl,
63
- });
64
- return htmlTemplate(portalBody(distributionUrl, distributionOptions));
65
- }
66
- };
67
- __decorate([
68
- (0, common_1.Get)('/signin-oidc'),
69
- __metadata("design:type", Function),
70
- __metadata("design:paramtypes", []),
71
- __metadata("design:returntype", void 0)
72
- ], AppController.prototype, "signin", null);
73
- __decorate([
74
- (0, common_1.Get)('/favicon*'),
75
- __metadata("design:type", Function),
76
- __metadata("design:paramtypes", []),
77
- __metadata("design:returntype", void 0)
78
- ], AppController.prototype, "catchall", null);
79
- __decorate([
80
- (0, common_1.Get)('/:workspace/cookie-policy'),
81
- __metadata("design:type", Function),
82
- __metadata("design:paramtypes", []),
83
- __metadata("design:returntype", Promise)
84
- ], AppController.prototype, "cookiePolicy", null);
85
- __decorate([
86
- (0, common_1.Get)(['/:workspace', '/:workspace/*']),
87
- __param(0, (0, common_1.Req)()),
88
- __param(1, (0, common_1.Param)('workspace')),
89
- __metadata("design:type", Function),
90
- __metadata("design:paramtypes", [Object, String]),
91
- __metadata("design:returntype", Promise)
92
- ], AppController.prototype, "index", null);
93
- exports.AppController = AppController = __decorate([
94
- (0, common_1.Controller)(),
95
- __metadata("design:paramtypes", [alliance_internal_node_utilities_1.LoggerService,
96
- config_1.ConfigService,
97
- axios_1.HttpService])
98
- ], AppController);
99
- // Taken from https://loading.io/css
100
- const loader = `
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"createAppController",{enumerable:true,get:function(){return createAppController}});const _axios=require("@nestjs/axios");const _common=require("@nestjs/common");const _config=require("@nestjs/config");const _allianceinternalnodeutilities=require("@telia-ace/alliance-internal-node-utilities");const _express=require("express");const _graphqlrequest=require("graphql-request");const _config1=require("./config");const _graphql=require("./graphql");function _ts_decorate(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)if(d=decorators[i])r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r;return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(k,v)}function _ts_param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function createAppController({}){let AppController=class AppController{signin(){}catchall(){return""}async cookiePolicy(){const policyUrl=this.configService.getOrThrow(_config1.ConfigKeys.WebprovisionsDistributionCookiePolicyUrl);const{data}=await this.httpService.axiosRef.get(policyUrl);return data}async index(req,workspaceSlug){let userHasAccess=false;try{const objectId=req.oidc.user.sub;const{user}=await (0,_graphqlrequest.request)(this.configService.getOrThrow(_allianceinternalnodeutilities.SharedConfigKeys.DbEndpoint),_graphql.GetUserDocument,{objectId,workspaceSlug},{authorization:(0,_allianceinternalnodeutilities.createSystemUserToken)(this.configService)});userHasAccess=!!user.id}catch{}if(!userHasAccess){return htmlTemplate(unauthorizedPortalBody())}const distribution={opts:{},url:this.configService.getOrThrow(_config1.ConfigKeys.WebprovisionsDistributionUrl)};if(!req.query["wp-tag"]&&!req.query["wp-version"]){distribution.opts.tag=this.configService.getOrThrow(_config1.ConfigKeys.WebprovisionsTag)}this.logger.info("opening portal",{user:req.oidc.user,distribution,workspaceSlug});return htmlTemplate(portalBody({distribution,workspaceSlug}))}constructor(logger,configService,httpService){this.logger=logger;this.configService=configService;this.httpService=httpService}};_ts_decorate([(0,_common.Get)("/signin-oidc"),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[])],AppController.prototype,"signin",null);_ts_decorate([(0,_common.Get)("/favicon*"),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[])],AppController.prototype,"catchall",null);_ts_decorate([(0,_common.Get)(["/:workspace/cookie-policy"]),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[])],AppController.prototype,"cookiePolicy",null);_ts_decorate([(0,_common.Get)(["/:workspace*"]),_ts_param(0,(0,_common.Req)()),_ts_param(1,(0,_common.Param)("workspace")),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[typeof _express.Request==="undefined"?Object:_express.Request,String])],AppController.prototype,"index",null);AppController=_ts_decorate([(0,_common.Controller)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[typeof _allianceinternalnodeutilities.LoggerService==="undefined"?Object:_allianceinternalnodeutilities.LoggerService,typeof _config.ConfigService==="undefined"?Object:_config.ConfigService,typeof _axios.HttpService==="undefined"?Object:_axios.HttpService])],AppController);return AppController}const loader=`
101
2
  <style>
102
3
  .alliance-portal-loader-wrapper {
103
4
  position: fixed;
@@ -203,9 +104,16 @@ const loader = `
203
104
  <div></div>
204
105
  </div>
205
106
  </div>
206
- `;
207
- function portalBody(distributionUrl, distributionOpts) {
208
- return `
107
+ `;function rootUrl(workspaceSlug,customerSlug){if(customerSlug){return`/${customerSlug}/${workspaceSlug}`}return`/${workspaceSlug}`}function portalBody({distribution,customerSlug,workspaceSlug}){const runtimeVariableScript=`
108
+ <script>
109
+ const { origin, pathname } = window.location;
110
+
111
+ window.__ALLIANCE_RUNTIME_ROOT_URL = origin + '${rootUrl(workspaceSlug,customerSlug)}';
112
+ window.__ALLIANCE_WORKSPACE = '${workspaceSlug}';
113
+ window.__ALLIANCE_CUSTOMER = ${customerSlug?`'${customerSlug}'`:"undefined"};
114
+ </script>
115
+ `;return`
116
+ ${runtimeVariableScript}
209
117
  <script>
210
118
  /* WEBPROVISIONS */
211
119
  !function(e,n){var o=n||{},c=document,t=window,s=function(n,o){e+=(e.indexOf("?")>-1?"&":"?")+encodeURIComponent(n)+"="
@@ -217,14 +125,11 @@ function portalBody(distributionUrl, distributionOpts) {
217
125
  * url - The url to the remote endpoint for the implementation.
218
126
  * args - Object containing optional arguments for the implementation.
219
127
  */
220
- ("${distributionUrl}", ${JSON.stringify(distributionOpts)})
128
+ ("${distribution.url}", ${JSON.stringify(distribution.opts)})
221
129
  </script>
222
130
 
223
131
  ${loader}
224
- `;
225
- }
226
- function unauthorizedPortalBody() {
227
- return `
132
+ `}function unauthorizedPortalBody(){return`
228
133
  <div class="unauthorized">
229
134
  <h1>401</h1>
230
135
  <p>You don't have permission to access this workspace.</p>
@@ -254,10 +159,7 @@ function unauthorizedPortalBody() {
254
159
  margin: 0;
255
160
  }
256
161
  </style>
257
- `;
258
- }
259
- function htmlTemplate(body) {
260
- return `
162
+ `}function htmlTemplate(body){return`
261
163
  <!DOCTYPE html>
262
164
  <html lang="en">
263
165
 
@@ -274,5 +176,4 @@ function htmlTemplate(body) {
274
176
  </body>
275
177
 
276
178
  </html>
277
- `;
278
- }
179
+ `}
@@ -1,29 +1 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.AppModule = void 0;
10
- const axios_1 = require("@nestjs/axios");
11
- const common_1 = require("@nestjs/common");
12
- const config_1 = require("@nestjs/config");
13
- const alliance_internal_node_utilities_1 = require("@telia-ace/alliance-internal-node-utilities");
14
- const app_controller_1 = require("./app.controller");
15
- let AppModule = exports.AppModule = class AppModule {
16
- };
17
- exports.AppModule = AppModule = __decorate([
18
- (0, common_1.Module)({
19
- controllers: [app_controller_1.AppController],
20
- imports: [
21
- config_1.ConfigModule.forRoot({
22
- isGlobal: true,
23
- }),
24
- alliance_internal_node_utilities_1.LoggerModule.forRoot(),
25
- axios_1.HttpModule,
26
- ],
27
- exports: [],
28
- })
29
- ], AppModule);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"AppModule",{enumerable:true,get:function(){return AppModule}});const _axios=require("@nestjs/axios");const _common=require("@nestjs/common");const _config=require("@nestjs/config");const _allianceinternalnodeutilities=require("@telia-ace/alliance-internal-node-utilities");const _appcontroller=require("./app.controller");function _ts_decorate(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)if(d=decorators[i])r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r;return c>3&&r&&Object.defineProperty(target,key,r),r}let AppModule=class AppModule{};AppModule=_ts_decorate([(0,_common.Module)({controllers:[(0,_appcontroller.createAppController)({})],imports:[_config.ConfigModule.forRoot({isGlobal:true}),_allianceinternalnodeutilities.LoggerModule.forRoot(),_axios.HttpModule],exports:[]})],AppModule);
package/dist/config.js CHANGED
@@ -1,16 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ConfigKeys = void 0;
4
- var ConfigKeys;
5
- (function (ConfigKeys) {
6
- ConfigKeys["AuthScopes"] = "AUTH_SCOPES";
7
- ConfigKeys["AuthAuthority"] = "AUTH_AUTHORITY";
8
- ConfigKeys["AuthClientSecret"] = "AUTH_CLIENT_SECRET";
9
- ConfigKeys["AuthClientId"] = "AUTH_CLIENT_ID";
10
- ConfigKeys["AuthResponseType"] = "AUTH_RESPONSE_TYPE";
11
- ConfigKeys["AuthSkipGroupClaimCheck"] = "AUTH_SKIP_GROUP_CLAIM_CHECK";
12
- ConfigKeys["ServiceBaseUrl"] = "SERVICE_BASE_URL";
13
- ConfigKeys["WebprovisionsTag"] = "WEBPROVISIONS_TAG";
14
- ConfigKeys["WebprovisionsDistributionUrl"] = "WEBPROVISIONS_DISTRIBUTION_URL";
15
- ConfigKeys["WebprovisionsDistributionCookiePolicyUrl"] = "WEBPROVISIONS_DISTRIBUTION_COOKIE_POLICY_URL";
16
- })(ConfigKeys || (exports.ConfigKeys = ConfigKeys = {}));
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ConfigKeys",{enumerable:true,get:function(){return ConfigKeys}});var ConfigKeys;(function(ConfigKeys){ConfigKeys["AuthScopes"]="AUTH_SCOPES";ConfigKeys["AuthAuthority"]="AUTH_AUTHORITY";ConfigKeys["AuthClientSecret"]="AUTH_CLIENT_SECRET";ConfigKeys["AuthClientId"]="AUTH_CLIENT_ID";ConfigKeys["AuthResponseType"]="AUTH_RESPONSE_TYPE";ConfigKeys["AuthSkipGroupClaimCheck"]="AUTH_SKIP_GROUP_CLAIM_CHECK";ConfigKeys["AuthCookiePath"]="AUTH_COOKIE_PATH";ConfigKeys["ServiceBaseUrl"]="SERVICE_BASE_URL";ConfigKeys["WebprovisionsTag"]="WEBPROVISIONS_TAG";ConfigKeys["WebprovisionsDistributionUrl"]="WEBPROVISIONS_DISTRIBUTION_URL";ConfigKeys["WebprovisionsDistributionCookiePolicyUrl"]="WEBPROVISIONS_DISTRIBUTION_COOKIE_POLICY_URL"})(ConfigKeys||(ConfigKeys={}));
@@ -1,6 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GetUserDocument = exports.SetUserTypeDocument = exports.GetOrCreateUserDocument = void 0;
4
- exports.GetOrCreateUserDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "mutation", "name": { "kind": "Name", "value": "GetOrCreateUser" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "input" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "GetOrCreateUserInput" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "getOrCreateUser" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "input" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "input" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "objectId" } }, { "kind": "Field", "name": { "kind": "Name", "value": "displayName" } }, { "kind": "Field", "name": { "kind": "Name", "value": "type" } }] } }] } }] };
5
- exports.SetUserTypeDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "mutation", "name": { "kind": "Name", "value": "SetUserType" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "input" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "SetUserTypeInput" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "setUserType" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "input" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "input" } } }] }] } }] };
6
- exports.GetUserDocument = { "kind": "Document", "definitions": [{ "kind": "OperationDefinition", "operation": "query", "name": { "kind": "Name", "value": "GetUser" }, "variableDefinitions": [{ "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "objectId" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } } }, { "kind": "VariableDefinition", "variable": { "kind": "Variable", "name": { "kind": "Name", "value": "workspaceSlug" } }, "type": { "kind": "NonNullType", "type": { "kind": "NamedType", "name": { "kind": "Name", "value": "String" } } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "user" }, "arguments": [{ "kind": "Argument", "name": { "kind": "Name", "value": "objectId" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "objectId" } } }, { "kind": "Argument", "name": { "kind": "Name", "value": "workspaceSlug" }, "value": { "kind": "Variable", "name": { "kind": "Name", "value": "workspaceSlug" } } }], "selectionSet": { "kind": "SelectionSet", "selections": [{ "kind": "Field", "name": { "kind": "Name", "value": "id" } }] } }] } }] };
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:all[name]})}_export(exports,{GetOrCreateUserDocument:function(){return GetOrCreateUserDocument},GetUserDocument:function(){return GetUserDocument},SetUserTypeDocument:function(){return SetUserTypeDocument}});const GetOrCreateUserDocument={"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"GetOrCreateUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"GetOrCreateUserInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getOrCreateUser"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objectId"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"type"}}]}}]}}]};const SetUserTypeDocument={"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SetUserType"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"SetUserTypeInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setUserType"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}]}]}}]};const GetUserDocument={"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"objectId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"workspaceSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"objectId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"objectId"}}},{"kind":"Argument","name":{"kind":"Name","value":"workspaceSlug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"workspaceSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]};
@@ -1,17 +1 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./generated"), exports);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./generated"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
package/dist/index.js CHANGED
@@ -1,75 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const config_1 = require("@nestjs/config");
4
- const core_1 = require("@nestjs/core");
5
- const alliance_internal_node_utilities_1 = require("@telia-ace/alliance-internal-node-utilities");
6
- const graphql_request_1 = require("graphql-request");
7
- const jose_1 = require("jose");
8
- const app_module_1 = require("./app.module");
9
- const config_2 = require("./config");
10
- const graphql_1 = require("./graphql");
11
- async function startPortal() {
12
- const app = await core_1.NestFactory.create(app_module_1.AppModule, { bufferLogs: true });
13
- const configService = app.get(config_1.ConfigService);
14
- const logger = await app.resolve(alliance_internal_node_utilities_1.LoggerService);
15
- app.useLogger(logger);
16
- app.flushLogs();
17
- app.useGlobalInterceptors(new alliance_internal_node_utilities_1.LoggerErrorInterceptor());
18
- app.useGlobalFilters(new alliance_internal_node_utilities_1.AllianceExceptionFilter());
19
- app.use((0, alliance_internal_node_utilities_1.authMiddleware)(configService, {
20
- baseURL: configService
21
- .getOrThrow(config_2.ConfigKeys.ServiceBaseUrl)
22
- .replace('{{port}}', configService.getOrThrow(alliance_internal_node_utilities_1.SharedConfigKeys.ServicePort)),
23
- clientSecret: configService.getOrThrow(config_2.ConfigKeys.AuthClientSecret),
24
- clientID: configService.getOrThrow(config_2.ConfigKeys.AuthClientId),
25
- authorizationParams: {
26
- response_type: configService.getOrThrow(config_2.ConfigKeys.AuthResponseType),
27
- scope: configService.getOrThrow(config_2.ConfigKeys.AuthScopes),
28
- },
29
- issuerBaseURL: `${configService.getOrThrow(config_2.ConfigKeys.AuthAuthority)}/.well-known/openid-configuration`,
30
- async afterCallback(_, __, session) {
31
- const claims = (0, jose_1.decodeJwt)(session.id_token);
32
- const user = {
33
- displayName: claims.name || 'Empty displayName',
34
- email: claims.email || claims.emails[0] || 'Empty email',
35
- objectId: claims.sub || claims.oid,
36
- };
37
- logger.trace('decoded JWT and mapped claims to user, getting or creating user in database', {
38
- claims,
39
- user,
40
- });
41
- try {
42
- // Create user in database if it doesn't exist
43
- await (0, graphql_request_1.request)(configService.getOrThrow(alliance_internal_node_utilities_1.SharedConfigKeys.DbEndpoint), graphql_1.GetOrCreateUserDocument, { input: user }, {
44
- authorization: (0, alliance_internal_node_utilities_1.createSystemUserToken)(configService),
45
- });
46
- logger.trace('added user to database, if it did not already exist');
47
- }
48
- catch { }
49
- // For easier testing as system admin during development
50
- const skipGroupClaimCheck = configService.get(config_2.ConfigKeys.AuthSkipGroupClaimCheck) ===
51
- 'true';
52
- if (!skipGroupClaimCheck) {
53
- const type = hasEnterpriseAdminRole(claims) ? 'system-admin' : 'user';
54
- logger.trace('updating user type according to user claims', { type });
55
- try {
56
- await (0, graphql_request_1.request)(configService.getOrThrow(alliance_internal_node_utilities_1.SharedConfigKeys.DbEndpoint), graphql_1.SetUserTypeDocument, { input: { objectId: user.objectId, type } }, {
57
- authorization: (0, alliance_internal_node_utilities_1.createSystemUserToken)(configService),
58
- });
59
- logger.trace('user type updated');
60
- }
61
- catch { }
62
- }
63
- return session;
64
- },
65
- }));
66
- await app.listen(configService.getOrThrow(alliance_internal_node_utilities_1.SharedConfigKeys.ServicePort));
67
- }
68
- function hasEnterpriseAdminRole(claims) {
69
- if (!claims.groups) {
70
- return false;
71
- }
72
- const aceEnterpriseAdminRoleId = 'PROD_ACE_Enterprise_Admins';
73
- return claims.groups.includes(aceEnterpriseAdminRoleId);
74
- }
75
- startPortal();
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});const _config=require("@nestjs/config");const _core=require("@nestjs/core");const _allianceinternalnodeutilities=require("@telia-ace/alliance-internal-node-utilities");const _graphqlrequest=require("graphql-request");const _jose=require("jose");const _appmodule=require("./app.module");const _config1=require("./config");const _graphql=require("./graphql");async function startPortal(){const app=await _core.NestFactory.create(_appmodule.AppModule,{bufferLogs:true});const configService=app.get(_config.ConfigService);const logger=await app.resolve(_allianceinternalnodeutilities.LoggerService);app.useLogger(logger);app.flushLogs();app.useGlobalInterceptors(new _allianceinternalnodeutilities.LoggerErrorInterceptor);app.useGlobalFilters(new _allianceinternalnodeutilities.AllianceExceptionFilter);app.use((0,_allianceinternalnodeutilities.authMiddleware)(configService,{baseURL:configService.getOrThrow(_config1.ConfigKeys.ServiceBaseUrl).replace("{{port}}",configService.getOrThrow(_allianceinternalnodeutilities.SharedConfigKeys.ServicePort)),clientSecret:configService.getOrThrow(_config1.ConfigKeys.AuthClientSecret),clientID:configService.getOrThrow(_config1.ConfigKeys.AuthClientId),authorizationParams:{response_type:configService.getOrThrow(_config1.ConfigKeys.AuthResponseType),scope:configService.getOrThrow(_config1.ConfigKeys.AuthScopes)},sessionCookiePath:configService.get(_config1.ConfigKeys.AuthCookiePath),issuerBaseURL:`${configService.getOrThrow(_config1.ConfigKeys.AuthAuthority)}/.well-known/openid-configuration`,async afterCallback(_,__,session){const claims=(0,_jose.decodeJwt)(session.id_token);const user={displayName:claims.name||"Empty displayName",email:claims.email||claims.emails[0]||"Empty email",objectId:claims.sub||claims.oid};logger.trace("decoded JWT and mapped claims to user, getting or creating user in database",{claims,user});try{await (0,_graphqlrequest.request)(configService.getOrThrow(_allianceinternalnodeutilities.SharedConfigKeys.DbEndpoint),_graphql.GetOrCreateUserDocument,{input:user},{authorization:(0,_allianceinternalnodeutilities.createSystemUserToken)(configService)});logger.trace("added user to database, if it did not already exist")}catch{}const skipGroupClaimCheck=configService.get(_config1.ConfigKeys.AuthSkipGroupClaimCheck)==="true";if(!skipGroupClaimCheck){const type=hasEnterpriseAdminRole(claims)?"system-admin":"user";logger.trace("updating user type according to user claims",{type});try{await (0,_graphqlrequest.request)(configService.getOrThrow(_allianceinternalnodeutilities.SharedConfigKeys.DbEndpoint),_graphql.SetUserTypeDocument,{input:{objectId:user.objectId,type}},{authorization:(0,_allianceinternalnodeutilities.createSystemUserToken)(configService)});logger.trace("user type updated")}catch{}}return session}}));await app.listen(configService.getOrThrow(_allianceinternalnodeutilities.SharedConfigKeys.ServicePort))}function hasEnterpriseAdminRole(claims){if(!claims.groups){return false}const aceEnterpriseAdminRoleId="PROD_ACE_Enterprise_Admins";return claims.groups.includes(aceEnterpriseAdminRoleId)}startPortal();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telia-ace/alliance-portal",
3
- "version": "1.0.6-next.7",
3
+ "version": "1.0.7-next.0",
4
4
  "description": "ACE Alliance portal",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Telia Company AB",
@@ -13,31 +13,30 @@
13
13
  "dist/"
14
14
  ],
15
15
  "dependencies": {
16
- "@auth/core": "^0.10.0",
17
16
  "@nestjs/axios": "^3.0.0",
18
- "@nestjs/common": "^10.1.0",
19
- "@nestjs/config": "^3.0.0",
20
- "@nestjs/core": "^10.1.0",
21
- "@nestjs/platform-express": "^10.1.0",
22
- "@telia-ace/alliance-internal-node-utilities": "1.0.3-next.4",
23
- "express-openid-connect": "^2.16.0",
24
- "graphql": "^16.7.1",
17
+ "@nestjs/common": "^10.2.7",
18
+ "@nestjs/config": "^3.1.1",
19
+ "@nestjs/core": "^10.2.7",
20
+ "@nestjs/platform-express": "^10.2.7",
21
+ "@telia-ace/alliance-internal-node-utilities": "1.0.4-next.0",
22
+ "express": "^4.18.2",
23
+ "graphql": "^16.8.1",
25
24
  "graphql-request": "^6.1.0",
26
- "jose": "^4.14.4",
27
- "jsonwebtoken": "^9.0.1",
25
+ "jose": "^4.15.3",
28
26
  "reflect-metadata": "^0.1.13",
29
27
  "rxjs": "^7.8.1"
30
28
  },
31
29
  "devDependencies": {
32
- "@graphql-codegen/cli": "^4.0.1",
30
+ "@graphql-codegen/cli": "^5.0.0",
33
31
  "@graphql-codegen/typed-document-node": "^5.0.1",
34
32
  "@graphql-codegen/typescript-operations": "^4.0.1",
35
33
  "@graphql-typed-document-node/core": "^3.2.0",
36
- "@nestjs/cli": "^10.1.10",
37
- "@types/express": "^4.17.17",
38
- "@types/jsonwebtoken": "^9.0.2",
39
- "@types/node": "^20.4.2",
40
- "express": "^4.18.2"
34
+ "@nestjs/cli": "^10.1.18",
35
+ "@swc/cli": "^0.1.62",
36
+ "@swc/core": "^1.3.93",
37
+ "@types/express": "^4.17.19",
38
+ "@types/node": "^20.8.5",
39
+ "tsup": "^7.2.0"
41
40
  },
42
41
  "publishConfig": {
43
42
  "access": "public"