@acorex-platform/module-integration-management-client 0.0.21

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 (31) hide show
  1. package/fesm2022/acorex-platform-module-integration-management-client-connect-with-credentials.command-DO_zqjHV.mjs +102 -0
  2. package/fesm2022/acorex-platform-module-integration-management-client-connect-with-credentials.command-DO_zqjHV.mjs.map +1 -0
  3. package/fesm2022/acorex-platform-module-integration-management-client-contracts.mjs +163 -0
  4. package/fesm2022/acorex-platform-module-integration-management-client-contracts.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-module-integration-management-client-delete-connection.command-DQ_kn8dH.mjs +53 -0
  6. package/fesm2022/acorex-platform-module-integration-management-client-delete-connection.command-DQ_kn8dH.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-module-integration-management-client-disconnect-connection.command-B4HeDA1n.mjs +60 -0
  8. package/fesm2022/acorex-platform-module-integration-management-client-disconnect-connection.command-B4HeDA1n.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-module-integration-management-client-get-provider.query-Ds10RwnU.mjs +30 -0
  10. package/fesm2022/acorex-platform-module-integration-management-client-get-provider.query-Ds10RwnU.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-module-integration-management-client-integration-connection-lifecycle.dispatcher-DRWR9ysx.mjs +45 -0
  12. package/fesm2022/acorex-platform-module-integration-management-client-integration-connection-lifecycle.dispatcher-DRWR9ysx.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-module-integration-management-client-integration-oauth-callback-page.component-XhloXUsZ.mjs +176 -0
  14. package/fesm2022/acorex-platform-module-integration-management-client-integration-oauth-callback-page.component-XhloXUsZ.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-integration-management-client-integrations-page.component-Q-SHidYA.mjs +406 -0
  16. package/fesm2022/acorex-platform-module-integration-management-client-integrations-page.component-Q-SHidYA.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-module-integration-management-client-list-domains.query--GGD6J46.mjs +52 -0
  18. package/fesm2022/acorex-platform-module-integration-management-client-list-domains.query--GGD6J46.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-module-integration-management-client-list-my-connections.query-CmHu1qFm.mjs +27 -0
  20. package/fesm2022/acorex-platform-module-integration-management-client-list-my-connections.query-CmHu1qFm.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-module-integration-management-client-list-providers.query-ODKJ_UhI.mjs +65 -0
  22. package/fesm2022/acorex-platform-module-integration-management-client-list-providers.query-ODKJ_UhI.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-module-integration-management-client-update-connection.command-BNMR-t12.mjs +42 -0
  24. package/fesm2022/acorex-platform-module-integration-management-client-update-connection.command-BNMR-t12.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-integration-management-client-validate-connection.command-CGtb_GPX.mjs +83 -0
  26. package/fesm2022/acorex-platform-module-integration-management-client-validate-connection.command-CGtb_GPX.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-integration-management-client.mjs +776 -0
  28. package/fesm2022/acorex-platform-module-integration-management-client.mjs.map +1 -0
  29. package/package.json +28 -0
  30. package/types/acorex-platform-module-integration-management-client-contracts.d.ts +191 -0
  31. package/types/acorex-platform-module-integration-management-client.d.ts +74 -0
