@acorex-platform/extension-google-client 0.0.33 → 0.0.37
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/fesm2022/acorex-platform-extension-google-client-complete-google-oauth.command-BE9n_4Yn.mjs.map +1 -1
- package/fesm2022/acorex-platform-extension-google-client-connect-google.command-DZ1pU8xZ.mjs.map +1 -1
- package/fesm2022/acorex-platform-extension-google-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-extension-google-client-google-oauth-http.client-BygIfysu.mjs.map +1 -1
- package/fesm2022/{acorex-platform-extension-google-client-google-platform-login-slot.component-WO8_R8Zh.mjs → acorex-platform-extension-google-client-google-platform-login-slot.component-CuMUv7eD.mjs} +2 -2
- package/fesm2022/{acorex-platform-extension-google-client-google-platform-login-slot.component-WO8_R8Zh.mjs.map → acorex-platform-extension-google-client-google-platform-login-slot.component-CuMUv7eD.mjs.map} +1 -1
- package/fesm2022/acorex-platform-extension-google-client.mjs +26 -65
- package/fesm2022/acorex-platform-extension-google-client.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-google-client-complete-google-oauth.command-BE9n_4Yn.mjs","sources":["../../../../libs/extensions/google/client/src/lib/features/connect/complete-google-oauth.command.ts"],"sourcesContent":["//#region ---- Complete Google OAuth callback ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPRuntimeCommandResult, AXPSafeIntegrationConnectionDto } from '@acorex-platform/framework-shared/core';\nimport { AXP_INTEGRATION_CONNECTION_ESTABLISHED } from '@acorex-platform/framework-client/common';\nimport {\n AXMIntegrationConnectionManager,\n toSafeIntegrationConnectionDto,\n} from '@acorex-platform/module-integration-management-client';\nimport { AXEGoogleOAuthHttpClient } from '../../api/google-oauth-http.client';\nimport { Injectable, inject } from '@angular/core';\n\nexport interface CompleteGoogleOAuthCommandInput {\n state: string;\n code: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CompleteGoogleOAuthCommand\n implements AXPCommand<CompleteGoogleOAuthCommandInput, AXPSafeIntegrationConnectionDto>\n{\n private readonly http = inject(AXEGoogleOAuthHttpClient);\n private readonly connectionManager = inject(AXMIntegrationConnectionManager);\n private readonly establishedHandlers = inject(AXP_INTEGRATION_CONNECTION_ESTABLISHED, { optional: true });\n\n async execute(\n input: CompleteGoogleOAuthCommandInput,\n ): AXPCommandExecuteResultPromise<AXPSafeIntegrationConnectionDto> {\n try {\n const { connectionId } = await this.http.completeOAuth({\n state: input.state,\n code: input.code,\n });\n\n const connection = await this.connectionManager.getByIdForCurrentUser(connectionId);\n if (!connection) {\n return { success: false, message: { text: 'Connection not found after Google OAuth callback.' } };\n }\n\n const safe = toSafeIntegrationConnectionDto(connection);\n await this.dispatchEstablished(safe);\n return { success: true, kind: 'object', data: safe };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Google OAuth callback failed.';\n return { success: false, message: { text: message } };\n }\n }\n\n private async dispatchEstablished(connection: AXPSafeIntegrationConnectionDto): Promise<void> {\n const list = this.establishedHandlers ?? [];\n for (const handler of list) {\n const resolved = handler instanceof Promise ? await handler : handler;\n if (resolved.providerId === connection.providerId) {\n await resolved.onEstablished(connection);\n }\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;;;MAkBa,0BAA0B,CAAA;AADvC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACvC,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,+BAA+B,CAAC;QAC3D,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,sCAAsC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAkC1G,IAAA;IAhCC,MAAM,OAAO,CACX,KAAsC,EAAA;AAEtC,QAAA,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBACrD,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;AACjB,aAAA,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,YAAY,CAAC;YACnF,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mDAAmD,EAAE,EAAE;YACnG;AAEA,YAAA,MAAM,IAAI,GAAG,8BAA8B,CAAC,UAAU,CAAC;AACvD,YAAA,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;AACpC,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;QACtD;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,+BAA+B;AACxF,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACvD;IACF;IAEQ,MAAM,mBAAmB,CAAC,UAA2C,EAAA;AAC3E,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE;AAC3C,QAAA,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE;AAC1B,YAAA,MAAM,QAAQ,GAAG,OAAO,YAAY,OAAO,GAAG,MAAM,OAAO,GAAG,OAAO;YACrE,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,EAAE;AACjD,gBAAA,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;YAC1C;QACF;IACF;8GAtCW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cADb,MAAM,EAAA,CAAA,CAAA;;2FACnB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-google-client-complete-google-oauth.command-BE9n_4Yn.mjs","sources":["../../../../libs/extensions/google/client/src/lib/features/connect/complete-google-oauth.command.ts"],"sourcesContent":["//#region ---- Complete Google OAuth callback ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPRuntimeCommandResult, AXPSafeIntegrationConnectionDto } from '@acorex-platform/framework-shared/core';\nimport { AXP_INTEGRATION_CONNECTION_ESTABLISHED } from '@acorex-platform/framework-client/common';\nimport {\n AXMIntegrationConnectionManager,\n toSafeIntegrationConnectionDto,\n} from '@acorex-platform/module-integration-management-client';\nimport { AXEGoogleOAuthHttpClient } from '../../api/google-oauth-http.client';\nimport { Injectable, inject } from '@angular/core';\n\nexport interface CompleteGoogleOAuthCommandInput {\n state: string;\n code: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CompleteGoogleOAuthCommand\n implements AXPCommand<CompleteGoogleOAuthCommandInput, AXPSafeIntegrationConnectionDto>\n{\n private readonly http = inject(AXEGoogleOAuthHttpClient);\n private readonly connectionManager = inject(AXMIntegrationConnectionManager);\n private readonly establishedHandlers = inject(AXP_INTEGRATION_CONNECTION_ESTABLISHED, { optional: true });\n\n async execute(\n input: CompleteGoogleOAuthCommandInput,\n ): AXPCommandExecuteResultPromise<AXPSafeIntegrationConnectionDto> {\n try {\n const { connectionId } = await this.http.completeOAuth({\n state: input.state,\n code: input.code,\n });\n\n const connection = await this.connectionManager.getByIdForCurrentUser(connectionId);\n if (!connection) {\n return { success: false, message: { text: 'Connection not found after Google OAuth callback.' } };\n }\n\n const safe = toSafeIntegrationConnectionDto(connection);\n await this.dispatchEstablished(safe);\n return { success: true, kind: 'object', data: safe };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Google OAuth callback failed.';\n return { success: false, message: { text: message } };\n }\n }\n\n private async dispatchEstablished(connection: AXPSafeIntegrationConnectionDto): Promise<void> {\n const list = this.establishedHandlers ?? [];\n for (const handler of list) {\n const resolved = handler instanceof Promise ? await handler : handler;\n if (resolved.providerId === connection.providerId) {\n await resolved.onEstablished(connection);\n }\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;;;MAkBa,0BAA0B,CAAA;AADvC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACvC,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,+BAA+B,CAAC;QAC3D,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,sCAAsC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAkC1G,IAAA;IAhCC,MAAM,OAAO,CACX,KAAsC,EAAA;AAEtC,QAAA,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBACrD,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;AACjB,aAAA,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,YAAY,CAAC;YACnF,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mDAAmD,EAAE,EAAE;YACnG;AAEA,YAAA,MAAM,IAAI,GAAG,8BAA8B,CAAC,UAAU,CAAC;AACvD,YAAA,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;AACpC,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;QACtD;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,+BAA+B;AACxF,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACvD;IACF;IAEQ,MAAM,mBAAmB,CAAC,UAA2C,EAAA;AAC3E,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE;AAC3C,QAAA,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE;AAC1B,YAAA,MAAM,QAAQ,GAAG,OAAO,YAAY,OAAO,GAAG,MAAM,OAAO,GAAG,OAAO;YACrE,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,EAAE;AACjD,gBAAA,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;YAC1C;QACF;IACF;8GAtCW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cADb,MAAM,EAAA,CAAA,CAAA;;2FACnB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
package/fesm2022/acorex-platform-extension-google-client-connect-google.command-DZ1pU8xZ.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-google-client-connect-google.command-DZ1pU8xZ.mjs","sources":["../../../../libs/extensions/google/client/src/lib/features/connect/connect-google.command.ts"],"sourcesContent":["//#region ---- Connect Google (OAuth 2.0) ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n type AXPRuntimeCommandResult,\n type AXPIntegrationConnectionScope,\n} from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { type ConnectCommandResult } from '@acorex-platform/module-integration-management-client';\nimport { AXEGoogleOAuthHttpClient } from '../../api/google-oauth-http.client';\nimport { Injectable, inject } from '@angular/core';\n\nexport interface ConnectGoogleCommandInput {\n providerId?: string;\n connectionScope?: AXPIntegrationConnectionScope;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ConnectGoogleCommand implements AXPCommand<ConnectGoogleCommandInput, ConnectCommandResult> {\n private readonly oauthHttp = inject(AXEGoogleOAuthHttpClient);\n private readonly sessionService = inject(AXPSessionService);\n\n async execute(input: ConnectGoogleCommandInput = {}): AXPCommandExecuteResultPromise<ConnectCommandResult> {\n try {\n const providerId = input.providerId ?? 'google';\n const connectionScope = input.connectionScope ?? 'user';\n\n const appName = this.sessionService.application?.name ?? 'demo';\n const redirectUri = `${window.location.origin}/${appName}/integrations/oauth/callback/${providerId}`;\n const result = await this.oauthHttp.startOAuth({\n redirectUri,\n connectionScope,\n displayName: providerId,\n });\n\n if (!result.redirectUrl) {\n return {\n success: false,\n message: { text: 'OAuth redirect URL was not returned.' },\n };\n }\n\n return { success: true, kind: 'object', data: { outcome: 'redirect', redirectUrl: result.redirectUrl } };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to connect Google.';\n return { success: false, message: { text: message } };\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;;MAkBa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC5C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AA4B5D,IAAA;AA1BC,IAAA,MAAM,OAAO,CAAC,KAAA,GAAmC,EAAE,EAAA;AACjD,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ;AAC/C,YAAA,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,MAAM;YAEvD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,IAAI,MAAM;AAC/D,YAAA,MAAM,WAAW,GAAG,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,6BAAA,EAAgC,UAAU,EAAE;YACpG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;gBAC7C,WAAW;gBACX,eAAe;AACf,gBAAA,WAAW,EAAE,UAAU;AACxB,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACvB,OAAO;AACL,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE;iBAC1D;YACH;YAEA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE;QAC1G;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,2BAA2B;AACpF,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACvD;IACF;8GA7BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-google-client-connect-google.command-DZ1pU8xZ.mjs","sources":["../../../../libs/extensions/google/client/src/lib/features/connect/connect-google.command.ts"],"sourcesContent":["//#region ---- Connect Google (OAuth 2.0) ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n type AXPRuntimeCommandResult,\n type AXPIntegrationConnectionScope,\n} from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { type ConnectCommandResult } from '@acorex-platform/module-integration-management-client';\nimport { AXEGoogleOAuthHttpClient } from '../../api/google-oauth-http.client';\nimport { Injectable, inject } from '@angular/core';\n\nexport interface ConnectGoogleCommandInput {\n providerId?: string;\n connectionScope?: AXPIntegrationConnectionScope;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ConnectGoogleCommand implements AXPCommand<ConnectGoogleCommandInput, ConnectCommandResult> {\n private readonly oauthHttp = inject(AXEGoogleOAuthHttpClient);\n private readonly sessionService = inject(AXPSessionService);\n\n async execute(input: ConnectGoogleCommandInput = {}): AXPCommandExecuteResultPromise<ConnectCommandResult> {\n try {\n const providerId = input.providerId ?? 'google';\n const connectionScope = input.connectionScope ?? 'user';\n\n const appName = this.sessionService.application?.name ?? 'demo';\n const redirectUri = `${window.location.origin}/${appName}/integrations/oauth/callback/${providerId}`;\n const result = await this.oauthHttp.startOAuth({\n redirectUri,\n connectionScope,\n displayName: providerId,\n });\n\n if (!result.redirectUrl) {\n return {\n success: false,\n message: { text: 'OAuth redirect URL was not returned.' },\n };\n }\n\n return { success: true, kind: 'object', data: { outcome: 'redirect', redirectUrl: result.redirectUrl } };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to connect Google.';\n return { success: false, message: { text: message } };\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;;MAkBa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC5C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AA4B5D,IAAA;AA1BC,IAAA,MAAM,OAAO,CAAC,KAAA,GAAmC,EAAE,EAAA;AACjD,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,QAAQ;AAC/C,YAAA,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,MAAM;YAEvD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,IAAI,MAAM;AAC/D,YAAA,MAAM,WAAW,GAAG,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,6BAAA,EAAgC,UAAU,EAAE;YACpG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;gBAC7C,WAAW;gBACX,eAAe;AACf,gBAAA,WAAW,EAAE,UAAU;AACxB,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACvB,OAAO;AACL,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE;iBAC1D;YACH;YAEA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE;QAC1G;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,2BAA2B;AACpF,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACvD;IACF;8GA7BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-google-client-contracts.mjs","sources":["../../../../libs/extensions/google/contracts/src/root-config.ts","../../../../libs/extensions/google/contracts/src/google.settings.keys.ts","../../../../libs/extensions/google/contracts/src/commands.keys.ts","../../../../libs/extensions/google/contracts/src/oauth.api.types.ts","../../../../libs/extensions/google/contracts/src/acorex-platform-extension-google-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-google',\n module: 'google-extension',\n};\n\nexport const RootConfig = {\n config,\n module: {\n name: config.module,\n icon: 'fa-brands fa-google',\n },\n};\n\n//#endregion\n","/**\n * User-scoped settings for Google sync preferences (Google extension).\n */\nexport enum AXEGoogleSettings {\n /** When true, Gmail sync is enabled for the connected Google account. */\n GmailSyncEnabled = 'Google:Setting:Sync.GmailEnabled',\n\n /** When true, Google Calendar sync is enabled for the connected Google account. */\n CalendarSyncEnabled = 'Google:Setting:Sync.CalendarEnabled',\n}\n","export enum AXEGoogleCommandKeys {\n ConnectionConnect = 'GoogleExtension:Connection:Connect',\n ConnectionCompleteOAuth = 'GoogleExtension:Connection:CompleteOAuth',\n /** Server runtime: start OAuth authorization (not the client connect UI command). */\n OAuthStart = 'GoogleExtension:OAuth:Start',\n /** Server runtime: complete OAuth after redirect callback. */\n OAuthComplete = 'GoogleExtension:OAuth:Complete',\n}\n","//#region ---- Google OAuth API (client ↔ server) ----\n\nexport interface AXEGoogleOAuthStartRequest {\n redirectUri: string;\n connectionScope?: 'user' | 'tenant';\n connectionKey?: string;\n displayName?: string;\n scopes?: string[];\n}\n\nexport interface AXEGoogleOAuthStartResponse {\n redirectUrl: string;\n state: string;\n}\n\nexport interface AXEGoogleOAuthCompleteRequest {\n state: string;\n code: string;\n}\n\nexport interface AXEGoogleOAuthCompleteResponse {\n connectionId: string;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,mBAAmB;AACzB,IAAA,MAAM,EAAE,kBAAkB;CAC3B;AAEM,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC,MAAM;AACnB,QAAA,IAAI,EAAE,qBAAqB;AAC5B,KAAA;;AAGH;;ACfA;;AAEG;IACS;AAAZ,CAAA,UAAY,iBAAiB,EAAA;;AAE3B,IAAA,iBAAA,CAAA,kBAAA,CAAA,GAAA,kCAAqD;;AAGrD,IAAA,iBAAA,CAAA,qBAAA,CAAA,GAAA,qCAA2D;AAC7D,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;;ICHjB;AAAZ,CAAA,UAAY,oBAAoB,EAAA;AAC9B,IAAA,oBAAA,CAAA,mBAAA,CAAA,GAAA,oCAAwD;AACxD,IAAA,oBAAA,CAAA,yBAAA,CAAA,GAAA,0CAAoE;;AAEpE,IAAA,oBAAA,CAAA,YAAA,CAAA,GAAA,6BAA0C;;AAE1C,IAAA,oBAAA,CAAA,eAAA,CAAA,GAAA,gCAAgD;AAClD,CAAC,EAPW,oBAAoB,KAApB,oBAAoB,GAAA,EAAA,CAAA,CAAA;;ACAhC;AAwBA;;ACxBA;;AAEG
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-google-client-contracts.mjs","sources":["../../../../libs/extensions/google/contracts/src/root-config.ts","../../../../libs/extensions/google/contracts/src/google.settings.keys.ts","../../../../libs/extensions/google/contracts/src/commands.keys.ts","../../../../libs/extensions/google/contracts/src/oauth.api.types.ts","../../../../libs/extensions/google/contracts/src/acorex-platform-extension-google-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-google',\n module: 'google-extension',\n};\n\nexport const RootConfig = {\n config,\n module: {\n name: config.module,\n icon: 'fa-brands fa-google',\n },\n};\n\n//#endregion\n","/**\n * User-scoped settings for Google sync preferences (Google extension).\n */\nexport enum AXEGoogleSettings {\n /** When true, Gmail sync is enabled for the connected Google account. */\n GmailSyncEnabled = 'Google:Setting:Sync.GmailEnabled',\n\n /** When true, Google Calendar sync is enabled for the connected Google account. */\n CalendarSyncEnabled = 'Google:Setting:Sync.CalendarEnabled',\n}\n","export enum AXEGoogleCommandKeys {\n ConnectionConnect = 'GoogleExtension:Connection:Connect',\n ConnectionCompleteOAuth = 'GoogleExtension:Connection:CompleteOAuth',\n /** Server runtime: start OAuth authorization (not the client connect UI command). */\n OAuthStart = 'GoogleExtension:OAuth:Start',\n /** Server runtime: complete OAuth after redirect callback. */\n OAuthComplete = 'GoogleExtension:OAuth:Complete',\n}\n","//#region ---- Google OAuth API (client ↔ server) ----\n\nexport interface AXEGoogleOAuthStartRequest {\n redirectUri: string;\n connectionScope?: 'user' | 'tenant';\n connectionKey?: string;\n displayName?: string;\n scopes?: string[];\n}\n\nexport interface AXEGoogleOAuthStartResponse {\n redirectUrl: string;\n state: string;\n}\n\nexport interface AXEGoogleOAuthCompleteRequest {\n state: string;\n code: string;\n}\n\nexport interface AXEGoogleOAuthCompleteResponse {\n connectionId: string;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAEA,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,mBAAmB;AACzB,IAAA,MAAM,EAAE,kBAAkB;CAC3B;AAEM,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC,MAAM;AACnB,QAAA,IAAI,EAAE,qBAAqB;AAC5B,KAAA;;AAGH;;ACfA;;AAEG;IACS;AAAZ,CAAA,UAAY,iBAAiB,EAAA;;AAE3B,IAAA,iBAAA,CAAA,kBAAA,CAAA,GAAA,kCAAqD;;AAGrD,IAAA,iBAAA,CAAA,qBAAA,CAAA,GAAA,qCAA2D;AAC7D,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;;ICHjB;AAAZ,CAAA,UAAY,oBAAoB,EAAA;AAC9B,IAAA,oBAAA,CAAA,mBAAA,CAAA,GAAA,oCAAwD;AACxD,IAAA,oBAAA,CAAA,yBAAA,CAAA,GAAA,0CAAoE;;AAEpE,IAAA,oBAAA,CAAA,YAAA,CAAA,GAAA,6BAA0C;;AAE1C,IAAA,oBAAA,CAAA,eAAA,CAAA,GAAA,gCAAgD;AAClD,CAAC,EAPW,oBAAoB,KAApB,oBAAoB,GAAA,EAAA,CAAA,CAAA;;ACAhC;AAwBA;;ACxBA;;AAEG;;"}
|
package/fesm2022/acorex-platform-extension-google-client-google-oauth-http.client-BygIfysu.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-google-client-google-oauth-http.client-BygIfysu.mjs","sources":["../../../../libs/extensions/google/client/src/lib/api/google-oauth-http.client.ts"],"sourcesContent":["import { commandMessageTextForError } from '@acorex-platform/framework-client/common';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXEGoogleCommandKeys,\n type AXEGoogleOAuthCompleteRequest,\n type AXEGoogleOAuthCompleteResponse,\n type AXEGoogleOAuthStartRequest,\n type AXEGoogleOAuthStartResponse,\n} from '@acorex-platform/extension-google-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class AXEGoogleOAuthHttpClient {\n private readonly commandService = inject(AXPCommandService);\n\n startOAuth(body: AXEGoogleOAuthStartRequest): Promise<AXEGoogleOAuthStartResponse> {\n return this.runCommand(AXEGoogleCommandKeys.OAuthStart, body);\n }\n\n completeOAuth(body: AXEGoogleOAuthCompleteRequest): Promise<AXEGoogleOAuthCompleteResponse> {\n return this.runCommand(AXEGoogleCommandKeys.OAuthComplete, body);\n }\n\n private async runCommand<TInput, TResult>(key: string, input: TInput): Promise<TResult> {\n const result = await this.commandService.execute<TInput, TResult>(key, input);\n if (!result?.success) {\n throw new Error(commandMessageTextForError(result?.message?.text) || `Google OAuth command failed: ${key}`);\n }\n return result.data as TResult;\n }\n}\n"],"names":[],"mappings":";;;;;;MAYa,wBAAwB,CAAA;AADrC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAiB5D,IAAA;AAfC,IAAA,UAAU,CAAC,IAAgC,EAAA;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC;IAC/D;AAEA,IAAA,aAAa,CAAC,IAAmC,EAAA;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,aAAa,EAAE,IAAI,CAAC;IAClE;AAEQ,IAAA,MAAM,UAAU,CAAkB,GAAW,EAAE,KAAa,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAkB,GAAG,EAAE,KAAK,CAAC;AAC7E,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAC;QAC7G;QACA,OAAO,MAAM,CAAC,IAAe;IAC/B;8GAjBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-google-client-google-oauth-http.client-BygIfysu.mjs","sources":["../../../../libs/extensions/google/client/src/lib/api/google-oauth-http.client.ts"],"sourcesContent":["import { commandMessageTextForError } from '@acorex-platform/framework-client/common';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXEGoogleCommandKeys,\n type AXEGoogleOAuthCompleteRequest,\n type AXEGoogleOAuthCompleteResponse,\n type AXEGoogleOAuthStartRequest,\n type AXEGoogleOAuthStartResponse,\n} from '@acorex-platform/extension-google-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class AXEGoogleOAuthHttpClient {\n private readonly commandService = inject(AXPCommandService);\n\n startOAuth(body: AXEGoogleOAuthStartRequest): Promise<AXEGoogleOAuthStartResponse> {\n return this.runCommand(AXEGoogleCommandKeys.OAuthStart, body);\n }\n\n completeOAuth(body: AXEGoogleOAuthCompleteRequest): Promise<AXEGoogleOAuthCompleteResponse> {\n return this.runCommand(AXEGoogleCommandKeys.OAuthComplete, body);\n }\n\n private async runCommand<TInput, TResult>(key: string, input: TInput): Promise<TResult> {\n const result = await this.commandService.execute<TInput, TResult>(key, input);\n if (!result?.success) {\n throw new Error(commandMessageTextForError(result?.message?.text) || `Google OAuth command failed: ${key}`);\n }\n return result.data as TResult;\n }\n}\n"],"names":[],"mappings":";;;;;;MAYa,wBAAwB,CAAA;AADrC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAiB5D,IAAA;AAfC,IAAA,UAAU,CAAC,IAAgC,EAAA;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC;IAC/D;AAEA,IAAA,aAAa,CAAC,IAAmC,EAAA;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,aAAa,EAAE,IAAI,CAAC;IAClE;AAEQ,IAAA,MAAM,UAAU,CAAkB,GAAW,EAAE,KAAa,EAAA;AAClE,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAkB,GAAG,EAAE,KAAK,CAAC;AAC7E,QAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAA,6BAAA,EAAgC,GAAG,CAAA,CAAE,CAAC;QAC7G;QACA,OAAO,MAAM,CAAC,IAAe;IAC/B;8GAjBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
|
@@ -43,7 +43,7 @@ class AXEGooglePlatformLoginSlotComponent {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEGooglePlatformLoginSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
46
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXEGooglePlatformLoginSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<ax-button\n class=\"w-full mt-2\"\n text=\"{{ '@auth:authentication.with-google' | translate | async }}\"\n [color]=\"'default'\"\n id=\"google-platform-login\"\n (onClick)=\"handleGoogleSignIn()\"\n [disabled]=\"isLoading()\"\n>\n <ax-prefix>\n <axp-logo [logoKey]=\"logoKey\" appearance=\"colored\" [size]=\"20\" />\n </ax-prefix>\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n</ax-button>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "
|
|
46
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXEGooglePlatformLoginSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<ax-button\n class=\"w-full mt-2\"\n text=\"{{ '@auth:authentication.with-google' | translate | async }}\"\n [color]=\"'default'\"\n id=\"google-platform-login\"\n (onClick)=\"handleGoogleSignIn()\"\n [disabled]=\"isLoading()\"\n>\n <ax-prefix>\n <axp-logo [logoKey]=\"logoKey\" appearance=\"colored\" [size]=\"20\" />\n </ax-prefix>\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n</ax-button>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i3.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
47
47
|
}
|
|
48
48
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXEGooglePlatformLoginSlotComponent, decorators: [{
|
|
49
49
|
type: Component,
|
|
@@ -51,4 +51,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
51
51
|
}] });
|
|
52
52
|
|
|
53
53
|
export { AXEGooglePlatformLoginSlotComponent };
|
|
54
|
-
//# sourceMappingURL=acorex-platform-extension-google-client-google-platform-login-slot.component-
|
|
54
|
+
//# sourceMappingURL=acorex-platform-extension-google-client-google-platform-login-slot.component-CuMUv7eD.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-google-client-google-platform-login-slot.component-
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-google-client-google-platform-login-slot.component-CuMUv7eD.mjs","sources":["../../../../libs/extensions/google/client/src/lib/platform-auth/google-platform-login-slot.component.ts","../../../../libs/extensions/google/client/src/lib/platform-auth/google-platform-login-slot.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPLogoComponent } from '@acorex-platform/framework-client/core';\nimport { CommonModule } from '@angular/common';\nimport { Component, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { axpGoogleLogoKey } from '../brand/google-logo-key';\n\n//#region ---- Google platform login slot ----\n\n@Component({\n templateUrl: './google-platform-login-slot.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXLoadingModule, AXTranslationModule, AXPLogoComponent],\n})\nexport class AXEGooglePlatformLoginSlotComponent {\n protected readonly logoKey = axpGoogleLogoKey;\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly toastService = inject(AXToastService);\n protected isLoading = signal(false);\n\n protected async handleGoogleSignIn(): Promise<void> {\n this.isLoading.set(true);\n try {\n this.sessionService.setStrategy('google');\n await this.sessionService.signin({ strategy: 'google' });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Google sign-in failed.';\n this.toastService.show({\n color: 'danger',\n content: message,\n timeOut: 6000,\n });\n } finally {\n this.isLoading.set(false);\n }\n }\n}\n\n//#endregion\n","<ax-button\n class=\"w-full mt-2\"\n text=\"{{ '@auth:authentication.with-google' | translate | async }}\"\n [color]=\"'default'\"\n id=\"google-platform-login\"\n (onClick)=\"handleGoogleSignIn()\"\n [disabled]=\"isLoading()\"\n>\n <ax-prefix>\n <axp-logo [logoKey]=\"logoKey\" appearance=\"colored\" [size]=\"20\" />\n </ax-prefix>\n @if (isLoading()) {\n <ax-loading></ax-loading>\n }\n</ax-button>\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AXMIntegrationManagementModule } from '@acorex-platform/module-integration-management-client';
|
|
2
2
|
import { AXP_INTEGRATION_SECRET_STORE, AXP_INTEGRATION_PROVIDER, AXP_INTEGRATION_RUNTIME_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
|
|
3
3
|
import * as i3 from '@acorex-platform/framework-client/auth';
|
|
4
|
-
import { AXPAuthStrategy, AXPSessionService, AXPPlatformAuthRuntimeService, resolvePlatformOAuthIssuer, resolvePlatformOAuthClientConfig,
|
|
4
|
+
import { AXPAuthStrategy, AXPSessionService, AXPPlatformAuthRuntimeService, resolvePlatformOAuthIssuer, resolvePlatformOAuthClientConfig, initPlatformOAuthAuthorization, toPlatformOAuthSignInResult, shouldPlatformOAuthBindSession, platformOAuthSessionUpdateParams, exchangePlatformOAuthAuthorizationCode, JwtUtil, TimeUtil, AXPAuthModule } from '@acorex-platform/framework-client/auth';
|
|
5
5
|
import { provideCommandSetups } from '@acorex-platform/framework-client/runtime';
|
|
6
6
|
import { RootConfig, AXEGoogleCommandKeys, AXEGoogleSettings } from '@acorex-platform/extension-google-client/contracts';
|
|
7
7
|
import * as i1 from '@acorex-platform/framework-client/core';
|
|
@@ -174,26 +174,18 @@ class AXEGooglePlatformAuthStrategy extends AXPAuthStrategy {
|
|
|
174
174
|
async redirectToGooglePlatformAuthorize() {
|
|
175
175
|
const issuer = this.resolveIssuer();
|
|
176
176
|
const { clientId, redirectUri, scope } = this.resolveClientConfig();
|
|
177
|
-
const codeVerifier = PkceUtil.generateRandomString(128);
|
|
178
|
-
localStorage.setItem('pkce_code_verifier', codeVerifier);
|
|
179
|
-
const codeChallenge = await PkceUtil.generateCodeChallenge(codeVerifier);
|
|
180
|
-
// Ensure callback can resolve strategy even if restoreSession cleared AXP_SESSION.
|
|
181
177
|
this.sessionService.setStrategy('google');
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
178
|
+
const { authorizeUrl } = await initPlatformOAuthAuthorization({
|
|
179
|
+
issuer,
|
|
180
|
+
clientId,
|
|
181
|
+
redirectUri,
|
|
186
182
|
scope,
|
|
187
|
-
|
|
188
|
-
code_challenge_method: 'S256',
|
|
189
|
-
prompt: 'login',
|
|
190
|
-
acr_values: 'google',
|
|
183
|
+
provider: 'google',
|
|
191
184
|
});
|
|
192
|
-
window.location.assign(
|
|
185
|
+
window.location.assign(authorizeUrl);
|
|
193
186
|
await this.waitForOAuthRedirect();
|
|
194
187
|
}
|
|
195
188
|
async signout() {
|
|
196
|
-
localStorage.removeItem('pkce_code_verifier');
|
|
197
189
|
localStorage.removeItem('oauth_provider');
|
|
198
190
|
await this.platformAuthRuntime.logout();
|
|
199
191
|
}
|
|
@@ -244,31 +236,14 @@ class AXEGooglePlatformAuthStrategy extends AXPAuthStrategy {
|
|
|
244
236
|
const { clientId, redirectUri } = this.resolveClientConfig();
|
|
245
237
|
const resolvedRedirectUri = params['redirectUri'] || redirectUri;
|
|
246
238
|
const resolvedClientId = params['clientId'] || clientId;
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
const body = new URLSearchParams({
|
|
253
|
-
grant_type: 'authorization_code',
|
|
254
|
-
client_id: resolvedClientId,
|
|
255
|
-
code_verifier: codeVerifier,
|
|
239
|
+
const tokenData = await exchangePlatformOAuthAuthorizationCode({
|
|
240
|
+
issuer,
|
|
241
|
+
clientId: resolvedClientId,
|
|
242
|
+
redirectUri: resolvedRedirectUri,
|
|
256
243
|
code,
|
|
257
|
-
redirect_uri: resolvedRedirectUri,
|
|
258
|
-
});
|
|
259
|
-
const response = await fetch(tokenEndpoint, {
|
|
260
|
-
method: 'POST',
|
|
261
|
-
credentials: 'include',
|
|
262
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
263
|
-
body: body.toString(),
|
|
264
244
|
});
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
throw new Error(`Token exchange failed: ${response.status} ${response.statusText}${detail ? ` — ${detail}` : ''}`);
|
|
268
|
-
}
|
|
269
|
-
localStorage.removeItem('pkce_code_verifier');
|
|
270
|
-
const tokenData = await response.json();
|
|
271
|
-
const payload = JwtUtil.parseJwt(tokenData.id_token);
|
|
245
|
+
const idToken = tokenData['id_token'] ?? null;
|
|
246
|
+
const payload = idToken ? JwtUtil.parseJwt(idToken) : null;
|
|
272
247
|
if (!payload) {
|
|
273
248
|
throw new Error('Payload not found');
|
|
274
249
|
}
|
|
@@ -281,10 +256,10 @@ class AXEGooglePlatformAuthStrategy extends AXPAuthStrategy {
|
|
|
281
256
|
return {
|
|
282
257
|
succeed: true,
|
|
283
258
|
data: {
|
|
284
|
-
accessToken: tokenData
|
|
285
|
-
refreshToken: tokenData
|
|
286
|
-
idToken
|
|
287
|
-
expiresIn: TimeUtil.calculateExpireInDate(tokenData
|
|
259
|
+
accessToken: tokenData['access_token'] ?? '',
|
|
260
|
+
refreshToken: tokenData['refresh_token'] ?? '',
|
|
261
|
+
idToken,
|
|
262
|
+
expiresIn: TimeUtil.calculateExpireInDate(Number(tokenData['expires_in'] ?? 0)),
|
|
288
263
|
user,
|
|
289
264
|
tenant: null,
|
|
290
265
|
application: null,
|
|
@@ -293,31 +268,17 @@ class AXEGooglePlatformAuthStrategy extends AXPAuthStrategy {
|
|
|
293
268
|
}
|
|
294
269
|
async beginAuthorizationCodeFlow(params) {
|
|
295
270
|
const issuer = this.resolveIssuer();
|
|
296
|
-
const tenantId = params['tenantId'] ?? params['tenant']?.id ?? null;
|
|
297
|
-
const applicationId = params['applicationId'] ?? params['application']?.id ?? null;
|
|
298
271
|
const { clientId, redirectUri, scope } = this.resolveClientConfig();
|
|
299
272
|
const resolvedRedirectUri = params['redirectUri'] || redirectUri;
|
|
300
273
|
const resolvedScope = params['scope'] || scope;
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
`redirect_uri=${encodeURIComponent(resolvedRedirectUri)}`,
|
|
310
|
-
`scope=${encodeURIComponent(resolvedScope)}`,
|
|
311
|
-
`state=${encodeURIComponent(state)}`,
|
|
312
|
-
tenantId ? `tenant_id=${encodeURIComponent(tenantId)}` : null,
|
|
313
|
-
applicationId ? `application_id=${encodeURIComponent(applicationId)}` : null,
|
|
314
|
-
`code_challenge=${encodeURIComponent(codeChallenge)}`,
|
|
315
|
-
`code_challenge_method=S256`,
|
|
316
|
-
`acr_values=google`,
|
|
317
|
-
]
|
|
318
|
-
.filter(Boolean)
|
|
319
|
-
.join('&');
|
|
320
|
-
window.location.href = `${authorizeEndpoint}?${queryParams}`;
|
|
274
|
+
const { authorizeUrl } = await initPlatformOAuthAuthorization({
|
|
275
|
+
issuer,
|
|
276
|
+
clientId,
|
|
277
|
+
redirectUri: resolvedRedirectUri,
|
|
278
|
+
scope: resolvedScope,
|
|
279
|
+
provider: 'google',
|
|
280
|
+
});
|
|
281
|
+
window.location.href = authorizeUrl;
|
|
321
282
|
await this.waitForOAuthRedirect();
|
|
322
283
|
return undefined;
|
|
323
284
|
}
|
|
@@ -462,7 +423,7 @@ class AXEGoogleExtensionModule {
|
|
|
462
423
|
registry.register(AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT, {
|
|
463
424
|
name: 'google-platform-login',
|
|
464
425
|
priority: 10,
|
|
465
|
-
loadComponent: () => import('./acorex-platform-extension-google-client-google-platform-login-slot.component-
|
|
426
|
+
loadComponent: () => import('./acorex-platform-extension-google-client-google-platform-login-slot.component-CuMUv7eD.mjs').then((component) => component.AXEGooglePlatformLoginSlotComponent),
|
|
466
427
|
condition: () => googlePlatformLogin.isEnabled(),
|
|
467
428
|
});
|
|
468
429
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-extension-google-client.mjs","sources":["../../../../libs/extensions/google/client/src/lib/brand/google-logo-key.ts","../../../../libs/extensions/google/client/src/lib/integration/google.integration.constants.ts","../../../../libs/extensions/google/client/src/lib/integration/google.integration.provider.ts","../../../../libs/extensions/google/client/src/lib/integration/google.integration-runtime.provider.ts","../../../../libs/extensions/google/client/src/lib/platform-auth/google-platform-auth.strategy.ts","../../../../libs/extensions/google/client/src/lib/platform-auth/google-platform-login-availability.service.ts","../../../../libs/extensions/google/client/src/lib/settings/google.settings.provider.ts","../../../../libs/extensions/google/client/src/lib/brand/google-logo.provider.ts","../../../../libs/extensions/google/client/src/lib/google-extension.module.ts","../../../../libs/extensions/google/client/src/lib/brand/google-logo.component.ts","../../../../libs/extensions/google/client/src/acorex-platform-extension-google-client.ts"],"sourcesContent":["//#region ---- Google logo registry key ----\n\nexport const axpGoogleLogoKey = 'google' as const;\n\n//#endregion\n","//#region ---- Google OAuth scopes ----\n\n/** Default OAuth scopes requested when connecting a Google account. */\nexport const AXE_GOOGLE_OAUTH_DEFAULT_SCOPES = [\n 'openid',\n 'email',\n 'profile',\n 'https://www.googleapis.com/auth/gmail.readonly',\n 'https://www.googleapis.com/auth/calendar',\n] as const;\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXP_INTEGRATION_AUTH_METHOD_TYPE, AXP_INTEGRATION_CAPABILITY, AXP_INTEGRATION_CONNECTION_SCOPE } from '@acorex-platform/framework-shared/core';\nimport {\n AXPIntegrationProvider,\n AXPIntegrationProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable } from '@angular/core';\nimport { AXEGoogleCommandKeys, RootConfig } from '@acorex-platform/extension-google-client/contracts';\nimport { axpGoogleLogoKey } from '../brand/google-logo-key';\nimport { AXE_GOOGLE_OAUTH_DEFAULT_SCOPES } from './google.integration.constants';\n\n//#endregion\n\n//#region ---- Provider ----\n\n@Injectable()\nexport class AXEGoogleIntegrationProvider implements AXPIntegrationProvider {\n async provide(context: AXPIntegrationProviderContext): Promise<void> {\n const I18N = `@${RootConfig.config.i18n}:integration`;\n\n context.register({\n domainId: 'other',\n id: 'google',\n module: RootConfig.module.name,\n displayName: `${I18N}.display-name`,\n description: `${I18N}.description`,\n icon: RootConfig.module.icon,\n logoKey: axpGoogleLogoKey,\n capabilities: [\n AXP_INTEGRATION_CAPABILITY.Messaging,\n AXP_INTEGRATION_CAPABILITY.Calendar,\n AXP_INTEGRATION_CAPABILITY.Sync,\n AXP_INTEGRATION_CAPABILITY.Identity,\n ],\n connectionScopes: [AXP_INTEGRATION_CONNECTION_SCOPE.User],\n allowMultipleConnections: false,\n defaultConnectionKey: 'default',\n connectCommandKey: AXEGoogleCommandKeys.ConnectionConnect,\n completeOAuthCommandKey: AXEGoogleCommandKeys.ConnectionCompleteOAuth,\n authMethods: [\n {\n type: AXP_INTEGRATION_AUTH_METHOD_TYPE.OAuth2,\n label: `${I18N}.auth.oauth.label`,\n instructions: `${I18N}.auth.oauth.instructions`,\n usesRedirect: true,\n supportsRefresh: true,\n supportsRevoke: true,\n supportsValidation: true,\n defaultScopes: [...AXE_GOOGLE_OAUTH_DEFAULT_SCOPES],\n fields: [],\n },\n ],\n });\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXP_INTEGRATION_CONNECTION_STATUS, type AXPIntegrationProviderRuntimeHooks, type AXPIntegrationRuntimeContext, type AXPIntegrationValidationResult } from '@acorex-platform/framework-shared/core';\nimport {\n AXP_INTEGRATION_SECRET_STORE,\n type AXPIntegrationRuntimeProvider,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable, inject } from '@angular/core';\nimport { defaultTo, trim } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXEGoogleIntegrationClient {\n accessToken: string;\n refreshToken?: string;\n email?: string;\n}\n\ninterface GoogleConnectionCredentials {\n accessToken: string;\n refreshToken?: string;\n email?: string;\n}\n\n//#endregion\n\n//#region ---- Runtime Provider ----\n\n@Injectable()\nexport class AXEGoogleIntegrationRuntimeProvider implements AXPIntegrationRuntimeProvider {\n readonly providerId = 'google';\n\n private readonly secretStore = inject(AXP_INTEGRATION_SECRET_STORE, { optional: true });\n\n async getHooks(): Promise<AXPIntegrationProviderRuntimeHooks> {\n return {\n validateConnection: (ctx) => this.validateConnection(ctx),\n createClient: (ctx) => this.createClient(ctx),\n };\n }\n\n private async validateConnection(ctx: AXPIntegrationRuntimeContext): Promise<AXPIntegrationValidationResult> {\n try {\n const credentials = await this.resolveCredentials(ctx);\n if (!credentials.accessToken) {\n return {\n valid: false,\n status: AXP_INTEGRATION_CONNECTION_STATUS.Invalid,\n errorMessage: 'No access token available for Google connection.',\n };\n }\n\n return {\n valid: true,\n status: AXP_INTEGRATION_CONNECTION_STATUS.Connected,\n externalAccountName: defaultTo(credentials.email, 'Google'),\n externalAccountId: defaultTo(credentials.email, undefined),\n };\n } catch {\n return {\n valid: false,\n status: AXP_INTEGRATION_CONNECTION_STATUS.Invalid,\n errorMessage: 'Failed to validate Google credentials.',\n };\n }\n }\n\n private async createClient(ctx: AXPIntegrationRuntimeContext): Promise<AXEGoogleIntegrationClient> {\n const credentials = await this.resolveCredentials(ctx);\n if (!credentials.accessToken) {\n throw new Error('Google connection has no usable access token.');\n }\n\n return {\n accessToken: credentials.accessToken,\n refreshToken: credentials.refreshToken,\n email: credentials.email,\n };\n }\n\n private async resolveCredentials(ctx: AXPIntegrationRuntimeContext): Promise<GoogleConnectionCredentials> {\n const config = (ctx.config ?? {}) as Record<string, unknown>;\n const configAccessToken = trim(String(config['accessToken'] ?? ''));\n if (configAccessToken) {\n return {\n accessToken: configAccessToken,\n refreshToken: trim(String(config['refreshToken'] ?? '')) || undefined,\n email: trim(String(config['email'] ?? '')) || undefined,\n };\n }\n\n if (!this.secretStore || !ctx.secretRef || ctx.secretRef === 'config') {\n throw new Error('Google connection credentials are not available.');\n }\n\n const credentials = await this.secretStore.resolve(ctx.secretRef, ctx);\n return {\n accessToken: trim(defaultTo(credentials.accessToken, '')),\n refreshToken: trim(defaultTo(credentials.refreshToken, '')) || undefined,\n email: trim(defaultTo(credentials.email, '')) || undefined,\n };\n }\n}\n\n//#endregion\n","import { AXM_AUTH_CONFIG_TOKEN, AXMAuthConfigs } from '@acorex-platform/module-auth-client';\nimport {\n AXPAuthStrategy,\n AXPBaseCredentials,\n AXPPlatformAuthRuntimeService,\n AXPSessionContext,\n AXPSessionData,\n AXPSessionService,\n AXPSignInResult,\n AXPUser,\n JwtUtil,\n PkceUtil,\n platformOAuthSessionUpdateParams,\n resolvePlatformOAuthAuthorizeEndpoint,\n resolvePlatformOAuthClientConfig,\n resolvePlatformOAuthIssuer,\n resolvePlatformOAuthTokenEndpoint,\n shouldPlatformOAuthBindSession,\n TimeUtil,\n toPlatformOAuthSignInResult,\n} from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\n\n//#region ---- Google platform auth strategy ----\n\n@Injectable()\nexport class AXEGooglePlatformAuthStrategy extends AXPAuthStrategy {\n private readonly authConfigs: AXMAuthConfigs = inject(AXM_AUTH_CONFIG_TOKEN);\n private readonly sessionService = inject(AXPSessionService);\n private readonly platformAuthRuntime = inject(AXPPlatformAuthRuntimeService);\n\n get name(): string {\n return 'google';\n }\n\n private resolveIssuer(): string {\n return resolvePlatformOAuthIssuer(this.authConfigs.baseUrl);\n }\n\n private resolveClientConfig() {\n return resolvePlatformOAuthClientConfig(this.authConfigs.authConfig);\n }\n\n override async signin(_credentials: AXPBaseCredentials): Promise<void> {\n await this.redirectToGooglePlatformAuthorize();\n }\n\n private async redirectToGooglePlatformAuthorize(): Promise<void> {\n const issuer = this.resolveIssuer();\n const { clientId, redirectUri, scope } = this.resolveClientConfig();\n\n const codeVerifier = PkceUtil.generateRandomString(128);\n localStorage.setItem('pkce_code_verifier', codeVerifier);\n const codeChallenge = await PkceUtil.generateCodeChallenge(codeVerifier);\n\n // Ensure callback can resolve strategy even if restoreSession cleared AXP_SESSION.\n this.sessionService.setStrategy('google');\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: clientId,\n redirect_uri: redirectUri,\n scope,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n prompt: 'login',\n acr_values: 'google',\n });\n\n window.location.assign(`${issuer}/connect/authorize?${params.toString()}`);\n await this.waitForOAuthRedirect();\n }\n\n async signout(): Promise<void> {\n localStorage.removeItem('pkce_code_verifier');\n localStorage.removeItem('oauth_provider');\n await this.platformAuthRuntime.logout();\n }\n\n async refreshToken(_context: AXPSessionContext): Promise<AXPSignInResult> {\n try {\n const authData = this.loadAuthData();\n const tokenData = await this.platformAuthRuntime.refresh();\n return toPlatformOAuthSignInResult(tokenData, {\n user: tokenData.user,\n tenant: authData?.tenant ?? null,\n application: authData?.application ?? null,\n });\n } catch (error) {\n console.error('Error refreshing token', error);\n return { succeed: false };\n }\n }\n\n override async updateToken(params: { [key: string]: any }): Promise<AXPSignInResult | undefined> {\n try {\n if (params['code']) {\n return this.exchangeAuthorizationCode(params);\n }\n\n if (shouldPlatformOAuthBindSession(this.sessionService.hasSessionCredentials(), params)) {\n const { tenant, application, tenantId, applicationId } = platformOAuthSessionUpdateParams(params);\n const result = await this.platformAuthRuntime.updateSession({\n tenantId,\n applicationId,\n tenant,\n application,\n });\n return toPlatformOAuthSignInResult(result, {\n user: (params['user'] as AXPUser) ?? null,\n tenant: tenant ?? null,\n application: application ?? null,\n });\n }\n\n return this.beginAuthorizationCodeFlow(params);\n } catch (error) {\n console.error('Error in updateToken:', error);\n throw error;\n }\n }\n\n private async exchangeAuthorizationCode(params: { [key: string]: any }): Promise<AXPSignInResult> {\n const code = params['code'];\n const issuer = this.resolveIssuer();\n const { clientId, redirectUri } = this.resolveClientConfig();\n const resolvedRedirectUri = params['redirectUri'] || redirectUri;\n const resolvedClientId = params['clientId'] || clientId;\n const tokenEndpoint = resolvePlatformOAuthTokenEndpoint(issuer);\n\n const codeVerifier = localStorage.getItem('pkce_code_verifier');\n if (!codeVerifier) {\n throw new Error('Code verifier not found. Please try signing in again.');\n }\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: resolvedClientId,\n code_verifier: codeVerifier,\n code,\n redirect_uri: resolvedRedirectUri,\n });\n\n const response = await fetch(tokenEndpoint, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const detail = await response.text().catch(() => '');\n throw new Error(\n `Token exchange failed: ${response.status} ${response.statusText}${detail ? ` — ${detail}` : ''}`,\n );\n }\n\n localStorage.removeItem('pkce_code_verifier');\n\n const tokenData = await response.json();\n const payload = JwtUtil.parseJwt(tokenData.id_token);\n if (!payload) {\n throw new Error('Payload not found');\n }\n\n const user = {\n id: payload['sub'] || '',\n title: payload['name'] || payload['email'] || '',\n name: payload['name'] || payload['email'] || '',\n avatar: payload['picture'] || '',\n } as AXPUser;\n\n return {\n succeed: true,\n data: {\n accessToken: tokenData.access_token ?? tokenData.accessToken,\n refreshToken: tokenData.refresh_token ?? tokenData.refreshToken,\n idToken: tokenData.id_token ?? null,\n expiresIn: TimeUtil.calculateExpireInDate(tokenData.expires_in || 0),\n user,\n tenant: null,\n application: null,\n },\n };\n }\n\n private async beginAuthorizationCodeFlow(params: { [key: string]: any }): Promise<undefined> {\n const issuer = this.resolveIssuer();\n const tenantId = params['tenantId'] ?? params['tenant']?.id ?? null;\n const applicationId = params['applicationId'] ?? params['application']?.id ?? null;\n const { clientId, redirectUri, scope } = this.resolveClientConfig();\n const resolvedRedirectUri = params['redirectUri'] || redirectUri;\n const resolvedScope = params['scope'] || scope;\n\n const codeVerifier = PkceUtil.generateRandomString(128);\n localStorage.setItem('pkce_code_verifier', codeVerifier);\n const codeChallenge = await PkceUtil.generateCodeChallenge(codeVerifier);\n\n const authorizeEndpoint = resolvePlatformOAuthAuthorizeEndpoint(issuer);\n const state = Math.random().toString(36).substring(2);\n\n const queryParams = [\n `response_type=code`,\n `client_id=${encodeURIComponent(clientId)}`,\n `redirect_uri=${encodeURIComponent(resolvedRedirectUri)}`,\n `scope=${encodeURIComponent(resolvedScope)}`,\n `state=${encodeURIComponent(state)}`,\n tenantId ? `tenant_id=${encodeURIComponent(tenantId)}` : null,\n applicationId ? `application_id=${encodeURIComponent(applicationId)}` : null,\n `code_challenge=${encodeURIComponent(codeChallenge)}`,\n `code_challenge_method=S256`,\n `acr_values=google`,\n ]\n .filter(Boolean)\n .join('&');\n\n window.location.href = `${authorizeEndpoint}?${queryParams}`;\n await this.waitForOAuthRedirect();\n\n return undefined;\n }\n\n private waitForOAuthRedirect(): Promise<void> {\n return new Promise<void>(() => {});\n }\n\n private loadAuthData(): AXPSessionData | undefined {\n return this.sessionService.getSessionData() || undefined;\n }\n}\n\n//#endregion\n","import { AXPPlatformAuthRuntimeService } from '@acorex-platform/framework-client/auth';\nimport { Injectable, inject } from '@angular/core';\n\n//#region ---- Google platform login availability ----\n\n@Injectable()\nexport class AXEGooglePlatformLoginAvailabilityService {\n private readonly platformAuthRuntime = inject(AXPPlatformAuthRuntimeService);\n private cachedEnabled: boolean | null = null;\n\n async isEnabled(): Promise<boolean> {\n if (this.cachedEnabled !== null) {\n return this.cachedEnabled;\n }\n\n try {\n const providers = await this.platformAuthRuntime.listProviders();\n this.cachedEnabled = providers.identityProviders.some((p) => p.id === 'google');\n return this.cachedEnabled;\n } catch {\n this.cachedEnabled = false;\n return false;\n }\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport { Injectable, inject } from '@angular/core';\nimport { AXEGoogleSettings, RootConfig } from '@acorex-platform/extension-google-client/contracts';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** Must match the settings group `name` from integration-management (`AXMIntegrationManagementSettingProvider`). */\nconst INTEGRATIONS_SETTINGS_GROUP = 'integrations';\n\nconst GOOGLE_I18N = '@extensions-google:settings.google';\n\n//#endregion\n\n//#region ---- Settings Provider ----\n\n@Injectable()\nexport class AXEGoogleSettingsProvider implements AXPSettingDefinitionProvider {\n private readonly sessionService = inject(AXPSessionService);\n\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n // Only register when the edition entitles Google (same gate as Integrations provider list).\n if (!this.sessionService.isModuleEnabled(RootConfig.module.name)) {\n return;\n }\n\n if (!context.hasGroup(INTEGRATIONS_SETTINGS_GROUP)) {\n return;\n }\n\n const integrations = context.group(INTEGRATIONS_SETTINGS_GROUP);\n if (!integrations) {\n return;\n }\n\n integrations\n .addSection('google', `${GOOGLE_I18N}.section-title`, `${GOOGLE_I18N}.section-description`)\n .addSetting({\n key: 'Google:Setting:ConnectionPanel',\n title: `${GOOGLE_I18N}.connection-title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n widget: {\n type: AXPWidgetsList.Advanced.IntegrationConnectionsPanel,\n layout: { stacked: true },\n options: { providerId: 'google' },\n },\n description: `${GOOGLE_I18N}.connection-description`,\n })\n .addSetting({\n key: AXEGoogleSettings.GmailSyncEnabled,\n title: `${GOOGLE_I18N}.gmail-enabled-title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n defaultValue: false,\n widget: {\n type: AXPWidgetsList.Editors.ToggleSwitch,\n },\n description: `${GOOGLE_I18N}.gmail-enabled-description`,\n })\n .addSetting({\n key: AXEGoogleSettings.CalendarSyncEnabled,\n title: `${GOOGLE_I18N}.calendar-enabled-title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n defaultValue: false,\n widget: {\n type: AXPWidgetsList.Editors.ToggleSwitch,\n },\n description: `${GOOGLE_I18N}.calendar-enabled-description`,\n })\n .endSection();\n }\n}\n\n//#endregion\n","import {\n AXP_LOGO_PROVIDER,\n type AXPLogoProvider,\n type AXPLogoRequest,\n type AXPLogoView,\n} from '@acorex-platform/framework-client/core';\nimport { axpGoogleLogoKey } from './google-logo-key';\n\nconst googleLogoProvider: AXPLogoProvider = {\n key: axpGoogleLogoKey,\n resolve: async (request: AXPLogoRequest): Promise<AXPLogoView> => ({\n kind: 'component',\n load: () => import('./google-logo.component').then((module) => module.AXEGoogleLogoComponent),\n inputs: {\n appearance: request.appearance,\n size: request.size,\n },\n }),\n};\n\nexport const AXE_GOOGLE_LOGO_PROVIDER = {\n provide: AXP_LOGO_PROVIDER,\n useValue: googleLogoProvider,\n multi: true,\n} as const;\n","//#region ---- Imports ----\n\nimport { AXMIntegrationManagementModule } from '@acorex-platform/module-integration-management-client';\nimport {\n AXP_INTEGRATION_PROVIDER,\n AXP_INTEGRATION_RUNTIME_PROVIDER,\n AXP_SETTING_DEFINITION_PROVIDER,\n} from '@acorex-platform/framework-client/common';\nimport { AXPAuthModule } from '@acorex-platform/framework-client/auth';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXEGoogleCommandKeys } from '@acorex-platform/extension-google-client/contracts';\nimport { AXPComponentSlotRegistryService } from '@acorex-platform/framework-client/core';\nimport { AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT } from '@acorex-platform/module-auth-client';\nimport { NgModule } from '@angular/core';\nimport { AXEGoogleIntegrationProvider } from './integration/google.integration.provider';\nimport { AXEGoogleIntegrationRuntimeProvider } from './integration/google.integration-runtime.provider';\nimport { AXEGooglePlatformAuthStrategy } from './platform-auth/google-platform-auth.strategy';\nimport { AXEGooglePlatformLoginAvailabilityService } from './platform-auth/google-platform-login-availability.service';\nimport { AXEGoogleSettingsProvider } from './settings/google.settings.provider';\nimport { AXE_GOOGLE_LOGO_PROVIDER } from './brand/google-logo.provider';\n\n//#endregion\n\n//#region ---- Module ----\n\n/**\n * Google Workspace integration (Gmail, Calendar) and platform login via Google OAuth.\n * Register in the app after {@link AXMIntegrationManagementModule}.\n */\n@NgModule({\n imports: [\n AXMIntegrationManagementModule,\n AXPAuthModule.forChild({ strategies: [AXEGooglePlatformAuthStrategy] }),\n ],\n providers: [\n AXEGooglePlatformLoginAvailabilityService,\n AXE_GOOGLE_LOGO_PROVIDER,\n {\n provide: AXP_INTEGRATION_PROVIDER,\n useClass: AXEGoogleIntegrationProvider,\n multi: true,\n },\n {\n provide: AXP_INTEGRATION_RUNTIME_PROVIDER,\n useClass: AXEGoogleIntegrationRuntimeProvider,\n multi: true,\n },\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXEGoogleSettingsProvider,\n multi: true,\n },\n provideCommandSetups([\n {\n key: AXEGoogleCommandKeys.ConnectionConnect,\n command: () => import('./features/connect/connect-google.command').then((c) => c.ConnectGoogleCommand),\n },\n {\n key: AXEGoogleCommandKeys.ConnectionCompleteOAuth,\n command: () =>\n import('./features/connect/complete-google-oauth.command').then((c) => c.CompleteGoogleOAuthCommand),\n },\n ]),\n ],\n})\nexport class AXEGoogleExtensionModule {\n constructor(\n registry: AXPComponentSlotRegistryService,\n googlePlatformLogin: AXEGooglePlatformLoginAvailabilityService,\n ) {\n registry.register(AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT, {\n name: 'google-platform-login',\n priority: 10,\n loadComponent: () =>\n import('./platform-auth/google-platform-login-slot.component').then(\n (component) => component.AXEGooglePlatformLoginSlotComponent,\n ),\n condition: () => googlePlatformLogin.isEnabled(),\n });\n }\n}\n\n//#endregion\n","import type { AXPLogoAppearance } from '@acorex-platform/framework-client/core';\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\n\n//#region ---- Google brand logo (owned by Google extension) ----\n\n@Component({\n selector: 'axe-google-logo',\n host: { class: 'inline-flex items-center justify-center' },\n changeDetection: ChangeDetectionStrategy.Eager,\n template: `\n @switch (resolvedAppearance()) {\n @case ('monochrome') {\n <svg [attr.width]=\"size()\" [attr.height]=\"size()\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n }\n @default {\n <svg [attr.width]=\"size()\" [attr.height]=\"size()\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n }\n }\n `,\n})\nexport class AXEGoogleLogoComponent {\n appearance = input<AXPLogoAppearance>('colored');\n size = input(20);\n\n protected readonly resolvedAppearance = computed(() => {\n const value = this.appearance();\n return value === 'monochrome' ? 'monochrome' : 'colored';\n });\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2.AXEGooglePlatformLoginAvailabilityService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-google-client.mjs","sources":["../../../../libs/extensions/google/client/src/lib/brand/google-logo-key.ts","../../../../libs/extensions/google/client/src/lib/integration/google.integration.constants.ts","../../../../libs/extensions/google/client/src/lib/integration/google.integration.provider.ts","../../../../libs/extensions/google/client/src/lib/integration/google.integration-runtime.provider.ts","../../../../libs/extensions/google/client/src/lib/platform-auth/google-platform-auth.strategy.ts","../../../../libs/extensions/google/client/src/lib/platform-auth/google-platform-login-availability.service.ts","../../../../libs/extensions/google/client/src/lib/settings/google.settings.provider.ts","../../../../libs/extensions/google/client/src/lib/brand/google-logo.provider.ts","../../../../libs/extensions/google/client/src/lib/google-extension.module.ts","../../../../libs/extensions/google/client/src/lib/brand/google-logo.component.ts","../../../../libs/extensions/google/client/src/acorex-platform-extension-google-client.ts"],"sourcesContent":["//#region ---- Google logo registry key ----\n\nexport const axpGoogleLogoKey = 'google' as const;\n\n//#endregion\n","//#region ---- Google OAuth scopes ----\n\n/** Default OAuth scopes requested when connecting a Google account. */\nexport const AXE_GOOGLE_OAUTH_DEFAULT_SCOPES = [\n 'openid',\n 'email',\n 'profile',\n 'https://www.googleapis.com/auth/gmail.readonly',\n 'https://www.googleapis.com/auth/calendar',\n] as const;\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXP_INTEGRATION_AUTH_METHOD_TYPE, AXP_INTEGRATION_CAPABILITY, AXP_INTEGRATION_CONNECTION_SCOPE } from '@acorex-platform/framework-shared/core';\nimport {\n AXPIntegrationProvider,\n AXPIntegrationProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable } from '@angular/core';\nimport { AXEGoogleCommandKeys, RootConfig } from '@acorex-platform/extension-google-client/contracts';\nimport { axpGoogleLogoKey } from '../brand/google-logo-key';\nimport { AXE_GOOGLE_OAUTH_DEFAULT_SCOPES } from './google.integration.constants';\n\n//#endregion\n\n//#region ---- Provider ----\n\n@Injectable()\nexport class AXEGoogleIntegrationProvider implements AXPIntegrationProvider {\n async provide(context: AXPIntegrationProviderContext): Promise<void> {\n const I18N = `@${RootConfig.config.i18n}:integration`;\n\n context.register({\n domainId: 'other',\n id: 'google',\n module: RootConfig.module.name,\n displayName: `${I18N}.display-name`,\n description: `${I18N}.description`,\n icon: RootConfig.module.icon,\n logoKey: axpGoogleLogoKey,\n capabilities: [\n AXP_INTEGRATION_CAPABILITY.Messaging,\n AXP_INTEGRATION_CAPABILITY.Calendar,\n AXP_INTEGRATION_CAPABILITY.Sync,\n AXP_INTEGRATION_CAPABILITY.Identity,\n ],\n connectionScopes: [AXP_INTEGRATION_CONNECTION_SCOPE.User],\n allowMultipleConnections: false,\n defaultConnectionKey: 'default',\n connectCommandKey: AXEGoogleCommandKeys.ConnectionConnect,\n completeOAuthCommandKey: AXEGoogleCommandKeys.ConnectionCompleteOAuth,\n authMethods: [\n {\n type: AXP_INTEGRATION_AUTH_METHOD_TYPE.OAuth2,\n label: `${I18N}.auth.oauth.label`,\n instructions: `${I18N}.auth.oauth.instructions`,\n usesRedirect: true,\n supportsRefresh: true,\n supportsRevoke: true,\n supportsValidation: true,\n defaultScopes: [...AXE_GOOGLE_OAUTH_DEFAULT_SCOPES],\n fields: [],\n },\n ],\n });\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXP_INTEGRATION_CONNECTION_STATUS, type AXPIntegrationProviderRuntimeHooks, type AXPIntegrationRuntimeContext, type AXPIntegrationValidationResult } from '@acorex-platform/framework-shared/core';\nimport {\n AXP_INTEGRATION_SECRET_STORE,\n type AXPIntegrationRuntimeProvider,\n} from '@acorex-platform/framework-client/common';\nimport { Injectable, inject } from '@angular/core';\nimport { defaultTo, trim } from 'lodash-es';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXEGoogleIntegrationClient {\n accessToken: string;\n refreshToken?: string;\n email?: string;\n}\n\ninterface GoogleConnectionCredentials {\n accessToken: string;\n refreshToken?: string;\n email?: string;\n}\n\n//#endregion\n\n//#region ---- Runtime Provider ----\n\n@Injectable()\nexport class AXEGoogleIntegrationRuntimeProvider implements AXPIntegrationRuntimeProvider {\n readonly providerId = 'google';\n\n private readonly secretStore = inject(AXP_INTEGRATION_SECRET_STORE, { optional: true });\n\n async getHooks(): Promise<AXPIntegrationProviderRuntimeHooks> {\n return {\n validateConnection: (ctx) => this.validateConnection(ctx),\n createClient: (ctx) => this.createClient(ctx),\n };\n }\n\n private async validateConnection(ctx: AXPIntegrationRuntimeContext): Promise<AXPIntegrationValidationResult> {\n try {\n const credentials = await this.resolveCredentials(ctx);\n if (!credentials.accessToken) {\n return {\n valid: false,\n status: AXP_INTEGRATION_CONNECTION_STATUS.Invalid,\n errorMessage: 'No access token available for Google connection.',\n };\n }\n\n return {\n valid: true,\n status: AXP_INTEGRATION_CONNECTION_STATUS.Connected,\n externalAccountName: defaultTo(credentials.email, 'Google'),\n externalAccountId: defaultTo(credentials.email, undefined),\n };\n } catch {\n return {\n valid: false,\n status: AXP_INTEGRATION_CONNECTION_STATUS.Invalid,\n errorMessage: 'Failed to validate Google credentials.',\n };\n }\n }\n\n private async createClient(ctx: AXPIntegrationRuntimeContext): Promise<AXEGoogleIntegrationClient> {\n const credentials = await this.resolveCredentials(ctx);\n if (!credentials.accessToken) {\n throw new Error('Google connection has no usable access token.');\n }\n\n return {\n accessToken: credentials.accessToken,\n refreshToken: credentials.refreshToken,\n email: credentials.email,\n };\n }\n\n private async resolveCredentials(ctx: AXPIntegrationRuntimeContext): Promise<GoogleConnectionCredentials> {\n const config = (ctx.config ?? {}) as Record<string, unknown>;\n const configAccessToken = trim(String(config['accessToken'] ?? ''));\n if (configAccessToken) {\n return {\n accessToken: configAccessToken,\n refreshToken: trim(String(config['refreshToken'] ?? '')) || undefined,\n email: trim(String(config['email'] ?? '')) || undefined,\n };\n }\n\n if (!this.secretStore || !ctx.secretRef || ctx.secretRef === 'config') {\n throw new Error('Google connection credentials are not available.');\n }\n\n const credentials = await this.secretStore.resolve(ctx.secretRef, ctx);\n return {\n accessToken: trim(defaultTo(credentials.accessToken, '')),\n refreshToken: trim(defaultTo(credentials.refreshToken, '')) || undefined,\n email: trim(defaultTo(credentials.email, '')) || undefined,\n };\n }\n}\n\n//#endregion\n","import { AXM_AUTH_CONFIG_TOKEN, AXMAuthConfigs } from '@acorex-platform/module-auth-client';\nimport {\n AXPAuthStrategy,\n AXPBaseCredentials,\n AXPPlatformAuthRuntimeService,\n AXPSessionContext,\n AXPSessionData,\n AXPSessionService,\n AXPSignInResult,\n AXPUser,\n JwtUtil,\n exchangePlatformOAuthAuthorizationCode,\n initPlatformOAuthAuthorization,\n platformOAuthSessionUpdateParams,\n resolvePlatformOAuthClientConfig,\n resolvePlatformOAuthIssuer,\n shouldPlatformOAuthBindSession,\n TimeUtil,\n toPlatformOAuthSignInResult,\n} from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\n\n//#region ---- Google platform auth strategy ----\n\n@Injectable()\nexport class AXEGooglePlatformAuthStrategy extends AXPAuthStrategy {\n private readonly authConfigs: AXMAuthConfigs = inject(AXM_AUTH_CONFIG_TOKEN);\n private readonly sessionService = inject(AXPSessionService);\n private readonly platformAuthRuntime = inject(AXPPlatformAuthRuntimeService);\n\n get name(): string {\n return 'google';\n }\n\n private resolveIssuer(): string {\n return resolvePlatformOAuthIssuer(this.authConfigs.baseUrl);\n }\n\n private resolveClientConfig() {\n return resolvePlatformOAuthClientConfig(this.authConfigs.authConfig);\n }\n\n override async signin(_credentials: AXPBaseCredentials): Promise<void> {\n await this.redirectToGooglePlatformAuthorize();\n }\n\n private async redirectToGooglePlatformAuthorize(): Promise<void> {\n const issuer = this.resolveIssuer();\n const { clientId, redirectUri, scope } = this.resolveClientConfig();\n\n this.sessionService.setStrategy('google');\n\n const { authorizeUrl } = await initPlatformOAuthAuthorization({\n issuer,\n clientId,\n redirectUri,\n scope,\n provider: 'google',\n });\n\n window.location.assign(authorizeUrl);\n await this.waitForOAuthRedirect();\n }\n\n async signout(): Promise<void> {\n localStorage.removeItem('oauth_provider');\n await this.platformAuthRuntime.logout();\n }\n\n async refreshToken(_context: AXPSessionContext): Promise<AXPSignInResult> {\n try {\n const authData = this.loadAuthData();\n const tokenData = await this.platformAuthRuntime.refresh();\n return toPlatformOAuthSignInResult(tokenData, {\n user: tokenData.user,\n tenant: authData?.tenant ?? null,\n application: authData?.application ?? null,\n });\n } catch (error) {\n console.error('Error refreshing token', error);\n return { succeed: false };\n }\n }\n\n override async updateToken(params: { [key: string]: any }): Promise<AXPSignInResult | undefined> {\n try {\n if (params['code']) {\n return this.exchangeAuthorizationCode(params);\n }\n\n if (shouldPlatformOAuthBindSession(this.sessionService.hasSessionCredentials(), params)) {\n const { tenant, application, tenantId, applicationId } = platformOAuthSessionUpdateParams(params);\n const result = await this.platformAuthRuntime.updateSession({\n tenantId,\n applicationId,\n tenant,\n application,\n });\n return toPlatformOAuthSignInResult(result, {\n user: (params['user'] as AXPUser) ?? null,\n tenant: tenant ?? null,\n application: application ?? null,\n });\n }\n\n return this.beginAuthorizationCodeFlow(params);\n } catch (error) {\n console.error('Error in updateToken:', error);\n throw error;\n }\n }\n\n private async exchangeAuthorizationCode(params: { [key: string]: any }): Promise<AXPSignInResult> {\n const code = params['code'];\n const issuer = this.resolveIssuer();\n const { clientId, redirectUri } = this.resolveClientConfig();\n const resolvedRedirectUri = params['redirectUri'] || redirectUri;\n const resolvedClientId = params['clientId'] || clientId;\n\n const tokenData = await exchangePlatformOAuthAuthorizationCode({\n issuer,\n clientId: resolvedClientId,\n redirectUri: resolvedRedirectUri,\n code,\n });\n\n const idToken = (tokenData['id_token'] as string | undefined) ?? null;\n const payload = idToken ? JwtUtil.parseJwt(idToken) : null;\n if (!payload) {\n throw new Error('Payload not found');\n }\n\n const user = {\n id: payload['sub'] || '',\n title: payload['name'] || payload['email'] || '',\n name: payload['name'] || payload['email'] || '',\n avatar: payload['picture'] || '',\n } as AXPUser;\n\n return {\n succeed: true,\n data: {\n accessToken: (tokenData['access_token'] as string | undefined) ?? '',\n refreshToken: (tokenData['refresh_token'] as string | undefined) ?? '',\n idToken,\n expiresIn: TimeUtil.calculateExpireInDate(Number(tokenData['expires_in'] ?? 0)),\n user,\n tenant: null,\n application: null,\n },\n };\n }\n\n private async beginAuthorizationCodeFlow(params: { [key: string]: any }): Promise<undefined> {\n const issuer = this.resolveIssuer();\n const { clientId, redirectUri, scope } = this.resolveClientConfig();\n const resolvedRedirectUri = params['redirectUri'] || redirectUri;\n const resolvedScope = params['scope'] || scope;\n\n const { authorizeUrl } = await initPlatformOAuthAuthorization({\n issuer,\n clientId,\n redirectUri: resolvedRedirectUri,\n scope: resolvedScope,\n provider: 'google',\n });\n\n window.location.href = authorizeUrl;\n await this.waitForOAuthRedirect();\n\n return undefined;\n }\n\n private waitForOAuthRedirect(): Promise<void> {\n return new Promise<void>(() => {});\n }\n\n private loadAuthData(): AXPSessionData | undefined {\n return this.sessionService.getSessionData() || undefined;\n }\n}\n\n//#endregion\n","import { AXPPlatformAuthRuntimeService } from '@acorex-platform/framework-client/auth';\nimport { Injectable, inject } from '@angular/core';\n\n//#region ---- Google platform login availability ----\n\n@Injectable()\nexport class AXEGooglePlatformLoginAvailabilityService {\n private readonly platformAuthRuntime = inject(AXPPlatformAuthRuntimeService);\n private cachedEnabled: boolean | null = null;\n\n async isEnabled(): Promise<boolean> {\n if (this.cachedEnabled !== null) {\n return this.cachedEnabled;\n }\n\n try {\n const providers = await this.platformAuthRuntime.listProviders();\n this.cachedEnabled = providers.identityProviders.some((p) => p.id === 'google');\n return this.cachedEnabled;\n } catch {\n this.cachedEnabled = false;\n return false;\n }\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsList } from '@acorex-platform/framework-shared/core';\nimport { Injectable, inject } from '@angular/core';\nimport { AXEGoogleSettings, RootConfig } from '@acorex-platform/extension-google-client/contracts';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** Must match the settings group `name` from integration-management (`AXMIntegrationManagementSettingProvider`). */\nconst INTEGRATIONS_SETTINGS_GROUP = 'integrations';\n\nconst GOOGLE_I18N = '@extensions-google:settings.google';\n\n//#endregion\n\n//#region ---- Settings Provider ----\n\n@Injectable()\nexport class AXEGoogleSettingsProvider implements AXPSettingDefinitionProvider {\n private readonly sessionService = inject(AXPSessionService);\n\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n // Only register when the edition entitles Google (same gate as Integrations provider list).\n if (!this.sessionService.isModuleEnabled(RootConfig.module.name)) {\n return;\n }\n\n if (!context.hasGroup(INTEGRATIONS_SETTINGS_GROUP)) {\n return;\n }\n\n const integrations = context.group(INTEGRATIONS_SETTINGS_GROUP);\n if (!integrations) {\n return;\n }\n\n integrations\n .addSection('google', `${GOOGLE_I18N}.section-title`, `${GOOGLE_I18N}.section-description`)\n .addSetting({\n key: 'Google:Setting:ConnectionPanel',\n title: `${GOOGLE_I18N}.connection-title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n widget: {\n type: AXPWidgetsList.Advanced.IntegrationConnectionsPanel,\n layout: { stacked: true },\n options: { providerId: 'google' },\n },\n description: `${GOOGLE_I18N}.connection-description`,\n })\n .addSetting({\n key: AXEGoogleSettings.GmailSyncEnabled,\n title: `${GOOGLE_I18N}.gmail-enabled-title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n defaultValue: false,\n widget: {\n type: AXPWidgetsList.Editors.ToggleSwitch,\n },\n description: `${GOOGLE_I18N}.gmail-enabled-description`,\n })\n .addSetting({\n key: AXEGoogleSettings.CalendarSyncEnabled,\n title: `${GOOGLE_I18N}.calendar-enabled-title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n defaultValue: false,\n widget: {\n type: AXPWidgetsList.Editors.ToggleSwitch,\n },\n description: `${GOOGLE_I18N}.calendar-enabled-description`,\n })\n .endSection();\n }\n}\n\n//#endregion\n","import {\n AXP_LOGO_PROVIDER,\n type AXPLogoProvider,\n type AXPLogoRequest,\n type AXPLogoView,\n} from '@acorex-platform/framework-client/core';\nimport { axpGoogleLogoKey } from './google-logo-key';\n\nconst googleLogoProvider: AXPLogoProvider = {\n key: axpGoogleLogoKey,\n resolve: async (request: AXPLogoRequest): Promise<AXPLogoView> => ({\n kind: 'component',\n load: () => import('./google-logo.component').then((module) => module.AXEGoogleLogoComponent),\n inputs: {\n appearance: request.appearance,\n size: request.size,\n },\n }),\n};\n\nexport const AXE_GOOGLE_LOGO_PROVIDER = {\n provide: AXP_LOGO_PROVIDER,\n useValue: googleLogoProvider,\n multi: true,\n} as const;\n","//#region ---- Imports ----\n\nimport { AXMIntegrationManagementModule } from '@acorex-platform/module-integration-management-client';\nimport {\n AXP_INTEGRATION_PROVIDER,\n AXP_INTEGRATION_RUNTIME_PROVIDER,\n AXP_SETTING_DEFINITION_PROVIDER,\n} from '@acorex-platform/framework-client/common';\nimport { AXPAuthModule } from '@acorex-platform/framework-client/auth';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXEGoogleCommandKeys } from '@acorex-platform/extension-google-client/contracts';\nimport { AXPComponentSlotRegistryService } from '@acorex-platform/framework-client/core';\nimport { AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT } from '@acorex-platform/module-auth-client';\nimport { NgModule } from '@angular/core';\nimport { AXEGoogleIntegrationProvider } from './integration/google.integration.provider';\nimport { AXEGoogleIntegrationRuntimeProvider } from './integration/google.integration-runtime.provider';\nimport { AXEGooglePlatformAuthStrategy } from './platform-auth/google-platform-auth.strategy';\nimport { AXEGooglePlatformLoginAvailabilityService } from './platform-auth/google-platform-login-availability.service';\nimport { AXEGoogleSettingsProvider } from './settings/google.settings.provider';\nimport { AXE_GOOGLE_LOGO_PROVIDER } from './brand/google-logo.provider';\n\n//#endregion\n\n//#region ---- Module ----\n\n/**\n * Google Workspace integration (Gmail, Calendar) and platform login via Google OAuth.\n * Register in the app after {@link AXMIntegrationManagementModule}.\n */\n@NgModule({\n imports: [\n AXMIntegrationManagementModule,\n AXPAuthModule.forChild({ strategies: [AXEGooglePlatformAuthStrategy] }),\n ],\n providers: [\n AXEGooglePlatformLoginAvailabilityService,\n AXE_GOOGLE_LOGO_PROVIDER,\n {\n provide: AXP_INTEGRATION_PROVIDER,\n useClass: AXEGoogleIntegrationProvider,\n multi: true,\n },\n {\n provide: AXP_INTEGRATION_RUNTIME_PROVIDER,\n useClass: AXEGoogleIntegrationRuntimeProvider,\n multi: true,\n },\n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXEGoogleSettingsProvider,\n multi: true,\n },\n provideCommandSetups([\n {\n key: AXEGoogleCommandKeys.ConnectionConnect,\n command: () => import('./features/connect/connect-google.command').then((c) => c.ConnectGoogleCommand),\n },\n {\n key: AXEGoogleCommandKeys.ConnectionCompleteOAuth,\n command: () =>\n import('./features/connect/complete-google-oauth.command').then((c) => c.CompleteGoogleOAuthCommand),\n },\n ]),\n ],\n})\nexport class AXEGoogleExtensionModule {\n constructor(\n registry: AXPComponentSlotRegistryService,\n googlePlatformLogin: AXEGooglePlatformLoginAvailabilityService,\n ) {\n registry.register(AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT, {\n name: 'google-platform-login',\n priority: 10,\n loadComponent: () =>\n import('./platform-auth/google-platform-login-slot.component').then(\n (component) => component.AXEGooglePlatformLoginSlotComponent,\n ),\n condition: () => googlePlatformLogin.isEnabled(),\n });\n }\n}\n\n//#endregion\n","import type { AXPLogoAppearance } from '@acorex-platform/framework-client/core';\nimport { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';\n\n//#region ---- Google brand logo (owned by Google extension) ----\n\n@Component({\n selector: 'axe-google-logo',\n host: { class: 'inline-flex items-center justify-center' },\n changeDetection: ChangeDetectionStrategy.Eager,\n template: `\n @switch (resolvedAppearance()) {\n @case ('monochrome') {\n <svg [attr.width]=\"size()\" [attr.height]=\"size()\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n }\n @default {\n <svg [attr.width]=\"size()\" [attr.height]=\"size()\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n }\n }\n `,\n})\nexport class AXEGoogleLogoComponent {\n appearance = input<AXPLogoAppearance>('colored');\n size = input(20);\n\n protected readonly resolvedAppearance = computed(() => {\n const value = this.appearance();\n return value === 'monochrome' ? 'monochrome' : 'colored';\n });\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2.AXEGooglePlatformLoginAvailabilityService"],"mappings":"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"}
|