@platform-mesh/portal-server-lib 0.0.0 → 0.5.2

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.
Files changed (99) hide show
  1. package/.github/workflows/pipeline.yaml +20 -0
  2. package/.prettierrc.mjs +6 -0
  3. package/CODEOWNERS +4 -0
  4. package/CODE_OF_CONDUCT.md +86 -0
  5. package/CONTRIBUTING.md +40 -0
  6. package/LICENSE +201 -0
  7. package/LICENSES/Apache-2.0.txt +73 -0
  8. package/README.md +41 -0
  9. package/base.jest.config.js +15 -0
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/portal-options/account-entity-context-provider.service.d.ts +4 -0
  14. package/dist/portal-options/account-entity-context-provider.service.js +35 -0
  15. package/dist/portal-options/account-entity-context-provider.service.js.map +1 -0
  16. package/dist/portal-options/auth-callback-provider.d.ts +10 -0
  17. package/dist/portal-options/auth-callback-provider.js +36 -0
  18. package/dist/portal-options/auth-callback-provider.js.map +1 -0
  19. package/dist/portal-options/auth-config-provider.d.ts +9 -0
  20. package/dist/portal-options/auth-config-provider.js +72 -0
  21. package/dist/portal-options/auth-config-provider.js.map +1 -0
  22. package/dist/portal-options/index.d.ts +10 -0
  23. package/dist/portal-options/index.js +11 -0
  24. package/dist/portal-options/index.js.map +1 -0
  25. package/dist/portal-options/logout-callback.service.d.ts +12 -0
  26. package/dist/portal-options/logout-callback.service.js +63 -0
  27. package/dist/portal-options/logout-callback.service.js.map +1 -0
  28. package/dist/portal-options/models/luigi-context.d.ts +4 -0
  29. package/dist/portal-options/models/luigi-context.js +2 -0
  30. package/dist/portal-options/models/luigi-context.js.map +1 -0
  31. package/dist/portal-options/pm-portal-context.service.d.ts +11 -0
  32. package/dist/portal-options/pm-portal-context.service.js +50 -0
  33. package/dist/portal-options/pm-portal-context.service.js.map +1 -0
  34. package/dist/portal-options/pm-request-context-provider.d.ts +13 -0
  35. package/dist/portal-options/pm-request-context-provider.js +34 -0
  36. package/dist/portal-options/pm-request-context-provider.js.map +1 -0
  37. package/dist/portal-options/service-providers/content-configuration-service-providers.service.d.ts +5 -0
  38. package/dist/portal-options/service-providers/content-configuration-service-providers.service.js +83 -0
  39. package/dist/portal-options/service-providers/content-configuration-service-providers.service.js.map +1 -0
  40. package/dist/portal-options/service-providers/contentconfigurations-query.d.ts +1 -0
  41. package/dist/portal-options/service-providers/contentconfigurations-query.js +22 -0
  42. package/dist/portal-options/service-providers/contentconfigurations-query.js.map +1 -0
  43. package/dist/portal-options/service-providers/kubernetes-service-providers.service.d.ts +8 -0
  44. package/dist/portal-options/service-providers/kubernetes-service-providers.service.js +98 -0
  45. package/dist/portal-options/service-providers/kubernetes-service-providers.service.js.map +1 -0
  46. package/dist/portal-options/service-providers/models/contentconfigurations.d.ts +20 -0
  47. package/dist/portal-options/service-providers/models/contentconfigurations.js +2 -0
  48. package/dist/portal-options/service-providers/models/contentconfigurations.js.map +1 -0
  49. package/dist/portal-options/service-providers/models/welcome-node-config.d.ts +2 -0
  50. package/dist/portal-options/service-providers/models/welcome-node-config.js +35 -0
  51. package/dist/portal-options/service-providers/models/welcome-node-config.js.map +1 -0
  52. package/dist/portal-options/services/iam-graphql.service.d.ts +7 -0
  53. package/dist/portal-options/services/iam-graphql.service.js +40 -0
  54. package/dist/portal-options/services/iam-graphql.service.js.map +1 -0
  55. package/dist/portal-options/services/kcp-k8s.service.d.ts +11 -0
  56. package/dist/portal-options/services/kcp-k8s.service.js +60 -0
  57. package/dist/portal-options/services/kcp-k8s.service.js.map +1 -0
  58. package/dist/portal-options/services/queries.d.ts +1 -0
  59. package/dist/portal-options/services/queries.js +7 -0
  60. package/dist/portal-options/services/queries.js.map +1 -0
  61. package/dist/portal-options/utils/domain.d.ts +3 -0
  62. package/dist/portal-options/utils/domain.js +11 -0
  63. package/dist/portal-options/utils/domain.js.map +1 -0
  64. package/eslint.config.mjs +27 -0
  65. package/jest.config.ts +42 -0
  66. package/nest-cli.json +6 -0
  67. package/package.json +85 -2
  68. package/renovate.json +6 -0
  69. package/src/index.ts +1 -0
  70. package/src/portal-options/account-entity-context-provider.service.ts +30 -0
  71. package/src/portal-options/auth-callback-provider.spec.ts +85 -0
  72. package/src/portal-options/auth-callback-provider.ts +27 -0
  73. package/src/portal-options/auth-config-provider.spec.ts +101 -0
  74. package/src/portal-options/auth-config-provider.ts +82 -0
  75. package/src/portal-options/index.ts +11 -0
  76. package/src/portal-options/logout-callback.service.spec.ts +113 -0
  77. package/src/portal-options/logout-callback.service.ts +60 -0
  78. package/src/portal-options/models/luigi-context.ts +4 -0
  79. package/src/portal-options/pm-portal-context.service.spec.ts +155 -0
  80. package/src/portal-options/pm-portal-context.service.ts +63 -0
  81. package/src/portal-options/pm-request-context-provider.spec.ts +69 -0
  82. package/src/portal-options/pm-request-context-provider.ts +33 -0
  83. package/src/portal-options/service-providers/content-configuration-service-providers.service.spec.ts +157 -0
  84. package/src/portal-options/service-providers/content-configuration-service-providers.service.ts +130 -0
  85. package/src/portal-options/service-providers/contentconfigurations-query.ts +22 -0
  86. package/src/portal-options/service-providers/kubernetes-service-providers.service.spec.ts +197 -0
  87. package/src/portal-options/service-providers/kubernetes-service-providers.service.ts +115 -0
  88. package/src/portal-options/service-providers/models/contentconfigurations.ts +13 -0
  89. package/src/portal-options/service-providers/models/welcome-node-config.ts +36 -0
  90. package/src/portal-options/services/iam-graphql.service.spec.ts +77 -0
  91. package/src/portal-options/services/iam-graphql.service.ts +33 -0
  92. package/src/portal-options/services/kcp-k8s.service.spec.ts +78 -0
  93. package/src/portal-options/services/kcp-k8s.service.ts +56 -0
  94. package/src/portal-options/services/queries.ts +7 -0
  95. package/src/portal-options/utils/domain.spec.ts +114 -0
  96. package/src/portal-options/utils/domain.ts +13 -0
  97. package/tsconfig.build.json +10 -0
  98. package/tsconfig.json +18 -0
  99. package/tsconfig.test.json +3 -0
