mcp-creatio 0.5.0 → 0.6.1
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/README.md +22 -1
- package/dist/cli.js +7 -2
- package/dist/cli.js.map +1 -1
- package/dist/config-builder.d.ts.map +1 -1
- package/dist/config-builder.js +13 -1
- package/dist/config-builder.js.map +1 -1
- package/dist/creatio/auth/auth.d.ts +16 -2
- package/dist/creatio/auth/auth.d.ts.map +1 -1
- package/dist/creatio/auth/auth.js +9 -0
- package/dist/creatio/auth/auth.js.map +1 -1
- package/dist/creatio/auth/index.d.ts +2 -1
- package/dist/creatio/auth/index.d.ts.map +1 -1
- package/dist/creatio/auth/index.js +4 -1
- package/dist/creatio/auth/index.js.map +1 -1
- package/dist/creatio/auth/providers/base-provider.d.ts +2 -5
- package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -1
- package/dist/creatio/auth/providers/base-provider.js +0 -15
- package/dist/creatio/auth/providers/base-provider.js.map +1 -1
- package/dist/creatio/auth/providers/oauth2-code-provider.js +3 -3
- package/dist/creatio/client-config.d.ts +8 -0
- package/dist/creatio/client-config.d.ts.map +1 -1
- package/dist/creatio/{providers → contracts}/admin-operation-provider.d.ts.map +1 -1
- package/dist/creatio/contracts/admin-operation-provider.js.map +1 -0
- package/dist/creatio/{providers → contracts}/configuration-provider.d.ts.map +1 -1
- package/dist/creatio/contracts/configuration-provider.js.map +1 -0
- package/dist/creatio/contracts/crud-provider.d.ts +52 -0
- package/dist/creatio/contracts/crud-provider.d.ts.map +1 -0
- package/dist/creatio/contracts/crud-provider.js.map +1 -0
- package/dist/creatio/{providers → contracts}/feature-provider.d.ts.map +1 -1
- package/dist/creatio/contracts/feature-provider.js.map +1 -0
- package/dist/creatio/{providers → contracts}/index.d.ts +1 -0
- package/dist/creatio/contracts/index.d.ts.map +1 -0
- package/dist/creatio/{providers → contracts}/index.js +1 -0
- package/dist/creatio/{providers → contracts}/index.js.map +1 -1
- package/dist/creatio/{providers → contracts}/process-provider.d.ts.map +1 -1
- package/dist/creatio/contracts/process-provider.js.map +1 -0
- package/dist/creatio/contracts/query.d.ts +69 -0
- package/dist/creatio/contracts/query.d.ts.map +1 -0
- package/dist/creatio/contracts/query.js +10 -0
- package/dist/creatio/contracts/query.js.map +1 -0
- package/dist/creatio/{providers → contracts}/sys-settings-provider.d.ts.map +1 -1
- package/dist/creatio/contracts/sys-settings-provider.js.map +1 -0
- package/dist/creatio/{providers → contracts}/user-provider.d.ts.map +1 -1
- package/dist/creatio/contracts/user-provider.js.map +1 -0
- package/dist/creatio/engines/{admin-operation/admin-operation-engine.d.ts → admin-operation-engine.d.ts} +4 -4
- package/dist/creatio/engines/admin-operation-engine.d.ts.map +1 -0
- package/dist/creatio/engines/admin-operation-engine.js +29 -0
- package/dist/creatio/engines/admin-operation-engine.js.map +1 -0
- package/dist/creatio/engines/configuration-engine.d.ts +10 -0
- package/dist/creatio/engines/configuration-engine.d.ts.map +1 -0
- package/dist/creatio/engines/configuration-engine.js +23 -0
- package/dist/creatio/engines/configuration-engine.js.map +1 -0
- package/dist/creatio/engines/crud-engine.d.ts +17 -0
- package/dist/creatio/engines/crud-engine.d.ts.map +1 -0
- package/dist/creatio/engines/crud-engine.js +39 -0
- package/dist/creatio/engines/crud-engine.js.map +1 -0
- package/dist/creatio/engines/engine-manager.d.ts +15 -8
- package/dist/creatio/engines/engine-manager.d.ts.map +1 -1
- package/dist/creatio/engines/engine-manager.js +26 -14
- package/dist/creatio/engines/engine-manager.js.map +1 -1
- package/dist/creatio/engines/engine.d.ts +36 -0
- package/dist/creatio/engines/engine.d.ts.map +1 -1
- package/dist/creatio/engines/engine.js +43 -0
- package/dist/creatio/engines/engine.js.map +1 -1
- package/dist/creatio/engines/feature-engine.d.ts +10 -0
- package/dist/creatio/engines/feature-engine.d.ts.map +1 -0
- package/dist/creatio/engines/{feature/feature-engine.js → feature-engine.js} +5 -3
- package/dist/creatio/engines/feature-engine.js.map +1 -0
- package/dist/creatio/engines/index.d.ts +7 -7
- package/dist/creatio/engines/index.d.ts.map +1 -1
- package/dist/creatio/engines/index.js +7 -7
- package/dist/creatio/engines/index.js.map +1 -1
- package/dist/creatio/engines/process-engine.d.ts +10 -0
- package/dist/creatio/engines/process-engine.d.ts.map +1 -0
- package/dist/creatio/engines/{process/process-engine.js → process-engine.js} +5 -3
- package/dist/creatio/engines/process-engine.js.map +1 -0
- package/dist/creatio/engines/{sys-settings/sys-settings-engine.d.ts → sys-settings-engine.d.ts} +4 -4
- package/dist/creatio/engines/sys-settings-engine.d.ts.map +1 -0
- package/dist/creatio/engines/sys-settings-engine.js +29 -0
- package/dist/creatio/engines/sys-settings-engine.js.map +1 -0
- package/dist/creatio/engines/user-engine.d.ts +10 -0
- package/dist/creatio/engines/user-engine.d.ts.map +1 -0
- package/dist/creatio/engines/{user/user-engine.js → user-engine.js} +4 -2
- package/dist/creatio/engines/user-engine.js.map +1 -0
- package/dist/creatio/index.d.ts +1 -1
- package/dist/creatio/index.js +1 -1
- package/dist/creatio/provider-context.d.ts +1 -1
- package/dist/creatio/services/admin-operation-service-provider.d.ts +1 -1
- package/dist/creatio/services/admin-operation-service-provider.d.ts.map +1 -1
- package/dist/creatio/services/admin-operation-service-provider.js +2 -2
- package/dist/creatio/services/admin-operation-service-provider.js.map +1 -1
- package/dist/creatio/services/configuration-service-provider.d.ts +1 -1
- package/dist/creatio/services/configuration-service-provider.d.ts.map +1 -1
- package/dist/creatio/services/configuration-service-provider.js +5 -2
- package/dist/creatio/services/configuration-service-provider.js.map +1 -1
- package/dist/creatio/services/creatio-service-context.d.ts +1 -1
- package/dist/creatio/services/creatio-service-context.d.ts.map +1 -1
- package/dist/creatio/services/creatio-service-context.js +6 -3
- package/dist/creatio/services/creatio-service-context.js.map +1 -1
- package/dist/creatio/services/crud-provider-factory.d.ts +16 -0
- package/dist/creatio/services/crud-provider-factory.d.ts.map +1 -0
- package/dist/creatio/services/crud-provider-factory.js +22 -0
- package/dist/creatio/services/crud-provider-factory.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-column-values.d.ts +12 -0
- package/dist/creatio/services/dataservice/data-service-column-values.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-column-values.js +39 -0
- package/dist/creatio/services/dataservice/data-service-column-values.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-crud-provider.d.ts +49 -0
- package/dist/creatio/services/dataservice/data-service-crud-provider.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-crud-provider.js +157 -0
- package/dist/creatio/services/dataservice/data-service-crud-provider.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-filter-translator.d.ts +32 -0
- package/dist/creatio/services/dataservice/data-service-filter-translator.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-filter-translator.js +114 -0
- package/dist/creatio/services/dataservice/data-service-filter-translator.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-query-builder.d.ts +21 -0
- package/dist/creatio/services/dataservice/data-service-query-builder.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-query-builder.js +97 -0
- package/dist/creatio/services/dataservice/data-service-query-builder.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-schema.d.ts +31 -0
- package/dist/creatio/services/dataservice/data-service-schema.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-schema.js +95 -0
- package/dist/creatio/services/dataservice/data-service-schema.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-transport.d.ts +21 -0
- package/dist/creatio/services/dataservice/data-service-transport.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-transport.js +49 -0
- package/dist/creatio/services/dataservice/data-service-transport.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-types.d.ts +180 -0
- package/dist/creatio/services/dataservice/data-service-types.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-types.js +110 -0
- package/dist/creatio/services/dataservice/data-service-types.js.map +1 -0
- package/dist/creatio/services/dataservice/data-service-value-type.d.ts +27 -0
- package/dist/creatio/services/dataservice/data-service-value-type.d.ts.map +1 -0
- package/dist/creatio/services/dataservice/data-service-value-type.js +99 -0
- package/dist/creatio/services/dataservice/data-service-value-type.js.map +1 -0
- package/dist/creatio/services/entity-name.d.ts +8 -0
- package/dist/creatio/services/entity-name.d.ts.map +1 -0
- package/dist/creatio/services/entity-name.js +17 -0
- package/dist/creatio/services/entity-name.js.map +1 -0
- package/dist/creatio/services/feature-service-provider.d.ts +1 -1
- package/dist/creatio/services/feature-service-provider.d.ts.map +1 -1
- package/dist/creatio/services/feature-service-provider.js +5 -5
- package/dist/creatio/services/feature-service-provider.js.map +1 -1
- package/dist/creatio/services/http-client.d.ts +10 -1
- package/dist/creatio/services/http-client.d.ts.map +1 -1
- package/dist/creatio/services/http-client.js +15 -3
- package/dist/creatio/services/http-client.js.map +1 -1
- package/dist/creatio/services/index.d.ts +14 -2
- package/dist/creatio/services/index.d.ts.map +1 -1
- package/dist/creatio/services/index.js +14 -2
- package/dist/creatio/services/index.js.map +1 -1
- package/dist/creatio/services/lookup-path.d.ts +18 -0
- package/dist/creatio/services/lookup-path.d.ts.map +1 -0
- package/dist/creatio/services/lookup-path.js +33 -0
- package/dist/creatio/services/lookup-path.js.map +1 -0
- package/dist/creatio/services/{metadata-store.d.ts → odata/metadata-store.d.ts} +2 -2
- package/dist/creatio/services/odata/metadata-store.d.ts.map +1 -0
- package/dist/creatio/services/{metadata-store.js → odata/metadata-store.js} +5 -4
- package/dist/creatio/services/odata/metadata-store.js.map +1 -0
- package/dist/creatio/services/{odata-crud-provider.d.ts → odata/odata-crud-provider.d.ts} +7 -7
- package/dist/creatio/services/odata/odata-crud-provider.d.ts.map +1 -0
- package/dist/creatio/services/{odata-crud-provider.js → odata/odata-crud-provider.js} +29 -67
- package/dist/creatio/services/odata/odata-crud-provider.js.map +1 -0
- package/dist/creatio/services/odata/odata-query-translator.d.ts +37 -0
- package/dist/creatio/services/odata/odata-query-translator.d.ts.map +1 -0
- package/dist/creatio/services/odata/odata-query-translator.js +160 -0
- package/dist/creatio/services/odata/odata-query-translator.js.map +1 -0
- package/dist/creatio/services/odata/odata-routes.d.ts +4 -0
- package/dist/creatio/services/odata/odata-routes.d.ts.map +1 -0
- package/dist/creatio/services/odata/odata-routes.js +9 -0
- package/dist/creatio/services/odata/odata-routes.js.map +1 -0
- package/dist/creatio/services/process-service-provider.d.ts +1 -1
- package/dist/creatio/services/process-service-provider.d.ts.map +1 -1
- package/dist/creatio/services/process-service-provider.js +2 -5
- package/dist/creatio/services/process-service-provider.js.map +1 -1
- package/dist/creatio/services/sys-settings-service-provider.d.ts +1 -1
- package/dist/creatio/services/sys-settings-service-provider.d.ts.map +1 -1
- package/dist/creatio/services/sys-settings-service-provider.js +12 -16
- package/dist/creatio/services/sys-settings-service-provider.js.map +1 -1
- package/dist/creatio/services/user-info-provider.d.ts +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +5 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +8 -0
- package/dist/log.js.map +1 -1
- package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -1
- package/dist/server/http/creatio-oauth-handlers.js +21 -5
- package/dist/server/http/creatio-oauth-handlers.js.map +1 -1
- package/dist/server/http/httpServer.d.ts.map +1 -1
- package/dist/server/http/httpServer.js +6 -4
- package/dist/server/http/httpServer.js.map +1 -1
- package/dist/server/http/mcp-handlers.js +2 -2
- package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts +2 -5
- package/dist/server/mcp/crtmcp/crt-mcp-client.d.ts.map +1 -1
- package/dist/server/mcp/crtmcp/crt-mcp-client.js +4 -4
- package/dist/server/mcp/crtmcp/crt-mcp-client.js.map +1 -1
- package/dist/server/mcp/filters.d.ts +7 -1
- package/dist/server/mcp/filters.d.ts.map +1 -1
- package/dist/server/mcp/filters.js +48 -90
- package/dist/server/mcp/filters.js.map +1 -1
- package/dist/server/mcp/server.d.ts +21 -1
- package/dist/server/mcp/server.d.ts.map +1 -1
- package/dist/server/mcp/server.js +183 -169
- package/dist/server/mcp/server.js.map +1 -1
- package/dist/server/mcp/tools-data.d.ts +57 -4
- package/dist/server/mcp/tools-data.d.ts.map +1 -1
- package/dist/server/mcp/tools-data.js +42 -17
- package/dist/server/mcp/tools-data.js.map +1 -1
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/{services → sessions}/session-context.d.ts +16 -0
- package/dist/sessions/session-context.d.ts.map +1 -0
- package/dist/{services → sessions}/session-context.js +36 -1
- package/dist/sessions/session-context.js.map +1 -0
- package/dist/{services → sessions}/token-refresh-scheduler.d.ts.map +1 -1
- package/dist/{services → sessions}/token-refresh-scheduler.js +2 -2
- package/dist/{services → sessions}/token-refresh-scheduler.js.map +1 -1
- package/dist/utils/context.js +2 -2
- package/package.json +1 -1
- package/dist/creatio/engines/admin-operation/admin-operation-engine.d.ts.map +0 -1
- package/dist/creatio/engines/admin-operation/admin-operation-engine.js +0 -27
- package/dist/creatio/engines/admin-operation/admin-operation-engine.js.map +0 -1
- package/dist/creatio/engines/configuration/configuration-engine.d.ts +0 -10
- package/dist/creatio/engines/configuration/configuration-engine.d.ts.map +0 -1
- package/dist/creatio/engines/configuration/configuration-engine.js +0 -18
- package/dist/creatio/engines/configuration/configuration-engine.js.map +0 -1
- package/dist/creatio/engines/crud/crud-engine.d.ts +0 -15
- package/dist/creatio/engines/crud/crud-engine.d.ts.map +0 -1
- package/dist/creatio/engines/crud/crud-engine.js +0 -33
- package/dist/creatio/engines/crud/crud-engine.js.map +0 -1
- package/dist/creatio/engines/feature/feature-engine.d.ts +0 -10
- package/dist/creatio/engines/feature/feature-engine.d.ts.map +0 -1
- package/dist/creatio/engines/feature/feature-engine.js.map +0 -1
- package/dist/creatio/engines/process/process-engine.d.ts +0 -10
- package/dist/creatio/engines/process/process-engine.d.ts.map +0 -1
- package/dist/creatio/engines/process/process-engine.js.map +0 -1
- package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts.map +0 -1
- package/dist/creatio/engines/sys-settings/sys-settings-engine.js +0 -27
- package/dist/creatio/engines/sys-settings/sys-settings-engine.js.map +0 -1
- package/dist/creatio/engines/user/user-engine.d.ts +0 -10
- package/dist/creatio/engines/user/user-engine.d.ts.map +0 -1
- package/dist/creatio/engines/user/user-engine.js.map +0 -1
- package/dist/creatio/providers/admin-operation-provider.js.map +0 -1
- package/dist/creatio/providers/configuration-provider.js.map +0 -1
- package/dist/creatio/providers/crud-provider.d.ts +0 -42
- package/dist/creatio/providers/crud-provider.d.ts.map +0 -1
- package/dist/creatio/providers/crud-provider.js.map +0 -1
- package/dist/creatio/providers/feature-provider.js.map +0 -1
- package/dist/creatio/providers/index.d.ts.map +0 -1
- package/dist/creatio/providers/process-provider.js.map +0 -1
- package/dist/creatio/providers/sys-settings-provider.js.map +0 -1
- package/dist/creatio/providers/user-provider.js.map +0 -1
- package/dist/creatio/services/metadata-store.d.ts.map +0 -1
- package/dist/creatio/services/metadata-store.js.map +0 -1
- package/dist/creatio/services/odata-crud-provider.d.ts.map +0 -1
- package/dist/creatio/services/odata-crud-provider.js.map +0 -1
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js.map +0 -1
- package/dist/services/session-context.d.ts.map +0 -1
- package/dist/services/session-context.js.map +0 -1
- /package/dist/creatio/{providers → contracts}/admin-operation-provider.d.ts +0 -0
- /package/dist/creatio/{providers → contracts}/admin-operation-provider.js +0 -0
- /package/dist/creatio/{providers → contracts}/configuration-provider.d.ts +0 -0
- /package/dist/creatio/{providers → contracts}/configuration-provider.js +0 -0
- /package/dist/creatio/{providers → contracts}/crud-provider.js +0 -0
- /package/dist/creatio/{providers → contracts}/feature-provider.d.ts +0 -0
- /package/dist/creatio/{providers → contracts}/feature-provider.js +0 -0
- /package/dist/creatio/{providers → contracts}/process-provider.d.ts +0 -0
- /package/dist/creatio/{providers → contracts}/process-provider.js +0 -0
- /package/dist/creatio/{providers → contracts}/sys-settings-provider.d.ts +0 -0
- /package/dist/creatio/{providers → contracts}/sys-settings-provider.js +0 -0
- /package/dist/creatio/{providers → contracts}/user-provider.d.ts +0 -0
- /package/dist/creatio/{providers → contracts}/user-provider.js +0 -0
- /package/dist/{services → sessions}/index.d.ts +0 -0
- /package/dist/{services → sessions}/index.js +0 -0
- /package/dist/{services → sessions}/token-refresh-scheduler.d.ts +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataServiceFilterTranslator = void 0;
|
|
4
|
+
const lookup_path_1 = require("../lookup-path");
|
|
5
|
+
const data_service_types_1 = require("./data-service-types");
|
|
6
|
+
const data_service_value_type_1 = require("./data-service-value-type");
|
|
7
|
+
const COMPARISON = {
|
|
8
|
+
eq: data_service_types_1.FilterComparisonType.Equal,
|
|
9
|
+
ne: data_service_types_1.FilterComparisonType.NotEqual,
|
|
10
|
+
gt: data_service_types_1.FilterComparisonType.Greater,
|
|
11
|
+
ge: data_service_types_1.FilterComparisonType.GreaterOrEqual,
|
|
12
|
+
lt: data_service_types_1.FilterComparisonType.Less,
|
|
13
|
+
le: data_service_types_1.FilterComparisonType.LessOrEqual,
|
|
14
|
+
contains: data_service_types_1.FilterComparisonType.Contain,
|
|
15
|
+
startswith: data_service_types_1.FilterComparisonType.StartWith,
|
|
16
|
+
endswith: data_service_types_1.FilterComparisonType.EndWith,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Projects a neutral {@link FilterNode} tree onto a Creatio DataService `Filters` tree.
|
|
20
|
+
* Groups become `FilterType.Group` with a keyed `items` map; comparisons become
|
|
21
|
+
* `FilterType.CompareFilter` with a column `LeftExpression` and a typed-parameter
|
|
22
|
+
* `RightExpression`; `isNull`/`isNotNull` become `FilterType.IsNullFilter`. An `in` list is
|
|
23
|
+
* expanded to an OR-group of equalities (DataService has no native IN in our op subset).
|
|
24
|
+
*/
|
|
25
|
+
class DataServiceFilterTranslator {
|
|
26
|
+
_resolveType;
|
|
27
|
+
constructor(resolveType = data_service_value_type_1.inferDataValueType) {
|
|
28
|
+
this._resolveType = resolveType;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Normalize a tool-supplied field to a DataService column path. The tool surface uses
|
|
32
|
+
* OData conventions (navigation with `/`, scalar FKs like `ContactId`); DataService
|
|
33
|
+
* addresses nested data by dotted path. So we map `/` -> `.`, and when a lookup is compared
|
|
34
|
+
* to a GUID we navigate it to its primary key (`Owner` -> `Owner.Id`,
|
|
35
|
+
* `Contact/Type` -> `Contact.Type.Id`). Non-GUID values keep the plain (dotted) path.
|
|
36
|
+
*/
|
|
37
|
+
_columnPath(field, value) {
|
|
38
|
+
const path = field.replace(/\//g, '.');
|
|
39
|
+
return (0, data_service_value_type_1.isGuid)(value) ? (0, lookup_path_1.lookupIdPath)(path, '.') : path;
|
|
40
|
+
}
|
|
41
|
+
_column(field, value) {
|
|
42
|
+
return { expressionType: data_service_types_1.ExpressionType.SchemaColumn, columnPath: this._columnPath(field, value) };
|
|
43
|
+
}
|
|
44
|
+
_parameter(field, value) {
|
|
45
|
+
const dataValueType = this._resolveType(field, value);
|
|
46
|
+
return {
|
|
47
|
+
expressionType: data_service_types_1.ExpressionType.Parameter,
|
|
48
|
+
parameter: { dataValueType, value: (0, data_service_value_type_1.encodeParameterValue)(dataValueType, value) },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
_compare(field, op, value) {
|
|
52
|
+
return {
|
|
53
|
+
filterType: data_service_types_1.FilterType.CompareFilter,
|
|
54
|
+
comparisonType: COMPARISON[op],
|
|
55
|
+
leftExpression: this._column(field, value),
|
|
56
|
+
rightExpression: this._parameter(field, value),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
_condition(node) {
|
|
60
|
+
if (node.op === 'isNull' || node.op === 'isNotNull') {
|
|
61
|
+
const isNull = node.op === 'isNull';
|
|
62
|
+
return {
|
|
63
|
+
filterType: data_service_types_1.FilterType.IsNullFilter,
|
|
64
|
+
comparisonType: isNull ? data_service_types_1.FilterComparisonType.IsNull : data_service_types_1.FilterComparisonType.IsNotNull,
|
|
65
|
+
// The platform's Filter.IsNull defaults to TRUE, so an IsNullFilter without this
|
|
66
|
+
// flag is always treated as IS NULL (inverting isNotNull). Set it explicitly.
|
|
67
|
+
isNull,
|
|
68
|
+
leftExpression: this._column(node.field),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return this._compare(node.field, node.op, node.value);
|
|
72
|
+
}
|
|
73
|
+
_group(logic, children) {
|
|
74
|
+
const items = {};
|
|
75
|
+
let n = 0;
|
|
76
|
+
for (const child of children) {
|
|
77
|
+
if (child) {
|
|
78
|
+
items[`item${++n}`] = child;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (n === 0) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
if (n === 1) {
|
|
85
|
+
return items.item1; // collapse a single-child group
|
|
86
|
+
}
|
|
87
|
+
return { filterType: data_service_types_1.FilterType.Group, logicalOperation: logic, items };
|
|
88
|
+
}
|
|
89
|
+
_in(node) {
|
|
90
|
+
return this._group(data_service_types_1.LogicalOperation.Or, node.values.map((v) => this._compare(node.field, 'eq', v)));
|
|
91
|
+
}
|
|
92
|
+
_node(node) {
|
|
93
|
+
if (node.kind === 'condition') {
|
|
94
|
+
return this._condition(node);
|
|
95
|
+
}
|
|
96
|
+
if (node.kind === 'in') {
|
|
97
|
+
return this._in(node);
|
|
98
|
+
}
|
|
99
|
+
return this._group(node.logic === 'or' ? data_service_types_1.LogicalOperation.Or : data_service_types_1.LogicalOperation.And, node.items.map((n) => this._node(n)));
|
|
100
|
+
}
|
|
101
|
+
/** Build the root `Filters` for a schema, or undefined when the tree is empty. */
|
|
102
|
+
translate(rootSchemaName, node) {
|
|
103
|
+
if (!node) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const filter = this._node(node);
|
|
107
|
+
if (!filter) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
return { ...filter, rootSchemaName };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.DataServiceFilterTranslator = DataServiceFilterTranslator;
|
|
114
|
+
//# sourceMappingURL=data-service-filter-translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-filter-translator.js","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-filter-translator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ReadQuery } from '../../contracts';
|
|
2
|
+
import { DataServiceFilterTranslator } from './data-service-filter-translator';
|
|
3
|
+
import { DataServiceSelectQuery } from './data-service-types';
|
|
4
|
+
/** Result-set key under which the count aggregate is returned. */
|
|
5
|
+
export declare const COUNT_COLUMN_ALIAS = "recordsCount";
|
|
6
|
+
/**
|
|
7
|
+
* Pure builder that projects the neutral {@link ReadQuery} onto a Creatio DataService
|
|
8
|
+
* `SelectQuery` payload (columns, paging, sorting, filters). Side-effect free for direct
|
|
9
|
+
* unit testing; the transport lives in {@link DataServiceCrudProvider}.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DataServiceQueryBuilder {
|
|
12
|
+
private readonly _filters;
|
|
13
|
+
constructor(filters?: DataServiceFilterTranslator);
|
|
14
|
+
private _orderMap;
|
|
15
|
+
buildSelectQuery(query: ReadQuery): DataServiceSelectQuery;
|
|
16
|
+
/** Build a COUNT(*) SelectQuery over the same filters (ignores paging), used to resolve
|
|
17
|
+
* the total when a read requests `count`. The aggregate is returned under
|
|
18
|
+
* {@link COUNT_COLUMN_ALIAS} in the single response row. */
|
|
19
|
+
buildCountQuery(query: ReadQuery): DataServiceSelectQuery;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data-service-query-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-query-builder.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAIN,sBAAsB,EAKtB,MAAM,sBAAsB,CAAC;AAE9B,kEAAkE;AAClE,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;;GAIG;AACH,qBAAa,uBAAuB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;gBAE3C,OAAO,8BAAoC;IAIvD,OAAO,CAAC,SAAS;IAWV,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,sBAAsB;IA2CjE;;iEAE6D;IACtD,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,sBAAsB;CAsBhE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataServiceQueryBuilder = exports.COUNT_COLUMN_ALIAS = void 0;
|
|
4
|
+
const lookup_path_1 = require("../lookup-path");
|
|
5
|
+
const data_service_filter_translator_1 = require("./data-service-filter-translator");
|
|
6
|
+
const data_service_types_1 = require("./data-service-types");
|
|
7
|
+
/** Result-set key under which the count aggregate is returned. */
|
|
8
|
+
exports.COUNT_COLUMN_ALIAS = 'recordsCount';
|
|
9
|
+
/**
|
|
10
|
+
* Pure builder that projects the neutral {@link ReadQuery} onto a Creatio DataService
|
|
11
|
+
* `SelectQuery` payload (columns, paging, sorting, filters). Side-effect free for direct
|
|
12
|
+
* unit testing; the transport lives in {@link DataServiceCrudProvider}.
|
|
13
|
+
*/
|
|
14
|
+
class DataServiceQueryBuilder {
|
|
15
|
+
_filters;
|
|
16
|
+
constructor(filters = new data_service_filter_translator_1.DataServiceFilterTranslator()) {
|
|
17
|
+
this._filters = filters;
|
|
18
|
+
}
|
|
19
|
+
_orderMap(order) {
|
|
20
|
+
const map = new Map();
|
|
21
|
+
(order ?? []).forEach((o, i) => {
|
|
22
|
+
map.set(o.field, {
|
|
23
|
+
dir: o.dir === 'desc' ? data_service_types_1.OrderDirection.Descending : data_service_types_1.OrderDirection.Ascending,
|
|
24
|
+
pos: i + 1,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
return map;
|
|
28
|
+
}
|
|
29
|
+
buildSelectQuery(query) {
|
|
30
|
+
const orderByPath = this._orderMap(query.order);
|
|
31
|
+
const items = {};
|
|
32
|
+
const selected = query.columns && query.columns.length > 0 ? query.columns : [];
|
|
33
|
+
for (const requested of selected) {
|
|
34
|
+
// The response is keyed by the item KEY, so keep the caller's requested name as the
|
|
35
|
+
// alias and normalize only the columnPath: OData-style `/` -> DataService `.`, and a
|
|
36
|
+
// scalar lookup FK (`TypeId`) -> its primary-key path (`Type.Id`). A bare lookup
|
|
37
|
+
// (`Type`) is left as-is so DataService returns its display value.
|
|
38
|
+
const columnPath = (0, lookup_path_1.lookupIdPath)(requested.replace(/\//g, '.'), '.');
|
|
39
|
+
const column = {
|
|
40
|
+
expression: { expressionType: data_service_types_1.ExpressionType.SchemaColumn, columnPath },
|
|
41
|
+
};
|
|
42
|
+
const hint = orderByPath.get(requested);
|
|
43
|
+
if (hint) {
|
|
44
|
+
column.orderDirection = hint.dir;
|
|
45
|
+
column.orderPosition = hint.pos;
|
|
46
|
+
}
|
|
47
|
+
items[requested] = column;
|
|
48
|
+
}
|
|
49
|
+
const select = {
|
|
50
|
+
rootSchemaName: query.entity,
|
|
51
|
+
operationType: data_service_types_1.QueryOperationType.Select,
|
|
52
|
+
columns: { items },
|
|
53
|
+
allColumns: selected.length === 0,
|
|
54
|
+
};
|
|
55
|
+
const filters = this._filters.translate(query.entity, query.filter);
|
|
56
|
+
if (filters) {
|
|
57
|
+
select.filters = filters;
|
|
58
|
+
}
|
|
59
|
+
// DataService rejects a FETCH of 0 rows (top:0); the provider returns no rows for top:0
|
|
60
|
+
// without sending this query, so only set paging for a positive page size.
|
|
61
|
+
if (typeof query.top === 'number' && query.top > 0) {
|
|
62
|
+
select.rowCount = query.top;
|
|
63
|
+
select.isPageable = true;
|
|
64
|
+
}
|
|
65
|
+
if (typeof query.skip === 'number' && query.skip > 0) {
|
|
66
|
+
select.rowsOffset = query.skip;
|
|
67
|
+
}
|
|
68
|
+
return select;
|
|
69
|
+
}
|
|
70
|
+
/** Build a COUNT(*) SelectQuery over the same filters (ignores paging), used to resolve
|
|
71
|
+
* the total when a read requests `count`. The aggregate is returned under
|
|
72
|
+
* {@link COUNT_COLUMN_ALIAS} in the single response row. */
|
|
73
|
+
buildCountQuery(query) {
|
|
74
|
+
const countColumn = {
|
|
75
|
+
expression: {
|
|
76
|
+
expressionType: data_service_types_1.ExpressionType.Function,
|
|
77
|
+
functionType: data_service_types_1.FunctionType.Aggregation,
|
|
78
|
+
functionArgument: { expressionType: data_service_types_1.ExpressionType.SchemaColumn, columnPath: 'Id' },
|
|
79
|
+
aggregationType: data_service_types_1.AggregationType.Count,
|
|
80
|
+
aggregationEvalType: data_service_types_1.AggregationEvalType.None,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const select = {
|
|
84
|
+
rootSchemaName: query.entity,
|
|
85
|
+
operationType: data_service_types_1.QueryOperationType.Select,
|
|
86
|
+
columns: { items: { [exports.COUNT_COLUMN_ALIAS]: countColumn } },
|
|
87
|
+
allColumns: false,
|
|
88
|
+
};
|
|
89
|
+
const filters = this._filters.translate(query.entity, query.filter);
|
|
90
|
+
if (filters) {
|
|
91
|
+
select.filters = filters;
|
|
92
|
+
}
|
|
93
|
+
return select;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.DataServiceQueryBuilder = DataServiceQueryBuilder;
|
|
97
|
+
//# sourceMappingURL=data-service-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-query-builder.js","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { EntitySchemaDescription } from '../../contracts';
|
|
2
|
+
import { DataServiceFilterTranslator } from './data-service-filter-translator';
|
|
3
|
+
import { DataServiceQueryBuilder } from './data-service-query-builder';
|
|
4
|
+
import { DataServiceSelectQuery, DataValueType } from './data-service-types';
|
|
5
|
+
import { DataServiceTransport } from './data-service-transport';
|
|
6
|
+
/**
|
|
7
|
+
* DataService-native schema discovery, on the SAME transport as CRUD (so the backend needs
|
|
8
|
+
* no OData at all):
|
|
9
|
+
* - `describeEntity` / column-type maps come from `RuntimeEntitySchemaRequest`, which returns
|
|
10
|
+
* each column's native `dataValueType` + `referenceSchemaName` — the authoritative source
|
|
11
|
+
* for write coercion (the platform never infers the type from the JSON value).
|
|
12
|
+
* - `listEntitySets` runs `SELECT DISTINCT Name, Caption FROM VwSysSchemaInWorkspace WHERE
|
|
13
|
+
* ManagerName = 'EntitySchemaManager' ORDER BY Name` as a SelectQuery.
|
|
14
|
+
* Runtime schemas are cached per entity (TTL) so describe + coercion share one fetch.
|
|
15
|
+
*/
|
|
16
|
+
export declare class DataServiceSchemaProvider {
|
|
17
|
+
private readonly _transport;
|
|
18
|
+
private readonly _queryBuilder;
|
|
19
|
+
private readonly _filters;
|
|
20
|
+
private readonly _schemaCache;
|
|
21
|
+
constructor(transport: DataServiceTransport, queryBuilder?: DataServiceQueryBuilder, filters?: DataServiceFilterTranslator);
|
|
22
|
+
/** Build the entity-list SelectQuery (visible for tests). */
|
|
23
|
+
buildListQuery(): DataServiceSelectQuery;
|
|
24
|
+
listEntitySets(): Promise<string[]>;
|
|
25
|
+
private _getRuntimeSchema;
|
|
26
|
+
private _columns;
|
|
27
|
+
describeEntity(entitySet: string): Promise<EntitySchemaDescription>;
|
|
28
|
+
/** Map of column name -> native {@link DataValueType} for write coercion. Empty on miss. */
|
|
29
|
+
columnTypes(entity: string): Promise<Map<string, DataValueType>>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data-service-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-schema.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAoBhE;;;;;;;;;GASG;AACH,qBAAa,yBAAyB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4D;gBAGxF,SAAS,EAAE,oBAAoB,EAC/B,YAAY,0BAAgC,EAC5C,OAAO,8BAAoC;IAO5C,6DAA6D;IACtD,cAAc,IAAI,sBAAsB;IAWlC,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAWlC,iBAAiB;IAkB/B,OAAO,CAAC,QAAQ;IAIH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAgBhF,4FAA4F;IAC/E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAS7E"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataServiceSchemaProvider = void 0;
|
|
4
|
+
const data_service_filter_translator_1 = require("./data-service-filter-translator");
|
|
5
|
+
const data_service_query_builder_1 = require("./data-service-query-builder");
|
|
6
|
+
const data_service_types_1 = require("./data-service-types");
|
|
7
|
+
const CACHE_TTL_MS = 30 * 60 * 1000;
|
|
8
|
+
const ENTITY_LIST_SCHEMA = 'VwSysSchemaInWorkspace';
|
|
9
|
+
const ENTITY_MANAGER = 'EntitySchemaManager';
|
|
10
|
+
/**
|
|
11
|
+
* DataService-native schema discovery, on the SAME transport as CRUD (so the backend needs
|
|
12
|
+
* no OData at all):
|
|
13
|
+
* - `describeEntity` / column-type maps come from `RuntimeEntitySchemaRequest`, which returns
|
|
14
|
+
* each column's native `dataValueType` + `referenceSchemaName` — the authoritative source
|
|
15
|
+
* for write coercion (the platform never infers the type from the JSON value).
|
|
16
|
+
* - `listEntitySets` runs `SELECT DISTINCT Name, Caption FROM VwSysSchemaInWorkspace WHERE
|
|
17
|
+
* ManagerName = 'EntitySchemaManager' ORDER BY Name` as a SelectQuery.
|
|
18
|
+
* Runtime schemas are cached per entity (TTL) so describe + coercion share one fetch.
|
|
19
|
+
*/
|
|
20
|
+
class DataServiceSchemaProvider {
|
|
21
|
+
_transport;
|
|
22
|
+
_queryBuilder;
|
|
23
|
+
_filters;
|
|
24
|
+
_schemaCache = new Map();
|
|
25
|
+
constructor(transport, queryBuilder = new data_service_query_builder_1.DataServiceQueryBuilder(), filters = new data_service_filter_translator_1.DataServiceFilterTranslator()) {
|
|
26
|
+
this._transport = transport;
|
|
27
|
+
this._queryBuilder = queryBuilder;
|
|
28
|
+
this._filters = filters;
|
|
29
|
+
}
|
|
30
|
+
/** Build the entity-list SelectQuery (visible for tests). */
|
|
31
|
+
buildListQuery() {
|
|
32
|
+
const query = this._queryBuilder.buildSelectQuery({
|
|
33
|
+
entity: ENTITY_LIST_SCHEMA,
|
|
34
|
+
columns: ['Name', 'Caption'],
|
|
35
|
+
order: [{ field: 'Name', dir: 'asc' }],
|
|
36
|
+
filter: { kind: 'condition', field: 'ManagerName', op: 'eq', value: ENTITY_MANAGER },
|
|
37
|
+
});
|
|
38
|
+
query.isDistinct = true;
|
|
39
|
+
return query;
|
|
40
|
+
}
|
|
41
|
+
async listEntitySets() {
|
|
42
|
+
const body = await this._transport.post('SelectQuery', this.buildListQuery(), {
|
|
43
|
+
logContext: { entity: ENTITY_LIST_SCHEMA },
|
|
44
|
+
});
|
|
45
|
+
const rows = Array.isArray(body?.rows) ? body.rows : [];
|
|
46
|
+
const names = rows.map((r) => String(r?.Name)).filter((name) => name && name !== 'undefined');
|
|
47
|
+
// The view yields one row per (schema, workspace/caption); a SelectQuery DISTINCT on
|
|
48
|
+
// Name+Caption still leaves Name duplicates, so dedupe by Name here.
|
|
49
|
+
return [...new Set(names)];
|
|
50
|
+
}
|
|
51
|
+
async _getRuntimeSchema(name) {
|
|
52
|
+
const cached = this._schemaCache.get(name);
|
|
53
|
+
if (cached && Date.now() - cached.at < CACHE_TTL_MS) {
|
|
54
|
+
return cached.schema;
|
|
55
|
+
}
|
|
56
|
+
const body = await this._transport.post('RuntimeEntitySchemaRequest', { name }, { logContext: { entity: name }, checkSuccess: true });
|
|
57
|
+
const schema = body?.schema;
|
|
58
|
+
if (!schema || !schema.name) {
|
|
59
|
+
throw new Error(`entity_not_found:${name}`);
|
|
60
|
+
}
|
|
61
|
+
this._schemaCache.set(name, { schema, at: Date.now() });
|
|
62
|
+
return schema;
|
|
63
|
+
}
|
|
64
|
+
_columns(schema) {
|
|
65
|
+
return Object.values(schema.columns?.Items ?? {});
|
|
66
|
+
}
|
|
67
|
+
async describeEntity(entitySet) {
|
|
68
|
+
const schema = await this._getRuntimeSchema(entitySet);
|
|
69
|
+
const columns = this._columns(schema);
|
|
70
|
+
const primary = columns.find((c) => c.uId && c.uId === schema.primaryColumnUId);
|
|
71
|
+
return {
|
|
72
|
+
entitySet,
|
|
73
|
+
entityType: schema.name,
|
|
74
|
+
key: primary ? [primary.name] : ['Id'],
|
|
75
|
+
properties: columns.map((c) => ({
|
|
76
|
+
name: c.name,
|
|
77
|
+
type: data_service_types_1.DataValueType[c.dataValueType] ?? String(c.dataValueType),
|
|
78
|
+
nullable: !c.isRequired,
|
|
79
|
+
})),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Map of column name -> native {@link DataValueType} for write coercion. Empty on miss. */
|
|
83
|
+
async columnTypes(entity) {
|
|
84
|
+
try {
|
|
85
|
+
const schema = await this._getRuntimeSchema(entity);
|
|
86
|
+
return new Map(this._columns(schema).map((c) => [c.name, c.dataValueType]));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Coercion degrades to the per-value heuristic when the schema is unavailable.
|
|
90
|
+
return new Map();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.DataServiceSchemaProvider = DataServiceSchemaProvider;
|
|
95
|
+
//# sourceMappingURL=data-service-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-schema.js","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CreatioHttpClient } from '../http-client';
|
|
2
|
+
/**
|
|
3
|
+
* Thin transport for the DataService JSON endpoint
|
|
4
|
+
* (`/0/DataService/json/SyncReply/<Operation>`). Owns the URL shape, the POST plumbing, and
|
|
5
|
+
* the logical-failure check so the CRUD provider and schema helper share one code path.
|
|
6
|
+
* DataService answers HTTP 200 even on logical failures, signalling them via
|
|
7
|
+
* `success: false` + `responseStatus`; `checkSuccess` (writes) turns that into an error.
|
|
8
|
+
* Reads skip the flag and rely on the returned `rows` (a SelectQuery does not reliably set
|
|
9
|
+
* `success`).
|
|
10
|
+
*/
|
|
11
|
+
export declare class DataServiceTransport {
|
|
12
|
+
private readonly _client;
|
|
13
|
+
constructor(client: CreatioHttpClient);
|
|
14
|
+
endpoint(operation: string): string;
|
|
15
|
+
private _assertSuccess;
|
|
16
|
+
post(operation: string, payload: unknown, opts?: {
|
|
17
|
+
logContext?: Record<string, unknown>;
|
|
18
|
+
checkSuccess?: boolean;
|
|
19
|
+
}): Promise<any>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data-service-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-transport.d.ts","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAEhC,MAAM,EAAE,iBAAiB;IAI9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI1C,OAAO,CAAC,cAAc;IAaT,IAAI,CAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GACzE,OAAO,CAAC,GAAG,CAAC;CAqBf"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataServiceTransport = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Thin transport for the DataService JSON endpoint
|
|
6
|
+
* (`/0/DataService/json/SyncReply/<Operation>`). Owns the URL shape, the POST plumbing, and
|
|
7
|
+
* the logical-failure check so the CRUD provider and schema helper share one code path.
|
|
8
|
+
* DataService answers HTTP 200 even on logical failures, signalling them via
|
|
9
|
+
* `success: false` + `responseStatus`; `checkSuccess` (writes) turns that into an error.
|
|
10
|
+
* Reads skip the flag and rely on the returned `rows` (a SelectQuery does not reliably set
|
|
11
|
+
* `success`).
|
|
12
|
+
*/
|
|
13
|
+
class DataServiceTransport {
|
|
14
|
+
_client;
|
|
15
|
+
constructor(client) {
|
|
16
|
+
this._client = client;
|
|
17
|
+
}
|
|
18
|
+
endpoint(operation) {
|
|
19
|
+
return `${this._client.normalizedBaseUrl}/0/DataService/json/SyncReply/${operation}`;
|
|
20
|
+
}
|
|
21
|
+
_assertSuccess(operation, body) {
|
|
22
|
+
if (body && body.success === false) {
|
|
23
|
+
const rs = body.responseStatus ?? {};
|
|
24
|
+
const message = rs.Message ??
|
|
25
|
+
rs.message ??
|
|
26
|
+
body.errorInfo?.message ??
|
|
27
|
+
body.errorInfo?.Message ??
|
|
28
|
+
'unknown_error';
|
|
29
|
+
throw new Error(`creatio_dataservice_${operation}_error:${message}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async post(operation, payload, opts = {}) {
|
|
33
|
+
const url = this.endpoint(operation);
|
|
34
|
+
const logContext = opts.logContext ?? {};
|
|
35
|
+
return this._client.request(`dataservice.${operation}`, url, async () => {
|
|
36
|
+
const init = await this._client.createPostRequest(payload);
|
|
37
|
+
return this._client.fetchWithAuth(url, async () => init);
|
|
38
|
+
}, async (response, duration) => {
|
|
39
|
+
const body = await response.json().catch(() => ({}));
|
|
40
|
+
if (opts.checkSuccess) {
|
|
41
|
+
this._assertSuccess(operation, body);
|
|
42
|
+
}
|
|
43
|
+
this._client.logSuccess(`dataservice.${operation}`, response.status, duration, logContext);
|
|
44
|
+
return body;
|
|
45
|
+
}, { errorPrefix: `creatio_dataservice_${operation}_failed`, logContext });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.DataServiceTransport = DataServiceTransport;
|
|
49
|
+
//# sourceMappingURL=data-service-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-service-transport.js","sourceRoot":"","sources":["../../../../src/creatio/services/dataservice/data-service-transport.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,MAAa,oBAAoB;IACf,OAAO,CAAoB;IAE5C,YAAY,MAAyB;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,QAAQ,CAAC,SAAiB;QAChC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,iCAAiC,SAAS,EAAE,CAAC;IACtF,CAAC;IAEO,cAAc,CAAC,SAAiB,EAAE,IAAS;QAClD,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;YACrC,MAAM,OAAO,GACZ,EAAE,CAAC,OAAO;gBACV,EAAE,CAAC,OAAO;gBACV,IAAI,CAAC,SAAS,EAAE,OAAO;gBACvB,IAAI,CAAC,SAAS,EAAE,OAAO;gBACvB,eAAe,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,UAAU,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,SAAiB,EACjB,OAAgB,EAChB,OAAyE,EAAE;QAE3E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAC1B,eAAe,SAAS,EAAE,EAC1B,GAAG,EACH,KAAK,IAAI,EAAE;YACV,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,EACD,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,SAAS,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC3F,OAAO,IAAI,CAAC;QACb,CAAC,EACD,EAAE,WAAW,EAAE,uBAAuB,SAAS,SAAS,EAAE,UAAU,EAAE,CACtE,CAAC;IACH,CAAC;CACD;AAjDD,oDAiDC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataService (DataValueType / Select-Insert-Update-Delete query) primitives for the
|
|
3
|
+
* planned Creatio `/0/DataService/json/SyncReply/SelectQuery|InsertQuery|...` backend.
|
|
4
|
+
*
|
|
5
|
+
* GROUNDWORK ONLY — these mirror the Creatio server-side enums so the DataService CRUD
|
|
6
|
+
* provider can be built without re-deriving them. The values match Creatio's
|
|
7
|
+
* `Terrasoft.DataValueType` / `Terrasoft.FilterComparisonType` so payloads are accepted
|
|
8
|
+
* verbatim by the platform. Kept isolated (no transport, no MCP knowledge) so it is
|
|
9
|
+
* trivially unit-testable. See the DataService provider plan in the repo memory.
|
|
10
|
+
*/
|
|
11
|
+
/** Subset of `Terrasoft.DataValueType` we need for CRUD. Numeric values are the platform's. */
|
|
12
|
+
export declare enum DataValueType {
|
|
13
|
+
Guid = 0,
|
|
14
|
+
Text = 1,
|
|
15
|
+
Integer = 4,
|
|
16
|
+
Float = 5,
|
|
17
|
+
Money = 6,
|
|
18
|
+
DateTime = 7,
|
|
19
|
+
Date = 8,
|
|
20
|
+
Time = 9,
|
|
21
|
+
Lookup = 10,
|
|
22
|
+
Boolean = 12,
|
|
23
|
+
Binary = 13
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* `Terrasoft.Core.Entities.FilterComparisonType` — verified against core
|
|
27
|
+
* `EntitySchemaQueryFilter.cs` (live regression caught the previously-wrong values: Greater/Less
|
|
28
|
+
* were swapped and Contain/EndWith/IsNull were off, so gt/ge/lt/le/contains/endswith filters
|
|
29
|
+
* silently mis-applied). Do NOT reorder to "look tidy" — these are the platform's wire values.
|
|
30
|
+
*/
|
|
31
|
+
export declare enum FilterComparisonType {
|
|
32
|
+
IsNull = 1,
|
|
33
|
+
IsNotNull = 2,
|
|
34
|
+
Equal = 3,
|
|
35
|
+
NotEqual = 4,
|
|
36
|
+
Less = 5,
|
|
37
|
+
LessOrEqual = 6,
|
|
38
|
+
Greater = 7,
|
|
39
|
+
GreaterOrEqual = 8,
|
|
40
|
+
StartWith = 9,
|
|
41
|
+
Contain = 11,
|
|
42
|
+
EndWith = 13
|
|
43
|
+
}
|
|
44
|
+
/** `Terrasoft.FilterType`. */
|
|
45
|
+
export declare enum FilterType {
|
|
46
|
+
None = 0,
|
|
47
|
+
CompareFilter = 1,
|
|
48
|
+
IsNullFilter = 2,
|
|
49
|
+
Group = 6
|
|
50
|
+
}
|
|
51
|
+
/** `Terrasoft.LogicalOperationStrict`. */
|
|
52
|
+
export declare enum LogicalOperation {
|
|
53
|
+
And = 0,
|
|
54
|
+
Or = 1
|
|
55
|
+
}
|
|
56
|
+
/** `Terrasoft.OrderDirection`. */
|
|
57
|
+
export declare enum OrderDirection {
|
|
58
|
+
Ascending = 1,
|
|
59
|
+
Descending = 2
|
|
60
|
+
}
|
|
61
|
+
/** `Terrasoft.ExpressionType` (the only ones we emit). */
|
|
62
|
+
export declare enum ExpressionType {
|
|
63
|
+
SchemaColumn = 0,
|
|
64
|
+
Function = 1,
|
|
65
|
+
Parameter = 2,
|
|
66
|
+
SubQuery = 3
|
|
67
|
+
}
|
|
68
|
+
/** `Terrasoft.FunctionType` (subset). */
|
|
69
|
+
export declare enum FunctionType {
|
|
70
|
+
None = 0,
|
|
71
|
+
Macros = 1,
|
|
72
|
+
Aggregation = 2
|
|
73
|
+
}
|
|
74
|
+
/** `Terrasoft.AggregationType` (subset — we only need Count). */
|
|
75
|
+
export declare enum AggregationType {
|
|
76
|
+
None = 0,
|
|
77
|
+
Count = 1,
|
|
78
|
+
Sum = 2,
|
|
79
|
+
Avg = 3,
|
|
80
|
+
Min = 4,
|
|
81
|
+
Max = 5
|
|
82
|
+
}
|
|
83
|
+
/** `Terrasoft.AggregationEvalType`. */
|
|
84
|
+
export declare enum AggregationEvalType {
|
|
85
|
+
None = 0,
|
|
86
|
+
All = 1,
|
|
87
|
+
Distinct = 2
|
|
88
|
+
}
|
|
89
|
+
/** `Terrasoft.QueryOperationType` (op is actually selected by the endpoint; sent for fidelity). */
|
|
90
|
+
export declare enum QueryOperationType {
|
|
91
|
+
Select = 0,
|
|
92
|
+
Insert = 1,
|
|
93
|
+
Update = 2,
|
|
94
|
+
Delete = 3,
|
|
95
|
+
Batch = 4
|
|
96
|
+
}
|
|
97
|
+
export interface DataServiceColumnExpression {
|
|
98
|
+
expressionType: ExpressionType.SchemaColumn;
|
|
99
|
+
columnPath: string;
|
|
100
|
+
}
|
|
101
|
+
/** A typed parameter value (`BaseExpression.Parameter`). DataValueType is mandatory — the
|
|
102
|
+
* platform does not infer it from the JSON value (an absent type silently defaults to Text). */
|
|
103
|
+
export interface DataServiceParameter {
|
|
104
|
+
dataValueType: DataValueType;
|
|
105
|
+
value: unknown;
|
|
106
|
+
}
|
|
107
|
+
export interface DataServiceParameterExpression {
|
|
108
|
+
expressionType: ExpressionType.Parameter;
|
|
109
|
+
parameter: DataServiceParameter;
|
|
110
|
+
}
|
|
111
|
+
export type DataServiceExpression = DataServiceColumnExpression | DataServiceParameterExpression;
|
|
112
|
+
/**
|
|
113
|
+
* A node of the DataService `Filters` tree. A group uses `filterType: Group` + `items`
|
|
114
|
+
* (a keyed map of child filters) + `logicalOperation`; a comparison uses
|
|
115
|
+
* `filterType: CompareFilter` + `comparisonType` + left/right expressions; a null-check
|
|
116
|
+
* uses `filterType: IsNullFilter` + `comparisonType: IsNull|IsNotNull` + `leftExpression`.
|
|
117
|
+
*/
|
|
118
|
+
export interface DataServiceFilter {
|
|
119
|
+
filterType: FilterType;
|
|
120
|
+
comparisonType?: FilterComparisonType;
|
|
121
|
+
logicalOperation?: LogicalOperation;
|
|
122
|
+
isNull?: boolean;
|
|
123
|
+
isNot?: boolean;
|
|
124
|
+
isEnabled?: boolean;
|
|
125
|
+
leftExpression?: DataServiceExpression;
|
|
126
|
+
rightExpression?: DataServiceExpression;
|
|
127
|
+
rightExpressions?: DataServiceExpression[];
|
|
128
|
+
items?: Record<string, DataServiceFilter>;
|
|
129
|
+
}
|
|
130
|
+
/** Root of a filter tree — a {@link DataServiceFilter} carrying the schema name. */
|
|
131
|
+
export interface DataServiceFilters extends DataServiceFilter {
|
|
132
|
+
rootSchemaName?: string;
|
|
133
|
+
}
|
|
134
|
+
/** An aggregate-function expression (e.g. COUNT) over a column argument. */
|
|
135
|
+
export interface DataServiceAggregationExpression {
|
|
136
|
+
expressionType: ExpressionType.Function;
|
|
137
|
+
functionType: FunctionType.Aggregation;
|
|
138
|
+
functionArgument: DataServiceColumnExpression;
|
|
139
|
+
aggregationType: AggregationType;
|
|
140
|
+
aggregationEvalType: AggregationEvalType;
|
|
141
|
+
}
|
|
142
|
+
export interface DataServiceSelectColumn {
|
|
143
|
+
expression: DataServiceColumnExpression | DataServiceAggregationExpression;
|
|
144
|
+
orderDirection?: OrderDirection;
|
|
145
|
+
orderPosition?: number;
|
|
146
|
+
}
|
|
147
|
+
export interface DataServiceSelectQuery {
|
|
148
|
+
rootSchemaName: string;
|
|
149
|
+
operationType: QueryOperationType.Select;
|
|
150
|
+
columns: {
|
|
151
|
+
items: Record<string, DataServiceSelectColumn>;
|
|
152
|
+
};
|
|
153
|
+
allColumns: boolean;
|
|
154
|
+
isDistinct?: boolean;
|
|
155
|
+
filters?: DataServiceFilters;
|
|
156
|
+
rowCount?: number;
|
|
157
|
+
rowsOffset?: number;
|
|
158
|
+
isPageable?: boolean;
|
|
159
|
+
}
|
|
160
|
+
/** `ColumnValues` map for Insert/Update — each entry a typed parameter expression. */
|
|
161
|
+
export interface DataServiceColumnValues {
|
|
162
|
+
items: Record<string, DataServiceParameterExpression>;
|
|
163
|
+
}
|
|
164
|
+
export interface DataServiceInsertQuery {
|
|
165
|
+
rootSchemaName: string;
|
|
166
|
+
operationType: QueryOperationType.Insert;
|
|
167
|
+
columnValues: DataServiceColumnValues;
|
|
168
|
+
}
|
|
169
|
+
export interface DataServiceUpdateQuery {
|
|
170
|
+
rootSchemaName: string;
|
|
171
|
+
operationType: QueryOperationType.Update;
|
|
172
|
+
columnValues: DataServiceColumnValues;
|
|
173
|
+
filters: DataServiceFilters;
|
|
174
|
+
}
|
|
175
|
+
export interface DataServiceDeleteQuery {
|
|
176
|
+
rootSchemaName: string;
|
|
177
|
+
operationType: QueryOperationType.Delete;
|
|
178
|
+
filters: DataServiceFilters;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data-service-types.d.ts.map
|