@contember/engine-content-api 2.0.2 → 2.1.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) 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 +6 -4
  6. package/dist/development/src/ExecutionContainer.cjs.map +1 -1
  7. package/dist/development/src/ExecutionContainer.js +6 -4
  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/ColumnValueResolver.cjs +1 -1
  14. package/dist/development/src/input-validation/ColumnValueResolver.cjs.map +1 -1
  15. package/dist/development/src/input-validation/ColumnValueResolver.js +1 -1
  16. package/dist/development/src/input-validation/ColumnValueResolver.js.map +1 -1
  17. package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
  18. package/dist/development/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
  19. package/dist/development/src/input-validation/dependencies/DependencyCollector.js +3 -0
  20. package/dist/development/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
  21. package/dist/development/src/mapper/Mapper.cjs +1 -0
  22. package/dist/development/src/mapper/Mapper.cjs.map +1 -1
  23. package/dist/development/src/mapper/Mapper.js +1 -0
  24. package/dist/development/src/mapper/Mapper.js.map +1 -1
  25. package/dist/development/src/mapper/insert/Inserter.cjs +3 -2
  26. package/dist/development/src/mapper/insert/Inserter.cjs.map +1 -1
  27. package/dist/development/src/mapper/insert/Inserter.js +3 -2
  28. package/dist/development/src/mapper/insert/Inserter.js.map +1 -1
  29. package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs +3 -2
  30. package/dist/development/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
  31. package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js +3 -2
  32. package/dist/development/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  33. package/dist/development/src/mapper/select/ConditionBuilder.cjs +9 -2
  34. package/dist/development/src/mapper/select/ConditionBuilder.cjs.map +1 -1
  35. package/dist/development/src/mapper/select/ConditionBuilder.js +10 -3
  36. package/dist/development/src/mapper/select/ConditionBuilder.js.map +1 -1
  37. package/dist/development/src/mapper/select/WhereBuilder.cjs +3 -3
  38. package/dist/development/src/mapper/select/WhereBuilder.cjs.map +1 -1
  39. package/dist/development/src/mapper/select/WhereBuilder.js +3 -3
  40. package/dist/development/src/mapper/select/WhereBuilder.js.map +1 -1
  41. package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs +33 -3
  42. package/dist/development/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
  43. package/dist/development/src/mapper/select/handlers/FieldsVisitor.js +33 -3
  44. package/dist/development/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  45. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
  46. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
  47. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
  48. package/dist/development/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  49. package/dist/development/src/resolvers/MutationResolver.cjs +1 -0
  50. package/dist/development/src/resolvers/MutationResolver.cjs.map +1 -1
  51. package/dist/development/src/resolvers/MutationResolver.js +1 -0
  52. package/dist/development/src/resolvers/MutationResolver.js.map +1 -1
  53. package/dist/development/src/resolvers/RefreshViewResolver.cjs +21 -0
  54. package/dist/development/src/resolvers/RefreshViewResolver.cjs.map +1 -0
  55. package/dist/development/src/resolvers/RefreshViewResolver.js +21 -0
  56. package/dist/development/src/resolvers/RefreshViewResolver.js.map +1 -0
  57. package/dist/development/src/schema/ColumnTypeResolver.cjs +9 -0
  58. package/dist/development/src/schema/ColumnTypeResolver.cjs.map +1 -1
  59. package/dist/development/src/schema/ColumnTypeResolver.js +10 -1
  60. package/dist/development/src/schema/ColumnTypeResolver.js.map +1 -1
  61. package/dist/development/src/schema/ConditionTypeProvider.cjs +35 -23
  62. package/dist/development/src/schema/ConditionTypeProvider.cjs.map +1 -1
  63. package/dist/development/src/schema/ConditionTypeProvider.js +36 -24
  64. package/dist/development/src/schema/ConditionTypeProvider.js.map +1 -1
  65. package/dist/development/src/schema/CustomTypesProvider.cjs +30 -0
  66. package/dist/development/src/schema/CustomTypesProvider.cjs.map +1 -1
  67. package/dist/development/src/schema/CustomTypesProvider.js +30 -0
  68. package/dist/development/src/schema/CustomTypesProvider.js.map +1 -1
  69. package/dist/development/src/schema/GraphQlSchemaBuilder.cjs +6 -1
  70. package/dist/development/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
  71. package/dist/development/src/schema/GraphQlSchemaBuilder.js +6 -1
  72. package/dist/development/src/schema/GraphQlSchemaBuilder.js.map +1 -1
  73. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
  74. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
  75. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
  76. package/dist/development/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  77. package/dist/development/src/schema/OrderByTypeProvider.cjs +6 -1
  78. package/dist/development/src/schema/OrderByTypeProvider.cjs.map +1 -1
  79. package/dist/development/src/schema/OrderByTypeProvider.js +6 -1
  80. package/dist/development/src/schema/OrderByTypeProvider.js.map +1 -1
  81. package/dist/development/src/schema/RefreshViewMutationProvider.cjs +42 -0
  82. package/dist/development/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
  83. package/dist/development/src/schema/RefreshViewMutationProvider.js +42 -0
  84. package/dist/development/src/schema/RefreshViewMutationProvider.js.map +1 -0
  85. package/dist/development/src/schema/WhereTypeProvider.cjs +1 -1
  86. package/dist/development/src/schema/WhereTypeProvider.cjs.map +1 -1
  87. package/dist/development/src/schema/WhereTypeProvider.js +1 -1
  88. package/dist/development/src/schema/WhereTypeProvider.js.map +1 -1
  89. package/dist/development/src/schema/entities/FieldTypeVisitor.cjs +3 -3
  90. package/dist/development/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
  91. package/dist/development/src/schema/entities/FieldTypeVisitor.js +3 -3
  92. package/dist/development/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  93. package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs +1 -1
  94. package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
  95. package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js +1 -1
  96. package/dist/development/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  97. package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs +1 -1
  98. package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
  99. package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js +1 -1
  100. package/dist/development/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  101. package/dist/development/src/utils/viewComputedId.cjs +16 -0
  102. package/dist/development/src/utils/viewComputedId.cjs.map +1 -0
  103. package/dist/development/src/utils/viewComputedId.js +16 -0
  104. package/dist/development/src/utils/viewComputedId.js.map +1 -0
  105. package/dist/production/index.cjs +1 -0
  106. package/dist/production/index.cjs.map +1 -1
  107. package/dist/production/index.js +1 -0
  108. package/dist/production/index.js.map +1 -1
  109. package/dist/production/src/ExecutionContainer.cjs +6 -4
  110. package/dist/production/src/ExecutionContainer.cjs.map +1 -1
  111. package/dist/production/src/ExecutionContainer.js +6 -4
  112. package/dist/production/src/ExecutionContainer.js.map +1 -1
  113. package/dist/production/src/acl/Authorizator.cjs +5 -1
  114. package/dist/production/src/acl/Authorizator.cjs.map +1 -1
  115. package/dist/production/src/acl/Authorizator.js +5 -1
  116. package/dist/production/src/acl/Authorizator.js.map +1 -1
  117. package/dist/production/src/input-validation/ColumnValueResolver.cjs +1 -1
  118. package/dist/production/src/input-validation/ColumnValueResolver.cjs.map +1 -1
  119. package/dist/production/src/input-validation/ColumnValueResolver.js +1 -1
  120. package/dist/production/src/input-validation/ColumnValueResolver.js.map +1 -1
  121. package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs +3 -0
  122. package/dist/production/src/input-validation/dependencies/DependencyCollector.cjs.map +1 -1
  123. package/dist/production/src/input-validation/dependencies/DependencyCollector.js +3 -0
  124. package/dist/production/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
  125. package/dist/production/src/mapper/Mapper.cjs +1 -0
  126. package/dist/production/src/mapper/Mapper.cjs.map +1 -1
  127. package/dist/production/src/mapper/Mapper.js +1 -0
  128. package/dist/production/src/mapper/Mapper.js.map +1 -1
  129. package/dist/production/src/mapper/insert/Inserter.cjs +3 -2
  130. package/dist/production/src/mapper/insert/Inserter.cjs.map +1 -1
  131. package/dist/production/src/mapper/insert/Inserter.js +3 -2
  132. package/dist/production/src/mapper/insert/Inserter.js.map +1 -1
  133. package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs +3 -2
  134. package/dist/production/src/mapper/insert/SqlCreateInputProcessor.cjs.map +1 -1
  135. package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js +3 -2
  136. package/dist/production/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  137. package/dist/production/src/mapper/select/ConditionBuilder.cjs +9 -2
  138. package/dist/production/src/mapper/select/ConditionBuilder.cjs.map +1 -1
  139. package/dist/production/src/mapper/select/ConditionBuilder.js +10 -3
  140. package/dist/production/src/mapper/select/ConditionBuilder.js.map +1 -1
  141. package/dist/production/src/mapper/select/WhereBuilder.cjs +3 -3
  142. package/dist/production/src/mapper/select/WhereBuilder.cjs.map +1 -1
  143. package/dist/production/src/mapper/select/WhereBuilder.js +3 -3
  144. package/dist/production/src/mapper/select/WhereBuilder.js.map +1 -1
  145. package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs +33 -3
  146. package/dist/production/src/mapper/select/handlers/FieldsVisitor.cjs.map +1 -1
  147. package/dist/production/src/mapper/select/handlers/FieldsVisitor.js +33 -3
  148. package/dist/production/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  149. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs +6 -2
  150. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.cjs.map +1 -1
  151. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js +6 -2
  152. package/dist/production/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  153. package/dist/production/src/resolvers/MutationResolver.cjs +1 -0
  154. package/dist/production/src/resolvers/MutationResolver.cjs.map +1 -1
  155. package/dist/production/src/resolvers/MutationResolver.js +1 -0
  156. package/dist/production/src/resolvers/MutationResolver.js.map +1 -1
  157. package/dist/production/src/resolvers/RefreshViewResolver.cjs +21 -0
  158. package/dist/production/src/resolvers/RefreshViewResolver.cjs.map +1 -0
  159. package/dist/production/src/resolvers/RefreshViewResolver.js +21 -0
  160. package/dist/production/src/resolvers/RefreshViewResolver.js.map +1 -0
  161. package/dist/production/src/schema/ColumnTypeResolver.cjs +9 -0
  162. package/dist/production/src/schema/ColumnTypeResolver.cjs.map +1 -1
  163. package/dist/production/src/schema/ColumnTypeResolver.js +10 -1
  164. package/dist/production/src/schema/ColumnTypeResolver.js.map +1 -1
  165. package/dist/production/src/schema/ConditionTypeProvider.cjs +35 -23
  166. package/dist/production/src/schema/ConditionTypeProvider.cjs.map +1 -1
  167. package/dist/production/src/schema/ConditionTypeProvider.js +36 -24
  168. package/dist/production/src/schema/ConditionTypeProvider.js.map +1 -1
  169. package/dist/production/src/schema/CustomTypesProvider.cjs +30 -0
  170. package/dist/production/src/schema/CustomTypesProvider.cjs.map +1 -1
  171. package/dist/production/src/schema/CustomTypesProvider.js +30 -0
  172. package/dist/production/src/schema/CustomTypesProvider.js.map +1 -1
  173. package/dist/production/src/schema/GraphQlSchemaBuilder.cjs +6 -1
  174. package/dist/production/src/schema/GraphQlSchemaBuilder.cjs.map +1 -1
  175. package/dist/production/src/schema/GraphQlSchemaBuilder.js +6 -1
  176. package/dist/production/src/schema/GraphQlSchemaBuilder.js.map +1 -1
  177. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs +2 -1
  178. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.cjs.map +1 -1
  179. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js +2 -1
  180. package/dist/production/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  181. package/dist/production/src/schema/OrderByTypeProvider.cjs +6 -1
  182. package/dist/production/src/schema/OrderByTypeProvider.cjs.map +1 -1
  183. package/dist/production/src/schema/OrderByTypeProvider.js +6 -1
  184. package/dist/production/src/schema/OrderByTypeProvider.js.map +1 -1
  185. package/dist/production/src/schema/RefreshViewMutationProvider.cjs +42 -0
  186. package/dist/production/src/schema/RefreshViewMutationProvider.cjs.map +1 -0
  187. package/dist/production/src/schema/RefreshViewMutationProvider.js +42 -0
  188. package/dist/production/src/schema/RefreshViewMutationProvider.js.map +1 -0
  189. package/dist/production/src/schema/WhereTypeProvider.cjs +1 -1
  190. package/dist/production/src/schema/WhereTypeProvider.cjs.map +1 -1
  191. package/dist/production/src/schema/WhereTypeProvider.js +1 -1
  192. package/dist/production/src/schema/WhereTypeProvider.js.map +1 -1
  193. package/dist/production/src/schema/entities/FieldTypeVisitor.cjs +3 -3
  194. package/dist/production/src/schema/entities/FieldTypeVisitor.cjs.map +1 -1
  195. package/dist/production/src/schema/entities/FieldTypeVisitor.js +3 -3
  196. package/dist/production/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  197. package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs +1 -1
  198. package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.cjs.map +1 -1
  199. package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js +1 -1
  200. package/dist/production/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  201. package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs +1 -1
  202. package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.cjs.map +1 -1
  203. package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js +1 -1
  204. package/dist/production/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  205. package/dist/production/src/utils/viewComputedId.cjs +16 -0
  206. package/dist/production/src/utils/viewComputedId.cjs.map +1 -0
  207. package/dist/production/src/utils/viewComputedId.js +16 -0
  208. package/dist/production/src/utils/viewComputedId.js.map +1 -0
  209. package/dist/tests/cases/integration/graphQlRequests/validation/utils.d.ts.map +1 -1
  210. package/dist/tests/src/tags.d.ts.map +1 -1
  211. package/dist/tests/src/test.d.ts.map +1 -1
  212. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  213. package/dist/tests/src/testUuid.d.ts.map +1 -1
  214. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  215. package/dist/types/ExecutionContainer.d.ts +8 -2
  216. package/dist/types/ExecutionContainer.d.ts.map +1 -1
  217. package/dist/types/acl/Authorizator.d.ts +3 -1
  218. package/dist/types/acl/Authorizator.d.ts.map +1 -1
  219. package/dist/types/acl/VariableUtils.d.ts.map +1 -1
  220. package/dist/types/input-validation/ValidationContext.d.ts.map +1 -1
  221. package/dist/types/input-validation/ValidationEvaluation.d.ts.map +1 -1
  222. package/dist/types/input-validation/ValidationPath.d.ts.map +1 -1
  223. package/dist/types/introspection/introspection.schema.d.ts.map +1 -1
  224. package/dist/types/mapper/ColumnValue.d.ts.map +1 -1
  225. package/dist/types/mapper/ErrorUtils.d.ts.map +1 -1
  226. package/dist/types/mapper/EventManager.d.ts.map +1 -1
  227. package/dist/types/mapper/MutationProcessorHelper.d.ts.map +1 -1
  228. package/dist/types/mapper/Result.d.ts.map +1 -1
  229. package/dist/types/mapper/delete/helpers.d.ts.map +1 -1
  230. package/dist/types/mapper/insert/Inserter.d.ts +4 -1
  231. package/dist/types/mapper/insert/Inserter.d.ts.map +1 -1
  232. package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts +4 -1
  233. package/dist/types/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  234. package/dist/types/mapper/select/ConditionBuilder.d.ts +2 -2
  235. package/dist/types/mapper/select/ConditionBuilder.d.ts.map +1 -1
  236. package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts +4 -1
  237. package/dist/types/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  238. package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts +5 -2
  239. package/dist/types/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  240. package/dist/types/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
  241. package/dist/types/mapper/select/optimizer/helpers.d.ts.map +1 -1
  242. package/dist/types/resolvers/ReadHelpers.d.ts.map +1 -1
  243. package/dist/types/resolvers/RefreshViewResolver.d.ts +13 -0
  244. package/dist/types/resolvers/RefreshViewResolver.d.ts.map +1 -0
  245. package/dist/types/schema/ColumnTypeResolver.d.ts +5 -5
  246. package/dist/types/schema/ColumnTypeResolver.d.ts.map +1 -1
  247. package/dist/types/schema/ConditionTypeProvider.d.ts +1 -0
  248. package/dist/types/schema/ConditionTypeProvider.d.ts.map +1 -1
  249. package/dist/types/schema/CustomTypesProvider.d.ts +1 -0
  250. package/dist/types/schema/CustomTypesProvider.d.ts.map +1 -1
  251. package/dist/types/schema/GraphQlSchemaBuilder.d.ts +3 -1
  252. package/dist/types/schema/GraphQlSchemaBuilder.d.ts.map +1 -1
  253. package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
  254. package/dist/types/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
  255. package/dist/types/schema/OperationExtension.d.ts.map +1 -1
  256. package/dist/types/schema/OrderByTypeProvider.d.ts.map +1 -1
  257. package/dist/types/schema/RefreshViewMutationProvider.d.ts +11 -0
  258. package/dist/types/schema/RefreshViewMutationProvider.d.ts.map +1 -0
  259. package/dist/types/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +1 -1
  260. package/dist/types/schema/utils.d.ts.map +1 -1
  261. package/dist/types/tsconfig.tsbuildinfo +1 -1
  262. package/dist/types/utils/isIt.d.ts.map +1 -1
  263. package/dist/types/utils/paginationUtils.d.ts.map +1 -1
  264. package/dist/types/utils/promises.d.ts.map +1 -1
  265. package/dist/types/utils/singletonFactory.d.ts.map +1 -1
  266. package/dist/types/utils/strings.d.ts.map +1 -1
  267. package/dist/types/utils/tuple.d.ts.map +1 -1
  268. package/dist/types/utils/uniqueWhereFields.d.ts.map +1 -1
  269. package/dist/types/utils/viewComputedId.d.ts +2 -0
  270. package/dist/types/utils/viewComputedId.d.ts.map +1 -0
  271. package/package.json +11 -11
  272. package/src/ExecutionContainer.ts +9 -5
  273. package/src/acl/Authorizator.ts +5 -0
  274. package/src/input-validation/ColumnValueResolver.ts +1 -1
  275. package/src/mapper/insert/Inserter.ts +2 -1
  276. package/src/mapper/insert/SqlCreateInputProcessor.ts +2 -1
  277. package/src/mapper/select/ConditionBuilder.ts +19 -5
  278. package/src/mapper/select/WhereBuilder.ts +3 -3
  279. package/src/mapper/select/handlers/FieldsVisitor.ts +36 -1
  280. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +6 -1
  281. package/src/resolvers/RefreshViewResolver.ts +23 -0
  282. package/src/schema/ColumnTypeResolver.ts +15 -3
  283. package/src/schema/ConditionTypeProvider.ts +40 -25
  284. package/src/schema/CustomTypesProvider.ts +37 -0
  285. package/src/schema/GraphQlSchemaBuilder.ts +8 -0
  286. package/src/schema/GraphQlSchemaBuilderFactory.ts +5 -2
  287. package/src/schema/OrderByTypeProvider.ts +6 -1
  288. package/src/schema/RefreshViewMutationProvider.ts +47 -0
  289. package/src/schema/WhereTypeProvider.ts +1 -1
  290. package/src/schema/entities/FieldTypeVisitor.ts +3 -3
  291. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +1 -1
  292. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +1 -1
  293. package/src/utils/viewComputedId.ts +23 -0
  294. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +38 -2
  295. package/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +6 -0
  296. package/tests/cases/integration/graphQlSchema/schema-array.gql +257 -0
  297. package/tests/cases/integration/graphQlSchema/schema-column-types.gql +420 -0
  298. package/tests/src/test.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"isIt.d.ts","sourceRoot":"","sources":["../../../src/utils/isIt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAG,GAAG,IAAI,CAKhH,CAAA"}
