mcp-creatio 0.3.6
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/.dockerignore +12 -0
- package/.editorconfig +14 -0
- package/.eslintrc.cjs +18 -0
- package/.gitattributes +8 -0
- package/.github/workflows/docker-publish.yml +50 -0
- package/.prettierignore +3 -0
- package/.prettierrc +9 -0
- package/.vscode/launch.json +23 -0
- package/.vscode/mcp.json +13 -0
- package/.vscode/settings.json +16 -0
- package/Agent.md +187 -0
- package/Debug.md +32 -0
- package/Dockerfile +23 -0
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +135 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-builder.d.ts +3 -0
- package/dist/config-builder.d.ts.map +1 -0
- package/dist/config-builder.js +66 -0
- package/dist/config-builder.js.map +1 -0
- package/dist/consts.d.ts +2 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/consts.js +6 -0
- package/dist/consts.js.map +1 -0
- package/dist/creatio/auth/auth-manager.d.ts +9 -0
- package/dist/creatio/auth/auth-manager.d.ts.map +1 -0
- package/dist/creatio/auth/auth-manager.js +29 -0
- package/dist/creatio/auth/auth-manager.js.map +1 -0
- package/dist/creatio/auth/auth.d.ts +16 -0
- package/dist/creatio/auth/auth.d.ts.map +1 -0
- package/dist/creatio/auth/auth.js +20 -0
- package/dist/creatio/auth/auth.js.map +1 -0
- package/dist/creatio/auth/index.d.ts +4 -0
- package/dist/creatio/auth/index.d.ts.map +1 -0
- package/dist/creatio/auth/index.js +21 -0
- package/dist/creatio/auth/index.js.map +1 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.d.ts +17 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.js +49 -0
- package/dist/creatio/auth/providers/base-oauth2-provider.js.map +1 -0
- package/dist/creatio/auth/providers/base-provider.d.ts +15 -0
- package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/base-provider.js +32 -0
- package/dist/creatio/auth/providers/base-provider.js.map +1 -0
- package/dist/creatio/auth/providers/index.d.ts +5 -0
- package/dist/creatio/auth/providers/index.d.ts.map +1 -0
- package/dist/creatio/auth/providers/index.js +21 -0
- package/dist/creatio/auth/providers/index.js.map +1 -0
- package/dist/creatio/auth/providers/legacy-provider.d.ts +10 -0
- package/dist/creatio/auth/providers/legacy-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/legacy-provider.js +73 -0
- package/dist/creatio/auth/providers/legacy-provider.js.map +1 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +18 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.js +245 -0
- package/dist/creatio/auth/providers/oauth2-code-provider.js.map +1 -0
- package/dist/creatio/auth/providers/oauth2-provider.d.ts +9 -0
- package/dist/creatio/auth/providers/oauth2-provider.d.ts.map +1 -0
- package/dist/creatio/auth/providers/oauth2-provider.js +86 -0
- package/dist/creatio/auth/providers/oauth2-provider.js.map +1 -0
- package/dist/creatio/auth/providers/type.d.ts +6 -0
- package/dist/creatio/auth/providers/type.d.ts.map +1 -0
- package/dist/creatio/auth/providers/type.js +10 -0
- package/dist/creatio/auth/providers/type.js.map +1 -0
- package/dist/creatio/client-config.d.ts +29 -0
- package/dist/creatio/client-config.d.ts.map +1 -0
- package/dist/creatio/client-config.js +3 -0
- package/dist/creatio/client-config.js.map +1 -0
- package/dist/creatio/engines/crud/crud-engine.d.ts +15 -0
- package/dist/creatio/engines/crud/crud-engine.d.ts.map +1 -0
- package/dist/creatio/engines/crud/crud-engine.js +33 -0
- package/dist/creatio/engines/crud/crud-engine.js.map +1 -0
- package/dist/creatio/engines/engine-manager.d.ts +33 -0
- package/dist/creatio/engines/engine-manager.d.ts.map +1 -0
- package/dist/creatio/engines/engine-manager.js +54 -0
- package/dist/creatio/engines/engine-manager.js.map +1 -0
- package/dist/creatio/engines/engine-registry.d.ts +15 -0
- package/dist/creatio/engines/engine-registry.d.ts.map +1 -0
- package/dist/creatio/engines/engine-registry.js +35 -0
- package/dist/creatio/engines/engine-registry.js.map +1 -0
- package/dist/creatio/engines/engine.d.ts +4 -0
- package/dist/creatio/engines/engine.d.ts.map +1 -0
- package/dist/creatio/engines/engine.js +3 -0
- package/dist/creatio/engines/engine.js.map +1 -0
- package/dist/creatio/engines/index.d.ts +8 -0
- package/dist/creatio/engines/index.d.ts.map +1 -0
- package/dist/creatio/engines/index.js +24 -0
- package/dist/creatio/engines/index.js.map +1 -0
- package/dist/creatio/engines/process/process-engine.d.ts +10 -0
- package/dist/creatio/engines/process/process-engine.d.ts.map +1 -0
- package/dist/creatio/engines/process/process-engine.js +18 -0
- package/dist/creatio/engines/process/process-engine.js.map +1 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts +13 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts.map +1 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.js +27 -0
- package/dist/creatio/engines/sys-settings/sys-settings-engine.js.map +1 -0
- package/dist/creatio/engines/user/user-engine.d.ts +10 -0
- package/dist/creatio/engines/user/user-engine.d.ts.map +1 -0
- package/dist/creatio/engines/user/user-engine.js +18 -0
- package/dist/creatio/engines/user/user-engine.js.map +1 -0
- package/dist/creatio/index.d.ts +7 -0
- package/dist/creatio/index.d.ts.map +1 -0
- package/dist/creatio/index.js +23 -0
- package/dist/creatio/index.js.map +1 -0
- package/dist/creatio/provider-context.d.ts +10 -0
- package/dist/creatio/provider-context.d.ts.map +1 -0
- package/dist/creatio/provider-context.js +3 -0
- package/dist/creatio/provider-context.js.map +1 -0
- package/dist/creatio/providers/crud-provider.d.ts +40 -0
- package/dist/creatio/providers/crud-provider.d.ts.map +1 -0
- package/dist/creatio/providers/crud-provider.js +3 -0
- package/dist/creatio/providers/crud-provider.js.map +1 -0
- package/dist/creatio/providers/index.d.ts +5 -0
- package/dist/creatio/providers/index.d.ts.map +1 -0
- package/dist/creatio/providers/index.js +21 -0
- package/dist/creatio/providers/index.js.map +1 -0
- package/dist/creatio/providers/process-provider.d.ts +14 -0
- package/dist/creatio/providers/process-provider.d.ts.map +1 -0
- package/dist/creatio/providers/process-provider.js +3 -0
- package/dist/creatio/providers/process-provider.js.map +1 -0
- package/dist/creatio/providers/sys-settings-provider.d.ts +58 -0
- package/dist/creatio/providers/sys-settings-provider.d.ts.map +1 -0
- package/dist/creatio/providers/sys-settings-provider.js +3 -0
- package/dist/creatio/providers/sys-settings-provider.js.map +1 -0
- package/dist/creatio/providers/user-provider.d.ts +12 -0
- package/dist/creatio/providers/user-provider.d.ts.map +1 -0
- package/dist/creatio/providers/user-provider.js +3 -0
- package/dist/creatio/providers/user-provider.js.map +1 -0
- package/dist/creatio/services/creatio-service-context.d.ts +17 -0
- package/dist/creatio/services/creatio-service-context.d.ts.map +1 -0
- package/dist/creatio/services/creatio-service-context.js +35 -0
- package/dist/creatio/services/creatio-service-context.js.map +1 -0
- package/dist/creatio/services/http-client.d.ts +29 -0
- package/dist/creatio/services/http-client.d.ts.map +1 -0
- package/dist/creatio/services/http-client.js +136 -0
- package/dist/creatio/services/http-client.js.map +1 -0
- package/dist/creatio/services/index.d.ts +8 -0
- package/dist/creatio/services/index.d.ts.map +1 -0
- package/dist/creatio/services/index.js +24 -0
- package/dist/creatio/services/index.js.map +1 -0
- package/dist/creatio/services/metadata-store.d.ts +20 -0
- package/dist/creatio/services/metadata-store.d.ts.map +1 -0
- package/dist/creatio/services/metadata-store.js +162 -0
- package/dist/creatio/services/metadata-store.js.map +1 -0
- package/dist/creatio/services/odata-crud-provider.d.ts +21 -0
- package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -0
- package/dist/creatio/services/odata-crud-provider.js +145 -0
- package/dist/creatio/services/odata-crud-provider.js.map +1 -0
- package/dist/creatio/services/process-service-provider.d.ts +11 -0
- package/dist/creatio/services/process-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/process-service-provider.js +52 -0
- package/dist/creatio/services/process-service-provider.js.map +1 -0
- package/dist/creatio/services/sys-settings-service-provider.d.ts +19 -0
- package/dist/creatio/services/sys-settings-service-provider.d.ts.map +1 -0
- package/dist/creatio/services/sys-settings-service-provider.js +107 -0
- package/dist/creatio/services/sys-settings-service-provider.js.map +1 -0
- package/dist/creatio/services/user-info-provider.d.ts +10 -0
- package/dist/creatio/services/user-info-provider.d.ts.map +1 -0
- package/dist/creatio/services/user-info-provider.js +26 -0
- package/dist/creatio/services/user-info-provider.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/log.d.ts +51 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +137 -0
- package/dist/log.js.map +1 -0
- package/dist/server/http/creatio-oauth-handlers.d.ts +14 -0
- package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -0
- package/dist/server/http/creatio-oauth-handlers.js +137 -0
- package/dist/server/http/creatio-oauth-handlers.js.map +1 -0
- package/dist/server/http/httpServer.d.ts +23 -0
- package/dist/server/http/httpServer.d.ts.map +1 -0
- package/dist/server/http/httpServer.js +131 -0
- package/dist/server/http/httpServer.js.map +1 -0
- package/dist/server/http/index.d.ts +6 -0
- package/dist/server/http/index.d.ts.map +1 -0
- package/dist/server/http/index.js +22 -0
- package/dist/server/http/index.js.map +1 -0
- package/dist/server/http/mcp-handlers.d.ts +10 -0
- package/dist/server/http/mcp-handlers.d.ts.map +1 -0
- package/dist/server/http/mcp-handlers.js +82 -0
- package/dist/server/http/mcp-handlers.js.map +1 -0
- package/dist/server/http/mcp-oauth-handlers.d.ts +11 -0
- package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -0
- package/dist/server/http/mcp-oauth-handlers.js +106 -0
- package/dist/server/http/mcp-oauth-handlers.js.map +1 -0
- package/dist/server/http/middleware.d.ts +11 -0
- package/dist/server/http/middleware.d.ts.map +1 -0
- package/dist/server/http/middleware.js +88 -0
- package/dist/server/http/middleware.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +19 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp/filters.d.ts +2 -0
- package/dist/server/mcp/filters.d.ts.map +1 -0
- package/dist/server/mcp/filters.js +94 -0
- package/dist/server/mcp/filters.js.map +1 -0
- package/dist/server/mcp/index.d.ts +2 -0
- package/dist/server/mcp/index.d.ts.map +1 -0
- package/dist/server/mcp/index.js +18 -0
- package/dist/server/mcp/index.js.map +1 -0
- package/dist/server/mcp/prompts-data.d.ts +147 -0
- package/dist/server/mcp/prompts-data.d.ts.map +1 -0
- package/dist/server/mcp/prompts-data.js +884 -0
- package/dist/server/mcp/prompts-data.js.map +1 -0
- package/dist/server/mcp/server.d.ts +25 -0
- package/dist/server/mcp/server.d.ts.map +1 -0
- package/dist/server/mcp/server.js +233 -0
- package/dist/server/mcp/server.js.map +1 -0
- package/dist/server/mcp/tools-data.d.ts +165 -0
- package/dist/server/mcp/tools-data.d.ts.map +1 -0
- package/dist/server/mcp/tools-data.js +466 -0
- package/dist/server/mcp/tools-data.js.map +1 -0
- package/dist/server/oauth/client-manager.d.ts +6 -0
- package/dist/server/oauth/client-manager.d.ts.map +1 -0
- package/dist/server/oauth/client-manager.js +52 -0
- package/dist/server/oauth/client-manager.js.map +1 -0
- package/dist/server/oauth/index.d.ts +7 -0
- package/dist/server/oauth/index.d.ts.map +1 -0
- package/dist/server/oauth/index.js +23 -0
- package/dist/server/oauth/index.js.map +1 -0
- package/dist/server/oauth/oauth-server.d.ts +21 -0
- package/dist/server/oauth/oauth-server.d.ts.map +1 -0
- package/dist/server/oauth/oauth-server.js +146 -0
- package/dist/server/oauth/oauth-server.js.map +1 -0
- package/dist/server/oauth/storage.d.ts +31 -0
- package/dist/server/oauth/storage.d.ts.map +1 -0
- package/dist/server/oauth/storage.js +73 -0
- package/dist/server/oauth/storage.js.map +1 -0
- package/dist/server/oauth/token-manager.d.ts +13 -0
- package/dist/server/oauth/token-manager.d.ts.map +1 -0
- package/dist/server/oauth/token-manager.js +69 -0
- package/dist/server/oauth/token-manager.js.map +1 -0
- package/dist/server/oauth/types.d.ts +51 -0
- package/dist/server/oauth/types.d.ts.map +1 -0
- package/dist/server/oauth/types.js +3 -0
- package/dist/server/oauth/types.js.map +1 -0
- package/dist/server/oauth/validators.d.ts +7 -0
- package/dist/server/oauth/validators.d.ts.map +1 -0
- package/dist/server/oauth/validators.js +51 -0
- package/dist/server/oauth/validators.js.map +1 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +19 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/session-context.d.ts +57 -0
- package/dist/services/session-context.d.ts.map +1 -0
- package/dist/services/session-context.js +182 -0
- package/dist/services/session-context.js.map +1 -0
- package/dist/services/token-refresh-scheduler.d.ts +16 -0
- package/dist/services/token-refresh-scheduler.d.ts.map +1 -0
- package/dist/services/token-refresh-scheduler.js +66 -0
- package/dist/services/token-refresh-scheduler.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +18 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/network.d.ts +7 -0
- package/dist/types/network.d.ts.map +1 -0
- package/dist/types/network.js +6 -0
- package/dist/types/network.js.map +1 -0
- package/dist/utils/context.d.ts +10 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +44 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +16 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/mcp.d.ts +3 -0
- package/dist/utils/mcp.d.ts.map +1 -0
- package/dist/utils/mcp.js +7 -0
- package/dist/utils/mcp.js.map +1 -0
- package/dist/utils/network.d.ts +7 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +63 -0
- package/dist/utils/network.js.map +1 -0
- package/dist/utils/pkce.d.ts +7 -0
- package/dist/utils/pkce.d.ts.map +1 -0
- package/dist/utils/pkce.js +43 -0
- package/dist/utils/pkce.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/docs/coding-style.md +30 -0
- package/ecosystem.config.json +17 -0
- package/eslint.config.cjs +95 -0
- package/package.json +54 -0
- package/src/cli.ts +158 -0
- package/src/config-builder.ts +76 -0
- package/src/consts.ts +3 -0
- package/src/creatio/auth/auth-manager.ts +27 -0
- package/src/creatio/auth/auth.ts +31 -0
- package/src/creatio/auth/index.ts +3 -0
- package/src/creatio/auth/providers/base-oauth2-provider.ts +62 -0
- package/src/creatio/auth/providers/base-provider.ts +42 -0
- package/src/creatio/auth/providers/index.ts +4 -0
- package/src/creatio/auth/providers/legacy-provider.ts +70 -0
- package/src/creatio/auth/providers/oauth2-code-provider.ts +252 -0
- package/src/creatio/auth/providers/oauth2-provider.ts +91 -0
- package/src/creatio/auth/providers/type.ts +5 -0
- package/src/creatio/client-config.ts +34 -0
- package/src/creatio/engines/crud/crud-engine.ts +47 -0
- package/src/creatio/engines/engine-manager.ts +102 -0
- package/src/creatio/engines/engine-registry.ts +36 -0
- package/src/creatio/engines/engine.ts +3 -0
- package/src/creatio/engines/index.ts +7 -0
- package/src/creatio/engines/process/process-engine.ts +20 -0
- package/src/creatio/engines/sys-settings/sys-settings-engine.ts +41 -0
- package/src/creatio/engines/user/user-engine.ts +20 -0
- package/src/creatio/index.ts +6 -0
- package/src/creatio/provider-context.ts +10 -0
- package/src/creatio/providers/crud-provider.ts +45 -0
- package/src/creatio/providers/index.ts +4 -0
- package/src/creatio/providers/process-provider.ts +15 -0
- package/src/creatio/providers/sys-settings-provider.ts +63 -0
- package/src/creatio/providers/user-provider.ts +12 -0
- package/src/creatio/services/creatio-service-context.ts +38 -0
- package/src/creatio/services/http-client.ts +174 -0
- package/src/creatio/services/index.ts +7 -0
- package/src/creatio/services/metadata-store.ts +181 -0
- package/src/creatio/services/odata-crud-provider.ts +210 -0
- package/src/creatio/services/process-service-provider.ts +76 -0
- package/src/creatio/services/sys-settings-service-provider.ts +192 -0
- package/src/creatio/services/user-info-provider.ts +41 -0
- package/src/index.ts +44 -0
- package/src/log.ts +141 -0
- package/src/server/http/creatio-oauth-handlers.ts +146 -0
- package/src/server/http/httpServer.ts +150 -0
- package/src/server/http/index.ts +5 -0
- package/src/server/http/mcp-handlers.ts +92 -0
- package/src/server/http/mcp-oauth-handlers.ts +108 -0
- package/src/server/http/middleware.ts +91 -0
- package/src/server/index.ts +2 -0
- package/src/server/mcp/filters.ts +97 -0
- package/src/server/mcp/index.ts +1 -0
- package/src/server/mcp/prompts-data.ts +896 -0
- package/src/server/mcp/server.ts +331 -0
- package/src/server/mcp/tools-data.ts +592 -0
- package/src/server/oauth/client-manager.ts +47 -0
- package/src/server/oauth/index.ts +6 -0
- package/src/server/oauth/oauth-server.ts +185 -0
- package/src/server/oauth/storage.ts +106 -0
- package/src/server/oauth/token-manager.ts +80 -0
- package/src/server/oauth/types.ts +55 -0
- package/src/server/oauth/validators.ts +56 -0
- package/src/services/index.ts +2 -0
- package/src/services/session-context.ts +232 -0
- package/src/services/token-refresh-scheduler.ts +68 -0
- package/src/types/index.ts +1 -0
- package/src/types/network.ts +7 -0
- package/src/utils/context.ts +49 -0
- package/src/utils/env.ts +12 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/mcp.ts +8 -0
- package/src/utils/network.ts +65 -0
- package/src/utils/pkce.ts +39 -0
- package/src/version.ts +15 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import log from '../../../log';
|
|
2
|
+
import { JSON_ACCEPT } from '../../../types';
|
|
3
|
+
import { parseSetCookie } from '../../../utils';
|
|
4
|
+
import { LegacyAuthConfig } from '../../client-config';
|
|
5
|
+
import { buildHeaders } from '../auth';
|
|
6
|
+
|
|
7
|
+
import { BaseProvider } from './base-provider';
|
|
8
|
+
|
|
9
|
+
export class LegacyProvider extends BaseProvider<LegacyAuthConfig> {
|
|
10
|
+
private _bpmCsrf: string | undefined;
|
|
11
|
+
|
|
12
|
+
private _cookieHeader: string | undefined;
|
|
13
|
+
|
|
14
|
+
private async _ensureSession() {
|
|
15
|
+
if (this._cookieHeader) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const url = `${this.config.baseUrl.replace(/\/$/, '')}/ServiceModel/AuthService.svc/Login`;
|
|
19
|
+
const body = JSON.stringify({
|
|
20
|
+
UserName: this.authConfig.login,
|
|
21
|
+
UserPassword: this.authConfig.password,
|
|
22
|
+
});
|
|
23
|
+
log.creatioAuthStart(this.config.baseUrl, 'legacy');
|
|
24
|
+
const res = await fetch(url, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: buildHeaders(JSON_ACCEPT, true),
|
|
27
|
+
body,
|
|
28
|
+
redirect: 'manual',
|
|
29
|
+
});
|
|
30
|
+
if (!res.ok) {
|
|
31
|
+
const responseText = await res.text().catch(() => '');
|
|
32
|
+
log.creatioAuthFailed(this.config.baseUrl, `${res.status} ${responseText}`, 'legacy');
|
|
33
|
+
throw new Error(`auth_failed:${res.status} ${responseText}`);
|
|
34
|
+
}
|
|
35
|
+
log.creatioAuthOk(this.config.baseUrl, 'legacy');
|
|
36
|
+
let setCookie: string[] = [];
|
|
37
|
+
if (typeof (res.headers as any).getSetCookie === 'function') {
|
|
38
|
+
setCookie = (res.headers as any).getSetCookie();
|
|
39
|
+
} else if ((res.headers as any).raw && (res.headers as any).raw()['set-cookie']) {
|
|
40
|
+
setCookie = (res.headers as any).raw()['set-cookie'];
|
|
41
|
+
} else {
|
|
42
|
+
setCookie = [];
|
|
43
|
+
}
|
|
44
|
+
const pairs = parseSetCookie(setCookie);
|
|
45
|
+
if (!pairs.length) {
|
|
46
|
+
throw new Error('auth_failed:no_set_cookie');
|
|
47
|
+
}
|
|
48
|
+
this._cookieHeader = pairs.map((c) => `${c.name}=${c.value}`).join('; ');
|
|
49
|
+
const csrf = pairs.find((c) => c.name.toUpperCase() === 'BPMCSRF')?.value;
|
|
50
|
+
if (csrf) {
|
|
51
|
+
this._bpmCsrf = csrf;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public async getHeaders(accept: string, isJson?: boolean): Promise<Record<string, string>> {
|
|
56
|
+
await this._ensureSession();
|
|
57
|
+
const h = buildHeaders(accept, Boolean(isJson));
|
|
58
|
+
h['ForceUseSession'] = 'true';
|
|
59
|
+
h['Cookie'] = this._cookieHeader!;
|
|
60
|
+
if (this._bpmCsrf) {
|
|
61
|
+
h['BPMCSRF'] = this._bpmCsrf;
|
|
62
|
+
}
|
|
63
|
+
return h;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public async refresh(): Promise<void> {
|
|
67
|
+
this._cookieHeader = undefined;
|
|
68
|
+
await this._ensureSession();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { HTTP_MCP_PORT } from '../../../consts';
|
|
2
|
+
import log from '../../../log';
|
|
3
|
+
import { SessionContext, TokenRefreshScheduler, type UserTokens } from '../../../services';
|
|
4
|
+
import { getEffectiveUserKey, getUserKey } from '../../../utils';
|
|
5
|
+
import { CreatioClientConfig, OAuth2CodeAuthConfig } from '../../client-config';
|
|
6
|
+
import { AUTHORIZE_ENDPOINT, REVOCATION_ENDPOINT, TOKEN_ENDPOINT } from '../auth';
|
|
7
|
+
|
|
8
|
+
import { BaseOAuth2Provider } from './base-oauth2-provider';
|
|
9
|
+
|
|
10
|
+
export class OAuth2CodeProvider extends BaseOAuth2Provider<OAuth2CodeAuthConfig> {
|
|
11
|
+
private readonly _sessionContext = SessionContext.instance;
|
|
12
|
+
private readonly _tokenRefreshScheduler = new TokenRefreshScheduler();
|
|
13
|
+
|
|
14
|
+
protected readonly authErrorCode = 'oauth2_code_need_consent';
|
|
15
|
+
|
|
16
|
+
private get _scope() {
|
|
17
|
+
return this.authConfig.scope || 'offline_access';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
constructor(config: CreatioClientConfig) {
|
|
21
|
+
super(config);
|
|
22
|
+
this._tokenRefreshScheduler.setRefreshCallback(this.refreshUserTokens.bind(this));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private async _exchangeCodeForTokens(code: string): Promise<UserTokens> {
|
|
26
|
+
const idBase = this.getIdentityBase();
|
|
27
|
+
const url = idBase + TOKEN_ENDPOINT;
|
|
28
|
+
const body = new URLSearchParams();
|
|
29
|
+
body.set('grant_type', 'authorization_code');
|
|
30
|
+
body.set('client_id', this.authConfig.clientId);
|
|
31
|
+
if (this.authConfig.clientSecret) {
|
|
32
|
+
body.set('client_secret', this.authConfig.clientSecret);
|
|
33
|
+
}
|
|
34
|
+
body.set('code', code);
|
|
35
|
+
body.set('redirect_uri', this.authConfig.redirectUri);
|
|
36
|
+
body.set('scope', this._scope);
|
|
37
|
+
log.creatioAuthStart(this.config.baseUrl, 'oauth2_code');
|
|
38
|
+
const res = await fetch(url, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
41
|
+
body: body.toString(),
|
|
42
|
+
});
|
|
43
|
+
const txt = await res.text().catch(() => '');
|
|
44
|
+
if (!res.ok || !txt) {
|
|
45
|
+
log.creatioAuthFailed(this.config.baseUrl, `token:${res.status} ${txt}`, 'oauth2_code');
|
|
46
|
+
throw new Error(`oauth2_code_token_error:${res.status}`);
|
|
47
|
+
}
|
|
48
|
+
let j: any;
|
|
49
|
+
try {
|
|
50
|
+
j = JSON.parse(txt);
|
|
51
|
+
} catch {
|
|
52
|
+
log.creatioAuthFailed(this.config.baseUrl, 'token_parse_failed', 'oauth2_code');
|
|
53
|
+
throw new Error('oauth2_code_token_parse_failed');
|
|
54
|
+
}
|
|
55
|
+
if (!j.access_token) {
|
|
56
|
+
throw new Error('oauth2_code_no_access_token');
|
|
57
|
+
}
|
|
58
|
+
const expiresIn = Number(j.expires_in) || 180;
|
|
59
|
+
const accessTokenExpiryMs = this.computeExpiryMs(expiresIn, 1);
|
|
60
|
+
log.creatioAuthOk(this.config.baseUrl, 'oauth2_code');
|
|
61
|
+
return {
|
|
62
|
+
accessToken: String(j.access_token),
|
|
63
|
+
accessTokenExpiryMs,
|
|
64
|
+
refreshToken: j.refresh_token ? String(j.refresh_token) : undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private async _refreshTokens(refreshToken: string): Promise<UserTokens> {
|
|
69
|
+
const idBase = this.getIdentityBase();
|
|
70
|
+
const url = idBase + TOKEN_ENDPOINT;
|
|
71
|
+
log.info('oauth2_code.refresh_attempt', { url, refreshTokenLength: refreshToken.length });
|
|
72
|
+
const body = new URLSearchParams();
|
|
73
|
+
body.set('grant_type', 'refresh_token');
|
|
74
|
+
body.set('client_id', this.authConfig.clientId);
|
|
75
|
+
if (this.authConfig.clientSecret) {
|
|
76
|
+
body.set('client_secret', this.authConfig.clientSecret);
|
|
77
|
+
}
|
|
78
|
+
body.set('refresh_token', refreshToken);
|
|
79
|
+
body.set('redirect_uri', this.authConfig.redirectUri);
|
|
80
|
+
body.set('scope', this._scope);
|
|
81
|
+
const res = await fetch(url, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
84
|
+
body: body.toString(),
|
|
85
|
+
});
|
|
86
|
+
const txt = await res.text().catch(() => '');
|
|
87
|
+
log.info('oauth2_code.refresh_response', {
|
|
88
|
+
status: res.status,
|
|
89
|
+
hasBody: !!txt,
|
|
90
|
+
bodyLength: txt.length,
|
|
91
|
+
});
|
|
92
|
+
if (!res.ok || !txt) {
|
|
93
|
+
log.error('oauth2_code.refresh_failed', {
|
|
94
|
+
status: res.status,
|
|
95
|
+
body: txt.substring(0, 200),
|
|
96
|
+
});
|
|
97
|
+
throw new Error(`oauth2_code_refresh_error:${res.status}`);
|
|
98
|
+
}
|
|
99
|
+
let j: any;
|
|
100
|
+
try {
|
|
101
|
+
j = JSON.parse(txt);
|
|
102
|
+
} catch {
|
|
103
|
+
throw new Error('oauth2_code_refresh_parse_failed');
|
|
104
|
+
}
|
|
105
|
+
if (!j.access_token) {
|
|
106
|
+
throw new Error('oauth2_code_refresh_no_access_token');
|
|
107
|
+
}
|
|
108
|
+
const expiresIn = Number(j.expires_in) || 180;
|
|
109
|
+
const accessTokenExpiryMs = this.computeExpiryMs(expiresIn, 1);
|
|
110
|
+
const newTokens = {
|
|
111
|
+
accessToken: String(j.access_token),
|
|
112
|
+
accessTokenExpiryMs,
|
|
113
|
+
refreshToken: j.refresh_token ? String(j.refresh_token) : refreshToken,
|
|
114
|
+
};
|
|
115
|
+
log.info('oauth2_code.refresh_success', {
|
|
116
|
+
hasNewRefreshToken: !!j.refresh_token,
|
|
117
|
+
expiresIn,
|
|
118
|
+
accessTokenLength: newTokens.accessToken.length,
|
|
119
|
+
});
|
|
120
|
+
return newTokens;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
protected throwNoTokenError(): void {
|
|
124
|
+
const userKey = getEffectiveUserKey();
|
|
125
|
+
const errorMessage = userKey
|
|
126
|
+
? `${this.authErrorCode}:http://localhost:${HTTP_MCP_PORT}/oauth/start?userKey=${encodeURIComponent(userKey)}`
|
|
127
|
+
: this.authErrorCode;
|
|
128
|
+
throw new Error(errorMessage);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
protected async ensureAccessToken(force = false): Promise<string | undefined> {
|
|
132
|
+
log.info('oauth2_code.ensure_access_token.start', { force });
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
if (
|
|
135
|
+
!force &&
|
|
136
|
+
this.accessToken &&
|
|
137
|
+
this.accessTokenExpiryMs &&
|
|
138
|
+
now < this.accessTokenExpiryMs
|
|
139
|
+
) {
|
|
140
|
+
return this.accessToken;
|
|
141
|
+
}
|
|
142
|
+
const userKey = getEffectiveUserKey();
|
|
143
|
+
if (!userKey) {
|
|
144
|
+
log.warn('oauth2_code.no_user_key');
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
const saved = await this._sessionContext.getTokensForUser(userKey);
|
|
148
|
+
if (!saved) {
|
|
149
|
+
log.warn('oauth2_code.no_saved_tokens', { userKey });
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
if (
|
|
153
|
+
!force &&
|
|
154
|
+
saved.accessToken &&
|
|
155
|
+
saved.accessTokenExpiryMs &&
|
|
156
|
+
now < saved.accessTokenExpiryMs
|
|
157
|
+
) {
|
|
158
|
+
this.accessToken = saved.accessToken;
|
|
159
|
+
this.accessTokenExpiryMs = saved.accessTokenExpiryMs;
|
|
160
|
+
return this.accessToken;
|
|
161
|
+
}
|
|
162
|
+
if (saved.refreshToken) {
|
|
163
|
+
const updated = await this._refreshTokens(saved.refreshToken);
|
|
164
|
+
await this._sessionContext.setTokensForUser(userKey, updated);
|
|
165
|
+
this.accessToken = updated.accessToken;
|
|
166
|
+
this.accessTokenExpiryMs = updated.accessTokenExpiryMs;
|
|
167
|
+
return this.accessToken;
|
|
168
|
+
}
|
|
169
|
+
await this._sessionContext.deleteTokensForUser(userKey);
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public async finishAuthorization(code: string): Promise<void> {
|
|
174
|
+
const userKey = getEffectiveUserKey();
|
|
175
|
+
log.info('oauth2_code.finish_authorization', { userKey, hasCode: !!code });
|
|
176
|
+
if (!userKey) {
|
|
177
|
+
throw new Error('oauth2_code_missing_user');
|
|
178
|
+
}
|
|
179
|
+
const tokens = await this._exchangeCodeForTokens(code);
|
|
180
|
+
await this._sessionContext.setTokensForUser(userKey, tokens);
|
|
181
|
+
this.accessToken = tokens.accessToken;
|
|
182
|
+
this.accessTokenExpiryMs = tokens.accessTokenExpiryMs;
|
|
183
|
+
this._tokenRefreshScheduler.scheduleRefresh(userKey);
|
|
184
|
+
log.info('oauth2_code.authorization_complete', { userKey });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public async getAuthorizeUrl(state: string): Promise<string> {
|
|
188
|
+
const idBase = this.getIdentityBase();
|
|
189
|
+
const u = new URL(idBase + AUTHORIZE_ENDPOINT);
|
|
190
|
+
u.searchParams.set('client_id', this.authConfig.clientId);
|
|
191
|
+
u.searchParams.set('redirect_uri', this.authConfig.redirectUri);
|
|
192
|
+
u.searchParams.set('response_type', 'code');
|
|
193
|
+
u.searchParams.set('state', state);
|
|
194
|
+
const scopeParam = encodeURIComponent(this._scope);
|
|
195
|
+
u.search += '&scope=' + scopeParam;
|
|
196
|
+
log.info('oauth2_code.authorize_url', {
|
|
197
|
+
idBase,
|
|
198
|
+
url: u.toString(),
|
|
199
|
+
});
|
|
200
|
+
return u.toString();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public async revoke(): Promise<void> {
|
|
204
|
+
try {
|
|
205
|
+
const userKey = getUserKey();
|
|
206
|
+
if (!userKey) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const saved = await this._sessionContext.getTokensForUser(userKey);
|
|
210
|
+
if (!saved?.refreshToken) {
|
|
211
|
+
await this._sessionContext.deleteTokensForUser(userKey);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const idBase = this.getIdentityBase();
|
|
215
|
+
const url = idBase + REVOCATION_ENDPOINT;
|
|
216
|
+
const body = new URLSearchParams();
|
|
217
|
+
body.set('client_id', this.authConfig.clientId);
|
|
218
|
+
if (this.authConfig.clientSecret) {
|
|
219
|
+
body.set('client_secret', this.authConfig.clientSecret);
|
|
220
|
+
}
|
|
221
|
+
body.set('token', saved.refreshToken);
|
|
222
|
+
body.set('token_type_hint', 'refresh_token');
|
|
223
|
+
const res = await fetch(url, {
|
|
224
|
+
method: 'POST',
|
|
225
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
226
|
+
body: body.toString(),
|
|
227
|
+
});
|
|
228
|
+
if (!res.ok) {
|
|
229
|
+
const t = await res.text().catch(() => '');
|
|
230
|
+
log.error('oauth2_code.revoke_failed', { status: res.status, t });
|
|
231
|
+
}
|
|
232
|
+
} finally {
|
|
233
|
+
const userKey = getUserKey();
|
|
234
|
+
if (userKey) {
|
|
235
|
+
await this._sessionContext.deleteTokensForUser(userKey);
|
|
236
|
+
this._tokenRefreshScheduler.cancelRefresh(userKey);
|
|
237
|
+
}
|
|
238
|
+
this.accessToken = undefined;
|
|
239
|
+
this.accessTokenExpiryMs = undefined;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
public async refreshUserTokens(userKey: string): Promise<void> {
|
|
244
|
+
const saved = await this._sessionContext.getTokensForUser(userKey);
|
|
245
|
+
if (!saved?.refreshToken) {
|
|
246
|
+
throw new Error('oauth2_no_refresh_token');
|
|
247
|
+
}
|
|
248
|
+
const updated = await this._refreshTokens(saved.refreshToken);
|
|
249
|
+
await this._sessionContext.setTokensForUser(userKey, updated);
|
|
250
|
+
log.info('oauth2_code.background_refresh_success', { userKey });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import log from '../../../log';
|
|
2
|
+
import { CreatioClientConfig, OAuth2AuthConfig } from '../../client-config';
|
|
3
|
+
import { TOKEN_BODY_SNIPPET_MAX, TOKEN_ENDPOINT } from '../auth';
|
|
4
|
+
|
|
5
|
+
import { BaseOAuth2Provider } from './base-oauth2-provider';
|
|
6
|
+
|
|
7
|
+
export class OAuth2Provider extends BaseOAuth2Provider<OAuth2AuthConfig> {
|
|
8
|
+
private readonly _config: CreatioClientConfig;
|
|
9
|
+
|
|
10
|
+
protected readonly authErrorCode = 'oauth2_auth_failed';
|
|
11
|
+
|
|
12
|
+
constructor(config: CreatioClientConfig) {
|
|
13
|
+
super(config);
|
|
14
|
+
this._config = config;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
protected async ensureAccessToken(): Promise<string | undefined> {
|
|
18
|
+
const now = Date.now();
|
|
19
|
+
if (this.accessToken && this.accessTokenExpiryMs && now < this.accessTokenExpiryMs) {
|
|
20
|
+
return this.accessToken;
|
|
21
|
+
}
|
|
22
|
+
const url = `${this.getIdentityBase()}${TOKEN_ENDPOINT}`;
|
|
23
|
+
const body = new URLSearchParams();
|
|
24
|
+
body.set('grant_type', 'client_credentials');
|
|
25
|
+
body.set('client_id', this.authConfig.clientId);
|
|
26
|
+
body.set('client_secret', this.authConfig.clientSecret);
|
|
27
|
+
try {
|
|
28
|
+
log.creatioAuthStart(this._config.baseUrl, 'oauth2');
|
|
29
|
+
const response = await fetch(url, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
32
|
+
body: body.toString(),
|
|
33
|
+
});
|
|
34
|
+
const responseText = await response.text().catch(() => '');
|
|
35
|
+
const contentType = (response.headers as any)?.get?.('content-type') ?? '';
|
|
36
|
+
const bodySnippet =
|
|
37
|
+
responseText && responseText.length > TOKEN_BODY_SNIPPET_MAX
|
|
38
|
+
? responseText.slice(0, TOKEN_BODY_SNIPPET_MAX) + '\n... [truncated]'
|
|
39
|
+
: responseText;
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
log.error('oauth.token.error', {
|
|
42
|
+
url,
|
|
43
|
+
status: response.status,
|
|
44
|
+
contentType,
|
|
45
|
+
bodySnippet,
|
|
46
|
+
});
|
|
47
|
+
log.creatioAuthFailed(
|
|
48
|
+
this._config.baseUrl,
|
|
49
|
+
`token_error:${response.status}`,
|
|
50
|
+
'oauth2',
|
|
51
|
+
);
|
|
52
|
+
throw new Error(`oauth2_token_error:${response.status}`);
|
|
53
|
+
}
|
|
54
|
+
if (!responseText) {
|
|
55
|
+
log.error('oauth.token.empty_body', { url, status: response.status, contentType });
|
|
56
|
+
log.creatioAuthFailed(this._config.baseUrl, 'empty_response_body', 'oauth2');
|
|
57
|
+
throw new Error('oauth2_empty_token_response');
|
|
58
|
+
}
|
|
59
|
+
let tokenResponse: any = null;
|
|
60
|
+
try {
|
|
61
|
+
tokenResponse = JSON.parse(responseText);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
log.error('oauth.token.parse_failed', {
|
|
64
|
+
url,
|
|
65
|
+
status: response.status,
|
|
66
|
+
contentType,
|
|
67
|
+
bodySnippet,
|
|
68
|
+
});
|
|
69
|
+
log.creatioAuthFailed(this._config.baseUrl, 'token_parse_failed', 'oauth2');
|
|
70
|
+
throw new Error('oauth2_token_parse_failed');
|
|
71
|
+
}
|
|
72
|
+
if (!tokenResponse || !tokenResponse.access_token) {
|
|
73
|
+
log.creatioAuthFailed(
|
|
74
|
+
this._config.baseUrl,
|
|
75
|
+
'no_access_token_in_response',
|
|
76
|
+
'oauth2',
|
|
77
|
+
);
|
|
78
|
+
throw new Error('oauth2_no_access_token');
|
|
79
|
+
}
|
|
80
|
+
this.accessToken = String(tokenResponse.access_token);
|
|
81
|
+
const expiresIn = Number(tokenResponse.expires_in) || 3600;
|
|
82
|
+
this.accessTokenExpiryMs = this.computeExpiryMs(expiresIn, 1);
|
|
83
|
+
log.creatioAuthOk(this._config.baseUrl, 'oauth2');
|
|
84
|
+
return this.accessToken;
|
|
85
|
+
} catch (e: any) {
|
|
86
|
+
log.error('oauth.token.exception', { error: String(e?.message ?? e) });
|
|
87
|
+
log.creatioAuthFailed(this._config.baseUrl, String(e?.message ?? e), 'oauth2');
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AuthProviderType } from './auth/providers';
|
|
2
|
+
|
|
3
|
+
interface ICreatioAuthConfig {
|
|
4
|
+
kind: AuthProviderType;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface LegacyAuthConfig extends ICreatioAuthConfig {
|
|
8
|
+
kind: AuthProviderType.Legacy;
|
|
9
|
+
login: string;
|
|
10
|
+
password: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface BaseOAuthConfig extends ICreatioAuthConfig {
|
|
14
|
+
clientId: string;
|
|
15
|
+
clientSecret: string;
|
|
16
|
+
scope?: string;
|
|
17
|
+
idBaseUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface OAuth2AuthConfig extends BaseOAuthConfig {
|
|
21
|
+
kind: AuthProviderType.OAuth2;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface OAuth2CodeAuthConfig extends BaseOAuthConfig {
|
|
25
|
+
kind: AuthProviderType.OAuth2Code;
|
|
26
|
+
redirectUri: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type CreatioClientAuthConfig = LegacyAuthConfig | OAuth2AuthConfig | OAuth2CodeAuthConfig;
|
|
30
|
+
|
|
31
|
+
export interface CreatioClientConfig {
|
|
32
|
+
baseUrl: string;
|
|
33
|
+
auth: CreatioClientAuthConfig;
|
|
34
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CrudDeleteParams,
|
|
3
|
+
CrudProvider,
|
|
4
|
+
CrudReadParams,
|
|
5
|
+
CrudUpdateParams,
|
|
6
|
+
CrudWriteParams,
|
|
7
|
+
EntitySchemaDescription,
|
|
8
|
+
} from '../../providers';
|
|
9
|
+
import { CreatioEngine } from '../engine';
|
|
10
|
+
|
|
11
|
+
export class CrudEngine implements CreatioEngine {
|
|
12
|
+
private readonly _provider: CrudProvider;
|
|
13
|
+
|
|
14
|
+
public readonly name = 'crud';
|
|
15
|
+
|
|
16
|
+
constructor(provider: CrudProvider) {
|
|
17
|
+
this._provider = provider;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public get kind(): string {
|
|
21
|
+
return this._provider.kind;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public listEntitySets(): Promise<string[]> {
|
|
25
|
+
return this._provider.listEntitySets();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public describeEntity(entitySet: string): Promise<EntitySchemaDescription> {
|
|
29
|
+
return this._provider.describeEntity(entitySet);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public read(params: CrudReadParams): Promise<any> {
|
|
33
|
+
return this._provider.read(params);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public create(params: CrudWriteParams): Promise<any> {
|
|
37
|
+
return this._provider.create(params);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public update(params: CrudUpdateParams): Promise<any> {
|
|
41
|
+
return this._provider.update(params);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public delete(params: CrudDeleteParams): Promise<any> {
|
|
45
|
+
return this._provider.delete(params);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { CreatioProviderContext } from '../provider-context';
|
|
2
|
+
import { CrudProvider, ProcessProvider, SysSettingsProvider, UserProvider } from '../providers';
|
|
3
|
+
|
|
4
|
+
import { CrudEngine } from './crud/crud-engine';
|
|
5
|
+
import { CreatioEngine } from './engine';
|
|
6
|
+
import { EngineRegistry, EngineType } from './engine-registry';
|
|
7
|
+
import { ProcessEngine } from './process/process-engine';
|
|
8
|
+
import { SysSettingsEngine } from './sys-settings/sys-settings-engine';
|
|
9
|
+
import { UserEngine } from './user/user-engine';
|
|
10
|
+
|
|
11
|
+
export interface EngineManagerOptions {
|
|
12
|
+
crudProvider?: CrudProvider;
|
|
13
|
+
processProvider?: ProcessProvider;
|
|
14
|
+
sysSettingsProvider?: SysSettingsProvider;
|
|
15
|
+
userProvider?: UserProvider;
|
|
16
|
+
enableCrud?: boolean;
|
|
17
|
+
enableProcess?: boolean;
|
|
18
|
+
enableSysSettings?: boolean;
|
|
19
|
+
enableUser?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class CreatioEngineManager {
|
|
23
|
+
private readonly _context: CreatioProviderContext;
|
|
24
|
+
private readonly _options: EngineManagerOptions | undefined;
|
|
25
|
+
private readonly _registry = new EngineRegistry();
|
|
26
|
+
private readonly _engines = new Map<string, CreatioEngine>();
|
|
27
|
+
|
|
28
|
+
public get authProvider() {
|
|
29
|
+
return this._context.authProvider;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public get registry(): EngineRegistry {
|
|
33
|
+
return this._registry;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public get crud(): CrudEngine {
|
|
37
|
+
return this._registry.require<CrudEngine>(EngineType.Crud);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public get process(): ProcessEngine {
|
|
41
|
+
return this._registry.require<ProcessEngine>(EngineType.Process);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public get sysSettings(): SysSettingsEngine {
|
|
45
|
+
return this._registry.require<SysSettingsEngine>(EngineType.SysSettings);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public get user(): UserEngine {
|
|
49
|
+
return this._registry.require<UserEngine>(EngineType.User);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
constructor(context: CreatioProviderContext, options?: EngineManagerOptions) {
|
|
53
|
+
this._context = context;
|
|
54
|
+
this._options = options;
|
|
55
|
+
this._initialize();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private _initialize() {
|
|
59
|
+
this._registerEngine(
|
|
60
|
+
EngineType.Crud,
|
|
61
|
+
() =>
|
|
62
|
+
new CrudEngine(this._options?.crudProvider ?? (this._context.crud as CrudProvider)),
|
|
63
|
+
this._options?.enableCrud ?? true,
|
|
64
|
+
);
|
|
65
|
+
this._registerEngine(
|
|
66
|
+
EngineType.Process,
|
|
67
|
+
() =>
|
|
68
|
+
new ProcessEngine(
|
|
69
|
+
this._options?.processProvider ?? (this._context.process as ProcessProvider),
|
|
70
|
+
),
|
|
71
|
+
this._options?.enableProcess ?? true,
|
|
72
|
+
);
|
|
73
|
+
this._registerEngine(
|
|
74
|
+
EngineType.SysSettings,
|
|
75
|
+
() =>
|
|
76
|
+
new SysSettingsEngine(
|
|
77
|
+
this._options?.sysSettingsProvider ??
|
|
78
|
+
(this._context.sysSettings as SysSettingsProvider),
|
|
79
|
+
),
|
|
80
|
+
this._options?.enableSysSettings ?? true,
|
|
81
|
+
);
|
|
82
|
+
this._registerEngine(
|
|
83
|
+
EngineType.User,
|
|
84
|
+
() =>
|
|
85
|
+
new UserEngine(this._options?.userProvider ?? (this._context.user as UserProvider)),
|
|
86
|
+
this._options?.enableUser ?? true,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
private _registerEngine<T extends CreatioEngine>(
|
|
91
|
+
type: EngineType,
|
|
92
|
+
factory: () => T,
|
|
93
|
+
enabled: boolean,
|
|
94
|
+
) {
|
|
95
|
+
if (!enabled) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const engine = factory();
|
|
99
|
+
this._engines.set(type, engine);
|
|
100
|
+
this._registry.register(engine);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CreatioEngine } from './engine';
|
|
2
|
+
|
|
3
|
+
export enum EngineType {
|
|
4
|
+
Crud = 'crud',
|
|
5
|
+
Process = 'process',
|
|
6
|
+
SysSettings = 'sys-settings',
|
|
7
|
+
User = 'user',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class EngineRegistry {
|
|
11
|
+
private readonly _engines = new Map<string, CreatioEngine>();
|
|
12
|
+
|
|
13
|
+
public register(engine: CreatioEngine): CreatioEngine {
|
|
14
|
+
if (this._engines.has(engine.name)) {
|
|
15
|
+
throw new Error(`engine_already_registered:${engine.name}`);
|
|
16
|
+
}
|
|
17
|
+
this._engines.set(engine.name, engine);
|
|
18
|
+
return engine;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public get<T extends CreatioEngine = CreatioEngine>(name: string): T | undefined {
|
|
22
|
+
return this._engines.get(name) as T | undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public require<T extends CreatioEngine = CreatioEngine>(name: string): T {
|
|
26
|
+
const engine = this.get<T>(name);
|
|
27
|
+
if (!engine) {
|
|
28
|
+
throw new Error(`engine_not_registered:${name}`);
|
|
29
|
+
}
|
|
30
|
+
return engine;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public entries(): IterableIterator<[string, CreatioEngine]> {
|
|
34
|
+
return this._engines.entries();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './engine';
|
|
2
|
+
export * from './engine-manager';
|
|
3
|
+
export * from './engine-registry';
|
|
4
|
+
export * from './crud/crud-engine';
|
|
5
|
+
export * from './process/process-engine';
|
|
6
|
+
export * from './sys-settings/sys-settings-engine';
|
|
7
|
+
export * from './user/user-engine';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ExecuteProcessParams, ExecuteProcessResult, ProcessProvider } from '../../providers';
|
|
2
|
+
import { CreatioEngine } from '../engine';
|
|
3
|
+
|
|
4
|
+
export class ProcessEngine implements CreatioEngine {
|
|
5
|
+
private readonly _provider: ProcessProvider;
|
|
6
|
+
|
|
7
|
+
public readonly name = 'process';
|
|
8
|
+
|
|
9
|
+
constructor(provider: ProcessProvider) {
|
|
10
|
+
this._provider = provider;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public get kind(): string {
|
|
14
|
+
return this._provider.kind;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public execute(params: ExecuteProcessParams): Promise<ExecuteProcessResult> {
|
|
18
|
+
return this._provider.executeProcess(params);
|
|
19
|
+
}
|
|
20
|
+
}
|