@contember/engine-content-api 2.1.0-alpha.1 → 2.1.0-alpha.2

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.
Files changed (164) hide show
  1. package/dist/development/index.cjs +1 -0
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +1 -0
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/development/src/ExecutionContainer.cjs +5 -3
  6. package/dist/development/src/ExecutionContainer.cjs.map +1 -1
  7. package/dist/development/src/ExecutionContainer.js +5 -3
  8. package/dist/development/src/ExecutionContainer.js.map +1 -1
  9. package/dist/development/src/acl/Authorizator.cjs +5 -1
  10. package/dist/development/src/acl/Authorizator.cjs.map +1 -1
  11. package/dist/development/src/acl/Authorizator.js +5 -1
  12. package/dist/development/src/acl/Authorizator.js.map +1 -1
  13. package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
  14. package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
  15. package/dist/development/src/input-validation/dependencies/DependencyCollector.js +3 -0
  16. package/dist/development/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
  17. package/dist/development/src/mapper/Mapper.cjs +1 -0
  18. package/dist/development/src/mapper/Mapper.cjs.map +1 -1
  19. package/dist/development/src/mapper/Mapper.js +1 -0
  20. package/dist/development/src/mapper/Mapper.js.map +1 -1
  21. package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs +30 -3
  22. package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
  23. package/dist/development/src/mapper/select/handlers/FieldsVisitor.js +30 -3
  24. package/dist/development/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  25. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
  26. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
  27. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
  28. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  29. package/dist/development/src/resolvers/MutationResolver.cjs +1 -0
  30. package/dist/development/src/resolvers/MutationResolver.cjs.map +1 -1
  31. package/dist/development/src/resolvers/MutationResolver.js +1 -0
  32. package/dist/development/src/resolvers/MutationResolver.js.map +1 -1
  33. package/dist/development/src/resolvers/RefreshViewResolver.cjs +20 -0
  34. package/dist/development/src/resolvers/RefreshViewResolver.cjs.map +1 -0
  35. package/dist/development/src/resolvers/RefreshViewResolver.js +20 -0
  36. package/dist/development/src/resolvers/RefreshViewResolver.js.map +1 -0
  37. package/dist/development/src/schema/GraphQlSchemaBuilder.cjs +6 -1
  38. package/dist/development/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
  39. package/dist/development/src/schema/GraphQlSchemaBuilder.js +6 -1
  40. package/dist/development/src/schema/GraphQlSchemaBuilder.js.map +1 -1
  41. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
  42. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
  43. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
  44. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  45. package/dist/development/src/schema/RefreshViewMutationProvider.cjs +35 -0
  46. package/dist/development/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
  47. package/dist/development/src/schema/RefreshViewMutationProvider.js +35 -0
  48. package/dist/development/src/schema/RefreshViewMutationProvider.js.map +1 -0
  49. package/dist/development/src/utils/viewComputedId.cjs +16 -0
  50. package/dist/development/src/utils/viewComputedId.cjs.map +1 -0
  51. package/dist/development/src/utils/viewComputedId.js +16 -0
  52. package/dist/development/src/utils/viewComputedId.js.map +1 -0
  53. package/dist/production/index.cjs +1 -0
  54. package/dist/production/index.cjs.map +1 -1
  55. package/dist/production/index.js +1 -0
  56. package/dist/production/index.js.map +1 -1
  57. package/dist/production/src/ExecutionContainer.cjs +5 -3
  58. package/dist/production/src/ExecutionContainer.cjs.map +1 -1
  59. package/dist/production/src/ExecutionContainer.js +5 -3
  60. package/dist/production/src/ExecutionContainer.js.map +1 -1
  61. package/dist/production/src/acl/Authorizator.cjs +5 -1
  62. package/dist/production/src/acl/Authorizator.cjs.map +1 -1
  63. package/dist/production/src/acl/Authorizator.js +5 -1
  64. package/dist/production/src/acl/Authorizator.js.map +1 -1
  65. package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
  66. package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
  67. package/dist/production/src/input-validation/dependencies/DependencyCollector.js +3 -0
  68. package/dist/production/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
  69. package/dist/production/src/mapper/Mapper.cjs +1 -0
  70. package/dist/production/src/mapper/Mapper.cjs.map +1 -1
  71. package/dist/production/src/mapper/Mapper.js +1 -0
  72. package/dist/production/src/mapper/Mapper.js.map +1 -1
  73. package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs +30 -3
  74. package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
  75. package/dist/production/src/mapper/select/handlers/FieldsVisitor.js +30 -3
  76. package/dist/production/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  77. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
  78. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
  79. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
  80. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  81. package/dist/production/src/resolvers/MutationResolver.cjs +1 -0
  82. package/dist/production/src/resolvers/MutationResolver.cjs.map +1 -1
  83. package/dist/production/src/resolvers/MutationResolver.js +1 -0
  84. package/dist/production/src/resolvers/MutationResolver.js.map +1 -1
  85. package/dist/production/src/resolvers/RefreshViewResolver.cjs +20 -0
  86. package/dist/production/src/resolvers/RefreshViewResolver.cjs.map +1 -0
  87. package/dist/production/src/resolvers/RefreshViewResolver.js +20 -0
  88. package/dist/production/src/resolvers/RefreshViewResolver.js.map +1 -0
  89. package/dist/production/src/schema/GraphQlSchemaBuilder.cjs +6 -1
  90. package/dist/production/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
  91. package/dist/production/src/schema/GraphQlSchemaBuilder.js +6 -1
  92. package/dist/production/src/schema/GraphQlSchemaBuilder.js.map +1 -1
  93. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
  94. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
  95. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
  96. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  97. package/dist/production/src/schema/RefreshViewMutationProvider.cjs +35 -0
  98. package/dist/production/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
  99. package/dist/production/src/schema/RefreshViewMutationProvider.js +35 -0
  100. package/dist/production/src/schema/RefreshViewMutationProvider.js.map +1 -0
  101. package/dist/production/src/utils/viewComputedId.cjs +16 -0
  102. package/dist/production/src/utils/viewComputedId.cjs.map +1 -0
  103. package/dist/production/src/utils/viewComputedId.js +16 -0
  104. package/dist/production/src/utils/viewComputedId.js.map +1 -0
  105. package/dist/tests/cases/integration/graphQlRequests/validation/utils.d.ts.map +1 -1
  106. package/dist/tests/src/tags.d.ts.map +1 -1
  107. package/dist/tests/src/test.d.ts.map +1 -1
  108. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  109. package/dist/tests/src/testUuid.d.ts.map +1 -1
  110. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  111. package/dist/types/ExecutionContainer.d.ts +8 -2
  112. package/dist/types/ExecutionContainer.d.ts.map +1 -1
  113. package/dist/types/acl/Authorizator.d.ts +3 -1
  114. package/dist/types/acl/Authorizator.d.ts.map +1 -1
  115. package/dist/types/acl/VariableUtils.d.ts.map +1 -1
  116. package/dist/types/input-validation/ValidationContext.d.ts.map +1 -1
  117. package/dist/types/input-validation/ValidationEvaluation.d.ts.map +1 -1
  118. package/dist/types/input-validation/ValidationPath.d.ts.map +1 -1
  119. package/dist/types/introspection/introspection.schema.d.ts.map +1 -1
  120. package/dist/types/mapper/ColumnValue.d.ts.map +1 -1
  121. package/dist/types/mapper/ErrorUtils.d.ts.map +1 -1
  122. package/dist/types/mapper/EventManager.d.ts.map +1 -1
  123. package/dist/types/mapper/MutationProcessorHelper.d.ts.map +1 -1
  124. package/dist/types/mapper/Result.d.ts.map +1 -1
  125. package/dist/types/mapper/delete/helpers.d.ts.map +1 -1
  126. package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts +4 -1
  127. package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  128. package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts +5 -2
  129. package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  130. package/dist/types/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
  131. package/dist/types/mapper/select/optimizer/helpers.d.ts.map +1 -1
  132. package/dist/types/resolvers/ReadHelpers.d.ts.map +1 -1
  133. package/dist/types/resolvers/RefreshViewResolver.d.ts +11 -0
  134. package/dist/types/resolvers/RefreshViewResolver.d.ts.map +1 -0
  135. package/dist/types/schema/GraphQlSchemaBuilder.d.ts +3 -1
  136. package/dist/types/schema/GraphQlSchemaBuilder.d.ts.map +1 -1
  137. package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
  138. package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
  139. package/dist/types/schema/OperationExtension.d.ts.map +1 -1
  140. package/dist/types/schema/RefreshViewMutationProvider.d.ts +11 -0
  141. package/dist/types/schema/RefreshViewMutationProvider.d.ts.map +1 -0
  142. package/dist/types/schema/utils.d.ts.map +1 -1
  143. package/dist/types/tsconfig.tsbuildinfo +1 -1
  144. package/dist/types/utils/isIt.d.ts.map +1 -1
  145. package/dist/types/utils/paginationUtils.d.ts.map +1 -1
  146. package/dist/types/utils/promises.d.ts.map +1 -1
  147. package/dist/types/utils/singletonFactory.d.ts.map +1 -1
  148. package/dist/types/utils/strings.d.ts.map +1 -1
  149. package/dist/types/utils/tuple.d.ts.map +1 -1
  150. package/dist/types/utils/uniqueWhereFields.d.ts.map +1 -1
  151. package/dist/types/utils/viewComputedId.d.ts +2 -0
  152. package/dist/types/utils/viewComputedId.d.ts.map +1 -0
  153. package/package.json +11 -11
  154. package/src/ExecutionContainer.ts +8 -4
  155. package/src/acl/Authorizator.ts +5 -0
  156. package/src/mapper/select/handlers/FieldsVisitor.ts +33 -1
  157. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +6 -1
  158. package/src/resolvers/RefreshViewResolver.ts +23 -0
  159. package/src/schema/GraphQlSchemaBuilder.ts +8 -0
  160. package/src/schema/GraphQlSchemaBuilderFactory.ts +5 -2
  161. package/src/schema/RefreshViewMutationProvider.ts +40 -0
  162. package/src/utils/viewComputedId.ts +23 -0
  163. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +1 -1
  164. package/tests/src/test.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MutationResolver.cjs","sources":["../../../../../packages/engine-content-api/src/resolvers/MutationResolver.ts"],"sourcesContent":["import { Input, Model, Result, Value } from '@contember/schema'\nimport {\n\tAfterCommitEvent,\n\tBeforeCommitEvent,\n\tConstraintType,\n\tconvertError,\n\tgetInsertPrimary,\n\tInputErrorKind,\n\tMapper,\n\tMapperFactory,\n\tMutationResultHint,\n\tMutationResultList,\n\tMutationResultType,\n\ttryMutation,\n} from '../mapper'\nimport { ValidationResolver } from './ValidationResolver'\nimport { GraphQLResolveInfo } from 'graphql'\nimport { GraphQlQueryAstFactory } from './GraphQlQueryAstFactory'\nimport { ImplementationException } from '../exception'\nimport { DatabaseMetadata, retryTransaction } from '@contember/database'\nimport { Operation, readOperationMeta } from '../schema'\nimport { assertNever } from '../utils'\nimport { InputPreValidator } from '../input-validation'\nimport { ObjectNode } from '../inputProcessing'\nimport { executeReadOperations } from './ReadHelpers'\nimport { logger } from '@contember/logger'\n\ntype WithoutNode<T extends { node: any }> = Pick<T, Exclude<keyof T, 'node'>>\n\ntype TransactionOptions = {\n\tdeferForeignKeyConstraints?: boolean\n\tdeferUniqueConstraints?: boolean\n}\n\nexport class MutationResolver {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly mapperFactory: MapperFactory,\n\t\tprivate readonly inputValidator: InputPreValidator,\n\t\tprivate readonly graphqlQueryAstFactory: GraphQlQueryAstFactory,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t) {}\n\n\tpublic async resolveTransaction(info: GraphQLResolveInfo, options: TransactionOptions): Promise<Result.TransactionResult> {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn (\n\t\t\t\t(path.length === 1 && !['ok', 'validation', 'errorMessage', 'errors'].includes(node.name.value)) ||\n\t\t\t\t(path.length === 2 && node.name.value === 'node') ||\n\t\t\t\tpath.length > 2 ||\n\t\t\t\tpath.length === 0 ||\n\t\t\t\t(path.length > 1 && path[1] === 'query')\n\t\t\t)\n\t\t})\n\t\tconst fields = GraphQlQueryAstFactory.resolveObjectType(info.returnType).getFields()\n\n\t\tconst prefixErrors = <T extends { path: Result.PathFragment[]; paths?: Result.PathFragment[][] }>(\n\t\t\terrors: T[],\n\t\t\tfield: string,\n\t\t): T[] =>\n\t\t\terrors.map(it => ({\n\t\t\t\t...it,\n\t\t\t\tpath: [{ __typename: '_FieldPathFragment', field }, ...it.path],\n\t\t\t\tpaths: it.paths\n\t\t\t\t\t? (it.paths.length === 0 ? [[]] : it.paths)?.map(it => [{ __typename: '_FieldPathFragment', field }, ...it])\n\t\t\t\t\t: undefined,\n\t\t\t}))\n\n\t\treturn this.transaction(async mapper => {\n\t\t\tif (options?.deferForeignKeyConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring foreign constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('foreignKey')\n\t\t\t}\n\t\t\tif (options?.deferUniqueConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring unique constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('unique')\n\t\t\t}\n\t\t\tconst validationResult: Record<string, Result.MutationFieldResult> = {}\n\t\t\tconst validationErrors: Result.ValidationError[] = []\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === 'query' || field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\n\t\t\t\tconst result: Result.ValidationResult | null = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.validateCreate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.validateUpdate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.validateUpsert(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException(`Invalid OperationMeta: ${String(meta)}`)\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\t\t\t\tif (result !== null) {\n\t\t\t\t\tvalidationResult[field.alias] = {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\tvalidation: result,\n\t\t\t\t\t\terrors: [],\n\t\t\t\t\t\terrorMessage: this.stringifyValidationErrors(result.errors),\n\t\t\t\t\t\tnode: null,\n\t\t\t\t\t}\n\t\t\t\t\tvalidationErrors.push(...prefixErrors(result.errors, field.alias))\n\t\t\t\t} else {\n\t\t\t\t\tvalidationResult[field.alias] = { ok: false, errors: [], validation: { valid: true, errors: [] }, node: null }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (validationErrors.length) {\n\t\t\t\treturn {\n\t\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validationErrors),\n\t\t\t\t\terrors: [],\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t},\n\t\t\t\t\t...validationResult,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst trxResult: Record<string, any> = {}\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tif (field.name === 'query') {\n\t\t\t\t\ttrxResult[field.alias] = await executeReadOperations(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tGraphQlQueryAstFactory.resolveObjectType(fieldConfig.type).getFields(),\n\t\t\t\t\t\tmapper,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\t\t\t\tlogger.debug('MutationResolver: Resolving a field', { field: field.alias })\n\t\t\t\tconst result: {\n\t\t\t\t\tok: boolean\n\t\t\t\t\tvalidation?: Result.ValidationResult\n\t\t\t\t\terrors: Result.ExecutionError[]\n\t\t\t\t} = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.resolveCreateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.resolveUpdateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn this.resolveDeleteInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.resolveUpsertInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tlogger.debug('MutationResolver: Field evaluation failed', { result, field: field.alias })\n\t\t\t\t\tconst validationErrors = result.validation ? prefixErrors(result.validation.errors, field.alias) : []\n\t\t\t\t\tconst executionErrors = prefixErrors(result.errors, field.alias)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\terrors: executionErrors,\n\t\t\t\t\t\tvalidation: result.validation\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalid: result.validation.valid,\n\t\t\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t: { valid: true, errors: [] },\n\t\t\t\t\t\terrorMessage: [\n\t\t\t\t\t\t\tthis.stringifyValidationErrors(validationErrors),\n\t\t\t\t\t\t\tthis.stringifyExecutionErrors(executionErrors),\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(it => it !== undefined)\n\t\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t\t\t...validationResult,\n\t\t\t\t\t\t[field.alias]: result,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttrxResult[field.alias] = result\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\tok: true,\n\t\t\t\terrors: [],\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\t...trxResult,\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic async resolveUpdate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpdate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveUpdateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpdate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateUpdate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\twhere: input.by,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpdateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.update(entity, input.by, input.data, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveCreate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateCreate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveCreateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateCreate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateCreate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t\toverRelation: null,\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveCreateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.insert(entity, input.data)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tif (!primary) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveCreateInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, { [entity.primary]: primary }, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveUpsert(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpsert(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tvalidation,\n\t\t\t\t\terrors: [],\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validation.errors),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn await this.resolveUpsertInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpsert(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = [\n\t\t\t...(await this.inputValidator.validateCreate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.create,\n\t\t\t\tpath: [],\n\t\t\t\toverRelation: null,\n\t\t\t})),\n\t\t\t...(await this.inputValidator.validateUpdate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.update,\n\t\t\t\twhere: input.by,\n\t\t\t\tpath: [],\n\t\t\t})),\n\t\t]\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpsertInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.upsert(entity, input.by, input.update, input.create, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tconst byResolved = primary ? { [entity.primary]: primary } : input.by\n\t\tif (!byResolved) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveUpsertInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, byResolved, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveDelete(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\treturn await this.resolveDeleteInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async resolveDeleteInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.DeleteInput>,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst input = queryAst.args\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\n\t\tconst result = await mapper.delete(entity, queryAst.args.by, queryAst.args.filter)\n\t\tif (\n\t\t\tresult.length >= 1 &&\n\t\t\t(result[0].result === MutationResultType.ok || result[0].result === MutationResultType.nothingToDo)\n\t\t) {\n\t\t\treturn { ok: true, errors: [], ...nodes }\n\t\t} else {\n\t\t\tconst errors = this.convertResultToErrors(result)\n\t\t\treturn { ok: false, errors, errorMessage: this.stringifyExecutionErrors(errors) }\n\t\t}\n\t}\n\n\tprivate createQueryAst(info: GraphQLResolveInfo) {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn path.length !== 1 || node.name.value === 'node'\n\t\t})\n\t\treturn queryAst\n\t}\n\n\tprivate async resolveResultNodes(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere,\n\t\tqueryAst: ObjectNode,\n\t): Promise<Record<string, Value.Object>> {\n\t\tconst nodeQuery = queryAst.findFieldByName('node')\n\t\tlet nodes: Record<string, any> = {}\n\t\tfor (const singleNodeQuery of nodeQuery) {\n\t\t\tif (!(singleNodeQuery instanceof ObjectNode)) {\n\t\t\t\tthrow new Error('MutationResolver: expected ObjectNode')\n\t\t\t}\n\t\t\tconst objectWithArgs = singleNodeQuery.withArgs({ by: where })\n\t\t\tnodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs, [])\n\t\t}\n\t\treturn nodes\n\t}\n\n\tprivate async transaction<R extends { ok: boolean }>(\n\t\tcb: (mapper: Mapper) => Promise<R>,\n\t): Promise<R> {\n\t\treturn await retryTransaction(\n\t\t\tasync () => {\n\t\t\t\treturn await this.mapperFactory.transaction(async mapper => {\n\t\t\t\t\tlogger.debug('MutationResolver: Starting mutation transaction')\n\t\t\t\t\tconst result = await cb(mapper)\n\t\t\t\t\tif (!result.ok) {\n\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction failed, rolling back', { result })\n\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new BeforeCommitEvent())\n\t\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction ok, committing')\n\t\t\t\t\t\t\tawait mapper.db.connection.commit()\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new AfterCommitEvent())\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t\tconst err = convertError(this.schema, this.schemaDatabaseMetadata, e)\n\t\t\t\t\t\t\tconst errorResponse = this.createErrorResponse([err])\n\t\t\t\t\t\t\tif (!errorResponse) {\n\t\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { ...result, ...errorResponse }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t},\n\t\t\tmessage => logger.warn(message),\n\t\t\t{\n\t\t\t\tmaxAttempts: 15,\n\t\t\t\tminTimeout: 10,\n\t\t\t\tmaxTimeout: 1000,\n\t\t\t},\n\t\t)\n\n\t}\n\n\tprivate createErrorResponse(result: MutationResultList) {\n\t\tconst errors = this.convertResultToErrors(result)\n\t\tif (errors.length > 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\terrors,\n\t\t\t\terrorMessage: this.stringifyExecutionErrors(errors),\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate convertResultToErrors(result: MutationResultList): Result.ExecutionError[] {\n\t\tconst errors = result.filter(\n\t\t\tit =>\n\t\t\t\t![MutationResultType.ok, MutationResultType.nothingToDo, MutationResultType.validationError].includes(\n\t\t\t\t\tit.result,\n\t\t\t\t),\n\t\t)\n\n\t\tlet hasSqlError = false\n\t\tconst filteredErrors: MutationResultList = []\n\t\tfor (const error of errors) {\n\t\t\tif (error.hints.includes(MutationResultHint.subSequentSqlError) && hasSqlError) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (error.hints.includes(MutationResultHint.sqlError)) {\n\t\t\t\thasSqlError = true\n\t\t\t}\n\t\t\tfilteredErrors.push(error)\n\t\t}\n\n\t\treturn filteredErrors.map(it => {\n\t\t\tconst paths = it.paths.map(path =>\n\t\t\t\tpath.map(it => ({\n\t\t\t\t\t...it,\n\t\t\t\t\t__typename: 'field' in it ? '_FieldPathFragment' : '_IndexPathFragment',\n\t\t\t\t})),\n\t\t\t)\n\t\t\tconst path = paths[0] || []\n\t\t\tswitch (it.result) {\n\t\t\t\tcase MutationResultType.constraintViolationError:\n\t\t\t\t\tswitch (it.constraint) {\n\t\t\t\t\t\tcase ConstraintType.notNull:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotNullConstraintViolation, message: it.message }\n\t\t\t\t\t\tcase ConstraintType.foreignKey:\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\tpaths,\n\t\t\t\t\t\t\t\ttype: Result.ExecutionErrorType.ForeignKeyConstraintViolation,\n\t\t\t\t\t\t\t\tmessage: it.message,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tcase ConstraintType.uniqueKey:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.UniqueConstraintViolation, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.constraint)\n\t\t\t\t\t}\n\t\t\t\tcase MutationResultType.noResultError:\n\t\t\t\tcase MutationResultType.notFoundError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotFoundOrDenied, message: it.message }\n\t\t\t\tcase MutationResultType.inputError:\n\t\t\t\t\tswitch (it.kind) {\n\t\t\t\t\t\tcase InputErrorKind.nonUniqueWhere:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NonUniqueWhereInput, message: it.message }\n\t\t\t\t\t\tcase InputErrorKind.invalidData:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.InvalidDataInput, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.kind)\n\t\t\t\t\t}\n\n\t\t\t\tcase MutationResultType.sqlError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.SqlError, message: it.message }\n\t\t\t\tcase MutationResultType.ok:\n\t\t\t\tcase MutationResultType.nothingToDo:\n\t\t\t\t\tthrow new ImplementationException('MutationResolver: unexpected MutationResultType')\n\t\t\t\tdefault:\n\t\t\t\t\treturn assertNever(it)\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate stringifyValidationErrors(validationErrors: Result.ValidationError[]): string | undefined {\n\t\tif (validationErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Validation has failed:\\n' +\n\t\t\tvalidationErrors.map(it => `${this.stringifyPath(it.path)}: ${it.message.text}`).join('\\n')\n\t\t)\n\t}\n\n\tprivate stringifyExecutionErrors(executionErrors: Result.ExecutionError[]): string | undefined {\n\t\tif (executionErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Execution has failed:\\n' +\n\t\t\texecutionErrors.map(it => `${this.stringifyPath(it.paths[0] || [])}: ${it.type} (${it.message || ''})`)\n\t\t)\n\t}\n\n\tprivate stringifyPath(path: Result.PathFragment[]): string {\n\t\tif (path.length === 0) {\n\t\t\treturn 'unknown field'\n\t\t}\n\t\treturn path\n\t\t\t.map(it => {\n\t\t\t\tif ('field' in it) {\n\t\t\t\t\treturn it.field\n\t\t\t\t}\n\t\t\t\tif ('alias' in it && it.alias) {\n\t\t\t\t\treturn `${it.index}(${it.alias})`\n\t\t\t\t}\n\t\t\t\treturn it.index\n\t\t\t})\n\t\t\t.join('.')\n\t}\n}\n"],"names":["schema","GraphQlQueryAstFactory","it","logger","ObjectNode","ImplementationException","readOperationMeta","Operation","assertNever","executeReadOperations","validationErrors","ValidationResolver","getInsertPrimary","MutationResultType","retryTransaction","BeforeCommitEvent","AfterCommitEvent","convertError","MutationResultHint","path","ConstraintType","Result","InputErrorKind"],"mappings":"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"}
1
+ {"version":3,"file":"MutationResolver.cjs","sources":["../../../../../packages/engine-content-api/src/resolvers/MutationResolver.ts"],"sourcesContent":["import { Input, Model, Result, Value } from '@contember/schema'\nimport {\n\tAfterCommitEvent,\n\tBeforeCommitEvent,\n\tConstraintType,\n\tconvertError,\n\tgetInsertPrimary,\n\tInputErrorKind,\n\tMapper,\n\tMapperFactory,\n\tMutationResultHint,\n\tMutationResultList,\n\tMutationResultType,\n\ttryMutation,\n} from '../mapper'\nimport { ValidationResolver } from './ValidationResolver'\nimport { GraphQLResolveInfo } from 'graphql'\nimport { GraphQlQueryAstFactory } from './GraphQlQueryAstFactory'\nimport { ImplementationException } from '../exception'\nimport { DatabaseMetadata, retryTransaction } from '@contember/database'\nimport { Operation, readOperationMeta } from '../schema'\nimport { assertNever } from '../utils'\nimport { InputPreValidator } from '../input-validation'\nimport { ObjectNode } from '../inputProcessing'\nimport { executeReadOperations } from './ReadHelpers'\nimport { logger } from '@contember/logger'\n\ntype WithoutNode<T extends { node: any }> = Pick<T, Exclude<keyof T, 'node'>>\n\ntype TransactionOptions = {\n\tdeferForeignKeyConstraints?: boolean\n\tdeferUniqueConstraints?: boolean\n}\n\nexport class MutationResolver {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly mapperFactory: MapperFactory,\n\t\tprivate readonly inputValidator: InputPreValidator,\n\t\tprivate readonly graphqlQueryAstFactory: GraphQlQueryAstFactory,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t) {}\n\n\tpublic async resolveTransaction(info: GraphQLResolveInfo, options: TransactionOptions): Promise<Result.TransactionResult> {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn (\n\t\t\t\t(path.length === 1 && !['ok', 'validation', 'errorMessage', 'errors'].includes(node.name.value)) ||\n\t\t\t\t(path.length === 2 && node.name.value === 'node') ||\n\t\t\t\tpath.length > 2 ||\n\t\t\t\tpath.length === 0 ||\n\t\t\t\t(path.length > 1 && path[1] === 'query')\n\t\t\t)\n\t\t})\n\t\tconst fields = GraphQlQueryAstFactory.resolveObjectType(info.returnType).getFields()\n\n\t\tconst prefixErrors = <T extends { path: Result.PathFragment[]; paths?: Result.PathFragment[][] }>(\n\t\t\terrors: T[],\n\t\t\tfield: string,\n\t\t): T[] =>\n\t\t\terrors.map(it => ({\n\t\t\t\t...it,\n\t\t\t\tpath: [{ __typename: '_FieldPathFragment', field }, ...it.path],\n\t\t\t\tpaths: it.paths\n\t\t\t\t\t? (it.paths.length === 0 ? [[]] : it.paths)?.map(it => [{ __typename: '_FieldPathFragment', field }, ...it])\n\t\t\t\t\t: undefined,\n\t\t\t}))\n\n\t\treturn this.transaction(async mapper => {\n\t\t\tif (options?.deferForeignKeyConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring foreign constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('foreignKey')\n\t\t\t}\n\t\t\tif (options?.deferUniqueConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring unique constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('unique')\n\t\t\t}\n\t\t\tconst validationResult: Record<string, Result.MutationFieldResult> = {}\n\t\t\tconst validationErrors: Result.ValidationError[] = []\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === 'query' || field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\n\t\t\t\tconst result: Result.ValidationResult | null = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.validateCreate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.validateUpdate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.validateUpsert(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException(`Invalid OperationMeta: ${String(meta)}`)\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\t\t\t\tif (result !== null) {\n\t\t\t\t\tvalidationResult[field.alias] = {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\tvalidation: result,\n\t\t\t\t\t\terrors: [],\n\t\t\t\t\t\terrorMessage: this.stringifyValidationErrors(result.errors),\n\t\t\t\t\t\tnode: null,\n\t\t\t\t\t}\n\t\t\t\t\tvalidationErrors.push(...prefixErrors(result.errors, field.alias))\n\t\t\t\t} else {\n\t\t\t\t\tvalidationResult[field.alias] = { ok: false, errors: [], validation: { valid: true, errors: [] }, node: null }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (validationErrors.length) {\n\t\t\t\treturn {\n\t\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validationErrors),\n\t\t\t\t\terrors: [],\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t},\n\t\t\t\t\t...validationResult,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst trxResult: Record<string, any> = {}\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tif (field.name === 'query') {\n\t\t\t\t\ttrxResult[field.alias] = await executeReadOperations(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tGraphQlQueryAstFactory.resolveObjectType(fieldConfig.type).getFields(),\n\t\t\t\t\t\tmapper,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\t\t\t\tlogger.debug('MutationResolver: Resolving a field', { field: field.alias })\n\t\t\t\tconst result: {\n\t\t\t\t\tok: boolean\n\t\t\t\t\tvalidation?: Result.ValidationResult\n\t\t\t\t\terrors: Result.ExecutionError[]\n\t\t\t\t} = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.resolveCreateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.resolveUpdateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn this.resolveDeleteInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.resolveUpsertInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tlogger.debug('MutationResolver: Field evaluation failed', { result, field: field.alias })\n\t\t\t\t\tconst validationErrors = result.validation ? prefixErrors(result.validation.errors, field.alias) : []\n\t\t\t\t\tconst executionErrors = prefixErrors(result.errors, field.alias)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\terrors: executionErrors,\n\t\t\t\t\t\tvalidation: result.validation\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalid: result.validation.valid,\n\t\t\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t: { valid: true, errors: [] },\n\t\t\t\t\t\terrorMessage: [\n\t\t\t\t\t\t\tthis.stringifyValidationErrors(validationErrors),\n\t\t\t\t\t\t\tthis.stringifyExecutionErrors(executionErrors),\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(it => it !== undefined)\n\t\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t\t\t...validationResult,\n\t\t\t\t\t\t[field.alias]: result,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttrxResult[field.alias] = result\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\tok: true,\n\t\t\t\terrors: [],\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\t...trxResult,\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic async resolveUpdate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpdate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveUpdateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpdate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateUpdate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\twhere: input.by,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpdateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.update(entity, input.by, input.data, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveCreate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateCreate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveCreateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateCreate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateCreate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t\toverRelation: null,\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveCreateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.insert(entity, input.data)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tif (!primary) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveCreateInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, { [entity.primary]: primary }, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveUpsert(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpsert(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tvalidation,\n\t\t\t\t\terrors: [],\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validation.errors),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn await this.resolveUpsertInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpsert(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = [\n\t\t\t...(await this.inputValidator.validateCreate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.create,\n\t\t\t\tpath: [],\n\t\t\t\toverRelation: null,\n\t\t\t})),\n\t\t\t...(await this.inputValidator.validateUpdate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.update,\n\t\t\t\twhere: input.by,\n\t\t\t\tpath: [],\n\t\t\t})),\n\t\t]\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpsertInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.upsert(entity, input.by, input.update, input.create, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tconst byResolved = primary ? { [entity.primary]: primary } : input.by\n\t\tif (!byResolved) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveUpsertInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, byResolved, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveDelete(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\treturn await this.resolveDeleteInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async resolveDeleteInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.DeleteInput>,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst input = queryAst.args\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\n\t\tconst result = await mapper.delete(entity, queryAst.args.by, queryAst.args.filter)\n\t\tif (\n\t\t\tresult.length >= 1 &&\n\t\t\t(result[0].result === MutationResultType.ok || result[0].result === MutationResultType.nothingToDo)\n\t\t) {\n\t\t\treturn { ok: true, errors: [], ...nodes }\n\t\t} else {\n\t\t\tconst errors = this.convertResultToErrors(result)\n\t\t\treturn { ok: false, errors, errorMessage: this.stringifyExecutionErrors(errors) }\n\t\t}\n\t}\n\n\tprivate createQueryAst(info: GraphQLResolveInfo) {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn path.length !== 1 || node.name.value === 'node'\n\t\t})\n\t\treturn queryAst\n\t}\n\n\tprivate async resolveResultNodes(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere,\n\t\tqueryAst: ObjectNode,\n\t): Promise<Record<string, Value.Object>> {\n\t\tconst nodeQuery = queryAst.findFieldByName('node')\n\t\tlet nodes: Record<string, any> = {}\n\t\tfor (const singleNodeQuery of nodeQuery) {\n\t\t\tif (!(singleNodeQuery instanceof ObjectNode)) {\n\t\t\t\tthrow new Error('MutationResolver: expected ObjectNode')\n\t\t\t}\n\t\t\tconst objectWithArgs = singleNodeQuery.withArgs({ by: where })\n\t\t\tnodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs, [])\n\t\t}\n\t\treturn nodes\n\t}\n\n\tprivate async transaction<R extends { ok: boolean }>(\n\t\tcb: (mapper: Mapper) => Promise<R>,\n\t): Promise<R> {\n\t\treturn await retryTransaction(\n\t\t\tasync () => {\n\t\t\t\treturn await this.mapperFactory.transaction(async mapper => {\n\t\t\t\t\tlogger.debug('MutationResolver: Starting mutation transaction')\n\t\t\t\t\tconst result = await cb(mapper)\n\t\t\t\t\tif (!result.ok) {\n\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction failed, rolling back', { result })\n\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new BeforeCommitEvent())\n\t\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction ok, committing')\n\t\t\t\t\t\t\tawait mapper.db.connection.commit()\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new AfterCommitEvent())\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t\tconst err = convertError(this.schema, this.schemaDatabaseMetadata, e)\n\t\t\t\t\t\t\tconst errorResponse = this.createErrorResponse([err])\n\t\t\t\t\t\t\tif (!errorResponse) {\n\t\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { ...result, ...errorResponse }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t},\n\t\t\tmessage => logger.warn(message),\n\t\t\t{\n\t\t\t\tmaxAttempts: 15,\n\t\t\t\tminTimeout: 10,\n\t\t\t\tmaxTimeout: 1000,\n\t\t\t},\n\t\t)\n\n\t}\n\n\tprivate createErrorResponse(result: MutationResultList) {\n\t\tconst errors = this.convertResultToErrors(result)\n\t\tif (errors.length > 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\terrors,\n\t\t\t\terrorMessage: this.stringifyExecutionErrors(errors),\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate convertResultToErrors(result: MutationResultList): Result.ExecutionError[] {\n\t\tconst errors = result.filter(\n\t\t\tit =>\n\t\t\t\t![MutationResultType.ok, MutationResultType.nothingToDo, MutationResultType.validationError].includes(\n\t\t\t\t\tit.result,\n\t\t\t\t),\n\t\t)\n\n\t\tlet hasSqlError = false\n\t\tconst filteredErrors: MutationResultList = []\n\t\tfor (const error of errors) {\n\t\t\tif (error.hints.includes(MutationResultHint.subSequentSqlError) && hasSqlError) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (error.hints.includes(MutationResultHint.sqlError)) {\n\t\t\t\thasSqlError = true\n\t\t\t}\n\t\t\tfilteredErrors.push(error)\n\t\t}\n\n\t\treturn filteredErrors.map(it => {\n\t\t\tconst paths = it.paths.map(path =>\n\t\t\t\tpath.map(it => ({\n\t\t\t\t\t...it,\n\t\t\t\t\t__typename: 'field' in it ? '_FieldPathFragment' : '_IndexPathFragment',\n\t\t\t\t})),\n\t\t\t)\n\t\t\tconst path = paths[0] || []\n\t\t\tswitch (it.result) {\n\t\t\t\tcase MutationResultType.constraintViolationError:\n\t\t\t\t\tswitch (it.constraint) {\n\t\t\t\t\t\tcase ConstraintType.notNull:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotNullConstraintViolation, message: it.message }\n\t\t\t\t\t\tcase ConstraintType.foreignKey:\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\tpaths,\n\t\t\t\t\t\t\t\ttype: Result.ExecutionErrorType.ForeignKeyConstraintViolation,\n\t\t\t\t\t\t\t\tmessage: it.message,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tcase ConstraintType.uniqueKey:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.UniqueConstraintViolation, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.constraint)\n\t\t\t\t\t}\n\t\t\t\tcase MutationResultType.noResultError:\n\t\t\t\tcase MutationResultType.notFoundError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotFoundOrDenied, message: it.message }\n\t\t\t\tcase MutationResultType.inputError:\n\t\t\t\t\tswitch (it.kind) {\n\t\t\t\t\t\tcase InputErrorKind.nonUniqueWhere:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NonUniqueWhereInput, message: it.message }\n\t\t\t\t\t\tcase InputErrorKind.invalidData:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.InvalidDataInput, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.kind)\n\t\t\t\t\t}\n\n\t\t\t\tcase MutationResultType.sqlError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.SqlError, message: it.message }\n\t\t\t\tcase MutationResultType.ok:\n\t\t\t\tcase MutationResultType.nothingToDo:\n\t\t\t\t\tthrow new ImplementationException('MutationResolver: unexpected MutationResultType')\n\t\t\t\tdefault:\n\t\t\t\t\treturn assertNever(it)\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate stringifyValidationErrors(validationErrors: Result.ValidationError[]): string | undefined {\n\t\tif (validationErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Validation has failed:\\n' +\n\t\t\tvalidationErrors.map(it => `${this.stringifyPath(it.path)}: ${it.message.text}`).join('\\n')\n\t\t)\n\t}\n\n\tprivate stringifyExecutionErrors(executionErrors: Result.ExecutionError[]): string | undefined {\n\t\tif (executionErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Execution has failed:\\n' +\n\t\t\texecutionErrors.map(it => `${this.stringifyPath(it.paths[0] || [])}: ${it.type} (${it.message || ''})`)\n\t\t)\n\t}\n\n\tprivate stringifyPath(path: Result.PathFragment[]): string {\n\t\tif (path.length === 0) {\n\t\t\treturn 'unknown field'\n\t\t}\n\t\treturn path\n\t\t\t.map(it => {\n\t\t\t\tif ('field' in it) {\n\t\t\t\t\treturn it.field\n\t\t\t\t}\n\t\t\t\tif ('alias' in it && it.alias) {\n\t\t\t\t\treturn `${it.index}(${it.alias})`\n\t\t\t\t}\n\t\t\t\treturn it.index\n\t\t\t})\n\t\t\t.join('.')\n\t}\n}\n"],"names":["schema","GraphQlQueryAstFactory","it","logger","ObjectNode","ImplementationException","readOperationMeta","Operation","assertNever","executeReadOperations","validationErrors","ValidationResolver","getInsertPrimary","MutationResultType","retryTransaction","BeforeCommitEvent","AfterCommitEvent","convertError","MutationResultHint","path","ConstraintType","Result","InputErrorKind"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { retryTransaction } from "@contember/database";
6
6
  import { getInsertPrimary, MutationResultType, MutationResultHint, InputErrorKind, ConstraintType } from "../mapper/Result.js";
7
7
  import { BeforeCommitEvent, AfterCommitEvent } from "../mapper/EventManager.js";
8
8
  import { ObjectNode } from "../inputProcessing/ObjectNode.js";
9
+ import "node:crypto";
9
10
  import { logger } from "@contember/logger";
10
11
  import { convertError } from "../mapper/ErrorUtils.js";
11
12
  import "fast-deep-equal";
@@ -1 +1 @@
1
- {"version":3,"file":"MutationResolver.js","sources":["../../../../../packages/engine-content-api/src/resolvers/MutationResolver.ts"],"sourcesContent":["import { Input, Model, Result, Value } from '@contember/schema'\nimport {\n\tAfterCommitEvent,\n\tBeforeCommitEvent,\n\tConstraintType,\n\tconvertError,\n\tgetInsertPrimary,\n\tInputErrorKind,\n\tMapper,\n\tMapperFactory,\n\tMutationResultHint,\n\tMutationResultList,\n\tMutationResultType,\n\ttryMutation,\n} from '../mapper'\nimport { ValidationResolver } from './ValidationResolver'\nimport { GraphQLResolveInfo } from 'graphql'\nimport { GraphQlQueryAstFactory } from './GraphQlQueryAstFactory'\nimport { ImplementationException } from '../exception'\nimport { DatabaseMetadata, retryTransaction } from '@contember/database'\nimport { Operation, readOperationMeta } from '../schema'\nimport { assertNever } from '../utils'\nimport { InputPreValidator } from '../input-validation'\nimport { ObjectNode } from '../inputProcessing'\nimport { executeReadOperations } from './ReadHelpers'\nimport { logger } from '@contember/logger'\n\ntype WithoutNode<T extends { node: any }> = Pick<T, Exclude<keyof T, 'node'>>\n\ntype TransactionOptions = {\n\tdeferForeignKeyConstraints?: boolean\n\tdeferUniqueConstraints?: boolean\n}\n\nexport class MutationResolver {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly mapperFactory: MapperFactory,\n\t\tprivate readonly inputValidator: InputPreValidator,\n\t\tprivate readonly graphqlQueryAstFactory: GraphQlQueryAstFactory,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t) {}\n\n\tpublic async resolveTransaction(info: GraphQLResolveInfo, options: TransactionOptions): Promise<Result.TransactionResult> {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn (\n\t\t\t\t(path.length === 1 && !['ok', 'validation', 'errorMessage', 'errors'].includes(node.name.value)) ||\n\t\t\t\t(path.length === 2 && node.name.value === 'node') ||\n\t\t\t\tpath.length > 2 ||\n\t\t\t\tpath.length === 0 ||\n\t\t\t\t(path.length > 1 && path[1] === 'query')\n\t\t\t)\n\t\t})\n\t\tconst fields = GraphQlQueryAstFactory.resolveObjectType(info.returnType).getFields()\n\n\t\tconst prefixErrors = <T extends { path: Result.PathFragment[]; paths?: Result.PathFragment[][] }>(\n\t\t\terrors: T[],\n\t\t\tfield: string,\n\t\t): T[] =>\n\t\t\terrors.map(it => ({\n\t\t\t\t...it,\n\t\t\t\tpath: [{ __typename: '_FieldPathFragment', field }, ...it.path],\n\t\t\t\tpaths: it.paths\n\t\t\t\t\t? (it.paths.length === 0 ? [[]] : it.paths)?.map(it => [{ __typename: '_FieldPathFragment', field }, ...it])\n\t\t\t\t\t: undefined,\n\t\t\t}))\n\n\t\treturn this.transaction(async mapper => {\n\t\t\tif (options?.deferForeignKeyConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring foreign constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('foreignKey')\n\t\t\t}\n\t\t\tif (options?.deferUniqueConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring unique constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('unique')\n\t\t\t}\n\t\t\tconst validationResult: Record<string, Result.MutationFieldResult> = {}\n\t\t\tconst validationErrors: Result.ValidationError[] = []\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === 'query' || field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\n\t\t\t\tconst result: Result.ValidationResult | null = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.validateCreate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.validateUpdate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.validateUpsert(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException(`Invalid OperationMeta: ${String(meta)}`)\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\t\t\t\tif (result !== null) {\n\t\t\t\t\tvalidationResult[field.alias] = {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\tvalidation: result,\n\t\t\t\t\t\terrors: [],\n\t\t\t\t\t\terrorMessage: this.stringifyValidationErrors(result.errors),\n\t\t\t\t\t\tnode: null,\n\t\t\t\t\t}\n\t\t\t\t\tvalidationErrors.push(...prefixErrors(result.errors, field.alias))\n\t\t\t\t} else {\n\t\t\t\t\tvalidationResult[field.alias] = { ok: false, errors: [], validation: { valid: true, errors: [] }, node: null }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (validationErrors.length) {\n\t\t\t\treturn {\n\t\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validationErrors),\n\t\t\t\t\terrors: [],\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t},\n\t\t\t\t\t...validationResult,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst trxResult: Record<string, any> = {}\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tif (field.name === 'query') {\n\t\t\t\t\ttrxResult[field.alias] = await executeReadOperations(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tGraphQlQueryAstFactory.resolveObjectType(fieldConfig.type).getFields(),\n\t\t\t\t\t\tmapper,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\t\t\t\tlogger.debug('MutationResolver: Resolving a field', { field: field.alias })\n\t\t\t\tconst result: {\n\t\t\t\t\tok: boolean\n\t\t\t\t\tvalidation?: Result.ValidationResult\n\t\t\t\t\terrors: Result.ExecutionError[]\n\t\t\t\t} = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.resolveCreateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.resolveUpdateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn this.resolveDeleteInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.resolveUpsertInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tlogger.debug('MutationResolver: Field evaluation failed', { result, field: field.alias })\n\t\t\t\t\tconst validationErrors = result.validation ? prefixErrors(result.validation.errors, field.alias) : []\n\t\t\t\t\tconst executionErrors = prefixErrors(result.errors, field.alias)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\terrors: executionErrors,\n\t\t\t\t\t\tvalidation: result.validation\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalid: result.validation.valid,\n\t\t\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t: { valid: true, errors: [] },\n\t\t\t\t\t\terrorMessage: [\n\t\t\t\t\t\t\tthis.stringifyValidationErrors(validationErrors),\n\t\t\t\t\t\t\tthis.stringifyExecutionErrors(executionErrors),\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(it => it !== undefined)\n\t\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t\t\t...validationResult,\n\t\t\t\t\t\t[field.alias]: result,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttrxResult[field.alias] = result\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\tok: true,\n\t\t\t\terrors: [],\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\t...trxResult,\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic async resolveUpdate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpdate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveUpdateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpdate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateUpdate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\twhere: input.by,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpdateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.update(entity, input.by, input.data, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveCreate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateCreate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveCreateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateCreate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateCreate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t\toverRelation: null,\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveCreateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.insert(entity, input.data)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tif (!primary) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveCreateInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, { [entity.primary]: primary }, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveUpsert(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpsert(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tvalidation,\n\t\t\t\t\terrors: [],\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validation.errors),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn await this.resolveUpsertInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpsert(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = [\n\t\t\t...(await this.inputValidator.validateCreate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.create,\n\t\t\t\tpath: [],\n\t\t\t\toverRelation: null,\n\t\t\t})),\n\t\t\t...(await this.inputValidator.validateUpdate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.update,\n\t\t\t\twhere: input.by,\n\t\t\t\tpath: [],\n\t\t\t})),\n\t\t]\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpsertInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.upsert(entity, input.by, input.update, input.create, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tconst byResolved = primary ? { [entity.primary]: primary } : input.by\n\t\tif (!byResolved) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveUpsertInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, byResolved, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveDelete(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\treturn await this.resolveDeleteInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async resolveDeleteInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.DeleteInput>,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst input = queryAst.args\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\n\t\tconst result = await mapper.delete(entity, queryAst.args.by, queryAst.args.filter)\n\t\tif (\n\t\t\tresult.length >= 1 &&\n\t\t\t(result[0].result === MutationResultType.ok || result[0].result === MutationResultType.nothingToDo)\n\t\t) {\n\t\t\treturn { ok: true, errors: [], ...nodes }\n\t\t} else {\n\t\t\tconst errors = this.convertResultToErrors(result)\n\t\t\treturn { ok: false, errors, errorMessage: this.stringifyExecutionErrors(errors) }\n\t\t}\n\t}\n\n\tprivate createQueryAst(info: GraphQLResolveInfo) {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn path.length !== 1 || node.name.value === 'node'\n\t\t})\n\t\treturn queryAst\n\t}\n\n\tprivate async resolveResultNodes(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere,\n\t\tqueryAst: ObjectNode,\n\t): Promise<Record<string, Value.Object>> {\n\t\tconst nodeQuery = queryAst.findFieldByName('node')\n\t\tlet nodes: Record<string, any> = {}\n\t\tfor (const singleNodeQuery of nodeQuery) {\n\t\t\tif (!(singleNodeQuery instanceof ObjectNode)) {\n\t\t\t\tthrow new Error('MutationResolver: expected ObjectNode')\n\t\t\t}\n\t\t\tconst objectWithArgs = singleNodeQuery.withArgs({ by: where })\n\t\t\tnodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs, [])\n\t\t}\n\t\treturn nodes\n\t}\n\n\tprivate async transaction<R extends { ok: boolean }>(\n\t\tcb: (mapper: Mapper) => Promise<R>,\n\t): Promise<R> {\n\t\treturn await retryTransaction(\n\t\t\tasync () => {\n\t\t\t\treturn await this.mapperFactory.transaction(async mapper => {\n\t\t\t\t\tlogger.debug('MutationResolver: Starting mutation transaction')\n\t\t\t\t\tconst result = await cb(mapper)\n\t\t\t\t\tif (!result.ok) {\n\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction failed, rolling back', { result })\n\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new BeforeCommitEvent())\n\t\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction ok, committing')\n\t\t\t\t\t\t\tawait mapper.db.connection.commit()\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new AfterCommitEvent())\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t\tconst err = convertError(this.schema, this.schemaDatabaseMetadata, e)\n\t\t\t\t\t\t\tconst errorResponse = this.createErrorResponse([err])\n\t\t\t\t\t\t\tif (!errorResponse) {\n\t\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { ...result, ...errorResponse }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t},\n\t\t\tmessage => logger.warn(message),\n\t\t\t{\n\t\t\t\tmaxAttempts: 15,\n\t\t\t\tminTimeout: 10,\n\t\t\t\tmaxTimeout: 1000,\n\t\t\t},\n\t\t)\n\n\t}\n\n\tprivate createErrorResponse(result: MutationResultList) {\n\t\tconst errors = this.convertResultToErrors(result)\n\t\tif (errors.length > 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\terrors,\n\t\t\t\terrorMessage: this.stringifyExecutionErrors(errors),\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate convertResultToErrors(result: MutationResultList): Result.ExecutionError[] {\n\t\tconst errors = result.filter(\n\t\t\tit =>\n\t\t\t\t![MutationResultType.ok, MutationResultType.nothingToDo, MutationResultType.validationError].includes(\n\t\t\t\t\tit.result,\n\t\t\t\t),\n\t\t)\n\n\t\tlet hasSqlError = false\n\t\tconst filteredErrors: MutationResultList = []\n\t\tfor (const error of errors) {\n\t\t\tif (error.hints.includes(MutationResultHint.subSequentSqlError) && hasSqlError) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (error.hints.includes(MutationResultHint.sqlError)) {\n\t\t\t\thasSqlError = true\n\t\t\t}\n\t\t\tfilteredErrors.push(error)\n\t\t}\n\n\t\treturn filteredErrors.map(it => {\n\t\t\tconst paths = it.paths.map(path =>\n\t\t\t\tpath.map(it => ({\n\t\t\t\t\t...it,\n\t\t\t\t\t__typename: 'field' in it ? '_FieldPathFragment' : '_IndexPathFragment',\n\t\t\t\t})),\n\t\t\t)\n\t\t\tconst path = paths[0] || []\n\t\t\tswitch (it.result) {\n\t\t\t\tcase MutationResultType.constraintViolationError:\n\t\t\t\t\tswitch (it.constraint) {\n\t\t\t\t\t\tcase ConstraintType.notNull:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotNullConstraintViolation, message: it.message }\n\t\t\t\t\t\tcase ConstraintType.foreignKey:\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\tpaths,\n\t\t\t\t\t\t\t\ttype: Result.ExecutionErrorType.ForeignKeyConstraintViolation,\n\t\t\t\t\t\t\t\tmessage: it.message,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tcase ConstraintType.uniqueKey:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.UniqueConstraintViolation, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.constraint)\n\t\t\t\t\t}\n\t\t\t\tcase MutationResultType.noResultError:\n\t\t\t\tcase MutationResultType.notFoundError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotFoundOrDenied, message: it.message }\n\t\t\t\tcase MutationResultType.inputError:\n\t\t\t\t\tswitch (it.kind) {\n\t\t\t\t\t\tcase InputErrorKind.nonUniqueWhere:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NonUniqueWhereInput, message: it.message }\n\t\t\t\t\t\tcase InputErrorKind.invalidData:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.InvalidDataInput, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.kind)\n\t\t\t\t\t}\n\n\t\t\t\tcase MutationResultType.sqlError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.SqlError, message: it.message }\n\t\t\t\tcase MutationResultType.ok:\n\t\t\t\tcase MutationResultType.nothingToDo:\n\t\t\t\t\tthrow new ImplementationException('MutationResolver: unexpected MutationResultType')\n\t\t\t\tdefault:\n\t\t\t\t\treturn assertNever(it)\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate stringifyValidationErrors(validationErrors: Result.ValidationError[]): string | undefined {\n\t\tif (validationErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Validation has failed:\\n' +\n\t\t\tvalidationErrors.map(it => `${this.stringifyPath(it.path)}: ${it.message.text}`).join('\\n')\n\t\t)\n\t}\n\n\tprivate stringifyExecutionErrors(executionErrors: Result.ExecutionError[]): string | undefined {\n\t\tif (executionErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Execution has failed:\\n' +\n\t\t\texecutionErrors.map(it => `${this.stringifyPath(it.paths[0] || [])}: ${it.type} (${it.message || ''})`)\n\t\t)\n\t}\n\n\tprivate stringifyPath(path: Result.PathFragment[]): string {\n\t\tif (path.length === 0) {\n\t\t\treturn 'unknown field'\n\t\t}\n\t\treturn path\n\t\t\t.map(it => {\n\t\t\t\tif ('field' in it) {\n\t\t\t\t\treturn it.field\n\t\t\t\t}\n\t\t\t\tif ('alias' in it && it.alias) {\n\t\t\t\t\treturn `${it.index}(${it.alias})`\n\t\t\t\t}\n\t\t\t\treturn it.index\n\t\t\t})\n\t\t\t.join('.')\n\t}\n}\n"],"names":["it","validationErrors","path"],"mappings":"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"}
1
+ {"version":3,"file":"MutationResolver.js","sources":["../../../../../packages/engine-content-api/src/resolvers/MutationResolver.ts"],"sourcesContent":["import { Input, Model, Result, Value } from '@contember/schema'\nimport {\n\tAfterCommitEvent,\n\tBeforeCommitEvent,\n\tConstraintType,\n\tconvertError,\n\tgetInsertPrimary,\n\tInputErrorKind,\n\tMapper,\n\tMapperFactory,\n\tMutationResultHint,\n\tMutationResultList,\n\tMutationResultType,\n\ttryMutation,\n} from '../mapper'\nimport { ValidationResolver } from './ValidationResolver'\nimport { GraphQLResolveInfo } from 'graphql'\nimport { GraphQlQueryAstFactory } from './GraphQlQueryAstFactory'\nimport { ImplementationException } from '../exception'\nimport { DatabaseMetadata, retryTransaction } from '@contember/database'\nimport { Operation, readOperationMeta } from '../schema'\nimport { assertNever } from '../utils'\nimport { InputPreValidator } from '../input-validation'\nimport { ObjectNode } from '../inputProcessing'\nimport { executeReadOperations } from './ReadHelpers'\nimport { logger } from '@contember/logger'\n\ntype WithoutNode<T extends { node: any }> = Pick<T, Exclude<keyof T, 'node'>>\n\ntype TransactionOptions = {\n\tdeferForeignKeyConstraints?: boolean\n\tdeferUniqueConstraints?: boolean\n}\n\nexport class MutationResolver {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly mapperFactory: MapperFactory,\n\t\tprivate readonly inputValidator: InputPreValidator,\n\t\tprivate readonly graphqlQueryAstFactory: GraphQlQueryAstFactory,\n\t\tprivate readonly schemaDatabaseMetadata: DatabaseMetadata,\n\t) {}\n\n\tpublic async resolveTransaction(info: GraphQLResolveInfo, options: TransactionOptions): Promise<Result.TransactionResult> {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn (\n\t\t\t\t(path.length === 1 && !['ok', 'validation', 'errorMessage', 'errors'].includes(node.name.value)) ||\n\t\t\t\t(path.length === 2 && node.name.value === 'node') ||\n\t\t\t\tpath.length > 2 ||\n\t\t\t\tpath.length === 0 ||\n\t\t\t\t(path.length > 1 && path[1] === 'query')\n\t\t\t)\n\t\t})\n\t\tconst fields = GraphQlQueryAstFactory.resolveObjectType(info.returnType).getFields()\n\n\t\tconst prefixErrors = <T extends { path: Result.PathFragment[]; paths?: Result.PathFragment[][] }>(\n\t\t\terrors: T[],\n\t\t\tfield: string,\n\t\t): T[] =>\n\t\t\terrors.map(it => ({\n\t\t\t\t...it,\n\t\t\t\tpath: [{ __typename: '_FieldPathFragment', field }, ...it.path],\n\t\t\t\tpaths: it.paths\n\t\t\t\t\t? (it.paths.length === 0 ? [[]] : it.paths)?.map(it => [{ __typename: '_FieldPathFragment', field }, ...it])\n\t\t\t\t\t: undefined,\n\t\t\t}))\n\n\t\treturn this.transaction(async mapper => {\n\t\t\tif (options?.deferForeignKeyConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring foreign constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('foreignKey')\n\t\t\t}\n\t\t\tif (options?.deferUniqueConstraints) {\n\t\t\t\tlogger.debug('MutationResolver: deferring unique constraints')\n\t\t\t\tawait mapper.constraintHelper.setConstraintsDeferred('unique')\n\t\t\t}\n\t\t\tconst validationResult: Record<string, Result.MutationFieldResult> = {}\n\t\t\tconst validationErrors: Result.ValidationError[] = []\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === 'query' || field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\n\t\t\t\tconst result: Result.ValidationResult | null = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.validateCreate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.validateUpdate(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.validateUpsert(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException(`Invalid OperationMeta: ${String(meta)}`)\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\t\t\t\tif (result !== null) {\n\t\t\t\t\tvalidationResult[field.alias] = {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\tvalidation: result,\n\t\t\t\t\t\terrors: [],\n\t\t\t\t\t\terrorMessage: this.stringifyValidationErrors(result.errors),\n\t\t\t\t\t\tnode: null,\n\t\t\t\t\t}\n\t\t\t\t\tvalidationErrors.push(...prefixErrors(result.errors, field.alias))\n\t\t\t\t} else {\n\t\t\t\t\tvalidationResult[field.alias] = { ok: false, errors: [], validation: { valid: true, errors: [] }, node: null }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (validationErrors.length) {\n\t\t\t\treturn {\n\t\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\t\tok: false,\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validationErrors),\n\t\t\t\t\terrors: [],\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t},\n\t\t\t\t\t...validationResult,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst trxResult: Record<string, any> = {}\n\t\t\tfor (const field of queryAst.fields) {\n\t\t\t\tif (field.name === '__typename') {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (!(field instanceof ObjectNode)) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst fieldConfig = fields[field.name]\n\t\t\t\tif (!fieldConfig) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tif (field.name === 'query') {\n\t\t\t\t\ttrxResult[field.alias] = await executeReadOperations(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tGraphQlQueryAstFactory.resolveObjectType(fieldConfig.type).getFields(),\n\t\t\t\t\t\tmapper,\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tconst meta = readOperationMeta(fieldConfig.extensions)\n\t\t\t\tlogger.debug('MutationResolver: Resolving a field', { field: field.alias })\n\t\t\t\tconst result: {\n\t\t\t\t\tok: boolean\n\t\t\t\t\tvalidation?: Result.ValidationResult\n\t\t\t\t\terrors: Result.ExecutionError[]\n\t\t\t\t} = await (() => {\n\t\t\t\t\tswitch (meta.operation) {\n\t\t\t\t\t\tcase Operation.create:\n\t\t\t\t\t\t\treturn this.resolveCreateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.update:\n\t\t\t\t\t\t\treturn this.resolveUpdateInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.delete:\n\t\t\t\t\t\t\treturn this.resolveDeleteInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.upsert:\n\t\t\t\t\t\t\treturn this.resolveUpsertInternal(mapper, meta.entity, field)\n\t\t\t\t\t\tcase Operation.get:\n\t\t\t\t\t\tcase Operation.paginate:\n\t\t\t\t\t\tcase Operation.list:\n\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t}\n\t\t\t\t\treturn assertNever(meta.operation)\n\t\t\t\t})()\n\n\t\t\t\tif (!result.ok) {\n\t\t\t\t\tlogger.debug('MutationResolver: Field evaluation failed', { result, field: field.alias })\n\t\t\t\t\tconst validationErrors = result.validation ? prefixErrors(result.validation.errors, field.alias) : []\n\t\t\t\t\tconst executionErrors = prefixErrors(result.errors, field.alias)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\terrors: executionErrors,\n\t\t\t\t\t\tvalidation: result.validation\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tvalid: result.validation.valid,\n\t\t\t\t\t\t\t\terrors: validationErrors,\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t\t: { valid: true, errors: [] },\n\t\t\t\t\t\terrorMessage: [\n\t\t\t\t\t\t\tthis.stringifyValidationErrors(validationErrors),\n\t\t\t\t\t\t\tthis.stringifyExecutionErrors(executionErrors),\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t.filter(it => it !== undefined)\n\t\t\t\t\t\t\t.join('\\n'),\n\t\t\t\t\t\t...validationResult,\n\t\t\t\t\t\t[field.alias]: result,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttrxResult[field.alias] = result\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t__typename: 'MutationTransaction',\n\t\t\t\tok: true,\n\t\t\t\terrors: [],\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\t...trxResult,\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic async resolveUpdate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpdate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveUpdateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpdate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateUpdate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\twhere: input.by,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpdateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpdateInput>,\n\t): Promise<WithoutNode<Result.UpdateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.update(entity, input.by, input.data, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveCreate(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateCreate(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn { ok: false, validation, errors: [], errorMessage: this.stringifyValidationErrors(validation.errors) }\n\t\t\t}\n\t\t\treturn await this.resolveCreateInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateCreate(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = await this.inputValidator.validateCreate({\n\t\t\tmapper,\n\t\t\tentity,\n\t\t\tdata: input.data,\n\t\t\tpath: [],\n\t\t\toverRelation: null,\n\t\t})\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveCreateInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.CreateInput>,\n\t): Promise<WithoutNode<Result.CreateResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.insert(entity, input.data)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tif (!primary) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveCreateInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, { [entity.primary]: primary }, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveUpsert(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\tconst validation = await this.validateUpsert(mapper, entity, queryAst)\n\t\t\tif (validation !== null) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tvalidation,\n\t\t\t\t\terrors: [],\n\t\t\t\t\terrorMessage: this.stringifyValidationErrors(validation.errors),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn await this.resolveUpsertInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async validateUpsert(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<Result.ValidationResult | null> {\n\t\tconst input = queryAst.args\n\t\tconst validationResult = [\n\t\t\t...(await this.inputValidator.validateCreate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.create,\n\t\t\t\tpath: [],\n\t\t\t\toverRelation: null,\n\t\t\t})),\n\t\t\t...(await this.inputValidator.validateUpdate({\n\t\t\t\tmapper,\n\t\t\t\tentity,\n\t\t\t\tdata: input.update,\n\t\t\t\twhere: input.by,\n\t\t\t\tpath: [],\n\t\t\t})),\n\t\t]\n\t\tif (validationResult.length > 0) {\n\t\t\treturn ValidationResolver.createValidationResponse(validationResult)\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate async resolveUpsertInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.UpsertInput>,\n\t): Promise<WithoutNode<Result.UpsertResult>> {\n\t\tconst input = queryAst.args\n\t\tconst result = await mapper.upsert(entity, input.by, input.update, input.create, input.filter)\n\t\tconst errorResponse = this.createErrorResponse(result)\n\t\tif (errorResponse) {\n\t\t\treturn errorResponse\n\t\t}\n\t\tconst primary = getInsertPrimary(result)\n\t\tconst byResolved = primary ? { [entity.primary]: primary } : input.by\n\t\tif (!byResolved) {\n\t\t\tthrow new ImplementationException('MutationResolver::resolveUpsertInternal does not handle result properly')\n\t\t}\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, byResolved, queryAst)\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalidation: {\n\t\t\t\tvalid: true,\n\t\t\t\terrors: [],\n\t\t\t},\n\t\t\terrors: [],\n\t\t\t...nodes,\n\t\t}\n\t}\n\n\tpublic async resolveDelete(\n\t\tentity: Model.Entity,\n\t\tinfo: GraphQLResolveInfo,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst queryAst = this.createQueryAst(info)\n\t\treturn this.transaction(async mapper => {\n\t\t\treturn await this.resolveDeleteInternal(mapper, entity, queryAst)\n\t\t})\n\t}\n\n\tprivate async resolveDeleteInternal(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\tqueryAst: ObjectNode<Input.DeleteInput>,\n\t): Promise<WithoutNode<Result.DeleteResult>> {\n\t\tconst input = queryAst.args\n\n\t\tconst nodes = await this.resolveResultNodes(mapper, entity, input.by, queryAst)\n\n\t\tconst result = await mapper.delete(entity, queryAst.args.by, queryAst.args.filter)\n\t\tif (\n\t\t\tresult.length >= 1 &&\n\t\t\t(result[0].result === MutationResultType.ok || result[0].result === MutationResultType.nothingToDo)\n\t\t) {\n\t\t\treturn { ok: true, errors: [], ...nodes }\n\t\t} else {\n\t\t\tconst errors = this.convertResultToErrors(result)\n\t\t\treturn { ok: false, errors, errorMessage: this.stringifyExecutionErrors(errors) }\n\t\t}\n\t}\n\n\tprivate createQueryAst(info: GraphQLResolveInfo) {\n\t\tconst queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {\n\t\t\treturn path.length !== 1 || node.name.value === 'node'\n\t\t})\n\t\treturn queryAst\n\t}\n\n\tprivate async resolveResultNodes(\n\t\tmapper: Mapper,\n\t\tentity: Model.Entity,\n\t\twhere: Input.UniqueWhere,\n\t\tqueryAst: ObjectNode,\n\t): Promise<Record<string, Value.Object>> {\n\t\tconst nodeQuery = queryAst.findFieldByName('node')\n\t\tlet nodes: Record<string, any> = {}\n\t\tfor (const singleNodeQuery of nodeQuery) {\n\t\t\tif (!(singleNodeQuery instanceof ObjectNode)) {\n\t\t\t\tthrow new Error('MutationResolver: expected ObjectNode')\n\t\t\t}\n\t\t\tconst objectWithArgs = singleNodeQuery.withArgs({ by: where })\n\t\t\tnodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs, [])\n\t\t}\n\t\treturn nodes\n\t}\n\n\tprivate async transaction<R extends { ok: boolean }>(\n\t\tcb: (mapper: Mapper) => Promise<R>,\n\t): Promise<R> {\n\t\treturn await retryTransaction(\n\t\t\tasync () => {\n\t\t\t\treturn await this.mapperFactory.transaction(async mapper => {\n\t\t\t\t\tlogger.debug('MutationResolver: Starting mutation transaction')\n\t\t\t\t\tconst result = await cb(mapper)\n\t\t\t\t\tif (!result.ok) {\n\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction failed, rolling back', { result })\n\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new BeforeCommitEvent())\n\t\t\t\t\t\t\tlogger.debug('MutationResolver: Transaction ok, committing')\n\t\t\t\t\t\t\tawait mapper.db.connection.commit()\n\t\t\t\t\t\t\tawait mapper.eventManager.fire(new AfterCommitEvent())\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait mapper.db.connection.rollback()\n\t\t\t\t\t\t\t} catch {}\n\t\t\t\t\t\t\tconst err = convertError(this.schema, this.schemaDatabaseMetadata, e)\n\t\t\t\t\t\t\tconst errorResponse = this.createErrorResponse([err])\n\t\t\t\t\t\t\tif (!errorResponse) {\n\t\t\t\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn { ...result, ...errorResponse }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t})\n\t\t\t},\n\t\t\tmessage => logger.warn(message),\n\t\t\t{\n\t\t\t\tmaxAttempts: 15,\n\t\t\t\tminTimeout: 10,\n\t\t\t\tmaxTimeout: 1000,\n\t\t\t},\n\t\t)\n\n\t}\n\n\tprivate createErrorResponse(result: MutationResultList) {\n\t\tconst errors = this.convertResultToErrors(result)\n\t\tif (errors.length > 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tvalidation: { valid: true, errors: [] },\n\t\t\t\terrors,\n\t\t\t\terrorMessage: this.stringifyExecutionErrors(errors),\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\tprivate convertResultToErrors(result: MutationResultList): Result.ExecutionError[] {\n\t\tconst errors = result.filter(\n\t\t\tit =>\n\t\t\t\t![MutationResultType.ok, MutationResultType.nothingToDo, MutationResultType.validationError].includes(\n\t\t\t\t\tit.result,\n\t\t\t\t),\n\t\t)\n\n\t\tlet hasSqlError = false\n\t\tconst filteredErrors: MutationResultList = []\n\t\tfor (const error of errors) {\n\t\t\tif (error.hints.includes(MutationResultHint.subSequentSqlError) && hasSqlError) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (error.hints.includes(MutationResultHint.sqlError)) {\n\t\t\t\thasSqlError = true\n\t\t\t}\n\t\t\tfilteredErrors.push(error)\n\t\t}\n\n\t\treturn filteredErrors.map(it => {\n\t\t\tconst paths = it.paths.map(path =>\n\t\t\t\tpath.map(it => ({\n\t\t\t\t\t...it,\n\t\t\t\t\t__typename: 'field' in it ? '_FieldPathFragment' : '_IndexPathFragment',\n\t\t\t\t})),\n\t\t\t)\n\t\t\tconst path = paths[0] || []\n\t\t\tswitch (it.result) {\n\t\t\t\tcase MutationResultType.constraintViolationError:\n\t\t\t\t\tswitch (it.constraint) {\n\t\t\t\t\t\tcase ConstraintType.notNull:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotNullConstraintViolation, message: it.message }\n\t\t\t\t\t\tcase ConstraintType.foreignKey:\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\tpaths,\n\t\t\t\t\t\t\t\ttype: Result.ExecutionErrorType.ForeignKeyConstraintViolation,\n\t\t\t\t\t\t\t\tmessage: it.message,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tcase ConstraintType.uniqueKey:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.UniqueConstraintViolation, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.constraint)\n\t\t\t\t\t}\n\t\t\t\tcase MutationResultType.noResultError:\n\t\t\t\tcase MutationResultType.notFoundError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NotFoundOrDenied, message: it.message }\n\t\t\t\tcase MutationResultType.inputError:\n\t\t\t\t\tswitch (it.kind) {\n\t\t\t\t\t\tcase InputErrorKind.nonUniqueWhere:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.NonUniqueWhereInput, message: it.message }\n\t\t\t\t\t\tcase InputErrorKind.invalidData:\n\t\t\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.InvalidDataInput, message: it.message }\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn assertNever(it.kind)\n\t\t\t\t\t}\n\n\t\t\t\tcase MutationResultType.sqlError:\n\t\t\t\t\treturn { path, paths, type: Result.ExecutionErrorType.SqlError, message: it.message }\n\t\t\t\tcase MutationResultType.ok:\n\t\t\t\tcase MutationResultType.nothingToDo:\n\t\t\t\t\tthrow new ImplementationException('MutationResolver: unexpected MutationResultType')\n\t\t\t\tdefault:\n\t\t\t\t\treturn assertNever(it)\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate stringifyValidationErrors(validationErrors: Result.ValidationError[]): string | undefined {\n\t\tif (validationErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Validation has failed:\\n' +\n\t\t\tvalidationErrors.map(it => `${this.stringifyPath(it.path)}: ${it.message.text}`).join('\\n')\n\t\t)\n\t}\n\n\tprivate stringifyExecutionErrors(executionErrors: Result.ExecutionError[]): string | undefined {\n\t\tif (executionErrors.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn (\n\t\t\t'Execution has failed:\\n' +\n\t\t\texecutionErrors.map(it => `${this.stringifyPath(it.paths[0] || [])}: ${it.type} (${it.message || ''})`)\n\t\t)\n\t}\n\n\tprivate stringifyPath(path: Result.PathFragment[]): string {\n\t\tif (path.length === 0) {\n\t\t\treturn 'unknown field'\n\t\t}\n\t\treturn path\n\t\t\t.map(it => {\n\t\t\t\tif ('field' in it) {\n\t\t\t\t\treturn it.field\n\t\t\t\t}\n\t\t\t\tif ('alias' in it && it.alias) {\n\t\t\t\t\treturn `${it.index}(${it.alias})`\n\t\t\t\t}\n\t\t\t\treturn it.index\n\t\t\t})\n\t\t\t.join('.')\n\t}\n}\n"],"names":["it","validationErrors","path"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const Database = require("@contember/database");
4
+ class RefreshViewResolver {
5
+ constructor(schema, mapperFactory) {
6
+ this.schema = schema;
7
+ this.mapperFactory = mapperFactory;
8
+ }
9
+ async resolve(entity) {
10
+ const mapper = this.mapperFactory.create();
11
+ const entityModel = this.schema.model.entities[entity];
12
+ if (!entityModel) {
13
+ throw new Error(`Entity ${entity} not found`);
14
+ }
15
+ await mapper.db.query(`REFRESH MATERIALIZED VIEW ${Database.wrapIdentifier(entityModel.tableName)}`);
16
+ return { ok: true };
17
+ }
18
+ }
19
+ exports.RefreshViewResolver = RefreshViewResolver;
20
+ //# sourceMappingURL=RefreshViewResolver.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RefreshViewResolver.cjs","sources":["../../../../../packages/engine-content-api/src/resolvers/RefreshViewResolver.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { MapperFactory } from '../mapper'\nimport { wrapIdentifier } from '@contember/database'\nimport { Authorizator } from '../acl'\n\nexport class RefreshViewResolver {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t\tprivate readonly mapperFactory: MapperFactory,\n\t) {\n\t}\n\n\tpublic async resolve(entity: string): Promise<{ ok: boolean }> {\n\t\tconst mapper = this.mapperFactory.create()\n\t\tconst entityModel = this.schema.model.entities[entity]\n\t\tif (!entityModel) {\n\t\t\tthrow new Error(`Entity ${entity} not found`)\n\t\t}\n\t\tawait mapper.db.query(`REFRESH MATERIALIZED VIEW ${wrapIdentifier(entityModel.tableName)}`)\n\n\t\treturn { ok: true }\n\t}\n}\n"],"names":["wrapIdentifier"],"mappings":";;;AAKO,MAAM,oBAAoB;AAAA,EAChC,YACkB,QACA,eAChB;AAFgB,SAAA,SAAA;AACA,SAAA,gBAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,QAAQ,QAA0C;AACxD,UAAA,SAAS,KAAK,cAAc,OAAO;AACzC,UAAM,cAAc,KAAK,OAAO,MAAM,SAAS,MAAM;AACrD,QAAI,CAAC,aAAa;AACjB,YAAM,IAAI,MAAM,UAAU,MAAM,YAAY;AAAA,IAAA;AAEvC,UAAA,OAAO,GAAG,MAAM,6BAA6BA,SAAAA,eAAe,YAAY,SAAS,CAAC,EAAE;AAEnF,WAAA,EAAE,IAAI,KAAK;AAAA,EAAA;AAEpB;;"}
@@ -0,0 +1,20 @@
1
+ import { wrapIdentifier } from "@contember/database";
2
+ class RefreshViewResolver {
3
+ constructor(schema, mapperFactory) {
4
+ this.schema = schema;
5
+ this.mapperFactory = mapperFactory;
6
+ }
7
+ async resolve(entity) {
8
+ const mapper = this.mapperFactory.create();
9
+ const entityModel = this.schema.model.entities[entity];
10
+ if (!entityModel) {
11
+ throw new Error(`Entity ${entity} not found`);
12
+ }
13
+ await mapper.db.query(`REFRESH MATERIALIZED VIEW ${wrapIdentifier(entityModel.tableName)}`);
14
+ return { ok: true };
15
+ }
16
+ }
17
+ export {
18
+ RefreshViewResolver
19
+ };
20
+ //# sourceMappingURL=RefreshViewResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RefreshViewResolver.js","sources":["../../../../../packages/engine-content-api/src/resolvers/RefreshViewResolver.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { MapperFactory } from '../mapper'\nimport { wrapIdentifier } from '@contember/database'\nimport { Authorizator } from '../acl'\n\nexport class RefreshViewResolver {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t\tprivate readonly mapperFactory: MapperFactory,\n\t) {\n\t}\n\n\tpublic async resolve(entity: string): Promise<{ ok: boolean }> {\n\t\tconst mapper = this.mapperFactory.create()\n\t\tconst entityModel = this.schema.model.entities[entity]\n\t\tif (!entityModel) {\n\t\t\tthrow new Error(`Entity ${entity} not found`)\n\t\t}\n\t\tawait mapper.db.query(`REFRESH MATERIALIZED VIEW ${wrapIdentifier(entityModel.tableName)}`)\n\n\t\treturn { ok: true }\n\t}\n}\n"],"names":[],"mappings":";AAKO,MAAM,oBAAoB;AAAA,EAChC,YACkB,QACA,eAChB;AAFgB,SAAA,SAAA;AACA,SAAA,gBAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,QAAQ,QAA0C;AACxD,UAAA,SAAS,KAAK,cAAc,OAAO;AACzC,UAAM,cAAc,KAAK,OAAO,MAAM,SAAS,MAAM;AACrD,QAAI,CAAC,aAAa;AACjB,YAAM,IAAI,MAAM,UAAU,MAAM,YAAY;AAAA,IAAA;AAEvC,UAAA,OAAO,GAAG,MAAM,6BAA6B,eAAe,YAAY,SAAS,CAAC,EAAE;AAEnF,WAAA,EAAE,IAAI,KAAK;AAAA,EAAA;AAEpB;"}
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const graphql = require("graphql");
4
4
  class GraphQlSchemaBuilder {
5
- constructor(schema, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider) {
5
+ constructor(schema, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider, refreshViewMutationProvider) {
6
6
  this.schema = schema;
7
7
  this.queryProvider = queryProvider;
8
8
  this.validationQueriesProvider = validationQueriesProvider;
9
9
  this.mutationProvider = mutationProvider;
10
10
  this.resultSchemaTypeProvider = resultSchemaTypeProvider;
11
+ this.refreshViewMutationProvider = refreshViewMutationProvider;
11
12
  }
12
13
  build(args = {}) {
13
14
  return new graphql.GraphQLSchema(this.buildConfig(args));
@@ -95,6 +96,10 @@ class GraphQlSchemaBuilder {
95
96
  resolve: (parent, args2, context, info) => context.executionContainer.readResolver.resolveQuery(info)
96
97
  });
97
98
  }
99
+ const refreshViewMutation = this.refreshViewMutationProvider.getMutation();
100
+ if (refreshViewMutation) {
101
+ mutations.set("refreshMaterializedView", refreshViewMutation);
102
+ }
98
103
  const infoType = new graphql.GraphQLObjectType({
99
104
  name: "Info",
100
105
  fields: () => ({
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQlSchemaBuilder.cjs","sources":["../../../../../packages/engine-content-api/src/schema/GraphQlSchemaBuilder.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLInputObjectType,\n\tGraphQLNamedType,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Model } from '@contember/schema'\nimport { MutationProvider } from './MutationProvider'\nimport { QueryProvider } from './QueryProvider'\nimport { ValidationQueriesProvider } from './ValidationQueriesProvider'\nimport { Context } from '../types'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\n\ntype BuildArgs = {\n\tqueries?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\tmutations?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\ttypes?: GraphQLNamedType[]\n}\n\nexport class GraphQlSchemaBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly queryProvider: QueryProvider,\n\t\tprivate readonly validationQueriesProvider: ValidationQueriesProvider,\n\t\tprivate readonly mutationProvider: MutationProvider,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t) {}\n\n\tpublic build(args: BuildArgs = {}): GraphQLSchema {\n\t\treturn new GraphQLSchema(this.buildConfig(args))\n\t}\n\n\tprivate buildConfig(args: BuildArgs): GraphQLSchemaConfig {\n\t\tconst queries = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.queries)\n\t\tconst mutations = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.mutations)\n\t\tfor (const entity of Object.values(this.schema.entities)) {\n\t\t\tconst queryFields = this.queryProvider.getQueries(entity)\n\t\t\tfor (const name in queryFields) {\n\t\t\t\tqueries.set(name, queryFields[name])\n\t\t\t}\n\t\t\tconst validationFields = this.validationQueriesProvider.getQueries(entity)\n\t\t\tfor (const name in validationFields) {\n\t\t\t\tqueries.set(name, validationFields[name])\n\t\t\t}\n\t\t\tconst mutationFields = this.mutationProvider.getMutations(entity)\n\t\t\tfor (const name in mutationFields) {\n\t\t\t\tmutations.set(name, mutationFields[name])\n\t\t\t}\n\t\t}\n\n\t\tif (queries.size > 0) {\n\t\t\tconst queryTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'QueryTransaction',\n\t\t\t\tfields: Object.fromEntries(queries),\n\t\t\t})\n\t\t\tqueries.set('transaction', {\n\t\t\t\ttype: queryTransactionType,\n\t\t\t\tresolve: async (parent, args, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.readResolver.resolveTransaction(info),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tconst queryObjectType = new GraphQLObjectType({\n\t\t\tname: 'Query',\n\t\t\tfields: () => Object.fromEntries(queries),\n\t\t})\n\t\tif (mutations.size > 0) {\n\t\t\tconst mutationTransactionOptions = new GraphQLInputObjectType({\n\t\t\t\tname: 'MutationTransactionOptions',\n\t\t\t\tfields: {\n\t\t\t\t\tdeferForeignKeyConstraints: { type: GraphQLBoolean },\n\t\t\t\t\tdeferUniqueConstraints: { type: GraphQLBoolean },\n\t\t\t\t},\n\t\t\t})\n\t\t\tconst mutationTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'MutationTransaction',\n\t\t\t\tfields: {\n\t\t\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\t\t\terrorMessage: { type: GraphQLString },\n\t\t\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t\t\t},\n\t\t\t\t\t...Object.fromEntries(mutations),\n\t\t\t\t\tquery: {\n\t\t\t\t\t\ttype: queryObjectType,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('transaction', {\n\t\t\t\targs: {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\ttype: mutationTransactionOptions,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: new GraphQLNonNull(\n\t\t\t\t\tmutationTransactionType,\n\t\t\t\t),\n\t\t\t\tresolve: async (parent, args: { options?: { deferForeignKeyConstraints?: boolean; deferUniqueConstraints?: boolean } }, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.mutationResolver.resolveTransaction(info, {\n\t\t\t\t\t\t\tdeferForeignKeyConstraints: args.options?.deferForeignKeyConstraints ?? false,\n\t\t\t\t\t\t\tdeferUniqueConstraints: args.options?.deferUniqueConstraints ?? false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('query', {\n\t\t\t\ttype: new GraphQLNonNull(queryObjectType),\n\t\t\t\tresolve: (parent, args, context: Context, info) => context.executionContainer.readResolver.resolveQuery(info),\n\t\t\t})\n\t\t}\n\t\tconst infoType = new GraphQLObjectType({\n\t\t\tname: 'Info',\n\t\t\tfields: () => ({\n\t\t\t\tdescription: { type: GraphQLString },\n\t\t\t}),\n\t\t})\n\t\tqueries.set('_info', {\n\t\t\ttype: infoType,\n\t\t\tresolve: () => ({\n\t\t\t\tdescription: 'TODO',\n\t\t\t}),\n\t\t})\n\n\n\t\treturn {\n\t\t\tquery: queryObjectType,\n\t\t\ttypes: args.types,\n\t\t\t...(mutations.size > 0\n\t\t\t\t? {\n\t\t\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\t\t\tname: 'Mutation',\n\t\t\t\t\t\tfields: () => Object.fromEntries(mutations),\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}\n\t}\n}\n"],"names":["GraphQLSchema","GraphQLObjectType","args","GraphQLInputObjectType","GraphQLBoolean","GraphQLNonNull","GraphQLString"],"mappings":"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"}
1
+ {"version":3,"file":"GraphQlSchemaBuilder.cjs","sources":["../../../../../packages/engine-content-api/src/schema/GraphQlSchemaBuilder.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLInputObjectType,\n\tGraphQLNamedType,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Model } from '@contember/schema'\nimport { MutationProvider } from './MutationProvider'\nimport { QueryProvider } from './QueryProvider'\nimport { ValidationQueriesProvider } from './ValidationQueriesProvider'\nimport { Context } from '../types'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\nimport { RefreshViewMutationProvider } from './RefreshViewMutationProvider'\n\ntype BuildArgs = {\n\tqueries?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\tmutations?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\ttypes?: GraphQLNamedType[]\n}\n\nexport class GraphQlSchemaBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly queryProvider: QueryProvider,\n\t\tprivate readonly validationQueriesProvider: ValidationQueriesProvider,\n\t\tprivate readonly mutationProvider: MutationProvider,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t\tprivate readonly refreshViewMutationProvider: RefreshViewMutationProvider,\n\t) {}\n\n\tpublic build(args: BuildArgs = {}): GraphQLSchema {\n\t\treturn new GraphQLSchema(this.buildConfig(args))\n\t}\n\n\tprivate buildConfig(args: BuildArgs): GraphQLSchemaConfig {\n\t\tconst queries = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.queries)\n\t\tconst mutations = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.mutations)\n\t\tfor (const entity of Object.values(this.schema.entities)) {\n\t\t\tconst queryFields = this.queryProvider.getQueries(entity)\n\t\t\tfor (const name in queryFields) {\n\t\t\t\tqueries.set(name, queryFields[name])\n\t\t\t}\n\t\t\tconst validationFields = this.validationQueriesProvider.getQueries(entity)\n\t\t\tfor (const name in validationFields) {\n\t\t\t\tqueries.set(name, validationFields[name])\n\t\t\t}\n\t\t\tconst mutationFields = this.mutationProvider.getMutations(entity)\n\t\t\tfor (const name in mutationFields) {\n\t\t\t\tmutations.set(name, mutationFields[name])\n\t\t\t}\n\t\t}\n\n\t\tif (queries.size > 0) {\n\t\t\tconst queryTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'QueryTransaction',\n\t\t\t\tfields: Object.fromEntries(queries),\n\t\t\t})\n\t\t\tqueries.set('transaction', {\n\t\t\t\ttype: queryTransactionType,\n\t\t\t\tresolve: async (parent, args, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.readResolver.resolveTransaction(info),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tconst queryObjectType = new GraphQLObjectType({\n\t\t\tname: 'Query',\n\t\t\tfields: () => Object.fromEntries(queries),\n\t\t})\n\t\tif (mutations.size > 0) {\n\t\t\tconst mutationTransactionOptions = new GraphQLInputObjectType({\n\t\t\t\tname: 'MutationTransactionOptions',\n\t\t\t\tfields: {\n\t\t\t\t\tdeferForeignKeyConstraints: { type: GraphQLBoolean },\n\t\t\t\t\tdeferUniqueConstraints: { type: GraphQLBoolean },\n\t\t\t\t},\n\t\t\t})\n\t\t\tconst mutationTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'MutationTransaction',\n\t\t\t\tfields: {\n\t\t\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\t\t\terrorMessage: { type: GraphQLString },\n\t\t\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t\t\t},\n\t\t\t\t\t...Object.fromEntries(mutations),\n\t\t\t\t\tquery: {\n\t\t\t\t\t\ttype: queryObjectType,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('transaction', {\n\t\t\t\targs: {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\ttype: mutationTransactionOptions,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: new GraphQLNonNull(\n\t\t\t\t\tmutationTransactionType,\n\t\t\t\t),\n\t\t\t\tresolve: async (parent, args: { options?: { deferForeignKeyConstraints?: boolean; deferUniqueConstraints?: boolean } }, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.mutationResolver.resolveTransaction(info, {\n\t\t\t\t\t\t\tdeferForeignKeyConstraints: args.options?.deferForeignKeyConstraints ?? false,\n\t\t\t\t\t\t\tdeferUniqueConstraints: args.options?.deferUniqueConstraints ?? false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('query', {\n\t\t\t\ttype: new GraphQLNonNull(queryObjectType),\n\t\t\t\tresolve: (parent, args, context: Context, info) => context.executionContainer.readResolver.resolveQuery(info),\n\t\t\t})\n\t\t}\n\n\t\tconst refreshViewMutation = this.refreshViewMutationProvider.getMutation()\n\t\tif (refreshViewMutation) {\n\t\t\tmutations.set('refreshMaterializedView', refreshViewMutation)\n\t\t}\n\n\t\tconst infoType = new GraphQLObjectType({\n\t\t\tname: 'Info',\n\t\t\tfields: () => ({\n\t\t\t\tdescription: { type: GraphQLString },\n\t\t\t}),\n\t\t})\n\t\tqueries.set('_info', {\n\t\t\ttype: infoType,\n\t\t\tresolve: () => ({\n\t\t\t\tdescription: 'TODO',\n\t\t\t}),\n\t\t})\n\n\n\t\treturn {\n\t\t\tquery: queryObjectType,\n\t\t\ttypes: args.types,\n\t\t\t...(mutations.size > 0\n\t\t\t\t? {\n\t\t\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\t\t\tname: 'Mutation',\n\t\t\t\t\t\tfields: () => Object.fromEntries(mutations),\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}\n\t}\n}\n"],"names":["GraphQLSchema","GraphQLObjectType","args","GraphQLInputObjectType","GraphQLBoolean","GraphQLNonNull","GraphQLString"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { GraphQLSchema, GraphQLObjectType, GraphQLInputObjectType, GraphQLBoolean, GraphQLNonNull, GraphQLString } from "graphql";
2
2
  class GraphQlSchemaBuilder {
3
- constructor(schema, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider) {
3
+ constructor(schema, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider, refreshViewMutationProvider) {
4
4
  this.schema = schema;
5
5
  this.queryProvider = queryProvider;
6
6
  this.validationQueriesProvider = validationQueriesProvider;
7
7
  this.mutationProvider = mutationProvider;
8
8
  this.resultSchemaTypeProvider = resultSchemaTypeProvider;
9
+ this.refreshViewMutationProvider = refreshViewMutationProvider;
9
10
  }
10
11
  build(args = {}) {
11
12
  return new GraphQLSchema(this.buildConfig(args));
@@ -93,6 +94,10 @@ class GraphQlSchemaBuilder {
93
94
  resolve: (parent, args2, context, info) => context.executionContainer.readResolver.resolveQuery(info)
94
95
  });
95
96
  }
97
+ const refreshViewMutation = this.refreshViewMutationProvider.getMutation();
98
+ if (refreshViewMutation) {
99
+ mutations.set("refreshMaterializedView", refreshViewMutation);
100
+ }
96
101
  const infoType = new GraphQLObjectType({
97
102
  name: "Info",
98
103
  fields: () => ({
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQlSchemaBuilder.js","sources":["../../../../../packages/engine-content-api/src/schema/GraphQlSchemaBuilder.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLInputObjectType,\n\tGraphQLNamedType,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Model } from '@contember/schema'\nimport { MutationProvider } from './MutationProvider'\nimport { QueryProvider } from './QueryProvider'\nimport { ValidationQueriesProvider } from './ValidationQueriesProvider'\nimport { Context } from '../types'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\n\ntype BuildArgs = {\n\tqueries?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\tmutations?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\ttypes?: GraphQLNamedType[]\n}\n\nexport class GraphQlSchemaBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly queryProvider: QueryProvider,\n\t\tprivate readonly validationQueriesProvider: ValidationQueriesProvider,\n\t\tprivate readonly mutationProvider: MutationProvider,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t) {}\n\n\tpublic build(args: BuildArgs = {}): GraphQLSchema {\n\t\treturn new GraphQLSchema(this.buildConfig(args))\n\t}\n\n\tprivate buildConfig(args: BuildArgs): GraphQLSchemaConfig {\n\t\tconst queries = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.queries)\n\t\tconst mutations = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.mutations)\n\t\tfor (const entity of Object.values(this.schema.entities)) {\n\t\t\tconst queryFields = this.queryProvider.getQueries(entity)\n\t\t\tfor (const name in queryFields) {\n\t\t\t\tqueries.set(name, queryFields[name])\n\t\t\t}\n\t\t\tconst validationFields = this.validationQueriesProvider.getQueries(entity)\n\t\t\tfor (const name in validationFields) {\n\t\t\t\tqueries.set(name, validationFields[name])\n\t\t\t}\n\t\t\tconst mutationFields = this.mutationProvider.getMutations(entity)\n\t\t\tfor (const name in mutationFields) {\n\t\t\t\tmutations.set(name, mutationFields[name])\n\t\t\t}\n\t\t}\n\n\t\tif (queries.size > 0) {\n\t\t\tconst queryTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'QueryTransaction',\n\t\t\t\tfields: Object.fromEntries(queries),\n\t\t\t})\n\t\t\tqueries.set('transaction', {\n\t\t\t\ttype: queryTransactionType,\n\t\t\t\tresolve: async (parent, args, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.readResolver.resolveTransaction(info),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tconst queryObjectType = new GraphQLObjectType({\n\t\t\tname: 'Query',\n\t\t\tfields: () => Object.fromEntries(queries),\n\t\t})\n\t\tif (mutations.size > 0) {\n\t\t\tconst mutationTransactionOptions = new GraphQLInputObjectType({\n\t\t\t\tname: 'MutationTransactionOptions',\n\t\t\t\tfields: {\n\t\t\t\t\tdeferForeignKeyConstraints: { type: GraphQLBoolean },\n\t\t\t\t\tdeferUniqueConstraints: { type: GraphQLBoolean },\n\t\t\t\t},\n\t\t\t})\n\t\t\tconst mutationTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'MutationTransaction',\n\t\t\t\tfields: {\n\t\t\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\t\t\terrorMessage: { type: GraphQLString },\n\t\t\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t\t\t},\n\t\t\t\t\t...Object.fromEntries(mutations),\n\t\t\t\t\tquery: {\n\t\t\t\t\t\ttype: queryObjectType,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('transaction', {\n\t\t\t\targs: {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\ttype: mutationTransactionOptions,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: new GraphQLNonNull(\n\t\t\t\t\tmutationTransactionType,\n\t\t\t\t),\n\t\t\t\tresolve: async (parent, args: { options?: { deferForeignKeyConstraints?: boolean; deferUniqueConstraints?: boolean } }, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.mutationResolver.resolveTransaction(info, {\n\t\t\t\t\t\t\tdeferForeignKeyConstraints: args.options?.deferForeignKeyConstraints ?? false,\n\t\t\t\t\t\t\tdeferUniqueConstraints: args.options?.deferUniqueConstraints ?? false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('query', {\n\t\t\t\ttype: new GraphQLNonNull(queryObjectType),\n\t\t\t\tresolve: (parent, args, context: Context, info) => context.executionContainer.readResolver.resolveQuery(info),\n\t\t\t})\n\t\t}\n\t\tconst infoType = new GraphQLObjectType({\n\t\t\tname: 'Info',\n\t\t\tfields: () => ({\n\t\t\t\tdescription: { type: GraphQLString },\n\t\t\t}),\n\t\t})\n\t\tqueries.set('_info', {\n\t\t\ttype: infoType,\n\t\t\tresolve: () => ({\n\t\t\t\tdescription: 'TODO',\n\t\t\t}),\n\t\t})\n\n\n\t\treturn {\n\t\t\tquery: queryObjectType,\n\t\t\ttypes: args.types,\n\t\t\t...(mutations.size > 0\n\t\t\t\t? {\n\t\t\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\t\t\tname: 'Mutation',\n\t\t\t\t\t\tfields: () => Object.fromEntries(mutations),\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}\n\t}\n}\n"],"names":["args"],"mappings":"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"}
1
+ {"version":3,"file":"GraphQlSchemaBuilder.js","sources":["../../../../../packages/engine-content-api/src/schema/GraphQlSchemaBuilder.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLInputObjectType,\n\tGraphQLNamedType,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Model } from '@contember/schema'\nimport { MutationProvider } from './MutationProvider'\nimport { QueryProvider } from './QueryProvider'\nimport { ValidationQueriesProvider } from './ValidationQueriesProvider'\nimport { Context } from '../types'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\nimport { RefreshViewMutationProvider } from './RefreshViewMutationProvider'\n\ntype BuildArgs = {\n\tqueries?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\tmutations?: Map<string, GraphQLFieldConfig<any, Context, any>>\n\ttypes?: GraphQLNamedType[]\n}\n\nexport class GraphQlSchemaBuilder {\n\tconstructor(\n\t\tprivate readonly schema: Model.Schema,\n\t\tprivate readonly queryProvider: QueryProvider,\n\t\tprivate readonly validationQueriesProvider: ValidationQueriesProvider,\n\t\tprivate readonly mutationProvider: MutationProvider,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t\tprivate readonly refreshViewMutationProvider: RefreshViewMutationProvider,\n\t) {}\n\n\tpublic build(args: BuildArgs = {}): GraphQLSchema {\n\t\treturn new GraphQLSchema(this.buildConfig(args))\n\t}\n\n\tprivate buildConfig(args: BuildArgs): GraphQLSchemaConfig {\n\t\tconst queries = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.queries)\n\t\tconst mutations = new Map<string, GraphQLFieldConfig<any, Context, any>>(args.mutations)\n\t\tfor (const entity of Object.values(this.schema.entities)) {\n\t\t\tconst queryFields = this.queryProvider.getQueries(entity)\n\t\t\tfor (const name in queryFields) {\n\t\t\t\tqueries.set(name, queryFields[name])\n\t\t\t}\n\t\t\tconst validationFields = this.validationQueriesProvider.getQueries(entity)\n\t\t\tfor (const name in validationFields) {\n\t\t\t\tqueries.set(name, validationFields[name])\n\t\t\t}\n\t\t\tconst mutationFields = this.mutationProvider.getMutations(entity)\n\t\t\tfor (const name in mutationFields) {\n\t\t\t\tmutations.set(name, mutationFields[name])\n\t\t\t}\n\t\t}\n\n\t\tif (queries.size > 0) {\n\t\t\tconst queryTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'QueryTransaction',\n\t\t\t\tfields: Object.fromEntries(queries),\n\t\t\t})\n\t\t\tqueries.set('transaction', {\n\t\t\t\ttype: queryTransactionType,\n\t\t\t\tresolve: async (parent, args, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.readResolver.resolveTransaction(info),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tconst queryObjectType = new GraphQLObjectType({\n\t\t\tname: 'Query',\n\t\t\tfields: () => Object.fromEntries(queries),\n\t\t})\n\t\tif (mutations.size > 0) {\n\t\t\tconst mutationTransactionOptions = new GraphQLInputObjectType({\n\t\t\t\tname: 'MutationTransactionOptions',\n\t\t\t\tfields: {\n\t\t\t\t\tdeferForeignKeyConstraints: { type: GraphQLBoolean },\n\t\t\t\t\tdeferUniqueConstraints: { type: GraphQLBoolean },\n\t\t\t\t},\n\t\t\t})\n\t\t\tconst mutationTransactionType = new GraphQLObjectType({\n\t\t\t\tname: 'MutationTransaction',\n\t\t\t\tfields: {\n\t\t\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\t\t\terrorMessage: { type: GraphQLString },\n\t\t\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t\t\t\tvalidation: {\n\t\t\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t\t\t},\n\t\t\t\t\t...Object.fromEntries(mutations),\n\t\t\t\t\tquery: {\n\t\t\t\t\t\ttype: queryObjectType,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('transaction', {\n\t\t\t\targs: {\n\t\t\t\t\toptions: {\n\t\t\t\t\t\ttype: mutationTransactionOptions,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttype: new GraphQLNonNull(\n\t\t\t\t\tmutationTransactionType,\n\t\t\t\t),\n\t\t\t\tresolve: async (parent, args: { options?: { deferForeignKeyConstraints?: boolean; deferUniqueConstraints?: boolean } }, context: Context, info) => {\n\t\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () =>\n\t\t\t\t\t\tcontext.executionContainer.mutationResolver.resolveTransaction(info, {\n\t\t\t\t\t\t\tdeferForeignKeyConstraints: args.options?.deferForeignKeyConstraints ?? false,\n\t\t\t\t\t\t\tdeferUniqueConstraints: args.options?.deferUniqueConstraints ?? false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t})\n\t\t\tmutations.set('query', {\n\t\t\t\ttype: new GraphQLNonNull(queryObjectType),\n\t\t\t\tresolve: (parent, args, context: Context, info) => context.executionContainer.readResolver.resolveQuery(info),\n\t\t\t})\n\t\t}\n\n\t\tconst refreshViewMutation = this.refreshViewMutationProvider.getMutation()\n\t\tif (refreshViewMutation) {\n\t\t\tmutations.set('refreshMaterializedView', refreshViewMutation)\n\t\t}\n\n\t\tconst infoType = new GraphQLObjectType({\n\t\t\tname: 'Info',\n\t\t\tfields: () => ({\n\t\t\t\tdescription: { type: GraphQLString },\n\t\t\t}),\n\t\t})\n\t\tqueries.set('_info', {\n\t\t\ttype: infoType,\n\t\t\tresolve: () => ({\n\t\t\t\tdescription: 'TODO',\n\t\t\t}),\n\t\t})\n\n\n\t\treturn {\n\t\t\tquery: queryObjectType,\n\t\t\ttypes: args.types,\n\t\t\t...(mutations.size > 0\n\t\t\t\t? {\n\t\t\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\t\t\tname: 'Mutation',\n\t\t\t\t\t\tfields: () => Object.fromEntries(mutations),\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}\n\t}\n}\n"],"names":["args"],"mappings":"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"}
@@ -30,6 +30,7 @@ const PaginatedHasManyFieldProvider = require("../extensions/paginatedHasMany/Pa
30
30
  const PaginatedHasManyFieldProviderVisitor = require("../extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.cjs");
31
31
  const dic = require("@contember/dic");
32
32
  const ConnectOrCreateRelationInputProvider = require("./mutations/ConnectOrCreateRelationInputProvider.cjs");
33
+ const RefreshViewMutationProvider = require("./RefreshViewMutationProvider.cjs");
33
34
  class GraphQlSchemaBuilderFactory {
34
35
  constructor() {
35
36
  }
@@ -37,7 +38,7 @@ class GraphQlSchemaBuilderFactory {
37
38
  return this.createContainerBuilder(schema, authorizator).build().graphQlSchemaBuilder;
38
39
  }
39
40
  createContainerBuilder(schema, authorizator) {
40
- return new dic.Builder({}).addService("schema", () => schema).addService("authorizator", () => authorizator).addService("customTypesProvider", ({}) => new CustomTypesProvider.CustomTypesProvider()).addService("enumsProvider", ({ schema: schema2 }) => new EnumsProvider.EnumsProvider(schema2)).addService("columnTypeResolver", ({ schema: schema2, enumsProvider, customTypesProvider }) => new ColumnTypeResolver.ColumnTypeResolver(schema2, enumsProvider, customTypesProvider)).addService("conditionTypeProvider", ({ columnTypeResolver }) => new ConditionTypeProvider.ConditionTypeProvider(columnTypeResolver)).addService("whereTypeProvider", ({ schema: schema2, authorizator: authorizator2, columnTypeResolver, conditionTypeProvider }) => new WhereTypeProvider.WhereTypeProvider(schema2, authorizator2, columnTypeResolver, conditionTypeProvider)).addService("orderByTypeProvider", ({ schema: schema2, authorizator: authorizator2 }) => new OrderByTypeProvider.OrderByTypeProvider(schema2, authorizator2)).addService("entityTypeProvider", ({ schema: schema2, authorizator: authorizator2, columnTypeResolver, whereTypeProvider, orderByTypeProvider }) => new EntityTypeProvider.EntityTypeProvider(schema2, authorizator2, columnTypeResolver, whereTypeProvider, orderByTypeProvider)).addService("paginatedFieldConfigFactory", ({ whereTypeProvider, orderByTypeProvider, entityTypeProvider }) => new PaginatedFieldConfigFactory.PaginatedFieldConfigFactory(whereTypeProvider, orderByTypeProvider, entityTypeProvider)).addService("hasManyToOneReducerVisitor", ({ schema: schema2, authorizator: authorizator2, entityTypeProvider, whereTypeProvider }) => new HasManyToHasOneRelationReducerVisitor.HasManyToHasOneRelationReducerFieldVisitor(schema2, authorizator2, entityTypeProvider, whereTypeProvider)).addService("hasManyToOneReducer", ({ schema: schema2, hasManyToOneReducerVisitor }) => new HasManyToHasOneReducer.HasManyToHasOneReducer(schema2, hasManyToOneReducerVisitor)).addService("paginatedHasManyFieldProviderVisitor", ({ paginatedFieldConfigFactory }) => new PaginatedHasManyFieldProviderVisitor.PaginatedHasManyFieldProviderVisitor(paginatedFieldConfigFactory)).addService("paginatedHasManyFieldProvider", ({ schema: schema2, paginatedHasManyFieldProviderVisitor }) => new PaginatedHasManyFieldProvider.PaginatedHasManyFieldProvider(schema2, paginatedHasManyFieldProviderVisitor)).addService("queryProvider", ({ authorizator: authorizator2, whereTypeProvider, orderByTypeProvider, entityTypeProvider, paginatedFieldConfigFactory }) => new QueryProvider.QueryProvider(authorizator2, whereTypeProvider, orderByTypeProvider, entityTypeProvider, paginatedFieldConfigFactory)).addService("createEntityInputProviderAccessor", ({}) => new accessor.Accessor()).addService("createEntityRelationAllowedOperationsVisitor", ({ authorizator: authorizator2 }) => new CreateEntityRelationAllowedOperationsVisitor.CreateEntityRelationAllowedOperationsVisitor(authorizator2)).addService("connectOrCreateRelationInputProvider", ({ schema: schema2, whereTypeProvider, createEntityInputProviderAccessor }) => new ConnectOrCreateRelationInputProvider.ConnectOrCreateRelationInputProvider(schema2, whereTypeProvider, createEntityInputProviderAccessor)).addService("createEntityRelationInputFieldVisitor", ({ schema: schema2, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) => new CreateEntityRelationInputFieldVisitor.CreateEntityRelationInputFieldVisitor(schema2, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider)).addService("createEntityRelationInputProvider", ({ schema: schema2, createEntityRelationInputFieldVisitor }) => new CreateEntityRelationInputProvider.CreateEntityRelationInputProvider(schema2, createEntityRelationInputFieldVisitor)).addService("createEntityInputFieldVisitor", ({ schema: schema2, authorizator: authorizator2, columnTypeResolver, createEntityRelationInputProvider }) => new CreateEntityInputFieldVisitor.CreateEntityInputFieldVisitor(schema2, authorizator2, columnTypeResolver, createEntityRelationInputProvider)).addService("createEntityInputProvider", ({ schema: schema2, authorizator: authorizator2, createEntityInputFieldVisitor }) => new EntityInputProvider.EntityInputProvider(EntityInputProvider.EntityInputType.create, schema2, authorizator2, createEntityInputFieldVisitor)).addService("updateEntityInputProviderAccessor", ({}) => new accessor.Accessor()).addService("updateEntityRelationAllowedOperationsVisitor", ({ authorizator: authorizator2 }) => new UpdateEntityRelationAllowedOperationsVisitor.UpdateEntityRelationAllowedOperationsVisitor(authorizator2)).addService("updateEntityRelationInputFieldVisitor", ({ schema: schema2, authorizator: authorizator2, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) => new UpdateEntityRelationInputFieldVisitor.UpdateEntityRelationInputFieldVisitor(schema2, authorizator2, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider)).addService("updateEntityRelationInputProvider", ({ schema: schema2, updateEntityRelationInputFieldVisitor }) => new UpdateEntityRelationInputProvider.UpdateEntityRelationInputProvider(schema2, updateEntityRelationInputFieldVisitor)).addService("updateEntityInputFieldVisitor", ({ authorizator: authorizator2, columnTypeResolver, updateEntityRelationInputProvider }) => new UpdateEntityInputFieldVisitor.UpdateEntityInputFieldVisitor(authorizator2, columnTypeResolver, updateEntityRelationInputProvider)).addService("updateEntityInputProvider", ({ schema: schema2, authorizator: authorizator2, updateEntityInputFieldVisitor }) => new EntityInputProvider.EntityInputProvider(EntityInputProvider.EntityInputType.update, schema2, authorizator2, updateEntityInputFieldVisitor)).addService("resultSchemaTypeProvider", ({}) => new ResultSchemaTypeProvider.ResultSchemaTypeProvider()).addService("mutationProvider", ({ authorizator: authorizator2, whereTypeProvider, entityTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider }) => new MutationProvider.MutationProvider(authorizator2, whereTypeProvider, entityTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider)).addService("validationQueriesProvider", ({ whereTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider }) => new ValidationQueriesProvider.ValidationQueriesProvider(whereTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider)).addService("graphQlSchemaBuilder", ({ schema: schema2, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider }) => new GraphQlSchemaBuilder.GraphQlSchemaBuilder(schema2, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider)).setupService("createEntityInputProvider", (it, { createEntityInputProviderAccessor }) => {
41
+ return new dic.Builder({}).addService("schema", () => schema).addService("authorizator", () => authorizator).addService("customTypesProvider", ({}) => new CustomTypesProvider.CustomTypesProvider()).addService("enumsProvider", ({ schema: schema2 }) => new EnumsProvider.EnumsProvider(schema2)).addService("columnTypeResolver", ({ schema: schema2, enumsProvider, customTypesProvider }) => new ColumnTypeResolver.ColumnTypeResolver(schema2, enumsProvider, customTypesProvider)).addService("conditionTypeProvider", ({ columnTypeResolver }) => new ConditionTypeProvider.ConditionTypeProvider(columnTypeResolver)).addService("whereTypeProvider", ({ schema: schema2, authorizator: authorizator2, columnTypeResolver, conditionTypeProvider }) => new WhereTypeProvider.WhereTypeProvider(schema2, authorizator2, columnTypeResolver, conditionTypeProvider)).addService("orderByTypeProvider", ({ schema: schema2, authorizator: authorizator2 }) => new OrderByTypeProvider.OrderByTypeProvider(schema2, authorizator2)).addService("entityTypeProvider", ({ schema: schema2, authorizator: authorizator2, columnTypeResolver, whereTypeProvider, orderByTypeProvider }) => new EntityTypeProvider.EntityTypeProvider(schema2, authorizator2, columnTypeResolver, whereTypeProvider, orderByTypeProvider)).addService("paginatedFieldConfigFactory", ({ whereTypeProvider, orderByTypeProvider, entityTypeProvider }) => new PaginatedFieldConfigFactory.PaginatedFieldConfigFactory(whereTypeProvider, orderByTypeProvider, entityTypeProvider)).addService("hasManyToOneReducerVisitor", ({ schema: schema2, authorizator: authorizator2, entityTypeProvider, whereTypeProvider }) => new HasManyToHasOneRelationReducerVisitor.HasManyToHasOneRelationReducerFieldVisitor(schema2, authorizator2, entityTypeProvider, whereTypeProvider)).addService("hasManyToOneReducer", ({ schema: schema2, hasManyToOneReducerVisitor }) => new HasManyToHasOneReducer.HasManyToHasOneReducer(schema2, hasManyToOneReducerVisitor)).addService("paginatedHasManyFieldProviderVisitor", ({ paginatedFieldConfigFactory }) => new PaginatedHasManyFieldProviderVisitor.PaginatedHasManyFieldProviderVisitor(paginatedFieldConfigFactory)).addService("paginatedHasManyFieldProvider", ({ schema: schema2, paginatedHasManyFieldProviderVisitor }) => new PaginatedHasManyFieldProvider.PaginatedHasManyFieldProvider(schema2, paginatedHasManyFieldProviderVisitor)).addService("queryProvider", ({ authorizator: authorizator2, whereTypeProvider, orderByTypeProvider, entityTypeProvider, paginatedFieldConfigFactory }) => new QueryProvider.QueryProvider(authorizator2, whereTypeProvider, orderByTypeProvider, entityTypeProvider, paginatedFieldConfigFactory)).addService("createEntityInputProviderAccessor", ({}) => new accessor.Accessor()).addService("createEntityRelationAllowedOperationsVisitor", ({ authorizator: authorizator2 }) => new CreateEntityRelationAllowedOperationsVisitor.CreateEntityRelationAllowedOperationsVisitor(authorizator2)).addService("connectOrCreateRelationInputProvider", ({ schema: schema2, whereTypeProvider, createEntityInputProviderAccessor }) => new ConnectOrCreateRelationInputProvider.ConnectOrCreateRelationInputProvider(schema2, whereTypeProvider, createEntityInputProviderAccessor)).addService("createEntityRelationInputFieldVisitor", ({ schema: schema2, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) => new CreateEntityRelationInputFieldVisitor.CreateEntityRelationInputFieldVisitor(schema2, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider)).addService("createEntityRelationInputProvider", ({ schema: schema2, createEntityRelationInputFieldVisitor }) => new CreateEntityRelationInputProvider.CreateEntityRelationInputProvider(schema2, createEntityRelationInputFieldVisitor)).addService("createEntityInputFieldVisitor", ({ schema: schema2, authorizator: authorizator2, columnTypeResolver, createEntityRelationInputProvider }) => new CreateEntityInputFieldVisitor.CreateEntityInputFieldVisitor(schema2, authorizator2, columnTypeResolver, createEntityRelationInputProvider)).addService("createEntityInputProvider", ({ schema: schema2, authorizator: authorizator2, createEntityInputFieldVisitor }) => new EntityInputProvider.EntityInputProvider(EntityInputProvider.EntityInputType.create, schema2, authorizator2, createEntityInputFieldVisitor)).addService("updateEntityInputProviderAccessor", ({}) => new accessor.Accessor()).addService("updateEntityRelationAllowedOperationsVisitor", ({ authorizator: authorizator2 }) => new UpdateEntityRelationAllowedOperationsVisitor.UpdateEntityRelationAllowedOperationsVisitor(authorizator2)).addService("updateEntityRelationInputFieldVisitor", ({ schema: schema2, authorizator: authorizator2, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) => new UpdateEntityRelationInputFieldVisitor.UpdateEntityRelationInputFieldVisitor(schema2, authorizator2, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider)).addService("updateEntityRelationInputProvider", ({ schema: schema2, updateEntityRelationInputFieldVisitor }) => new UpdateEntityRelationInputProvider.UpdateEntityRelationInputProvider(schema2, updateEntityRelationInputFieldVisitor)).addService("updateEntityInputFieldVisitor", ({ authorizator: authorizator2, columnTypeResolver, updateEntityRelationInputProvider }) => new UpdateEntityInputFieldVisitor.UpdateEntityInputFieldVisitor(authorizator2, columnTypeResolver, updateEntityRelationInputProvider)).addService("updateEntityInputProvider", ({ schema: schema2, authorizator: authorizator2, updateEntityInputFieldVisitor }) => new EntityInputProvider.EntityInputProvider(EntityInputProvider.EntityInputType.update, schema2, authorizator2, updateEntityInputFieldVisitor)).addService("resultSchemaTypeProvider", ({}) => new ResultSchemaTypeProvider.ResultSchemaTypeProvider()).addService("mutationProvider", ({ authorizator: authorizator2, whereTypeProvider, entityTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider }) => new MutationProvider.MutationProvider(authorizator2, whereTypeProvider, entityTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider)).addService("validationQueriesProvider", ({ whereTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider }) => new ValidationQueriesProvider.ValidationQueriesProvider(whereTypeProvider, createEntityInputProvider, updateEntityInputProvider, resultSchemaTypeProvider)).addService("refreshViewMutationProvider", ({ schema: schema2, authorizator: authorizator2 }) => new RefreshViewMutationProvider.RefreshViewMutationProvider(schema2, authorizator2)).addService("graphQlSchemaBuilder", ({ schema: schema2, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider, refreshViewMutationProvider }) => new GraphQlSchemaBuilder.GraphQlSchemaBuilder(schema2, queryProvider, validationQueriesProvider, mutationProvider, resultSchemaTypeProvider, refreshViewMutationProvider)).setupService("createEntityInputProvider", (it, { createEntityInputProviderAccessor }) => {
41
42
  createEntityInputProviderAccessor.set(it);
42
43
  }).setupService("updateEntityInputProvider", (it, { updateEntityInputProviderAccessor }) => {
43
44
  updateEntityInputProviderAccessor.set(it);