@@ -0,0 +1,72 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { getDiscoveryEndpoint, getOrganization } from './utils/domain.js';
11
+ import { CoreV1Api, KubeConfig } from '@kubernetes/client-node';
12
+ import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
13
+ import { DiscoveryService, } from '@openmfp/portal-server-lib';
14
+ let PMAuthConfigProvider = class PMAuthConfigProvider {
15
+ discoveryService;
16
+ k8sApi;
17
+ constructor(discoveryService) {
18
+ this.discoveryService = discoveryService;
19
+ const kc = new KubeConfig();
20
+ kc.loadFromDefault();
21
+ this.k8sApi = kc.makeApiClient(CoreV1Api);
22
+ }
23
+ async getAuthConfig(request) {
24
+ const oidcUrl = getDiscoveryEndpoint(request);
25
+ const clientId = getOrganization(request);
26
+ const baseDomain = process.env['BASE_DOMAINS_DEFAULT'];
27
+ const clientSecret = await this.getClientSecret(clientId);
28
+ const oidc = await this.discoveryService.getOIDC(oidcUrl);
29
+ const oauthServerUrl = oidc?.authorization_endpoint ?? process.env['AUTH_SERVER_URL_DEFAULT'];
30
+ const oauthTokenUrl = oidc?.token_endpoint ?? process.env['TOKEN_URL_DEFAULT'];
31
+ if (!oauthServerUrl || !oauthTokenUrl || !clientId || !clientSecret) {
32
+ const hasClientSecret = !!clientSecret;
33
+ throw new HttpException({
34
+ message: 'Default auth configuration incomplete.',
35
+ error: `The default properly configured. oauthServerUrl: '${oauthServerUrl}' oauthTokenUrl: '${oauthTokenUrl}' clientId: '${clientId}', has client secret: ${String(hasClientSecret)}`,
36
+ statusCode: HttpStatus.NOT_FOUND,
37
+ }, HttpStatus.NOT_FOUND);
38
+ }
39
+ return {
40
+ idpName: clientId,
41
+ baseDomain,
42
+ clientId,
43
+ clientSecret,
44
+ oauthServerUrl,
45
+ oauthTokenUrl,
46
+ oidcIssuerUrl: oidc?.issuer,
47
+ endSessionUrl: oidc?.end_session_endpoint,
48
+ };
49
+ }
50
+ async getClientSecret(orgName) {
51
+ const secretName = `portal-client-secret-${orgName}`;
52
+ const namespace = 'platform-mesh-system';
53
+ try {
54
+ const res = await this.k8sApi.readNamespacedSecret({
55
+ namespace,
56
+ name: secretName,
57
+ });
58
+ const secretData = res.data;
59
+ return Buffer.from(secretData['attribute.client_secret'], 'base64').toString('utf-8');
60
+ }
61
+ catch (err) {
62
+ console.error(`Failed to fetch secret ${secretName}:`, err.response?.body || err);
63
+ throw err;
64
+ }
65
+ }
66
+ };
67
+ PMAuthConfigProvider = __decorate([
68
+ Injectable(),
69
+ __metadata("design:paramtypes", [DiscoveryService])
70
+ ], PMAuthConfigProvider);
71
+ export { PMAuthConfigProvider };
72
+ //# sourceMappingURL=auth-config-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-config-provider.js","sourceRoot":"","sources":["../../src/portal-options/auth-config-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from './account-entity-context-provider.service.js';
2
+ export * from './pm-portal-context.service.js';
3
+ export * from './pm-request-context-provider.js';
4
+ export * from './auth-config-provider.js';
5
+ export * from './service-providers/content-configuration-service-providers.service.js';
6
+ export * from './service-providers/kubernetes-service-providers.service.js';
7
+ export * from './auth-callback-provider.js';
8
+ export * from './logout-callback.service.js';
9
+ export * from './services/kcp-k8s.service.js';
10
+ export * from './services/iam-graphql.service.js';
@@ -0,0 +1,11 @@
1
+ export * from './account-entity-context-provider.service.js';
2
+ export * from './pm-portal-context.service.js';
3
+ export * from './pm-request-context-provider.js';
4
+ export * from './auth-config-provider.js';
5
+ export * from './service-providers/content-configuration-service-providers.service.js';
6
+ export * from './service-providers/kubernetes-service-providers.service.js';
7
+ export * from './auth-callback-provider.js';
8
+ export * from './logout-callback.service.js';
9
+ export * from './services/kcp-k8s.service.js';
10
+ export * from './services/iam-graphql.service.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/portal-options/index.ts"],"names":[],"mappings":"AAAA,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wEAAwE,CAAC;AACvF,cAAc,6DAA6D,CAAC;AAC5E,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { HttpService } from '@nestjs/axios';
2
+ import { AuthConfigService, CookiesService, LogoutCallback } from '@openmfp/portal-server-lib';
3
+ import { Request, Response } from 'express';
4
+ export declare class PMLogoutService implements LogoutCallback {
5
+ private authConfigService;
6
+ private httpService;
7
+ private cookiesService;
8
+ private logger;
9
+ constructor(authConfigService: AuthConfigService, httpService: HttpService, cookiesService: CookiesService);
10
+ handleLogout(request: Request, response: Response): Promise<void | string>;
11
+ private logoutWithIdToken;
12
+ }
@@ -0,0 +1,63 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ var PMLogoutService_1;
14
+ import { HttpService } from '@nestjs/axios';
15
+ import { Inject, Injectable, Logger } from '@nestjs/common';
16
+ import { AUTH_CONFIG_INJECTION_TOKEN, CookiesService, } from '@openmfp/portal-server-lib';
17
+ import { firstValueFrom } from 'rxjs';
18
+ let PMLogoutService = PMLogoutService_1 = class PMLogoutService {
19
+ authConfigService;
20
+ httpService;
21
+ cookiesService;
22
+ logger = new Logger(PMLogoutService_1.name);
23
+ constructor(authConfigService, httpService, cookiesService) {
24
+ this.authConfigService = authConfigService;
25
+ this.httpService = httpService;
26
+ this.cookiesService = cookiesService;
27
+ }
28
+ async handleLogout(request, response) {
29
+ const authConfig = await this.authConfigService.getAuthConfig(request);
30
+ try {
31
+ const refreshToken = this.cookiesService.getAuthCookie(request);
32
+ const body = new URLSearchParams({
33
+ client_id: authConfig.clientId,
34
+ client_secret: authConfig.clientSecret,
35
+ refresh_token: refreshToken,
36
+ });
37
+ await firstValueFrom(this.httpService.post(authConfig.endSessionUrl, body, {
38
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
39
+ }));
40
+ }
41
+ catch (error) {
42
+ this.logger.error('Error during keycloak logout', error?.response?.data || error.message);
43
+ this.logger.warn('Trying to log out with the id token');
44
+ return this.logoutWithIdToken(request, authConfig.endSessionUrl);
45
+ }
46
+ }
47
+ logoutWithIdToken(request, endSessionUrl) {
48
+ const { id_token_hint, post_logout_redirect_uri } = request.query;
49
+ const params = new URLSearchParams({
50
+ id_token_hint: String(id_token_hint || ''),
51
+ post_logout_redirect_uri: String(post_logout_redirect_uri || ''),
52
+ });
53
+ return `${endSessionUrl}?${params}`;
54
+ }
55
+ };
56
+ PMLogoutService = PMLogoutService_1 = __decorate([
57
+ Injectable(),
58
+ __param(0, Inject(AUTH_CONFIG_INJECTION_TOKEN)),
59
+ __metadata("design:paramtypes", [Object, HttpService,
60
+ CookiesService])
61
+ ], PMLogoutService);
62
+ export { PMLogoutService };
63
+ //# sourceMappingURL=logout-callback.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout-callback.service.js","sourceRoot":"","sources":["../../src/portal-options/logout-callback.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,2BAA2B,EAE3B,cAAc,GAEf,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG/B,IAAM,eAAe,uBAArB,MAAM,eAAe;IAKhB;IACA;IACA;IANF,MAAM,GAAW,IAAI,MAAM,CAAC,iBAAe,CAAC,IAAI,CAAC,CAAC;IAE1D,YAEU,iBAAoC,EACpC,WAAwB,EACxB,cAA8B;QAF9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,gBAAW,GAAX,WAAW,CAAa;QACxB,mBAAc,GAAd,cAAc,CAAgB;IACrC,CAAC;IAEG,KAAK,CAAC,YAAY,CACvB,OAAgB,EAChB,QAAkB;QAElB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEhE,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;gBAC/B,SAAS,EAAE,UAAU,CAAC,QAAQ;gBAC9B,aAAa,EAAE,UAAU,CAAC,YAAY;gBACtC,aAAa,EAAE,YAAY;aAC5B,CAAC,CAAC;YAEH,MAAM,cAAc,CAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE;gBACpD,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;aACjE,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8BAA8B,EAC9B,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CACvC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,OAAgB,EAAE,aAAqB;QAC/D,MAAM,EAAE,aAAa,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;YAC1C,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,IAAI,EAAE,CAAC;SACjE,CAAC,CAAC;QACH,OAAO,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC;IACtC,CAAC;CACF,CAAA;AA/CY,eAAe;IAD3B,UAAU,EAAE;IAKR,WAAA,MAAM,CAAC,2BAA2B,CAAC,CAAA;6CAEf,WAAW;QACR,cAAc;GAP7B,eAAe,CA+C3B"}
@@ -0,0 +1,4 @@
1
+ export interface PortalContext extends Record<string, any> {
2
+ crdGatewayApiUrl?: string;
3
+ iamServiceApiUrl?: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=luigi-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luigi-context.js","sourceRoot":"","sources":["../../../src/portal-options/models/luigi-context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { PortalContext } from './models/luigi-context.js';
2
+ import { KcpKubernetesService } from './services/kcp-k8s.service.js';
3
+ import { PortalContextProvider } from '@openmfp/portal-server-lib';
4
+ import type { Request, Response } from 'express';
5
+ export declare class PMPortalContextService implements PortalContextProvider {
6
+ private kcpKubernetesService;
7
+ constructor(kcpKubernetesService: KcpKubernetesService);
8
+ getContextValues(request: Request, response: Response, portalContext: PortalContext): Promise<PortalContext>;
9
+ private addKcpWorkspaceUrl;
10
+ private processDynamicApiUrls;
11
+ }
@@ -0,0 +1,50 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { KcpKubernetesService } from './services/kcp-k8s.service.js';
11
+ import { getOrganization } from './utils/domain.js';
12
+ import { Injectable } from '@nestjs/common';
13
+ import process from 'node:process';
14
+ let PMPortalContextService = class PMPortalContextService {
15
+ kcpKubernetesService;
16
+ constructor(kcpKubernetesService) {
17
+ this.kcpKubernetesService = kcpKubernetesService;
18
+ }
19
+ async getContextValues(request, response, portalContext) {
20
+ this.processDynamicApiUrls(request, portalContext);
21
+ this.addKcpWorkspaceUrl(request, portalContext);
22
+ return portalContext;
23
+ }
24
+ addKcpWorkspaceUrl(request, portalContext) {
25
+ const organization = getOrganization(request);
26
+ const account = request.query?.['core_platform-mesh_io_account'];
27
+ portalContext.kcpWorkspaceUrl =
28
+ this.kcpKubernetesService.getKcpWorkspacePublicUrl(organization, account);
29
+ }
30
+ processDynamicApiUrls(request, portalContext) {
31
+ const org = getOrganization(request);
32
+ const baseDomain = process.env['BASE_DOMAINS_DEFAULT'];
33
+ const subDomain = request.hostname !== baseDomain ? `${org}.` : '';
34
+ const replacements = {
35
+ '${org-subdomain}': subDomain,
36
+ '${org-name}': org,
37
+ };
38
+ const replacePlaceholders = (url) => url
39
+ ? Object.entries(replacements).reduce((acc, [key, value]) => acc.replace(key, value), url)
40
+ : url;
41
+ portalContext.crdGatewayApiUrl = replacePlaceholders(portalContext.crdGatewayApiUrl);
42
+ portalContext.iamServiceApiUrl = replacePlaceholders(portalContext.iamServiceApiUrl);
43
+ }
44
+ };
45
+ PMPortalContextService = __decorate([
46
+ Injectable(),
47
+ __metadata("design:paramtypes", [KcpKubernetesService])
48
+ ], PMPortalContextService);
49
+ export { PMPortalContextService };
50
+ //# sourceMappingURL=pm-portal-context.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm-portal-context.service.js","sourceRoot":"","sources":["../../src/portal-options/pm-portal-context.service.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,OAAO,MAAM,cAAc,CAAC;AAG5B,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACb;IAApB,YAAoB,oBAA0C;QAA1C,yBAAoB,GAApB,oBAAoB,CAAsB;IAAG,CAAC;IAElE,KAAK,CAAC,gBAAgB,CACpB,OAAgB,EAChB,QAAkB,EAClB,aAA4B;QAE5B,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAEhD,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,kBAAkB,CACxB,OAAgB,EAChB,aAA4B;QAE5B,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,+BAA+B,CAAC,CAAC;QAEjE,aAAa,CAAC,eAAe;YAC3B,IAAI,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAEO,qBAAqB,CAC3B,OAAgB,EAChB,aAA4B;QAE5B,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnE,MAAM,YAAY,GAAG;YACnB,kBAAkB,EAAE,SAAS;YAC7B,aAAa,EAAE,GAAG;SACnB,CAAC;QAEF,MAAM,mBAAmB,GAAG,CAAC,GAAY,EAAE,EAAE,CAC3C,GAAG;YACD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CACjC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAC9C,GAAG,CACJ;YACH,CAAC,CAAC,GAAG,CAAC;QAEV,aAAa,CAAC,gBAAgB,GAAG,mBAAmB,CAClD,aAAa,CAAC,gBAAgB,CAC/B,CAAC;QACF,aAAa,CAAC,gBAAgB,GAAG,mBAAmB,CAClD,aAAa,CAAC,gBAAgB,CAC/B,CAAC;IACJ,CAAC;CACF,CAAA;AArDY,sBAAsB;IADlC,UAAU,EAAE;qCAE+B,oBAAoB;GADnD,sBAAsB,CAqDlC"}
@@ -0,0 +1,13 @@
1
+ import { PortalContextProviderImpl, RequestContextProvider } from '@openmfp/portal-server-lib';
2
+ import type { Request, Response } from 'express';
3
+ export interface RequestContext extends Record<string, any> {
4
+ account?: string;
5
+ organization: string;
6
+ crdGatewayApiUrl?: string;
7
+ isSubDomain: boolean;
8
+ }
9
+ export declare class PMRequestContextProvider implements RequestContextProvider {
10
+ private portalContextService;
11
+ constructor(portalContextService: PortalContextProviderImpl);
12
+ getContextValues(request: Request, response: Response): Promise<RequestContext>;
13
+ }
@@ -0,0 +1,34 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { getOrganization } from './utils/domain.js';
11
+ import { Injectable } from '@nestjs/common';
12
+ import { PortalContextProviderImpl, } from '@openmfp/portal-server-lib';
13
+ let PMRequestContextProvider = class PMRequestContextProvider {
14
+ portalContextService;
15
+ constructor(portalContextService) {
16
+ this.portalContextService = portalContextService;
17
+ }
18
+ async getContextValues(request, response) {
19
+ const organization = getOrganization(request);
20
+ const baseDomain = process.env['BASE_DOMAINS_DEFAULT'];
21
+ return {
22
+ ...request.query,
23
+ ...(await this.portalContextService.getContextValues(request, response)),
24
+ organization,
25
+ isSubDomain: request.hostname !== baseDomain,
26
+ };
27
+ }
28
+ };
29
+ PMRequestContextProvider = __decorate([
30
+ Injectable(),
31
+ __metadata("design:paramtypes", [PortalContextProviderImpl])
32
+ ], PMRequestContextProvider);
33
+ export { PMRequestContextProvider };
34
+ //# sourceMappingURL=pm-request-context-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm-request-context-provider.js","sourceRoot":"","sources":["../../src/portal-options/pm-request-context-provider.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACL,yBAAyB,GAE1B,MAAM,4BAA4B,CAAC;AAW7B,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACf;IAApB,YAAoB,oBAA+C;QAA/C,yBAAoB,GAApB,oBAAoB,CAA2B;IAAG,CAAC;IAEvE,KAAK,CAAC,gBAAgB,CACpB,OAAgB,EAChB,QAAkB;QAElB,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACvD,OAAO;YACL,GAAG,OAAO,CAAC,KAAK;YAChB,GAAG,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxE,YAAY;YACZ,WAAW,EAAE,OAAO,CAAC,QAAQ,KAAK,UAAU;SAC7C,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,wBAAwB;IADpC,UAAU,EAAE;qCAE+B,yBAAyB;GADxD,wBAAwB,CAgBpC"}
@@ -0,0 +1,5 @@
1
+ import { RequestContext } from '../pm-request-context-provider.js';
2
+ import { ServiceProviderResponse, ServiceProviderService } from '@openmfp/portal-server-lib';
3
+ export declare class ContentConfigurationServiceProvidersService implements ServiceProviderService {
4
+ getServiceProviders(token: string, entities: string[], context: RequestContext): Promise<ServiceProviderResponse>;
5
+ }
@@ -0,0 +1,83 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { contentConfigurationsQuery } from './contentconfigurations-query.js';
8
+ import { welcomeNodeConfig } from './models/welcome-node-config.js';
9
+ import { Injectable } from '@nestjs/common';
10
+ import { GraphQLClient } from 'graphql-request';
11
+ let ContentConfigurationServiceProvidersService = class ContentConfigurationServiceProvidersService {
12
+ async getServiceProviders(token, entities, context) {
13
+ if (!token) {
14
+ throw new Error('Token is required');
15
+ }
16
+ if (!context.isSubDomain) {
17
+ return welcomeNodeConfig;
18
+ }
19
+ if (!context?.organization) {
20
+ throw new Error('Context with organization is required');
21
+ }
22
+ let url = context.crdGatewayApiUrl.replace('kubernetes-graphql-gateway/root', 'kubernetes-graphql-gateway/virtual-workspace/contentconfigurations/root');
23
+ const platformMeshAccountId = context?.['core_platform-mesh_io_account'];
24
+ if (platformMeshAccountId) {
25
+ url = url.replace('/graphql', `:${platformMeshAccountId}/graphql`);
26
+ }
27
+ console.log(`Calculated crd gateway api url: ${url}`);
28
+ const client = new GraphQLClient(url, {
29
+ headers: {
30
+ Authorization: `Bearer ${token}`,
31
+ },
32
+ });
33
+ try {
34
+ const response = await client.request(contentConfigurationsQuery, {});
35
+ if (!response?.ui_platform_mesh_io?.ContentConfigurations) {
36
+ throw new Error('Invalid response structure: missing ContentConfigurations');
37
+ }
38
+ const entity = !entities || !entities.length ? 'main' : entities[0];
39
+ const contentConfigurations = response.ui_platform_mesh_io.ContentConfigurations.filter((item) => item.metadata.labels?.['ui.platform-mesh.io/entity'] === entity).map((item) => {
40
+ try {
41
+ if (!item.status?.configurationResult) {
42
+ throw new Error(`Missing configurationResult for item: ${item.metadata?.name || 'unknown'}`);
43
+ }
44
+ const contentConfiguration = JSON.parse(item.status.configurationResult);
45
+ if (!contentConfiguration.url) {
46
+ contentConfiguration.url = item.spec.remoteConfiguration?.url;
47
+ }
48
+ return contentConfiguration;
49
+ }
50
+ catch (parseError) {
51
+ console.error(`Failed to parse configuration for item ${item.metadata?.name || 'unknown'}:`, parseError);
52
+ if (parseError instanceof Error &&
53
+ parseError.message.includes('Missing configurationResult')) {
54
+ throw parseError;
55
+ }
56
+ throw new Error(`Invalid JSON in configurationResult for item: ${item.metadata?.name || 'unknown'}`);
57
+ }
58
+ });
59
+ return {
60
+ rawServiceProviders: [
61
+ {
62
+ name: 'platform-mesh-system',
63
+ displayName: '',
64
+ creationTimestamp: '',
65
+ contentConfiguration: contentConfigurations,
66
+ },
67
+ ],
68
+ };
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error &&
72
+ error.message.includes('configurationResult')) {
73
+ throw error;
74
+ }
75
+ throw new Error(`Failed to fetch content configurations: ${error instanceof Error ? error.message : 'Unknown error'}`);
76
+ }
77
+ }
78
+ };
79
+ ContentConfigurationServiceProvidersService = __decorate([
80
+ Injectable()
81
+ ], ContentConfigurationServiceProvidersService);
82
+ export { ContentConfigurationServiceProvidersService };
83
+ //# sourceMappingURL=content-configuration-service-providers.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-configuration-service-providers.service.js","sourceRoot":"","sources":["../../../src/portal-options/service-providers/content-configuration-service-providers.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const contentConfigurationsQuery: string;
@@ -0,0 +1,22 @@
1
+ import { gql } from 'graphql-request';
2
+ export const contentConfigurationsQuery = gql `
3
+ query {
4
+ ui_platform_mesh_io {
5
+ ContentConfigurations {
6
+ metadata {
7
+ name
8
+ labels
9
+ }
10
+ spec {
11
+ remoteConfiguration {
12
+ url
13
+ }
14
+ }
15
+ status {
16
+ configurationResult
17
+ }
18
+ }
19
+ }
20
+ }
21
+ `;
22
+ //# sourceMappingURL=contentconfigurations-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contentconfigurations-query.js","sourceRoot":"","sources":["../../../src/portal-options/service-providers/contentconfigurations-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;CAmB5C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { KcpKubernetesService } from '../services/kcp-k8s.service.js';
2
+ import { ServiceProviderResponse, ServiceProviderService } from '@openmfp/portal-server-lib';
3
+ export declare class KubernetesServiceProvidersService implements ServiceProviderService {
4
+ private kcpKubernetesService;
5
+ constructor(kcpKubernetesService: KcpKubernetesService);
6
+ getServiceProviders(token: string, entities: string[], context: Record<string, any>): Promise<ServiceProviderResponse>;
7
+ private getKubernetesResources;
8
+ }
@@ -0,0 +1,98 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { KcpKubernetesService } from '../services/kcp-k8s.service.js';
11
+ import { welcomeNodeConfig } from './models/welcome-node-config.js';
12
+ import { PromiseMiddlewareWrapper } from '@kubernetes/client-node/dist/gen/middleware.js';
13
+ import { Injectable } from '@nestjs/common';
14
+ let KubernetesServiceProvidersService = class KubernetesServiceProvidersService {
15
+ kcpKubernetesService;
16
+ constructor(kcpKubernetesService) {
17
+ this.kcpKubernetesService = kcpKubernetesService;
18
+ }
19
+ async getServiceProviders(token, entities, context) {
20
+ if (!token) {
21
+ throw new Error('Token is required');
22
+ }
23
+ if (!context.isSubDomain) {
24
+ return welcomeNodeConfig;
25
+ }
26
+ if (!context?.organization) {
27
+ throw new Error('Context with organization is required');
28
+ }
29
+ const entity = !entities || !entities.length ? 'main' : entities[0];
30
+ let response;
31
+ try {
32
+ response = await this.getKubernetesResources(entity, context, token);
33
+ }
34
+ catch (error) {
35
+ console.error(error);
36
+ if (error.code == 429 || error.statusCode == 429) {
37
+ await new Promise((resolve) => setTimeout(resolve, 1000));
38
+ console.log('Retry after 1 second reading kubernetes resources.');
39
+ response = await this.getKubernetesResources(entity, context, token);
40
+ }
41
+ }
42
+ if (!response.items) {
43
+ return {
44
+ rawServiceProviders: [],
45
+ };
46
+ }
47
+ const responseItems = response.items;
48
+ const contentConfigurations = responseItems
49
+ .filter((item) => !!item.status.configurationResult)
50
+ .map((item) => {
51
+ const contentConfiguration = JSON.parse(item.status.configurationResult);
52
+ if (!contentConfiguration.url) {
53
+ contentConfiguration.url = item.spec.remoteConfiguration?.url;
54
+ }
55
+ return contentConfiguration;
56
+ });
57
+ return {
58
+ rawServiceProviders: [
59
+ {
60
+ name: 'platform-mesh-system',
61
+ displayName: '',
62
+ creationTimestamp: '',
63
+ contentConfiguration: contentConfigurations,
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ async getKubernetesResources(entity, requestContext, token) {
69
+ const gvr = {
70
+ group: 'ui.platform-mesh.io',
71
+ version: 'v1alpha1',
72
+ plural: 'contentconfigurations',
73
+ labelSelector: `ui.platform-mesh.io/entity=${entity}`,
74
+ };
75
+ const k8sApi = this.kcpKubernetesService.getKcpK8sApiClient();
76
+ return await k8sApi.listClusterCustomObject(gvr, {
77
+ middleware: [
78
+ new PromiseMiddlewareWrapper({
79
+ pre: async (context) => {
80
+ const kcpUrl = this.kcpKubernetesService.getKcpVirtualWorkspaceUrl(requestContext.organization, requestContext?.['core_platform-mesh_io_account']);
81
+ const path = `${kcpUrl}/apis/${gvr.group}/${gvr.version}/${gvr.plural}`;
82
+ console.log('kcp url: ', path);
83
+ context.setUrl(path);
84
+ context.setHeaderParam('Authorization', `Bearer ${token}`);
85
+ return context;
86
+ },
87
+ post: async (context) => context,
88
+ }),
89
+ ],
90
+ });
91
+ }
92
+ };
93
+ KubernetesServiceProvidersService = __decorate([
94
+ Injectable(),
95
+ __metadata("design:paramtypes", [KcpKubernetesService])
96
+ ], KubernetesServiceProvidersService);
97
+ export { KubernetesServiceProvidersService };
98
+ //# sourceMappingURL=kubernetes-service-providers.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubernetes-service-providers.service.js","sourceRoot":"","sources":["../../../src/portal-options/service-providers/kubernetes-service-providers.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface ContentConfigurationQueryResponse {
2
+ ui_platform_mesh_io: ContentConfigurationsResponse;
3
+ }
4
+ export interface ContentConfigurationsResponse {
5
+ ContentConfigurations: ContentConfigurationResponse[];
6
+ }
7
+ export interface ContentConfigurationResponse {
8
+ metadata: {
9
+ name: string;
10
+ labels?: Record<string, string>;
11
+ };
12
+ spec: {
13
+ remoteConfiguration?: {
14
+ url?: string;
15
+ };
16
+ };
17
+ status: {
18
+ configurationResult?: string;
19
+ };
20
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contentconfigurations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contentconfigurations.js","sourceRoot":"","sources":["../../../../src/portal-options/service-providers/models/contentconfigurations.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import { ServiceProviderResponse } from '@openmfp/portal-server-lib';
2
+ export declare const welcomeNodeConfig: ServiceProviderResponse;