@@ -0,0 +1,176 @@
1
+ import * as i3 from '@acorex/components/button';
2
+ import { AXButtonModule } from '@acorex/components/button';
3
+ import * as i11 from '@acorex/core/translation';
4
+ import { AXTranslationModule } from '@acorex/core/translation';
5
+ import { AXPSessionService } from '@acorex-platform/framework-client/auth';
6
+ import { AXPIntegrationProviderRegistryService } from '@acorex-platform/framework-client/common';
7
+ import { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';
8
+ import { commandMessageTextForError } from '@acorex-platform/framework-client/layout/entity';
9
+ import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
10
+ import { resolveAppRouteName, buildTenantIntegrationsPagePath } from '@acorex-platform/module-integration-management-client/contracts';
11
+ import * as i3$1 from '@angular/common';
12
+ import { CommonModule } from '@angular/common';
13
+ import * as i0 from '@angular/core';
14
+ import { inject, ChangeDetectionStrategy, Component } from '@angular/core';
15
+ import { ActivatedRoute, Router } from '@angular/router';
16
+ import { BehaviorSubject, firstValueFrom } from 'rxjs';
17
+
18
+ class AXMIntegrationOAuthCallbackPageComponent {
19
+ constructor() {
20
+ this.route = inject(ActivatedRoute);
21
+ this.router = inject(Router);
22
+ this.commandService = inject(AXPCommandService);
23
+ this.sessionService = inject(AXPSessionService);
24
+ this.providerRegistry = inject(AXPIntegrationProviderRegistryService);
25
+ this.isLoading$ = new BehaviorSubject(true);
26
+ this.error$ = new BehaviorSubject(null);
27
+ }
28
+ async ngOnInit() {
29
+ const sessionReady = await this.ensureSessionReady();
30
+ if (!sessionReady) {
31
+ return;
32
+ }
33
+ await this.completeCallback();
34
+ }
35
+ /** Wait for app init + persisted session (user, tenant, app, permissions) before OAuth completion. */
36
+ async ensureSessionReady() {
37
+ let authorized = await firstValueFrom(this.sessionService.isAuthorizedWithLoading$);
38
+ if (!authorized) {
39
+ await this.sessionService.restoreSession();
40
+ authorized = await firstValueFrom(this.sessionService.isAuthorizedWithLoading$);
41
+ }
42
+ if (!authorized) {
43
+ this.isLoading$.next(false);
44
+ this.error$.next('Session is not ready. Please sign in again and retry the connection.');
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ async completeCallback() {
50
+ const providerId = this.route.snapshot.paramMap.get('providerId') ?? '';
51
+ const state = this.route.snapshot.queryParamMap.get('state') ?? '';
52
+ const code = this.route.snapshot.queryParamMap.get('code') ?? '';
53
+ const oauthError = this.route.snapshot.queryParamMap.get('error') ?? '';
54
+ if (oauthError) {
55
+ this.isLoading$.next(false);
56
+ this.error$.next(oauthError);
57
+ return;
58
+ }
59
+ if (!providerId || !state || !code) {
60
+ this.isLoading$.next(false);
61
+ this.error$.next('Missing OAuth callback parameters.');
62
+ return;
63
+ }
64
+ const provider = await this.providerRegistry.get(providerId);
65
+ const commandKey = provider?.completeOAuthCommandKey;
66
+ if (!commandKey) {
67
+ this.isLoading$.next(false);
68
+ this.error$.next(`OAuth callback is not configured for provider '${providerId}'.`);
69
+ return;
70
+ }
71
+ try {
72
+ const result = await this.commandService.execute(commandKey, { state, code });
73
+ if (!result?.success) {
74
+ this.error$.next(commandMessageTextForError(result?.message?.text) ||
75
+ 'OAuth callback failed.');
76
+ return;
77
+ }
78
+ await this.goToIntegrations();
79
+ }
80
+ catch (error) {
81
+ const message = error instanceof Error ? error.message : 'OAuth callback failed.';
82
+ this.error$.next(message);
83
+ }
84
+ finally {
85
+ this.isLoading$.next(false);
86
+ }
87
+ }
88
+ async goToIntegrations() {
89
+ // Prefer session app slug — callback URLs are often app-agnostic or legacy `/demo/...`.
90
+ const appName = resolveAppRouteName(this.sessionService.application?.name, this.route.snapshot.paramMap.get('appName'));
91
+ if (!appName) {
92
+ this.error$.next('Unable to determine the current application after authorization.');
93
+ return;
94
+ }
95
+ await this.router.navigateByUrl(buildTenantIntegrationsPagePath(appName));
96
+ }
97
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMIntegrationOAuthCallbackPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
98
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMIntegrationOAuthCallbackPageComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
99
+ <ng-container *translate="let t">
100
+ <div class="h-full flex flex-col items-center justify-center p-8">
101
+ <div class="w-96 text-center">
102
+ @if (isLoading$ | async) {
103
+ <axp-state-message
104
+ mode="loading"
105
+ icon="fa-solid fa-spinner fa-spin"
106
+ title="Completing authorization..."
107
+ description="Please wait while we finish connecting your integration."
108
+ ></axp-state-message>
109
+ } @else if (error$ | async; as error) {
110
+ <axp-state-message
111
+ mode="error"
112
+ icon="fa-solid fa-exclamation-triangle"
113
+ title="Authorization failed"
114
+ [description]="error"
115
+ >
116
+ <div slot="actions" class="flex justify-center">
117
+ <ax-button
118
+ color="primary"
119
+ text="Back to integrations"
120
+ (onClick)="goToIntegrations()"
121
+ ></ax-button>
122
+ </div>
123
+ </axp-state-message>
124
+ }
125
+ </div>
126
+ </div>
127
+ </ng-container>
128
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i11.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMIntegrationOAuthCallbackPageComponent, decorators: [{
131
+ type: Component,
132
+ args: [{
133
+ standalone: true,
134
+ imports: [
135
+ CommonModule,
136
+ AXButtonModule,
137
+ AXTranslationModule,
138
+ AXPStateMessageComponent,
139
+ ],
140
+ template: `
141
+ <ng-container *translate="let t">
142
+ <div class="h-full flex flex-col items-center justify-center p-8">
143
+ <div class="w-96 text-center">
144
+ @if (isLoading$ | async) {
145
+ <axp-state-message
146
+ mode="loading"
147
+ icon="fa-solid fa-spinner fa-spin"
148
+ title="Completing authorization..."
149
+ description="Please wait while we finish connecting your integration."
150
+ ></axp-state-message>
151
+ } @else if (error$ | async; as error) {
152
+ <axp-state-message
153
+ mode="error"
154
+ icon="fa-solid fa-exclamation-triangle"
155
+ title="Authorization failed"
156
+ [description]="error"
157
+ >
158
+ <div slot="actions" class="flex justify-center">
159
+ <ax-button
160
+ color="primary"
161
+ text="Back to integrations"
162
+ (onClick)="goToIntegrations()"
163
+ ></ax-button>
164
+ </div>
165
+ </axp-state-message>
166
+ }
167
+ </div>
168
+ </div>
169
+ </ng-container>
170
+ `,
171
+ changeDetection: ChangeDetectionStrategy.OnPush,
172
+ }]
173
+ }] });
174
+
175
+ export { AXMIntegrationOAuthCallbackPageComponent };
176
+ //# sourceMappingURL=acorex-platform-module-integration-management-client-integration-oauth-callback-page.component-XhloXUsZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-integration-management-client-integration-oauth-callback-page.component-XhloXUsZ.mjs","sources":["../../../../libs/modules/integration-management/client/src/lib/features/oauth-callback/integration-oauth-callback-page.component.ts"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPIntegrationProviderRegistryService } from '@acorex-platform/framework-client/common';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { commandMessageTextForError } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n buildTenantIntegrationsPagePath,\n resolveAppRouteName,\n} from '@acorex-platform/module-integration-management-client/contracts';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n OnInit,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BehaviorSubject, firstValueFrom } from 'rxjs';\n\n@Component({\n standalone: true,\n imports: [\n CommonModule,\n AXButtonModule,\n AXTranslationModule,\n AXPStateMessageComponent,\n ],\n template: `\n <ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n title=\"Completing authorization...\"\n description=\"Please wait while we finish connecting your integration.\"\n ></axp-state-message>\n } @else if (error$ | async; as error) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n title=\"Authorization failed\"\n [description]=\"error\"\n >\n <div slot=\"actions\" class=\"flex justify-center\">\n <ax-button\n color=\"primary\"\n text=\"Back to integrations\"\n (onClick)=\"goToIntegrations()\"\n ></ax-button>\n </div>\n </axp-state-message>\n }\n </div>\n </div>\n </ng-container>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXMIntegrationOAuthCallbackPageComponent implements OnInit {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly commandService = inject(AXPCommandService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly providerRegistry = inject(AXPIntegrationProviderRegistryService);\n\n protected readonly isLoading$ = new BehaviorSubject<boolean>(true);\n protected readonly error$ = new BehaviorSubject<string | null>(null);\n\n async ngOnInit(): Promise<void> {\n const sessionReady = await this.ensureSessionReady();\n if (!sessionReady) {\n return;\n }\n\n await this.completeCallback();\n }\n\n /** Wait for app init + persisted session (user, tenant, app, permissions) before OAuth completion. */\n private async ensureSessionReady(): Promise<boolean> {\n let authorized = await firstValueFrom(\n this.sessionService.isAuthorizedWithLoading$,\n );\n if (!authorized) {\n await this.sessionService.restoreSession();\n authorized = await firstValueFrom(\n this.sessionService.isAuthorizedWithLoading$,\n );\n }\n\n if (!authorized) {\n this.isLoading$.next(false);\n this.error$.next(\n 'Session is not ready. Please sign in again and retry the connection.',\n );\n return false;\n }\n\n return true;\n }\n\n private async completeCallback(): Promise<void> {\n const providerId = this.route.snapshot.paramMap.get('providerId') ?? '';\n const state = this.route.snapshot.queryParamMap.get('state') ?? '';\n const code = this.route.snapshot.queryParamMap.get('code') ?? '';\n const oauthError = this.route.snapshot.queryParamMap.get('error') ?? '';\n\n if (oauthError) {\n this.isLoading$.next(false);\n this.error$.next(oauthError);\n return;\n }\n\n if (!providerId || !state || !code) {\n this.isLoading$.next(false);\n this.error$.next('Missing OAuth callback parameters.');\n return;\n }\n\n const provider = await this.providerRegistry.get(providerId);\n const commandKey = provider?.completeOAuthCommandKey;\n if (!commandKey) {\n this.isLoading$.next(false);\n this.error$.next(`OAuth callback is not configured for provider '${providerId}'.`);\n return;\n }\n\n try {\n const result = await this.commandService.execute(commandKey, { state, code });\n\n if (!result?.success) {\n this.error$.next(\n commandMessageTextForError(result?.message?.text) ||\n 'OAuth callback failed.',\n );\n return;\n }\n\n await this.goToIntegrations();\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'OAuth callback failed.';\n this.error$.next(message);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n protected async goToIntegrations(): Promise<void> {\n // Prefer session app slug — callback URLs are often app-agnostic or legacy `/demo/...`.\n const appName = resolveAppRouteName(\n this.sessionService.application?.name,\n this.route.snapshot.paramMap.get('appName'),\n );\n if (!appName) {\n this.error$.next('Unable to determine the current application after authorization.');\n return;\n }\n await this.router.navigateByUrl(buildTenantIntegrationsPagePath(appName));\n }\n}\n\n"],"names":["i1","i3"],"mappings":"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"}