1
+ {"version":3,"file":"isIt.d.ts","sourceRoot":"","sources":["../../../src/utils/isIt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAG,GAAG,IAAI,CAKhH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"paginationUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/paginationUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,qBAAa,gBAAgB;aAEX,aAAa,EAAE,UAAU,GAAG,SAAS;aACrC,SAAS,EAAE,UAAU,GAAG,SAAS;gBADjC,aAAa,EAAE,UAAU,GAAG,SAAS,EACrC,SAAS,EAAE,UAAU,GAAG,SAAS;IAGlD,IAAI,kBAAkB,YAErB;IAED,IAAI,aAAa,YAEhB;IAEM,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG;CAc9E;AACD,eAAO,MAAM,sBAAsB,aAAc,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,qBAmBtF,CAAA"}
1
+ {"version":3,"file":"paginationUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/paginationUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,qBAAa,gBAAgB;aAEX,aAAa,EAAE,UAAU,GAAG,SAAS;aACrC,SAAS,EAAE,UAAU,GAAG,SAAS;gBADjC,aAAa,EAAE,UAAU,GAAG,SAAS,EACrC,SAAS,EAAE,UAAU,GAAG,SAAS;IAGlD,IAAI,kBAAkB,YAErB;IAED,IAAI,aAAa,YAEhB;IAEM,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG;CAc9E;AACD,eAAO,MAAM,sBAAsB,GAAI,UAAU,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,qBAmBtF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../../src/utils/promises.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,YAAa,oBAAoB,CAAC,GAAG,CAAC,EAAE,KAAG,GAAG,EAEvE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,CAAC,WAAW,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAG,CAAC,EAE3E,CAAA"}
1
+ {"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../../src/utils/promises.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,GAAI,SAAS,oBAAoB,CAAC,GAAG,CAAC,EAAE,KAAG,GAAG,EAEvE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAG,CAAC,EAE3E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"singletonFactory.d.ts","sourceRoot":"","sources":["../../../src/utils/singletonFactory.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,EAAE,WAAW,IAAI,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,YAGjF,EAAE,SAAS,IAAI,KAAG,CAkBhC,CAAA"}
1
+ {"version":3,"file":"singletonFactory.d.ts","sourceRoot":"","sources":["../../../src/utils/singletonFactory.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,MAGvF,MAAM,EAAE,EAAE,OAAO,IAAI,KAAG,CAkBhC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../../src/utils/strings.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,qBAAqB,UAAW,MAAM,WAE3C,CAAA;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAA"}
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../../src/utils/strings.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,qBAAqB,GAAI,OAAO,MAAM,WAE3C,CAAA;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/utils/tuple.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,OAAO,EAAE,WAAW,CAAC,MAAS,CAAA"}
1
+ {"version":3,"file":"tuple.d.ts","sourceRoot":"","sources":["../../../src/utils/tuple.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,MAAS,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"uniqueWhereFields.d.ts","sourceRoot":"","sources":["../../../src/utils/uniqueWhereFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,KAAK,YAAY,GAAG,SAAS,MAAM,EAAE,CAAA;AACrC,eAAO,MAAM,uBAAuB,WAAY,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,KAAG,SAAS,CAAC,YAAY,CAAC,EAc3G,CAAA"}
1
+ {"version":3,"file":"uniqueWhereFields.d.ts","sourceRoot":"","sources":["../../../src/utils/uniqueWhereFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,KAAK,YAAY,GAAG,SAAS,MAAM,EAAE,CAAA;AACrC,eAAO,MAAM,uBAAuB,GAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,CAAC,MAAM,KAAG,SAAS,CAAC,YAAY,CAAC,EAc3G,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const viewComputedId: (inputs: (string)[]) => string;
2
+ //# sourceMappingURL=viewComputedId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewComputedId.d.ts","sourceRoot":"","sources":["../../../src/utils/viewComputedId.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,GAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAG,MAWnD,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-content-api",
3
- "version": "2.0.2",
3
+ "version": "2.1.0-alpha.10",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/production/index.js",
6
6
  "typings": "./dist/types/index.d.ts",
@@ -26,19 +26,19 @@
26
26
  "generate": "gql-gen --config graphql.codegen.yml"
27
27
  },
28
28
  "dependencies": {
29
- "@contember/database": "2.0.2",
30
- "@contember/dic": "2.0.2",
31
- "@contember/graphql-utils": "2.0.2",
32
- "@contember/logger": "2.0.2",
33
- "@contember/schema": "2.0.2",
34
- "@contember/schema-definition": "2.0.2",
35
- "@contember/schema-utils": "2.0.2",
29
+ "@contember/database": "2.1.0-alpha.10",
30
+ "@contember/dic": "2.1.0-alpha.10",
31
+ "@contember/graphql-utils": "2.1.0-alpha.10",
32
+ "@contember/logger": "2.1.0-alpha.10",
33
+ "@contember/schema": "2.1.0-alpha.10",
34
+ "@contember/schema-definition": "2.1.0-alpha.10",
35
+ "@contember/schema-utils": "2.1.0-alpha.10",
36
36
  "fast-deep-equal": "^3.1.3"
37
37
  },
38
38
  "devDependencies": {
39
- "@contember/database-tester": "2.0.2",
40
- "@contember/schema-definition": "2.0.2",
41
- "@types/node": "^20.16.11",
39
+ "@contember/database-tester": "2.1.0-alpha.10",
40
+ "@contember/schema-definition": "2.1.0-alpha.10",
41
+ "@types/node": "^20.17.22",
42
42
  "graphql": "^16.9.0",
43
43
  "pg": "^8.12.0"
44
44
  },
@@ -28,7 +28,7 @@ import {
28
28
  import { Builder } from '@contember/dic'
29
29
  import { Acl, Model, Schema } from '@contember/schema'
30
30
  import { Client, DatabaseMetadata, SelectBuilder as DbSelectBuilder } from '@contember/database'
31
- import { Providers } from '@contember/schema-utils'
31
+ import { ParsedMembership, Providers } from '@contember/schema-utils'
32
32
  import { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'
33
33
  import { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'
34
34
  import { WhereOptimizer } from './mapper/select/optimizer/WhereOptimizer'
@@ -41,6 +41,7 @@ import {
41
41
  QueryAstFactory,
42
42
  ValidationDataSelector,
43
43
  } from './input-validation'
44
+ import { RefreshViewResolver } from './resolvers/RefreshViewResolver'
44
45
 
45
46
  export type ExecutionContainerArgs = {
46
47
  schema: Schema
@@ -59,6 +60,7 @@ export interface ExecutionContainer {
59
60
  readResolver: ReadResolver
60
61
  mutationResolver: MutationResolver
61
62
  validationResolver: ValidationResolver
63
+ refreshViewResolver: RefreshViewResolver
62
64
  }
63
65
 
64
66
  export type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>
@@ -122,8 +124,8 @@ export class ExecutionContainerFactory {
122
124
  new OrderByBuilder(schema.model, joinBuilder))
123
125
  .addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>
124
126
  new RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))
125
- .addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema }) =>
126
- new FieldsVisitorFactory(relationFetcher, predicateFactory, schema.settings.content ?? {}))
127
+ .addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, schema, providers }) =>
128
+ new FieldsVisitorFactory(schema.model, relationFetcher, predicateFactory, schema.settings.content ?? {}, providers))
127
129
  .addService('metaHandler', ({ whereBuilder, predicateFactory }) =>
128
130
  new MetaHandler(whereBuilder, predicateFactory))
129
131
  .addService('uniqueWhereExpander', ({ schema }) =>
@@ -169,7 +171,7 @@ export class ExecutionContainerFactory {
169
171
  .addService('updater', ({ predicateFactory, updateBuilderFactory, schema, schemaDatabaseMetadata }) =>
170
172
  new Updater(schema.model, schemaDatabaseMetadata, predicateFactory, updateBuilderFactory))
171
173
  .addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>
172
- new Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))
174
+ new Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers, { uuidVersion: schema.settings.content?.uuidVersion }))
173
175
  .addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {
174
176
  return new MapperFactory(
175
177
  db,
@@ -209,10 +211,12 @@ export class ExecutionContainerFactory {
209
211
  new MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))
210
212
  .addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>
211
213
  new ValidationResolver(mapperFactory, inputPreValidator))
214
+ .addService('refreshViewResolver', ({ schema, mapperFactory }) =>
215
+ new RefreshViewResolver(schema, mapperFactory))
212
216
  }
