@contember/engine-content-api 2.0.2 → 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 +6 -4
- package/dist/development/src/ExecutionContainer.cjs.map +1 -1
- package/dist/development/src/ExecutionContainer.js +6 -4
- 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/ColumnValueResolver.cjs +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.cjs.map +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.js +1 -1
- package/dist/development/src/input-validation/ColumnValueResolver.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/insert/Inserter.cjs +3 -2
- package/dist/development/src/mapper/insert/Inserter.cjs.map +1 -1
- package/dist/development/src/mapper/insert/Inserter.js +3 -2
- package/dist/development/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs +3 -2
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js +3 -2
- package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.cjs +9 -2
- package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/ConditionBuilder.js +10 -3
- package/dist/development/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/WhereBuilder.cjs +3 -3
- package/dist/development/src/mapper/select/WhereBuilder.cjs.map +1 -1
- package/dist/development/src/mapper/select/WhereBuilder.js +3 -3
- package/dist/development/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs +33 -3
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/development/src/mapper/select/handlers/FieldsVisitor.js +33 -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/ColumnTypeResolver.cjs +9 -0
- package/dist/development/src/schema/ColumnTypeResolver.cjs.map +1 -1
- package/dist/development/src/schema/ColumnTypeResolver.js +10 -1
- package/dist/development/src/schema/ColumnTypeResolver.js.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.cjs +35 -23
- package/dist/development/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/ConditionTypeProvider.js +36 -24
- package/dist/development/src/schema/ConditionTypeProvider.js.map +1 -1
- package/dist/development/src/schema/CustomTypesProvider.cjs +30 -0
- package/dist/development/src/schema/CustomTypesProvider.cjs.map +1 -1
- package/dist/development/src/schema/CustomTypesProvider.js +30 -0
- package/dist/development/src/schema/CustomTypesProvider.js.map +1 -1
- 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/OrderByTypeProvider.cjs +6 -1
- package/dist/development/src/schema/OrderByTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/OrderByTypeProvider.js +6 -1
- package/dist/development/src/schema/OrderByTypeProvider.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/schema/WhereTypeProvider.cjs +1 -1
- package/dist/development/src/schema/WhereTypeProvider.cjs.map +1 -1
- package/dist/development/src/schema/WhereTypeProvider.js +1 -1
- package/dist/development/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/development/src/schema/entities/FieldTypeVisitor.cjs +3 -3
- package/dist/development/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
- package/dist/development/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/development/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js +1 -1
- package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js +1 -1
- package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- 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 +6 -4
- package/dist/production/src/ExecutionContainer.cjs.map +1 -1
- package/dist/production/src/ExecutionContainer.js +6 -4
- 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/ColumnValueResolver.cjs +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.cjs.map +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.js +1 -1
- package/dist/production/src/input-validation/ColumnValueResolver.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/insert/Inserter.cjs +3 -2
- package/dist/production/src/mapper/insert/Inserter.cjs.map +1 -1
- package/dist/production/src/mapper/insert/Inserter.js +3 -2
- package/dist/production/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs +3 -2
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js +3 -2
- package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.cjs +9 -2
- package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/ConditionBuilder.js +10 -3
- package/dist/production/src/mapper/select/ConditionBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/WhereBuilder.cjs +3 -3
- package/dist/production/src/mapper/select/WhereBuilder.cjs.map +1 -1
- package/dist/production/src/mapper/select/WhereBuilder.js +3 -3
- package/dist/production/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs +33 -3
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
- package/dist/production/src/mapper/select/handlers/FieldsVisitor.js +33 -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/ColumnTypeResolver.cjs +9 -0
- package/dist/production/src/schema/ColumnTypeResolver.cjs.map +1 -1
- package/dist/production/src/schema/ColumnTypeResolver.js +10 -1
- package/dist/production/src/schema/ColumnTypeResolver.js.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.cjs +35 -23
- package/dist/production/src/schema/ConditionTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/ConditionTypeProvider.js +36 -24
- package/dist/production/src/schema/ConditionTypeProvider.js.map +1 -1
- package/dist/production/src/schema/CustomTypesProvider.cjs +30 -0
- package/dist/production/src/schema/CustomTypesProvider.cjs.map +1 -1
- package/dist/production/src/schema/CustomTypesProvider.js +30 -0
- package/dist/production/src/schema/CustomTypesProvider.js.map +1 -1
- 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/OrderByTypeProvider.cjs +6 -1
- package/dist/production/src/schema/OrderByTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/OrderByTypeProvider.js +6 -1
- package/dist/production/src/schema/OrderByTypeProvider.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/schema/WhereTypeProvider.cjs +1 -1
- package/dist/production/src/schema/WhereTypeProvider.cjs.map +1 -1
- package/dist/production/src/schema/WhereTypeProvider.js +1 -1
- package/dist/production/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/production/src/schema/entities/FieldTypeVisitor.cjs +3 -3
- package/dist/production/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
- package/dist/production/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/production/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js +1 -1
- package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js +1 -1
- package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- 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/insert/Inserter.d.ts +4 -1
- package/dist/types/mapper/insert/Inserter.d.ts.map +1 -1
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts +4 -1
- package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/types/mapper/select/ConditionBuilder.d.ts +2 -2
- package/dist/types/mapper/select/ConditionBuilder.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/ColumnTypeResolver.d.ts +5 -5
- package/dist/types/schema/ColumnTypeResolver.d.ts.map +1 -1
- package/dist/types/schema/ConditionTypeProvider.d.ts +1 -0
- package/dist/types/schema/ConditionTypeProvider.d.ts.map +1 -1
- package/dist/types/schema/CustomTypesProvider.d.ts +1 -0
- package/dist/types/schema/CustomTypesProvider.d.ts.map +1 -1
- 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/OrderByTypeProvider.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/mutations/UpdateEntityInputFieldVisitor.d.ts +1 -1
- 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 +9 -5
- package/src/acl/Authorizator.ts +5 -0
- package/src/input-validation/ColumnValueResolver.ts +1 -1
- package/src/mapper/insert/Inserter.ts +2 -1
- package/src/mapper/insert/SqlCreateInputProcessor.ts +2 -1
- package/src/mapper/select/ConditionBuilder.ts +19 -5
- package/src/mapper/select/WhereBuilder.ts +3 -3
- package/src/mapper/select/handlers/FieldsVisitor.ts +36 -1
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +6 -1
- package/src/resolvers/RefreshViewResolver.ts +23 -0
- package/src/schema/ColumnTypeResolver.ts +15 -3
- package/src/schema/ConditionTypeProvider.ts +40 -25
- package/src/schema/CustomTypesProvider.ts +37 -0
- package/src/schema/GraphQlSchemaBuilder.ts +8 -0
- package/src/schema/GraphQlSchemaBuilderFactory.ts +5 -2
- package/src/schema/OrderByTypeProvider.ts +6 -1
- package/src/schema/RefreshViewMutationProvider.ts +47 -0
- package/src/schema/WhereTypeProvider.ts +1 -1
- package/src/schema/entities/FieldTypeVisitor.ts +3 -3
- package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +1 -1
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +1 -1
- package/src/utils/viewComputedId.ts +23 -0
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +38 -2
- package/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +6 -0
- package/tests/cases/integration/graphQlSchema/schema-array.gql +257 -0
- package/tests/cases/integration/graphQlSchema/schema-column-types.gql +420 -0
- 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.0.
|
|
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.0.
|
|
30
|
-
"@contember/dic": "2.0.
|
|
31
|
-
"@contember/graphql-utils": "2.0.
|
|
32
|
-
"@contember/logger": "2.0.
|
|
33
|
-
"@contember/schema": "2.0.
|
|
34
|
-
"@contember/schema-definition": "2.0.
|
|
35
|
-
"@contember/schema-utils": "2.0.
|
|
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.0.
|
|
40
|
-
"@contember/schema-definition": "2.0.
|
|
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 }) =>
|
|
@@ -169,7 +171,7 @@ export class ExecutionContainerFactory {
|
|
|
169
171
|
.addService('updater', ({ predicateFactory, updateBuilderFactory, schema, schemaDatabaseMetadata }) =>
|
|
170
172
|
new Updater(schema.model, schemaDatabaseMetadata, predicateFactory, updateBuilderFactory))
|
|
171
173
|
.addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>
|
|
172
|
-
new Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))
|
|
174
|
+
new Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers, { uuidVersion: schema.settings.content?.uuidVersion }))
|
|
173
175
|
.addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {
|
|
174
176
|
return new MapperFactory(
|
|
175
177
|
db,
|
|
@@ -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
|
}
|
|
@@ -9,7 +9,7 @@ export class ColumnValueResolver {
|
|
|
9
9
|
return '00000000-0000-0000-0000-000000000000'
|
|
10
10
|
}
|
|
11
11
|
try {
|
|
12
|
-
return resolveColumnValue(context, this.providers)
|
|
12
|
+
return resolveColumnValue(context, this.providers, {})
|
|
13
13
|
} catch (e) {
|
|
14
14
|
if (e instanceof NoDataError) {
|
|
15
15
|
return undefined
|
|
@@ -16,6 +16,7 @@ export class Inserter {
|
|
|
16
16
|
private readonly schemaDatabaseMetadata: DatabaseMetadata,
|
|
17
17
|
private readonly insertBuilderFactory: InsertBuilderFactory,
|
|
18
18
|
private readonly providers: Providers,
|
|
19
|
+
private readonly options: { uuidVersion?: 4 | 7 },
|
|
19
20
|
) {}
|
|
20
21
|
|
|
21
22
|
public async insert(
|
|
@@ -30,7 +31,7 @@ export class Inserter {
|
|
|
30
31
|
insertBuilder.addPredicates(Object.keys(data))
|
|
31
32
|
|
|
32
33
|
const visitor = new CreateInputVisitor<SqlCreateInputProcessorResult>(
|
|
33
|
-
new SqlCreateInputProcessor(insertBuilder, mapper, this.providers),
|
|
34
|
+
new SqlCreateInputProcessor(insertBuilder, mapper, this.providers, this.options),
|
|
34
35
|
this.schema,
|
|
35
36
|
data,
|
|
36
37
|
)
|
|
@@ -25,6 +25,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<SqlCreateIn
|
|
|
25
25
|
private readonly insertBuilder: InsertBuilder,
|
|
26
26
|
private readonly mapper: Mapper,
|
|
27
27
|
private readonly providers: Providers,
|
|
28
|
+
private readonly options: { uuidVersion?: 4 | 7 } = {},
|
|
28
29
|
) {
|
|
29
30
|
this.oneHasOneInverseCreateInputProcessor = new OneHasOneInverseCreateInputProcessor(this.mapper)
|
|
30
31
|
this.oneHasOneOwningCreateInputProcessor = new OneHasOneOwningCreateInputProcessor(this.mapper, this.insertBuilder)
|
|
@@ -36,7 +37,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<SqlCreateIn
|
|
|
36
37
|
public async column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<SqlCreateInputProcessorResult> {
|
|
37
38
|
this.insertBuilder.addFieldValue(
|
|
38
39
|
context.column.name,
|
|
39
|
-
resolveColumnValue(context, this.providers),
|
|
40
|
+
resolveColumnValue(context, this.providers, this.options),
|
|
40
41
|
)
|
|
41
42
|
return []
|
|
42
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Input } from '@contember/schema'
|
|
2
|
-
import { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator } from '@contember/database'
|
|
1
|
+
import { Input, Model } from '@contember/schema'
|
|
2
|
+
import { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'
|
|
3
3
|
import { UserError } from '../../exception'
|
|
4
4
|
|
|
5
5
|
export class ConditionBuilder {
|
|
@@ -7,7 +7,7 @@ export class ConditionBuilder {
|
|
|
7
7
|
builder: SqlConditionBuilder,
|
|
8
8
|
tableName: string,
|
|
9
9
|
columnName: string,
|
|
10
|
-
columnType:
|
|
10
|
+
columnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,
|
|
11
11
|
condition: Input.Condition<any> | null,
|
|
12
12
|
): SqlConditionBuilder {
|
|
13
13
|
if (condition === null) {
|
|
@@ -37,21 +37,35 @@ export class ConditionBuilder {
|
|
|
37
37
|
and: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),
|
|
38
38
|
or: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),
|
|
39
39
|
not: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),
|
|
40
|
+
|
|
41
|
+
isNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),
|
|
42
|
+
|
|
40
43
|
eq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),
|
|
41
44
|
notEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),
|
|
42
|
-
|
|
43
|
-
in: (builder, values) => builder.in(columnIdentifier, values, columnType),
|
|
45
|
+
in: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),
|
|
44
46
|
notIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),
|
|
45
47
|
lt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),
|
|
46
48
|
lte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),
|
|
47
49
|
gt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),
|
|
48
50
|
gte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),
|
|
51
|
+
|
|
52
|
+
includes: (builder, value) => {
|
|
53
|
+
const cast = columnType.type === Model.ColumnType.Enum
|
|
54
|
+
? `${Compiler.SCHEMA_PLACEHOLDER}."${columnType.columnType}"`
|
|
55
|
+
: columnType.columnType
|
|
56
|
+
|
|
57
|
+
return builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)
|
|
58
|
+
},
|
|
59
|
+
maxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),
|
|
60
|
+
minLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),
|
|
61
|
+
|
|
49
62
|
contains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),
|
|
50
63
|
startsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),
|
|
51
64
|
endsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),
|
|
52
65
|
containsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),
|
|
53
66
|
startsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),
|
|
54
67
|
endsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),
|
|
68
|
+
|
|
55
69
|
never: builder => builder.raw('false'),
|
|
56
70
|
always: builder => builder.raw('true'),
|
|
57
71
|
|
|
@@ -160,7 +160,7 @@ export class WhereBuilder {
|
|
|
160
160
|
conditionBuilder,
|
|
161
161
|
tableName,
|
|
162
162
|
relation.joiningColumn.columnName,
|
|
163
|
-
(targetEntity.fields[targetEntity.primary] as Model.AnyColumn)
|
|
163
|
+
(targetEntity.fields[targetEntity.primary] as Model.AnyColumn),
|
|
164
164
|
primaryCondition,
|
|
165
165
|
)
|
|
166
166
|
}
|
|
@@ -182,7 +182,7 @@ export class WhereBuilder {
|
|
|
182
182
|
|
|
183
183
|
conditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {
|
|
184
184
|
visitColumn: ({ entity, column }) => {
|
|
185
|
-
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column
|
|
185
|
+
return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column, fieldWhere as Input.Condition<Input.ColumnValue>)
|
|
186
186
|
},
|
|
187
187
|
visitOneHasOneInverse: joinedWhere,
|
|
188
188
|
visitOneHasOneOwning: joinedWhere,
|
|
@@ -275,7 +275,7 @@ export class WhereBuilder {
|
|
|
275
275
|
const primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)
|
|
276
276
|
if (primaryCondition !== null) {
|
|
277
277
|
|
|
278
|
-
const columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn)
|
|
278
|
+
const columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn)
|
|
279
279
|
|
|
280
280
|
return qb.where(condition =>
|
|
281
281
|
this.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition),
|
|
@@ -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)
|
|
@@ -27,10 +34,38 @@ export class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.C
|
|
|
27
34
|
if (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {
|
|
28
35
|
selectFrom += '::text'
|
|
29
36
|
}
|
|
37
|
+
if (column.type === Model.ColumnType.Enum && column.list) {
|
|
38
|
+
selectFrom += '::text[]'
|
|
39
|
+
}
|
|
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
|
+
}
|
|
30
64
|
|
|
31
65
|
this.executionContext.addColumn({
|
|
32
66
|
query: qb => qb.select(new Literal(selectFrom), columnAlias),
|
|
33
67
|
predicate: this.getRequiredPredicate(entity, column),
|
|
68
|
+
valueGetter: columnValueGetter,
|
|
34
69
|
})
|
|
35
70
|
}
|
|
36
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
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLScalarType, GraphQLString } from 'graphql'
|
|
1
|
+
import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLScalarType, GraphQLString } from 'graphql'
|
|
2
2
|
import { Model } from '@contember/schema'
|
|
3
3
|
import { EnumsProvider } from './EnumsProvider'
|
|
4
4
|
import { CustomTypesProvider } from './CustomTypesProvider'
|
|
@@ -7,6 +7,8 @@ import { singletonFactory } from '../utils'
|
|
|
7
7
|
|
|
8
8
|
type ScalarType = Exclude<Model.ColumnType, Model.ColumnType.Enum>
|
|
9
9
|
|
|
10
|
+
export type ColumnGraphQLType = GraphQLScalarType | GraphQLEnumType | GraphQLList<GraphQLNonNull<GraphQLScalarType | GraphQLEnumType>>
|
|
11
|
+
|
|
10
12
|
export class ColumnTypeResolver {
|
|
11
13
|
private schema: Model.Schema
|
|
12
14
|
private enumsProvider: EnumsProvider
|
|
@@ -36,7 +38,15 @@ export class ColumnTypeResolver {
|
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
|
|
39
|
-
public getType(column: Model.AnyColumn): GraphQLScalarType | GraphQLEnumType {
|
|
41
|
+
public getType(column: Model.AnyColumn): [type: ColumnGraphQLType, baseType: GraphQLScalarType | GraphQLEnumType] {
|
|
42
|
+
const baseType = this.getBaseType(column)
|
|
43
|
+
return [
|
|
44
|
+
column.list ? new GraphQLList(new GraphQLNonNull(baseType)) : baseType,
|
|
45
|
+
baseType,
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private getBaseType(column: Model.AnyColumn): GraphQLScalarType | GraphQLEnumType {
|
|
40
50
|
if (column.typeAlias) {
|
|
41
51
|
if (column.type === Model.ColumnType.Enum) {
|
|
42
52
|
throw new Error('GraphQL type alias cannot be specified for enum type')
|
|
@@ -62,7 +72,7 @@ export class ColumnTypeResolver {
|
|
|
62
72
|
}
|
|
63
73
|
}
|
|
64
74
|
|
|
65
|
-
|
|
75
|
+
private getScalarType(type: ScalarType): GraphQLScalarType {
|
|
66
76
|
switch (type) {
|
|
67
77
|
case Model.ColumnType.Int:
|
|
68
78
|
return GraphQLInt
|
|
@@ -76,6 +86,8 @@ export class ColumnTypeResolver {
|
|
|
76
86
|
return GraphQLBoolean
|
|
77
87
|
case Model.ColumnType.DateTime:
|
|
78
88
|
return this.customTypeProvider.dateTimeType
|
|
89
|
+
case Model.ColumnType.Time:
|
|
90
|
+
return this.customTypeProvider.timeType
|
|
79
91
|
case Model.ColumnType.Date:
|
|
80
92
|
return this.customTypeProvider.dateType
|
|
81
93
|
case Model.ColumnType.Json:
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
GraphQLEnumType,
|
|
5
5
|
GraphQLInputFieldConfigMap,
|
|
6
6
|
GraphQLInputObjectType,
|
|
7
|
+
GraphQLInt,
|
|
7
8
|
GraphQLList,
|
|
8
9
|
GraphQLNonNull,
|
|
9
10
|
GraphQLScalarType,
|
|
@@ -12,24 +13,30 @@ import {
|
|
|
12
13
|
import { singletonFactory } from '../utils'
|
|
13
14
|
import { ColumnTypeResolver } from './ColumnTypeResolver'
|
|
14
15
|
import { GqlTypeName } from './utils'
|
|
16
|
+
import { ImplementationException } from '../exception'
|
|
15
17
|
|
|
16
18
|
export class ConditionTypeProvider {
|
|
17
|
-
private conditions = singletonFactory<GraphQLInputObjectType, string, GraphQLScalarType | GraphQLEnumType>(
|
|
18
|
-
(name, type) => this.createCondition(type),
|
|
19
|
+
private conditions = singletonFactory<GraphQLInputObjectType, string, [GraphQLScalarType | GraphQLEnumType, Model.AnyColumn]>(
|
|
20
|
+
(name, [type, column]) => this.createCondition(name, column, type),
|
|
19
21
|
)
|
|
20
22
|
|
|
21
23
|
constructor(private readonly columnTypeResolver: ColumnTypeResolver) {}
|
|
22
24
|
|
|
23
25
|
public getCondition(column: Model.AnyColumn): GraphQLInputObjectType {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
+
const [graphqlType, baseType] = this.columnTypeResolver.getType(column)
|
|
27
|
+
const name = this.createName(column, baseType.name)
|
|
28
|
+
return this.conditions(name, [baseType, column])
|
|
26
29
|
}
|
|
27
30
|
|
|
28
|
-
private
|
|
29
|
-
const suffix =
|
|
30
|
-
|
|
31
|
+
private createName(column: Model.AnyColumn, typeName: string): string {
|
|
32
|
+
const suffix = column.type === Model.ColumnType.Enum ? 'Enum' : ''
|
|
33
|
+
const arraySuffix = column.list ? 'List' : ''
|
|
34
|
+
return GqlTypeName`${typeName}${suffix}${arraySuffix}Condition`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private createCondition(name: string, column: Model.AnyColumn, type: GraphQLScalarType | GraphQLEnumType): GraphQLInputObjectType {
|
|
31
38
|
const condition: GraphQLInputObjectType = new GraphQLInputObjectType({
|
|
32
|
-
name:
|
|
39
|
+
name: name,
|
|
33
40
|
fields: (): GraphQLInputFieldConfigMap => {
|
|
34
41
|
const conditions: GraphQLInputFieldConfigMap = {
|
|
35
42
|
and: { type: new GraphQLList(new GraphQLNonNull(condition)) },
|
|
@@ -39,25 +46,33 @@ export class ConditionTypeProvider {
|
|
|
39
46
|
null: { type: GraphQLBoolean },
|
|
40
47
|
isNull: { type: GraphQLBoolean },
|
|
41
48
|
}
|
|
42
|
-
if (
|
|
43
|
-
conditions.
|
|
44
|
-
conditions.
|
|
45
|
-
conditions.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
if (column.list) {
|
|
50
|
+
conditions.minLength = { type: GraphQLInt }
|
|
51
|
+
conditions.maxLength = { type: GraphQLInt }
|
|
52
|
+
conditions.includes = { type: type }
|
|
53
|
+
} else {
|
|
54
|
+
if (column.type !== Model.ColumnType.Json) {
|
|
55
|
+
conditions.eq = { type }
|
|
56
|
+
conditions.notEq = { type }
|
|
57
|
+
conditions.in = { type: new GraphQLList(new GraphQLNonNull(type)) }
|
|
58
|
+
conditions.notIn = { type: new GraphQLList(new GraphQLNonNull(type)) }
|
|
59
|
+
conditions.lt = { type: type }
|
|
60
|
+
conditions.lte = { type: type }
|
|
61
|
+
conditions.gt = { type: type }
|
|
62
|
+
conditions.gte = { type: type }
|
|
63
|
+
}
|
|
64
|
+
if (column.type === Model.ColumnType.String) {
|
|
65
|
+
conditions.contains = { type: GraphQLString }
|
|
66
|
+
conditions.startsWith = { type: GraphQLString }
|
|
67
|
+
conditions.endsWith = { type: GraphQLString }
|
|
56
68
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
69
|
+
conditions.containsCI = { type: GraphQLString }
|
|
70
|
+
conditions.startsWithCI = { type: GraphQLString }
|
|
71
|
+
conditions.endsWithCI = { type: GraphQLString }
|
|
72
|
+
}
|
|
60
73
|
}
|
|
74
|
+
|
|
75
|
+
|
|
61
76
|
return conditions
|
|
62
77
|
},
|
|
63
78
|
})
|
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
import { GraphQLScalarType, Kind } from 'graphql'
|
|
2
2
|
import { JSONType, UuidType } from '@contember/graphql-utils'
|
|
3
3
|
|
|
4
|
+
const TIME_REGEX = /^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d)(?:\.(\d+))?)?$/
|
|
5
|
+
|
|
6
|
+
function validateTime(value: unknown): string {
|
|
7
|
+
if (typeof value !== 'string') {
|
|
8
|
+
throw new TypeError(`Time value must be a string, got: ${typeof value}`)
|
|
9
|
+
}
|
|
10
|
+
const match = TIME_REGEX.exec(value)
|
|
11
|
+
if (!match) {
|
|
12
|
+
throw new TypeError(`Value is not a valid time: ${value}`)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const hours = match[1]
|
|
16
|
+
const minutes = match[2]
|
|
17
|
+
const seconds = match[3] || '00'
|
|
18
|
+
const fraction = match[4] ? `.${match[4]}` : ''
|
|
19
|
+
|
|
20
|
+
return `${hours}:${minutes}:${seconds}${fraction}`
|
|
21
|
+
}
|
|
22
|
+
|
|
4
23
|
|
|
5
24
|
export class CustomTypesProvider {
|
|
6
25
|
public readonly uuidType: GraphQLScalarType = UuidType
|
|
7
26
|
|
|
8
27
|
//todo: implement serialize, parseValue and parseLiteral properly
|
|
28
|
+
|
|
9
29
|
public readonly dateType: GraphQLScalarType = new GraphQLScalarType({
|
|
10
30
|
name: 'Date',
|
|
11
31
|
serialize: str => String(str),
|
|
@@ -14,6 +34,23 @@ export class CustomTypesProvider {
|
|
|
14
34
|
return ast.kind === Kind.STRING ? ast.value : undefined
|
|
15
35
|
},
|
|
16
36
|
})
|
|
37
|
+
|
|
38
|
+
public readonly timeType: GraphQLScalarType = new GraphQLScalarType({
|
|
39
|
+
name: 'Time',
|
|
40
|
+
serialize(value) {
|
|
41
|
+
return validateTime(value)
|
|
42
|
+
},
|
|
43
|
+
parseValue(value) {
|
|
44
|
+
return validateTime(value)
|
|
45
|
+
},
|
|
46
|
+
parseLiteral(ast) {
|
|
47
|
+
if (ast.kind !== Kind.STRING) {
|
|
48
|
+
throw new TypeError(`Time scalar can only parse string values, got: ${ast.kind}`)
|
|
49
|
+
}
|
|
50
|
+
return validateTime(ast.value)
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
|
|
17
54
|
public readonly dateTimeType: GraphQLScalarType = new GraphQLScalarType({
|
|
18
55
|
name: 'DateTime',
|
|
19
56
|
serialize: str => String(str),
|
|
@@ -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: () => ({
|