@contember/engine-content-api 2.1.0-alpha.1 → 2.1.0-alpha.10
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/dist/development/index.cjs +1 -0
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +1 -0
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ExecutionContainer.cjs +5 -3
- package/dist/development/src/ExecutionContainer.cjs.map +1 -1
- package/dist/development/src/ExecutionContainer.js +5 -3
- package/dist/development/src/ExecutionContainer.js.map +1 -1
- package/dist/development/src/acl/Authorizator.cjs +5 -1
- package/dist/development/src/acl/Authorizator.cjs.map +1 -1
- package/dist/development/src/acl/Authorizator.js +5 -1
- package/dist/development/src/acl/Authorizator.js.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
- package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
- package/dist/development/src/input-validation/dependencies/DependencyCollector.js +3 -0
- package/dist/development/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
- package/dist/development/src/mapper/Mapper.cjs +1 -0
- package/dist/development/src/mapper/Mapper.cjs.map +1 -1
- package/dist/development/src/mapper/Mapper.js +1 -0
- package/dist/development/src/mapper/Mapper.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs +30 -3
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js +30 -3
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
- package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/development/src/resolvers/MutationResolver.cjs +1 -0
- package/dist/development/src/resolvers/MutationResolver.cjs.map +1 -1
- package/dist/development/src/resolvers/MutationResolver.js +1 -0
- package/dist/development/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/development/src/resolvers/RefreshViewResolver.cjs +21 -0
- package/dist/development/src/resolvers/RefreshViewResolver.cjs.map +1 -0
- package/dist/development/src/resolvers/RefreshViewResolver.js +21 -0
- package/dist/development/src/resolvers/RefreshViewResolver.js.map +1 -0
- package/dist/development/src/schema/GraphQlSchemaBuilder.cjs +6 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.js +6 -1
- package/dist/development/src/schema/GraphQlSchemaBuilder.js.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
- package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/development/src/schema/RefreshViewMutationProvider.cjs +42 -0
- package/dist/development/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
- package/dist/development/src/schema/RefreshViewMutationProvider.js +42 -0
- package/dist/development/src/schema/RefreshViewMutationProvider.js.map +1 -0
- package/dist/development/src/utils/viewComputedId.cjs +16 -0
- package/dist/development/src/utils/viewComputedId.cjs.map +1 -0
- package/dist/development/src/utils/viewComputedId.js +16 -0
- package/dist/development/src/utils/viewComputedId.js.map +1 -0
- package/dist/production/index.cjs +1 -0
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +1 -0
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ExecutionContainer.cjs +5 -3
- package/dist/production/src/ExecutionContainer.cjs.map +1 -1
- package/dist/production/src/ExecutionContainer.js +5 -3
- package/dist/production/src/ExecutionContainer.js.map +1 -1
- package/dist/production/src/acl/Authorizator.cjs +5 -1
- package/dist/production/src/acl/Authorizator.cjs.map +1 -1
- package/dist/production/src/acl/Authorizator.js +5 -1
- package/dist/production/src/acl/Authorizator.js.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
- package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
- package/dist/production/src/input-validation/dependencies/DependencyCollector.js +3 -0
- package/dist/production/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
- package/dist/production/src/mapper/Mapper.cjs +1 -0
- package/dist/production/src/mapper/Mapper.cjs.map +1 -1
- package/dist/production/src/mapper/Mapper.js +1 -0
- package/dist/production/src/mapper/Mapper.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs +30 -3
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js +30 -3
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
- package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/production/src/resolvers/MutationResolver.cjs +1 -0
- package/dist/production/src/resolvers/MutationResolver.cjs.map +1 -1
- package/dist/production/src/resolvers/MutationResolver.js +1 -0
- package/dist/production/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/production/src/resolvers/RefreshViewResolver.cjs +21 -0
- package/dist/production/src/resolvers/RefreshViewResolver.cjs.map +1 -0
- package/dist/production/src/resolvers/RefreshViewResolver.js +21 -0
- package/dist/production/src/resolvers/RefreshViewResolver.js.map +1 -0
- package/dist/production/src/schema/GraphQlSchemaBuilder.cjs +6 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.js +6 -1
- package/dist/production/src/schema/GraphQlSchemaBuilder.js.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
- package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/production/src/schema/RefreshViewMutationProvider.cjs +42 -0
- package/dist/production/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
- package/dist/production/src/schema/RefreshViewMutationProvider.js +42 -0
- package/dist/production/src/schema/RefreshViewMutationProvider.js.map +1 -0
- package/dist/production/src/utils/viewComputedId.cjs +16 -0
- package/dist/production/src/utils/viewComputedId.cjs.map +1 -0
- package/dist/production/src/utils/viewComputedId.js +16 -0
- package/dist/production/src/utils/viewComputedId.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/validation/utils.d.ts.map +1 -1
- package/dist/tests/src/tags.d.ts.map +1 -1
- package/dist/tests/src/test.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testUuid.d.ts.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ExecutionContainer.d.ts +8 -2
- package/dist/types/ExecutionContainer.d.ts.map +1 -1
- package/dist/types/acl/Authorizator.d.ts +3 -1
- package/dist/types/acl/Authorizator.d.ts.map +1 -1
- package/dist/types/acl/VariableUtils.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationContext.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationEvaluation.d.ts.map +1 -1
- package/dist/types/input-validation/ValidationPath.d.ts.map +1 -1
- package/dist/types/introspection/introspection.schema.d.ts.map +1 -1
- package/dist/types/mapper/ColumnValue.d.ts.map +1 -1
- package/dist/types/mapper/ErrorUtils.d.ts.map +1 -1
- package/dist/types/mapper/EventManager.d.ts.map +1 -1
- package/dist/types/mapper/MutationProcessorHelper.d.ts.map +1 -1
- package/dist/types/mapper/Result.d.ts.map +1 -1
- package/dist/types/mapper/delete/helpers.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts +4 -1
- package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts +5 -2
- package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
- package/dist/types/mapper/select/optimizer/helpers.d.ts.map +1 -1
- package/dist/types/resolvers/ReadHelpers.d.ts.map +1 -1
- package/dist/types/resolvers/RefreshViewResolver.d.ts +13 -0
- package/dist/types/resolvers/RefreshViewResolver.d.ts.map +1 -0
- package/dist/types/schema/GraphQlSchemaBuilder.d.ts +3 -1
- package/dist/types/schema/GraphQlSchemaBuilder.d.ts.map +1 -1
- package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
- package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
- package/dist/types/schema/OperationExtension.d.ts.map +1 -1
- package/dist/types/schema/RefreshViewMutationProvider.d.ts +11 -0
- package/dist/types/schema/RefreshViewMutationProvider.d.ts.map +1 -0
- package/dist/types/schema/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/types/utils/isIt.d.ts.map +1 -1
- package/dist/types/utils/paginationUtils.d.ts.map +1 -1
- package/dist/types/utils/promises.d.ts.map +1 -1
- package/dist/types/utils/singletonFactory.d.ts.map +1 -1
- package/dist/types/utils/strings.d.ts.map +1 -1
- package/dist/types/utils/tuple.d.ts.map +1 -1
- package/dist/types/utils/uniqueWhereFields.d.ts.map +1 -1
- package/dist/types/utils/viewComputedId.d.ts +2 -0
- package/dist/types/utils/viewComputedId.d.ts.map +1 -0
- package/package.json +11 -11
- package/src/ExecutionContainer.ts +8 -4
- package/src/acl/Authorizator.ts +5 -0
- package/src/mapper/select/handlers/FieldsVisitor.ts +33 -1
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +6 -1
- package/src/resolvers/RefreshViewResolver.ts +23 -0
- package/src/schema/GraphQlSchemaBuilder.ts +8 -0
- package/src/schema/GraphQlSchemaBuilderFactory.ts +5 -2
- package/src/schema/RefreshViewMutationProvider.ts +47 -0
- package/src/utils/viewComputedId.ts +23 -0
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +1 -1
- package/tests/src/test.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isIt.d.ts","sourceRoot":"","sources":["../../../src/utils/isIt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"isIt.d.ts","sourceRoot":"","sources":["../../../src/utils/isIt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAG,GAAG,IAAI,CAKhH,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paginationUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/paginationUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,qBAAa,gBAAgB;aAEX,aAAa,EAAE,UAAU,GAAG,SAAS;aACrC,SAAS,EAAE,UAAU,GAAG,SAAS;gBADjC,aAAa,EAAE,UAAU,GAAG,SAAS,EACrC,SAAS,EAAE,UAAU,GAAG,SAAS;IAGlD,IAAI,kBAAkB,YAErB;IAED,IAAI,aAAa,YAEhB;IAEM,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG;CAc9E;AACD,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"paginationUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/paginationUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,qBAAa,gBAAgB;aAEX,aAAa,EAAE,UAAU,GAAG,SAAS;aACrC,SAAS,EAAE,UAAU,GAAG,SAAS;gBADjC,aAAa,EAAE,UAAU,GAAG,SAAS,EACrC,SAAS,EAAE,UAAU,GAAG,SAAS;IAGlD,IAAI,kBAAkB,YAErB;IAED,IAAI,aAAa,YAEhB;IAEM,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG;CAc9E;AACD,eAAO,MAAM,sBAAsB,GAAI,UAAU,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,qBAmBtF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../../src/utils/promises.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../../src/utils/promises.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,GAAI,SAAS,oBAAoB,CAAC,GAAG,CAAC,EAAE,KAAG,GAAG,EAEvE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAG,CAAC,EAE3E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singletonFactory.d.ts","sourceRoot":"","sources":["../../../src/utils/singletonFactory.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"singletonFactory.d.ts","sourceRoot":"","sources":["../../../src/utils/singletonFactory.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,MAGvF,MAAM,EAAE,EAAE,OAAO,IAAI,KAAG,CAkBhC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../../src/utils/strings.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../../src/utils/strings.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,qBAAqB,GAAI,OAAO,MAAM,WAE3C,CAAA;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/utils/tuple.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/utils/tuple.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,MAAS,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniqueWhereFields.d.ts","sourceRoot":"","sources":["../../../src/utils/uniqueWhereFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,KAAK,YAAY,GAAG,SAAS,MAAM,EAAE,CAAA;AACrC,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"uniqueWhereFields.d.ts","sourceRoot":"","sources":["../../../src/utils/uniqueWhereFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,KAAK,YAAY,GAAG,SAAS,MAAM,EAAE,CAAA;AACrC,eAAO,MAAM,uBAAuB,GAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,CAAC,MAAM,KAAG,SAAS,CAAC,YAAY,CAAC,EAc3G,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewComputedId.d.ts","sourceRoot":"","sources":["../../../src/utils/viewComputedId.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,GAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAG,MAWnD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/engine-content-api",
|
|
3
|
-
"version": "2.1.0-alpha.
|
|
3
|
+
"version": "2.1.0-alpha.10",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/production/index.js",
|
|
6
6
|
"typings": "./dist/types/index.d.ts",
|
|
@@ -26,19 +26,19 @@
|
|
|
26
26
|
"generate": "gql-gen --config graphql.codegen.yml"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@contember/database": "2.1.0-alpha.
|
|
30
|
-
"@contember/dic": "2.1.0-alpha.
|
|
31
|
-
"@contember/graphql-utils": "2.1.0-alpha.
|
|
32
|
-
"@contember/logger": "2.1.0-alpha.
|
|
33
|
-
"@contember/schema": "2.1.0-alpha.
|
|
34
|
-
"@contember/schema-definition": "2.1.0-alpha.
|
|
35
|
-
"@contember/schema-utils": "2.1.0-alpha.
|
|
29
|
+
"@contember/database": "2.1.0-alpha.10",
|
|
30
|
+
"@contember/dic": "2.1.0-alpha.10",
|
|
31
|
+
"@contember/graphql-utils": "2.1.0-alpha.10",
|
|
32
|
+
"@contember/logger": "2.1.0-alpha.10",
|
|
33
|
+
"@contember/schema": "2.1.0-alpha.10",
|
|
34
|
+
"@contember/schema-definition": "2.1.0-alpha.10",
|
|
35
|
+
"@contember/schema-utils": "2.1.0-alpha.10",
|
|
36
36
|
"fast-deep-equal": "^3.1.3"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@contember/database-tester": "2.1.0-alpha.
|
|
40
|
-
"@contember/schema-definition": "2.1.0-alpha.
|
|
41
|
-
"@types/node": "^20.
|
|
39
|
+
"@contember/database-tester": "2.1.0-alpha.10",
|
|
40
|
+
"@contember/schema-definition": "2.1.0-alpha.10",
|
|
41
|
+
"@types/node": "^20.17.22",
|
|
42
42
|
"graphql": "^16.9.0",
|
|
43
43
|
"pg": "^8.12.0"
|
|
44
44
|
},
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
import { Builder } from '@contember/dic'
|
|
29
29
|
import { Acl, Model, Schema } from '@contember/schema'
|
|
30
30
|
import { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@contember/database'
|
|
31
|
-
import { Providers } from '@contember/schema-utils'
|
|
31
|
+
import { ParsedMembership, Providers } from '@contember/schema-utils'
|
|
32
32
|
import { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'
|
|
33
33
|
import { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'
|
|
34
34
|
import { WhereOptimizer } from './mapper/select/optimizer/WhereOptimizer'
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
QueryAstFactory,
|
|
42
42
|
ValidationDataSelector,
|
|
43
43
|
} from './input-validation'
|
|
44
|
+
import { RefreshViewResolver } from './resolvers/RefreshViewResolver'
|
|
44
45
|
|
|
45
46
|
export type ExecutionContainerArgs = {
|
|
46
47
|
schema: Schema
|
|
@@ -59,6 +60,7 @@ export interface ExecutionContainer {
|
|
|
59
60
|
readResolver: ReadResolver
|
|
60
61
|
mutationResolver: MutationResolver
|
|
61
62
|
validationResolver: ValidationResolver
|
|
63
|
+
refreshViewResolver: RefreshViewResolver
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
export type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>
|
|
@@ -122,8 +124,8 @@ export class ExecutionContainerFactory {
|
|
|
122
124
|
new OrderByBuilder(schema.model, joinBuilder))
|
|
123
125
|
.addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>
|
|
124
126
|
new RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))
|
|
125
|
-
.addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema }) =>
|
|
126
|
-
new FieldsVisitorFactory(relationFetcher, predicateFactory, schema.settings.content ?? {}))
|
|
127
|
+
.addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema, providers }) =>
|
|
128
|
+
new FieldsVisitorFactory(schema.model, relationFetcher, predicateFactory, schema.settings.content ?? {}, providers))
|
|
127
129
|
.addService('metaHandler', ({ whereBuilder, predicateFactory }) =>
|
|
128
130
|
new MetaHandler(whereBuilder, predicateFactory))
|
|
129
131
|
.addService('uniqueWhereExpander', ({ schema }) =>
|
|
@@ -209,10 +211,12 @@ export class ExecutionContainerFactory {
|
|
|
209
211
|
new MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))
|
|
210
212
|
.addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>
|
|
211
213
|
new ValidationResolver(mapperFactory, inputPreValidator))
|
|
214
|
+
.addService('refreshViewResolver', ({ schema, mapperFactory }) =>
|
|
215
|
+
new RefreshViewResolver(schema, mapperFactory))
|
|
212
216
|
}
|
|
213
217
|
|
|
214
218
|
public create(args: ExecutionContainerArgs): ExecutionContainer {
|
|
215
|
-
return this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')
|
|
219
|
+
return this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver', 'refreshViewResolver')
|
|
216
220
|
}
|
|
217
221
|
}
|
|
218
222
|
|
package/src/acl/Authorizator.ts
CHANGED
|
@@ -7,6 +7,7 @@ export class Authorizator {
|
|
|
7
7
|
constructor(
|
|
8
8
|
private readonly permissions: Acl.Permissions,
|
|
9
9
|
private readonly defaultCustomPrimary: boolean,
|
|
10
|
+
private readonly allowRefreshMaterializedView: boolean,
|
|
10
11
|
) {
|
|
11
12
|
}
|
|
12
13
|
|
|
@@ -56,4 +57,8 @@ export class Authorizator {
|
|
|
56
57
|
isRootOperationDisallowed(entity: string, operation: Acl.Operation): boolean {
|
|
57
58
|
return this.permissions?.[entity]?.operations?.noRoot?.includes(operation) ?? false
|
|
58
59
|
}
|
|
60
|
+
|
|
61
|
+
isRefreshMaterializedViewAllowed(entity: string): boolean {
|
|
62
|
+
return this.permissions?.[entity]?.operations?.refreshMaterializedView ?? this.allowRefreshMaterializedView
|
|
63
|
+
}
|
|
59
64
|
}
|
|
@@ -4,20 +4,27 @@ import { RelationFetcher } from '../RelationFetcher'
|
|
|
4
4
|
import { SelectExecutionHandlerContext } from '../SelectExecutionHandler'
|
|
5
5
|
import { PredicateFactory } from '../../../acl'
|
|
6
6
|
import { Literal, wrapIdentifier } from '@contember/database'
|
|
7
|
+
import { ColumnValueGetter } from '../SelectHydrator'
|
|
8
|
+
import { Providers } from '@contember/schema-utils'
|
|
9
|
+
import { getColumnName } from '@contember/schema-utils'
|
|
10
|
+
import { viewComputedId } from '../../../utils/viewComputedId'
|
|
7
11
|
|
|
8
12
|
export class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.ColumnVisitor<void> {
|
|
9
13
|
constructor(
|
|
14
|
+
private readonly schema: Model.Schema,
|
|
10
15
|
private readonly relationFetcher: RelationFetcher,
|
|
11
16
|
private readonly predicateFactory: PredicateFactory,
|
|
12
17
|
private readonly mapper: Mapper,
|
|
13
18
|
private readonly executionContext: SelectExecutionHandlerContext,
|
|
14
19
|
private readonly relationPath: Model.AnyRelationContext[],
|
|
15
20
|
private readonly settings: Settings.ContentSettings,
|
|
21
|
+
private readonly providers: Providers,
|
|
16
22
|
) {}
|
|
17
23
|
|
|
18
24
|
visitColumn({ entity, column }: Model.ColumnContext): void {
|
|
19
25
|
const columnPath = this.executionContext.path
|
|
20
|
-
const
|
|
26
|
+
const tablePath = columnPath.back()
|
|
27
|
+
const tableAlias = tablePath.alias
|
|
21
28
|
const columnAlias = columnPath.alias
|
|
22
29
|
|
|
23
30
|
let selectFrom = wrapIdentifier(tableAlias) + '.' + wrapIdentifier(column.columnName)
|
|
@@ -31,9 +38,34 @@ export class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.C
|
|
|
31
38
|
selectFrom += '::text[]'
|
|
32
39
|
}
|
|
33
40
|
|
|
41
|
+
let columnValueGetter: ColumnValueGetter | undefined = undefined
|
|
42
|
+
if (entity.view && column.name === entity.primary && column.type === Model.ColumnType.Uuid) {
|
|
43
|
+
if (entity.view.idSource) {
|
|
44
|
+
const aliases: string[] = []
|
|
45
|
+
for (const source of entity.view.idSource) {
|
|
46
|
+
const columnName = getColumnName(this.schema, entity, source)
|
|
47
|
+
const idSrcPath = columnPath.for(source + '__id_src')
|
|
48
|
+
aliases.push(idSrcPath.alias)
|
|
49
|
+
this.executionContext.addColumn({
|
|
50
|
+
query: qb => qb.select([tableAlias, columnName], idSrcPath.alias),
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
columnValueGetter = row => {
|
|
55
|
+
return viewComputedId(aliases.map(it => row[it]?.toString() || ''))
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
columnValueGetter = row => {
|
|
59
|
+
return row[columnAlias] ?? (this.providers.uuid({ version: this.settings.uuidVersion }))
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
34
65
|
this.executionContext.addColumn({
|
|
35
66
|
query: qb => qb.select(new Literal(selectFrom), columnAlias),
|
|
36
67
|
predicate: this.getRequiredPredicate(entity, column),
|
|
68
|
+
valueGetter: columnValueGetter,
|
|
37
69
|
})
|
|
38
70
|
}
|
|
39
71
|
|
|
@@ -3,23 +3,28 @@ import { RelationFetcher } from '../RelationFetcher'
|
|
|
3
3
|
import { Mapper } from '../../Mapper'
|
|
4
4
|
import { SelectExecutionHandlerContext } from '../SelectExecutionHandler'
|
|
5
5
|
import { PredicateFactory } from '../../../acl'
|
|
6
|
-
import { Settings } from '@contember/schema'
|
|
6
|
+
import { Model, Settings } from '@contember/schema'
|
|
7
|
+
import { Providers } from '@contember/schema-utils'
|
|
7
8
|
|
|
8
9
|
export class FieldsVisitorFactory {
|
|
9
10
|
constructor(
|
|
11
|
+
private readonly schema: Model.Schema,
|
|
10
12
|
private readonly relationFetcher: RelationFetcher,
|
|
11
13
|
private readonly predicateFactory: PredicateFactory,
|
|
12
14
|
private readonly settings: Settings.ContentSettings,
|
|
15
|
+
private readonly providers: Providers,
|
|
13
16
|
) {}
|
|
14
17
|
|
|
15
18
|
create(mapper: Mapper, context: SelectExecutionHandlerContext): FieldsVisitor {
|
|
16
19
|
return new FieldsVisitor(
|
|
20
|
+
this.schema,
|
|
17
21
|
this.relationFetcher,
|
|
18
22
|
this.predicateFactory,
|
|
19
23
|
mapper,
|
|
20
24
|
context,
|
|
21
25
|
context.relationPath,
|
|
22
26
|
this.settings,
|
|
27
|
+
this.providers,
|
|
23
28
|
)
|
|
24
29
|
}
|
|
25
30
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Schema } from '@contember/schema'
|
|
2
|
+
import { MapperFactory } from '../mapper'
|
|
3
|
+
import { wrapIdentifier } from '@contember/database'
|
|
4
|
+
|
|
5
|
+
export class RefreshViewResolver {
|
|
6
|
+
constructor(
|
|
7
|
+
private readonly schema: Schema,
|
|
8
|
+
private readonly mapperFactory: MapperFactory,
|
|
9
|
+
) {
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public async resolve(entity: string, options?: { concurrently?: boolean }): Promise<{ ok: boolean }> {
|
|
13
|
+
const mapper = this.mapperFactory.create()
|
|
14
|
+
const entityModel = this.schema.model.entities[entity]
|
|
15
|
+
if (!entityModel) {
|
|
16
|
+
throw new Error(`Entity ${entity} not found`)
|
|
17
|
+
}
|
|
18
|
+
const concurrently = options?.concurrently ? ' CONCURRENTLY' : ''
|
|
19
|
+
await mapper.db.query(`REFRESH MATERIALIZED VIEW${concurrently} ${wrapIdentifier(mapper.db.schema)}.${wrapIdentifier(entityModel.tableName)}`)
|
|
20
|
+
|
|
21
|
+
return { ok: true }
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -15,6 +15,7 @@ import { QueryProvider } from './QueryProvider'
|
|
|
15
15
|
import { ValidationQueriesProvider } from './ValidationQueriesProvider'
|
|
16
16
|
import { Context } from '../types'
|
|
17
17
|
import { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'
|
|
18
|
+
import { RefreshViewMutationProvider } from './RefreshViewMutationProvider'
|
|
18
19
|
|
|
19
20
|
type BuildArgs = {
|
|
20
21
|
queries?: Map<string, GraphQLFieldConfig<any, Context, any>>
|
|
@@ -29,6 +30,7 @@ export class GraphQlSchemaBuilder {
|
|
|
29
30
|
private readonly validationQueriesProvider: ValidationQueriesProvider,
|
|
30
31
|
private readonly mutationProvider: MutationProvider,
|
|
31
32
|
private readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,
|
|
33
|
+
private readonly refreshViewMutationProvider: RefreshViewMutationProvider,
|
|
32
34
|
) {}
|
|
33
35
|
|
|
34
36
|
public build(args: BuildArgs = {}): GraphQLSchema {
|
|
@@ -117,6 +119,12 @@ export class GraphQlSchemaBuilder {
|
|
|
117
119
|
resolve: (parent, args, context: Context, info) => context.executionContainer.readResolver.resolveQuery(info),
|
|
118
120
|
})
|
|
119
121
|
}
|
|
122
|
+
|
|
123
|
+
const refreshViewMutation = this.refreshViewMutationProvider.getMutation()
|
|
124
|
+
if (refreshViewMutation) {
|
|
125
|
+
mutations.set('refreshMaterializedView', refreshViewMutation)
|
|
126
|
+
}
|
|
127
|
+
|
|
120
128
|
const infoType = new GraphQLObjectType({
|
|
121
129
|
name: 'Info',
|
|
122
130
|
fields: () => ({
|
|
@@ -29,6 +29,7 @@ import { PaginatedHasManyFieldProvider } from '../extensions/paginatedHasMany/Pa
|
|
|
29
29
|
import { PaginatedHasManyFieldProviderVisitor } from '../extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor'
|
|
30
30
|
import { Builder } from '@contember/dic'
|
|
31
31
|
import { ConnectOrCreateRelationInputProvider } from './mutations/ConnectOrCreateRelationInputProvider'
|
|
32
|
+
import { RefreshViewMutationProvider } from './RefreshViewMutationProvider'
|
|
32
33
|
|
|
33
34
|
export class GraphQlSchemaBuilderFactory {
|
|
34
35
|
constructor() {}
|
|
@@ -101,8 +102,10 @@ export class GraphQlSchemaBuilderFactory {
|
|
|
101
102
|
new MutationProvider(authorizator, whereTypeProvider, entityTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider))
|
|
102
103
|
.addService('validationQueriesProvider', ({ whereTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider }) =>
|
|
103
104
|
new ValidationQueriesProvider(whereTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider))
|
|
104
|
-
.addService('
|
|
105
|
-
new
|
|
105
|
+
.addService('refreshViewMutationProvider', ({ schema, authorizator }) =>
|
|
106
|
+
new RefreshViewMutationProvider(schema, authorizator))
|
|
107
|
+
.addService('graphQlSchemaBuilder', ({ schema, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider, refreshViewMutationProvider }) =>
|
|
108
|
+
new GraphQlSchemaBuilder(schema, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider, refreshViewMutationProvider))
|
|
106
109
|
.setupService('createEntityInputProvider', (it, { createEntityInputProviderAccessor }) => {
|
|
107
110
|
createEntityInputProviderAccessor.set(it)
|
|
108
111
|
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Model } from '@contember/schema'
|
|
2
|
+
import { GraphQLBoolean, GraphQLEnumType, GraphQLFieldConfig, GraphQLInputObjectType, GraphQLObjectType } from 'graphql'
|
|
3
|
+
import { Context } from '../types'
|
|
4
|
+
import { Authorizator } from '../acl'
|
|
5
|
+
|
|
6
|
+
export class RefreshViewMutationProvider {
|
|
7
|
+
constructor(
|
|
8
|
+
private readonly schema: Model.Schema,
|
|
9
|
+
private readonly authorizator: Authorizator,
|
|
10
|
+
) {
|
|
11
|
+
}
|
|
12
|
+
getMutation(): GraphQLFieldConfig<any, Context, any> | undefined {
|
|
13
|
+
const materializedViews = Object.values(this.schema.entities)
|
|
14
|
+
.filter(it => it.view?.materialized)
|
|
15
|
+
.filter(it => this.authorizator.isRefreshMaterializedViewAllowed(it.name))
|
|
16
|
+
if (materializedViews.length === 0) {
|
|
17
|
+
return undefined
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const materializedViewsEnum = new GraphQLEnumType({
|
|
21
|
+
name: '_MaterializedView',
|
|
22
|
+
values: Object.fromEntries(materializedViews.map(it => [it.name, { value: it.name }])),
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const refreshViewOptions = new GraphQLInputObjectType({
|
|
26
|
+
name: 'RefreshMaterializedViewOptions',
|
|
27
|
+
fields: {
|
|
28
|
+
concurrently: { type: GraphQLBoolean },
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
return {
|
|
32
|
+
type: new GraphQLObjectType({
|
|
33
|
+
name: 'RefreshMaterializedViewResponse',
|
|
34
|
+
fields: {
|
|
35
|
+
ok: { type: GraphQLBoolean },
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
args: {
|
|
39
|
+
name: { type: materializedViewsEnum },
|
|
40
|
+
options: { type: refreshViewOptions },
|
|
41
|
+
},
|
|
42
|
+
resolve: async (parent, args, context) => {
|
|
43
|
+
return await context.executionContainer.refreshViewResolver.resolve(args.name, args.options)
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import crypto from 'node:crypto'
|
|
2
|
+
|
|
3
|
+
export const viewComputedId = (inputs: (string)[]): string => {
|
|
4
|
+
let uuidBytes: Buffer
|
|
5
|
+
uuidBytes = crypto.createHash('md5').update(inputs.join('\x00')).digest()
|
|
6
|
+
|
|
7
|
+
// Set the version (v8) in the high nibble of byte 6.
|
|
8
|
+
uuidBytes[6] = (uuidBytes[6] & 0x0f) | 0x80 // 0x80 = 1000 0000 (version 8)
|
|
9
|
+
|
|
10
|
+
// Set the variant (RFC 4122) in byte 8.
|
|
11
|
+
uuidBytes[8] = (uuidBytes[8] & 0x3f) | 0x80
|
|
12
|
+
|
|
13
|
+
return formatUUID(uuidBytes)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const formatUUID = (buf: Buffer): string => {
|
|
17
|
+
const hex = buf.toString('hex')
|
|
18
|
+
return hex.substring(0, 8)
|
|
19
|
+
+ '-' + hex.substring(8, 12)
|
|
20
|
+
+ '-' + hex.substring(12, 16)
|
|
21
|
+
+ '-' + hex.substring(16, 20)
|
|
22
|
+
+ '-' + hex.substring(20)
|
|
23
|
+
}
|
|
@@ -29,7 +29,7 @@ const testSchema = async (test: Test) => {
|
|
|
29
29
|
const schema = schemaResult instanceof SchemaBuilder ? schemaResult.buildSchema() : schemaResult
|
|
30
30
|
const schemaWithAcl = { ...schema, acl: { roles: {}, variables: {} } }
|
|
31
31
|
const permissions = test.permissions(schemaWithAcl)
|
|
32
|
-
const authorizator = new Authorizator(permissions, false)
|
|
32
|
+
const authorizator = new Authorizator(permissions, false, false)
|
|
33
33
|
const graphQlSchemaBuilder = schemaFactory.create(schemaWithAcl, authorizator)
|
|
34
34
|
const graphQlSchema = graphQlSchemaBuilder.build()
|
|
35
35
|
|
package/tests/src/test.ts
CHANGED
|
@@ -75,7 +75,7 @@ export const failedTransaction = (executes: SqlQuery[]): SqlQuery[] => {
|
|
|
75
75
|
|
|
76
76
|
export const execute = async (test: Test) => {
|
|
77
77
|
const permissions: Acl.Permissions = test.permissions || new AllowAllPermissionFactory().create(test.schema)
|
|
78
|
-
const authorizator = new Authorizator(permissions, false)
|
|
78
|
+
const authorizator = new Authorizator(permissions, false, false)
|
|
79
79
|
const builder = new GraphQlSchemaBuilderFactory().create(test.schema, authorizator)
|
|
80
80
|
const graphQLSchema = builder.build()
|
|
81
81
|
|