213
217
 
214
218
  public create(args: ExecutionContainerArgs): ExecutionContainer {
215
- return this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')
219
+ return this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver', 'refreshViewResolver')
216
220
  }
217
221
  }
218
222
 
@@ -7,6 +7,7 @@ export class Authorizator {
7
7
  constructor(
8
8
  private readonly permissions: Acl.Permissions,
9
9
  private readonly defaultCustomPrimary: boolean,
10
+ private readonly allowRefreshMaterializedView: boolean,
10
11
  ) {
11
12
  }
12
13
 
@@ -56,4 +57,8 @@ export class Authorizator {
56
57
  isRootOperationDisallowed(entity: string, operation: Acl.Operation): boolean {
57
58
  return this.permissions?.[entity]?.operations?.noRoot?.includes(operation) ?? false
58
59
  }
60
+
61
+ isRefreshMaterializedViewAllowed(entity: string): boolean {
62
+ return this.permissions?.[entity]?.operations?.refreshMaterializedView ?? this.allowRefreshMaterializedView
63
+ }
59
64
  }
@@ -9,7 +9,7 @@ export class ColumnValueResolver {
9
9
  return '00000000-0000-0000-0000-000000000000'
10
10
  }
11
11
  try {
12
- return resolveColumnValue(context, this.providers)
12
+ return resolveColumnValue(context, this.providers, {})
13
13
  } catch (e) {
14
14
  if (e instanceof NoDataError) {
15
15
  return undefined
@@ -16,6 +16,7 @@ export class Inserter {
16
16
  private readonly schemaDatabaseMetadata: DatabaseMetadata,
17
17
  private readonly insertBuilderFactory: InsertBuilderFactory,
18
18
  private readonly providers: Providers,
19
+ private readonly options: { uuidVersion?: 4 | 7 },
19
20
  ) {}
20
21
 
21
22
  public async insert(
@@ -30,7 +31,7 @@ export class Inserter {
30
31
  insertBuilder.addPredicates(Object.keys(data))
31
32
 
32
33
  const visitor = new CreateInputVisitor<SqlCreateInputProcessorResult>(
33
- new SqlCreateInputProcessor(insertBuilder, mapper, this.providers),
34
+ new SqlCreateInputProcessor(insertBuilder, mapper, this.providers, this.options),
34
35
  this.schema,
35
36
  data,
36
37
  )
@@ -25,6 +25,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<SqlCreateIn
25
25
  private readonly insertBuilder: InsertBuilder,
26
26
  private readonly mapper: Mapper,
27
27
  private readonly providers: Providers,
28
+ private readonly options: { uuidVersion?: 4 | 7 } = {},
28
29
  ) {
29
30
  this.oneHasOneInverseCreateInputProcessor = new OneHasOneInverseCreateInputProcessor(this.mapper)
30
31
  this.oneHasOneOwningCreateInputProcessor = new OneHasOneOwningCreateInputProcessor(this.mapper, this.insertBuilder)
@@ -36,7 +37,7 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<SqlCreateIn
36
37
  public async column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<SqlCreateInputProcessorResult> {
37
38
  this.insertBuilder.addFieldValue(
38
39
  context.column.name,
39
- resolveColumnValue(context, this.providers),
40
+ resolveColumnValue(context, this.providers, this.options),
40
41
  )
41
42
  return []
42
43
  }
@@ -1,5 +1,5 @@
1
- import { Input } from '@contember/schema'
2
- import { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator } from '@contember/database'
1
+ import { Input, Model } from '@contember/schema'
2
+ import { QueryBuilder, ConditionBuilder as SqlConditionBuilder, Operator, Literal, formatColumnIdentifier, Compiler } from '@contember/database'
3
3
  import { UserError } from '../../exception'
4
4
 
5
5
  export class ConditionBuilder {
@@ -7,7 +7,7 @@ export class ConditionBuilder {
7
7
  builder: SqlConditionBuilder,
8
8
  tableName: string,
9
9
  columnName: string,
10
- columnType: string,
10
+ columnType: Pick<Model.AnyColumn, 'type' | 'list' | 'columnType'>,
11
11
  condition: Input.Condition<any> | null,
12
12
  ): SqlConditionBuilder {
13
13
  if (condition === null) {
@@ -37,21 +37,35 @@ export class ConditionBuilder {
37
37
  and: (builder, expressions) => builder.and(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),
38
38
  or: (builder, expressions) => builder.or(builder2 => expressions.reduce((builder3, expr) => this.build(builder3, tableName, columnName, columnType, expr), builder2)),
39
39
  not: (builder, expression) => builder.not(builder2 => this.build(builder2, tableName, columnName, columnType, expression)),
40
+
41
+ isNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),
42
+
40
43
  eq: (builder, value) => builder.compare(columnIdentifier, Operator.eq, value),
41
44
  notEq: (builder, value) => builder.compare(columnIdentifier, Operator.notEq, value),
42
- isNull: (builder, value) => value ? builder.isNull(columnIdentifier) : builder.not(clause => clause.isNull(columnIdentifier)),
43
- in: (builder, values) => builder.in(columnIdentifier, values, columnType),
45
+ in: (builder, values) => builder.in(columnIdentifier, values, columnType.columnType),
44
46
  notIn: (builder, values) => builder.not(builder2 => builder2.in(columnIdentifier, values)),
45
47
  lt: (builder, value) => builder.compare(columnIdentifier, Operator.lt, value),
46
48
  lte: (builder, value) => builder.compare(columnIdentifier, Operator.lte, value),
47
49
  gt: (builder, value) => builder.compare(columnIdentifier, Operator.gt, value),
48
50
  gte: (builder, value) => builder.compare(columnIdentifier, Operator.gte, value),
51
+
52
+ includes: (builder, value) => {
53
+ const cast = columnType.type === Model.ColumnType.Enum
54
+ ? `${Compiler.SCHEMA_PLACEHOLDER}."${columnType.columnType}"`
55
+ : columnType.columnType
56
+
57
+ return builder.raw(`${formatColumnIdentifier(columnIdentifier)} @> ARRAY[?]::${cast}[]`, value)
58
+ },
59
+ maxLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) <= ?`, value),
60
+ minLength: (builder, value) => builder.raw(`array_length(${formatColumnIdentifier(columnIdentifier)}, 1) >= ?`, value),
61
+
49
62
  contains: (builder, value) => builder.compare(columnIdentifier, Operator.contains, value),
50
63
  startsWith: (builder, value) => builder.compare(columnIdentifier, Operator.startsWith, value),
51
64
  endsWith: (builder, value) => builder.compare(columnIdentifier, Operator.endsWith, value),
52
65
  containsCI: (builder, value) => builder.compare(columnIdentifier, Operator.containsCI, value),
53
66
  startsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.startsWithCI, value),
54
67
  endsWithCI: (builder, value) => builder.compare(columnIdentifier, Operator.endsWithCI, value),
68
+
55
69
  never: builder => builder.raw('false'),
56
70
  always: builder => builder.raw('true'),
57
71
 
@@ -160,7 +160,7 @@ export class WhereBuilder {
160
160
  conditionBuilder,
161
161
  tableName,
162
162
  relation.joiningColumn.columnName,
163
- (targetEntity.fields[targetEntity.primary] as Model.AnyColumn).columnType,
163
+ (targetEntity.fields[targetEntity.primary] as Model.AnyColumn),
164
164
  primaryCondition,
165
165
  )
166
166
  }
@@ -182,7 +182,7 @@ export class WhereBuilder {
182
182
 
183
183
  conditionBuilder = acceptFieldVisitor<SqlConditionBuilder>(this.schema, entity, fieldName, {
184
184
  visitColumn: ({ entity, column }) => {
185
- return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column.columnType, fieldWhere as Input.Condition<Input.ColumnValue>)
185
+ return this.conditionBuilder.build(conditionBuilder, tableName, column.columnName, column, fieldWhere as Input.Condition<Input.ColumnValue>)
186
186
  },
187
187
  visitOneHasOneInverse: joinedWhere,
188
188
  visitOneHasOneOwning: joinedWhere,
@@ -275,7 +275,7 @@ export class WhereBuilder {
275
275
  const primaryCondition = this.transformWhereToPrimaryCondition(relationWhere, targetEntity.primary)
276
276
  if (primaryCondition !== null) {
277
277
 
278
- const columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn).columnType
278
+ const columnType = (targetEntity.fields[targetEntity.primary] as Model.AnyColumn)
279
279
 
280
280
  return qb.where(condition =>
281
281
  this.conditionBuilder.build(condition, junctionPath.alias, toColumn, columnType, primaryCondition),
@@ -4,20 +4,27 @@ import { RelationFetcher } from '../RelationFetcher'
4
4
  import { SelectExecutionHandlerContext } from '../SelectExecutionHandler'
5
5
  import { PredicateFactory } from '../../../acl'
6
6
  import { Literal, wrapIdentifier } from '@contember/database'
7
+ import { ColumnValueGetter } from '../SelectHydrator'
8
+ import { Providers } from '@contember/schema-utils'
9
+ import { getColumnName } from '@contember/schema-utils'
10
+ import { viewComputedId } from '../../../utils/viewComputedId'
7
11
 
8
12
  export class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.ColumnVisitor<void> {
9
13
  constructor(
14
+ private readonly schema: Model.Schema,
10
15
  private readonly relationFetcher: RelationFetcher,
11
16
  private readonly predicateFactory: PredicateFactory,
12
17
  private readonly mapper: Mapper,
13
18
  private readonly executionContext: SelectExecutionHandlerContext,
14
19
  private readonly relationPath: Model.AnyRelationContext[],
15
20
  private readonly settings: Settings.ContentSettings,
21
+ private readonly providers: Providers,
16
22
  ) {}
17
23
 
18
24
  visitColumn({ entity, column }: Model.ColumnContext): void {
19
25
  const columnPath = this.executionContext.path
20
- const tableAlias = columnPath.back().alias
26
+ const tablePath = columnPath.back()
27
+ const tableAlias = tablePath.alias
21
28
  const columnAlias = columnPath.alias
22
29
 
23
30
  let selectFrom = wrapIdentifier(tableAlias) + '.' + wrapIdentifier(column.columnName)
@@ -27,10 +34,38 @@ export class FieldsVisitor implements Model.RelationByTypeVisitor<void>, Model.C
27
34
  if (column.type === Model.ColumnType.DateTime && this.settings.fullDateTimeResponse) {
28
35
  selectFrom += '::text'
29
36
  }
37
+ if (column.type === Model.ColumnType.Enum && column.list) {
38
+ selectFrom += '::text[]'
39
+ }
40
+
41
+ let columnValueGetter: ColumnValueGetter | undefined = undefined
42
+ if (entity.view && column.name === entity.primary && column.type === Model.ColumnType.Uuid) {
43
+ if (entity.view.idSource) {
44
+ const aliases: string[] = []
45
+ for (const source of entity.view.idSource) {
46
+ const columnName = getColumnName(this.schema, entity, source)
47
+ const idSrcPath = columnPath.for(source + '__id_src')
48
+ aliases.push(idSrcPath.alias)
49
+ this.executionContext.addColumn({
50
+ query: qb => qb.select([tableAlias, columnName], idSrcPath.alias),
51
+ })
52
+ }
53
+
54
+ columnValueGetter = row => {
55
+ return viewComputedId(aliases.map(it => row[it]?.toString() || ''))
56
+ }
57
+ } else {
58
+ columnValueGetter = row => {
59
+ return row[columnAlias] ?? (this.providers.uuid({ version: this.settings.uuidVersion }))
60
+ }
61
+
62
+ }
63
+ }
30
64
 
31
65
  this.executionContext.addColumn({
32
66
  query: qb => qb.select(new Literal(selectFrom), columnAlias),
33
67
  predicate: this.getRequiredPredicate(entity, column),
68
+ valueGetter: columnValueGetter,
34
69
  })
35
70
  }
36
71
 
@@ -3,23 +3,28 @@ import { RelationFetcher } from '../RelationFetcher'
3
3
  import { Mapper } from '../../Mapper'
4
4
  import { SelectExecutionHandlerContext } from '../SelectExecutionHandler'
5
5
  import { PredicateFactory } from '../../../acl'
6
- import { Settings } from '@contember/schema'
6
+ import { Model, Settings } from '@contember/schema'
7
+ import { Providers } from '@contember/schema-utils'
7
8
 
8
9
  export class FieldsVisitorFactory {
9
10
  constructor(
11
+ private readonly schema: Model.Schema,
10
12
  private readonly relationFetcher: RelationFetcher,
11
13
  private readonly predicateFactory: PredicateFactory,
12
14
  private readonly settings: Settings.ContentSettings,
15
+ private readonly providers: Providers,
13
16
  ) {}
14
17
 
15
18
  create(mapper: Mapper, context: SelectExecutionHandlerContext): FieldsVisitor {
16
19
  return new FieldsVisitor(
20
+ this.schema,
17
21
  this.relationFetcher,
18
22
  this.predicateFactory,
19
23
  mapper,
20
24
  context,
21
25
  context.relationPath,
22
26
  this.settings,
27
+ this.providers,
23
28
  )
24
29
  }
25
30
  }
@@ -0,0 +1,23 @@
1
+ import { Schema } from '@contember/schema'
2
+ import { MapperFactory } from '../mapper'
3
+ import { wrapIdentifier } from '@contember/database'
4
+
5
+ export class RefreshViewResolver {
6
+ constructor(
7
+ private readonly schema: Schema,
8
+ private readonly mapperFactory: MapperFactory,
9
+ ) {
10
+ }
11
+
12
+ public async resolve(entity: string, options?: { concurrently?: boolean }): Promise<{ ok: boolean }> {
13
+ const mapper = this.mapperFactory.create()
14
+ const entityModel = this.schema.model.entities[entity]
15
+ if (!entityModel) {
16
+ throw new Error(`Entity ${entity} not found`)
17
+ }
18
+ const concurrently = options?.concurrently ? ' CONCURRENTLY' : ''
19
+ await mapper.db.query(`REFRESH MATERIALIZED VIEW${concurrently} ${wrapIdentifier(mapper.db.schema)}.${wrapIdentifier(entityModel.tableName)}`)
20
+
21
+ return { ok: true }
22
+ }
23
+ }
@@ -1,4 +1,4 @@
1
- import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLScalarType, GraphQLString } from 'graphql'
1
+ import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLScalarType, GraphQLString } from 'graphql'
2
2
  import { Model } from '@contember/schema'
3
3
  import { EnumsProvider } from './EnumsProvider'
4
4
  import { CustomTypesProvider } from './CustomTypesProvider'
@@ -7,6 +7,8 @@ import { singletonFactory } from '../utils'
7
7
 
8
8
  type ScalarType = Exclude<Model.ColumnType, Model.ColumnType.Enum>
9
9
 
10
+ export type ColumnGraphQLType = GraphQLScalarType | GraphQLEnumType | GraphQLList<GraphQLNonNull<GraphQLScalarType | GraphQLEnumType>>
11
+
10
12
  export class ColumnTypeResolver {
11
13
  private schema: Model.Schema
12
14
  private enumsProvider: EnumsProvider
@@ -36,7 +38,15 @@ export class ColumnTypeResolver {
36
38
  }
37
39
  }
38
40
 
39
- public getType(column: Model.AnyColumn): GraphQLScalarType | GraphQLEnumType {
41
+ public getType(column: Model.AnyColumn): [type: ColumnGraphQLType, baseType: GraphQLScalarType | GraphQLEnumType] {
42
+ const baseType = this.getBaseType(column)
43
+ return [
44
+ column.list ? new GraphQLList(new GraphQLNonNull(baseType)) : baseType,
45
+ baseType,
46
+ ]
47
+ }
48
+
49
+ private getBaseType(column: Model.AnyColumn): GraphQLScalarType | GraphQLEnumType {
40
50
  if (column.typeAlias) {
41
51
  if (column.type === Model.ColumnType.Enum) {
42
52
  throw new Error('GraphQL type alias cannot be specified for enum type')
@@ -62,7 +72,7 @@ export class ColumnTypeResolver {
62
72
  }
63
73
  }
64
74
 
65
- public getScalarType(type: ScalarType): GraphQLScalarType {
75
+ private getScalarType(type: ScalarType): GraphQLScalarType {
66
76
  switch (type) {
67
77
  case Model.ColumnType.Int:
68
78
  return GraphQLInt
@@ -76,6 +86,8 @@ export class ColumnTypeResolver {
76
86
  return GraphQLBoolean
77
87
  case Model.ColumnType.DateTime:
78
88
  return this.customTypeProvider.dateTimeType
89
+ case Model.ColumnType.Time:
90
+ return this.customTypeProvider.timeType
79
91
  case Model.ColumnType.Date:
80
92
  return this.customTypeProvider.dateType
81
93
  case Model.ColumnType.Json:
@@ -4,6 +4,7 @@ import {
4
4
  GraphQLEnumType,
5
5
  GraphQLInputFieldConfigMap,
6
6
  GraphQLInputObjectType,
7
+ GraphQLInt,
7
8
  GraphQLList,
8
9
  GraphQLNonNull,
9
10
  GraphQLScalarType,
@@ -12,24 +13,30 @@ import {
12
13
  import { singletonFactory } from '../utils'
13
14
  import { ColumnTypeResolver } from './ColumnTypeResolver'
14
15
  import { GqlTypeName } from './utils'
16
+ import { ImplementationException } from '../exception'
15
17
 
16
18
  export class ConditionTypeProvider {
17
- private conditions = singletonFactory<GraphQLInputObjectType, string, GraphQLScalarType | GraphQLEnumType>(
18
- (name, type) => this.createCondition(type),
19
+ private conditions = singletonFactory<GraphQLInputObjectType, string, [GraphQLScalarType | GraphQLEnumType, Model.AnyColumn]>(
20
+ (name, [type, column]) => this.createCondition(name, column, type),
19
21
  )
20
22
 
21
23
  constructor(private readonly columnTypeResolver: ColumnTypeResolver) {}
22
24
 
23
25
  public getCondition(column: Model.AnyColumn): GraphQLInputObjectType {
24
- const basicType = this.columnTypeResolver.getType(column)
25
- return this.conditions(basicType.name, basicType)
26
+ const [graphqlType, baseType] = this.columnTypeResolver.getType(column)
27
+ const name = this.createName(column, baseType.name)
28
+ return this.conditions(name, [baseType, column])
26
29
  }
27
30
 
28
- private createCondition(type: GraphQLScalarType | GraphQLEnumType): GraphQLInputObjectType {
29
- const suffix =
30
- typeof type === 'object' && type.constructor && type.constructor.name === 'GraphQLEnumType' ? 'Enum' : ''
31
+ private createName(column: Model.AnyColumn, typeName: string): string {
32
+ const suffix = column.type === Model.ColumnType.Enum ? 'Enum' : ''
33
+ const arraySuffix = column.list ? 'List' : ''
34
+ return GqlTypeName`${typeName}${suffix}${arraySuffix}Condition`
35
+ }
36
+
37
+ private createCondition(name: string, column: Model.AnyColumn, type: GraphQLScalarType | GraphQLEnumType): GraphQLInputObjectType {
31
38
  const condition: GraphQLInputObjectType = new GraphQLInputObjectType({
32
- name: GqlTypeName`${type.name}${suffix}Condition`,
39
+ name: name,
33
40
  fields: (): GraphQLInputFieldConfigMap => {
34
41
  const conditions: GraphQLInputFieldConfigMap = {
35
42
  and: { type: new GraphQLList(new GraphQLNonNull(condition)) },
@@ -39,25 +46,33 @@ export class ConditionTypeProvider {
39
46
  null: { type: GraphQLBoolean },
40
47
  isNull: { type: GraphQLBoolean },
41
48
  }
42
- if (type.name !== 'Json') {
43
- conditions.eq = { type }
44
- conditions.notEq = { type }
45
- conditions.in = { type: new GraphQLList(new GraphQLNonNull(type)) }
46
- conditions.notIn = { type: new GraphQLList(new GraphQLNonNull(type)) }
47
- conditions.lt = { type: type }
48
- conditions.lte = { type: type }
49
- conditions.gt = { type: type }
50
- conditions.gte = { type: type }
51
- }
52
- if (type.name === 'String') {
53
- conditions.contains = { type: GraphQLString }
54
- conditions.startsWith = { type: GraphQLString }
55
- conditions.endsWith = { type: GraphQLString }
49
+ if (column.list) {
50
+ conditions.minLength = { type: GraphQLInt }
51
+ conditions.maxLength = { type: GraphQLInt }
52
+ conditions.includes = { type: type }
53
+ } else {
54
+ if (column.type !== Model.ColumnType.Json) {
55
+ conditions.eq = { type }
56
+ conditions.notEq = { type }
57
+ conditions.in = { type: new GraphQLList(new GraphQLNonNull(type)) }
58
+ conditions.notIn = { type: new GraphQLList(new GraphQLNonNull(type)) }
59
+ conditions.lt = { type: type }
60
+ conditions.lte = { type: type }
61
+ conditions.gt = { type: type }
62
+ conditions.gte = { type: type }
63
+ }
64
+ if (column.type === Model.ColumnType.String) {
65
+ conditions.contains = { type: GraphQLString }
66
+ conditions.startsWith = { type: GraphQLString }
67
+ conditions.endsWith = { type: GraphQLString }
56
68
 
57
- conditions.containsCI = { type: GraphQLString }
58
- conditions.startsWithCI = { type: GraphQLString }
59
- conditions.endsWithCI = { type: GraphQLString }
69
+ conditions.containsCI = { type: GraphQLString }
70
+ conditions.startsWithCI = { type: GraphQLString }
71
+ conditions.endsWithCI = { type: GraphQLString }
72
+ }
60
73
  }
74
+
75
+
61
76
  return conditions
62
77
  },
63
78
  })
@@ -1,11 +1,31 @@
1
1
  import { GraphQLScalarType, Kind } from 'graphql'
2
2
  import { JSONType, UuidType } from '@contember/graphql-utils'
3
3
 
4
+ const TIME_REGEX = /^([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d)(?:\.(\d+))?)?$/
5
+
6
+ function validateTime(value: unknown): string {
7
+ if (typeof value !== 'string') {
8
+ throw new TypeError(`Time value must be a string, got: ${typeof value}`)
9
+ }
10
+ const match = TIME_REGEX.exec(value)
11
+ if (!match) {
12
+ throw new TypeError(`Value is not a valid time: ${value}`)
13
+ }
14
+
15
+ const hours = match[1]
16
+ const minutes = match[2]
17
+ const seconds = match[3] || '00'
18
+ const fraction = match[4] ? `.${match[4]}` : ''
19
+
20
+ return `${hours}:${minutes}:${seconds}${fraction}`
21
+ }
22
+
4
23
 
5
24
  export class CustomTypesProvider {
6
25
  public readonly uuidType: GraphQLScalarType = UuidType
7
26
 
8
27
  //todo: implement serialize, parseValue and parseLiteral properly
28
+
9
29
  public readonly dateType: GraphQLScalarType = new GraphQLScalarType({
10
30
  name: 'Date',
11
31
  serialize: str => String(str),
@@ -14,6 +34,23 @@ export class CustomTypesProvider {
14
34
  return ast.kind === Kind.STRING ? ast.value : undefined
15
35
  },
16
36
  })
37
+
38
+ public readonly timeType: GraphQLScalarType = new GraphQLScalarType({
39
+ name: 'Time',
40
+ serialize(value) {
41
+ return validateTime(value)
42
+ },
43
+ parseValue(value) {
44
+ return validateTime(value)
45
+ },
46
+ parseLiteral(ast) {
47
+ if (ast.kind !== Kind.STRING) {
48
+ throw new TypeError(`Time scalar can only parse string values, got: ${ast.kind}`)
49
+ }
50
+ return validateTime(ast.value)
51
+ },
52
+ })
53
+
17
54
  public readonly dateTimeType: GraphQLScalarType = new GraphQLScalarType({
18
55
  name: 'DateTime',
19
56
  serialize: str => String(str),
@@ -15,6 +15,7 @@ import { QueryProvider } from './QueryProvider'
15
15
  import { ValidationQueriesProvider } from './ValidationQueriesProvider'
16
16
  import { Context } from '../types'
17
17
  import { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'
18
+ import { RefreshViewMutationProvider } from './RefreshViewMutationProvider'
18
19
 
19
20
  type BuildArgs = {
20
21
  queries?: Map<string, GraphQLFieldConfig<any, Context, any>>
@@ -29,6 +30,7 @@ export class GraphQlSchemaBuilder {
29
30
  private readonly validationQueriesProvider: ValidationQueriesProvider,
30
31
  private readonly mutationProvider: MutationProvider,
31
32
  private readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,
33
+ private readonly refreshViewMutationProvider: RefreshViewMutationProvider,
32
34
  ) {}
33
35
 
34
36
  public build(args: BuildArgs = {}): GraphQLSchema {
@@ -117,6 +119,12 @@ export class GraphQlSchemaBuilder {
117
119
  resolve: (parent, args, context: Context, info) => context.executionContainer.readResolver.resolveQuery(info),
118
120
  })
119
121
  }
122
+
123
+ const refreshViewMutation = this.refreshViewMutationProvider.getMutation()
124
+ if (refreshViewMutation) {
125
+ mutations.set('refreshMaterializedView', refreshViewMutation)
126
+ }
127
+
120
128
  const infoType = new GraphQLObjectType({
121
129
  name: 'Info',
122
130
  fields: () => ({