@axinom/mosaic-graphql-common 0.33.0 → 0.34.0-rc.3

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 (253) hide show
  1. package/dist/cjs/common/checks.d.ts.map +1 -0
  2. package/dist/cjs/common/checks.js.map +1 -0
  3. package/dist/cjs/common/index.d.ts +3 -0
  4. package/dist/cjs/common/index.d.ts.map +1 -0
  5. package/dist/{common → cjs/common}/index.js +2 -2
  6. package/dist/cjs/common/index.js.map +1 -0
  7. package/dist/cjs/common/types.d.ts.map +1 -0
  8. package/dist/cjs/common/types.js.map +1 -0
  9. package/dist/cjs/index.d.ts +5 -0
  10. package/dist/cjs/index.d.ts.map +1 -0
  11. package/dist/{index.js → cjs/index.js} +4 -4
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/{middleware → cjs/middleware}/forward-to-graphiql.d.ts +1 -1
  14. package/dist/cjs/middleware/forward-to-graphiql.d.ts.map +1 -0
  15. package/dist/cjs/middleware/forward-to-graphiql.js.map +1 -0
  16. package/dist/cjs/middleware/index.d.ts +2 -0
  17. package/dist/cjs/middleware/index.d.ts.map +1 -0
  18. package/dist/{middleware → cjs/middleware}/index.js +1 -1
  19. package/dist/cjs/middleware/index.js.map +1 -0
  20. package/dist/cjs/package.json +1 -0
  21. package/dist/{plugins → cjs/plugins}/add-error-codes-enum-plugin.d.ts +2 -2
  22. package/dist/cjs/plugins/add-error-codes-enum-plugin.d.ts.map +1 -0
  23. package/dist/cjs/plugins/add-error-codes-enum-plugin.js.map +1 -0
  24. package/dist/{plugins → cjs/plugins}/annotate-types-with-permissions-plugin.d.ts +1 -1
  25. package/dist/cjs/plugins/annotate-types-with-permissions-plugin.d.ts.map +1 -0
  26. package/dist/{plugins → cjs/plugins}/annotate-types-with-permissions-plugin.js +5 -6
  27. package/dist/cjs/plugins/annotate-types-with-permissions-plugin.js.map +1 -0
  28. package/dist/{plugins → cjs/plugins}/bulk-edit/bulk-edit-async-plugin-factory.d.ts +4 -4
  29. package/dist/cjs/plugins/bulk-edit/bulk-edit-async-plugin-factory.d.ts.map +1 -0
  30. package/dist/{plugins → cjs/plugins}/bulk-edit/bulk-edit-async-plugin-factory.js +22 -15
  31. package/dist/cjs/plugins/bulk-edit/bulk-edit-async-plugin-factory.js.map +1 -0
  32. package/dist/{plugins → cjs/plugins}/bulk-edit/bulk-edit-item-change-handler-helpers.d.ts +5 -5
  33. package/dist/cjs/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.d.ts.map +1 -0
  34. package/dist/cjs/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.js.map +1 -0
  35. package/dist/{plugins → cjs/plugins}/deprecate-stray-node-id-fields-plugin.d.ts +1 -1
  36. package/dist/cjs/plugins/deprecate-stray-node-id-fields-plugin.d.ts.map +1 -0
  37. package/dist/{plugins → cjs/plugins}/deprecate-stray-node-id-fields-plugin.js +2 -2
  38. package/dist/cjs/plugins/deprecate-stray-node-id-fields-plugin.js.map +1 -0
  39. package/dist/{plugins → cjs/plugins}/generic-bulk-plugin-factory.d.ts +1 -1
  40. package/dist/cjs/plugins/generic-bulk-plugin-factory.d.ts.map +1 -0
  41. package/dist/{plugins → cjs/plugins}/generic-bulk-plugin-factory.js +21 -21
  42. package/dist/cjs/plugins/generic-bulk-plugin-factory.js.map +1 -0
  43. package/dist/{plugins → cjs/plugins}/graphiql-management-mode-plugin-hook.d.ts +1 -1
  44. package/dist/cjs/plugins/graphiql-management-mode-plugin-hook.d.ts.map +1 -0
  45. package/dist/cjs/plugins/graphiql-management-mode-plugin-hook.js.map +1 -0
  46. package/dist/cjs/plugins/index.d.ts +12 -0
  47. package/dist/cjs/plugins/index.d.ts.map +1 -0
  48. package/dist/{plugins → cjs/plugins}/index.js +11 -11
  49. package/dist/cjs/plugins/index.js.map +1 -0
  50. package/dist/{plugins → cjs/plugins}/omit-from-query-root-plugin.d.ts +1 -1
  51. package/dist/cjs/plugins/omit-from-query-root-plugin.d.ts.map +1 -0
  52. package/dist/{plugins → cjs/plugins}/omit-from-query-root-plugin.js +1 -1
  53. package/dist/cjs/plugins/omit-from-query-root-plugin.js.map +1 -0
  54. package/dist/{plugins → cjs/plugins}/operations-enum-generator-plugin-factory.d.ts +7 -1
  55. package/dist/cjs/plugins/operations-enum-generator-plugin-factory.d.ts.map +1 -0
  56. package/dist/{plugins → cjs/plugins}/operations-enum-generator-plugin-factory.js +15 -4
  57. package/dist/cjs/plugins/operations-enum-generator-plugin-factory.js.map +1 -0
  58. package/dist/{plugins → cjs/plugins}/subscriptions-plugin-factory.d.ts +1 -1
  59. package/dist/cjs/plugins/subscriptions-plugin-factory.d.ts.map +1 -0
  60. package/dist/{plugins → cjs/plugins}/subscriptions-plugin-factory.js +7 -14
  61. package/dist/cjs/plugins/subscriptions-plugin-factory.js.map +1 -0
  62. package/dist/{plugins → cjs/plugins}/validation-directives-plugin.d.ts +1 -1
  63. package/dist/cjs/plugins/validation-directives-plugin.d.ts.map +1 -0
  64. package/dist/{plugins → cjs/plugins}/validation-directives-plugin.js +3 -4
  65. package/dist/cjs/plugins/validation-directives-plugin.js.map +1 -0
  66. package/dist/{postgraphile → cjs/postgraphile}/enhance-graphql-errors.d.ts +3 -3
  67. package/dist/cjs/postgraphile/enhance-graphql-errors.d.ts.map +1 -0
  68. package/dist/{postgraphile → cjs/postgraphile}/enhance-graphql-errors.js +23 -19
  69. package/dist/cjs/postgraphile/enhance-graphql-errors.js.map +1 -0
  70. package/dist/cjs/postgraphile/index.d.ts +4 -0
  71. package/dist/cjs/postgraphile/index.d.ts.map +1 -0
  72. package/dist/{postgraphile → cjs/postgraphile}/index.js +3 -3
  73. package/dist/cjs/postgraphile/index.js.map +1 -0
  74. package/dist/{postgraphile → cjs/postgraphile}/postgraphile-options-builder.d.ts +4 -4
  75. package/dist/cjs/postgraphile/postgraphile-options-builder.d.ts.map +1 -0
  76. package/dist/{postgraphile → cjs/postgraphile}/postgraphile-options-builder.js +34 -25
  77. package/dist/cjs/postgraphile/postgraphile-options-builder.js.map +1 -0
  78. package/dist/{postgraphile → cjs/postgraphile}/websocket-utils.d.ts +2 -2
  79. package/dist/cjs/postgraphile/websocket-utils.d.ts.map +1 -0
  80. package/dist/cjs/postgraphile/websocket-utils.js.map +1 -0
  81. package/dist/esm/common/checks.d.ts +9 -0
  82. package/dist/esm/common/checks.d.ts.map +1 -0
  83. package/dist/esm/common/checks.js +16 -0
  84. package/dist/esm/common/checks.js.map +1 -0
  85. package/dist/esm/common/index.d.ts +3 -0
  86. package/dist/esm/common/index.d.ts.map +1 -0
  87. package/dist/esm/common/index.js +3 -0
  88. package/dist/esm/common/index.js.map +1 -0
  89. package/dist/esm/common/types.d.ts +13 -0
  90. package/dist/esm/common/types.d.ts.map +1 -0
  91. package/dist/esm/common/types.js +11 -0
  92. package/dist/esm/common/types.js.map +1 -0
  93. package/dist/esm/index.d.ts +5 -0
  94. package/dist/esm/index.d.ts.map +1 -0
  95. package/dist/esm/index.js +5 -0
  96. package/dist/esm/index.js.map +1 -0
  97. package/dist/esm/middleware/forward-to-graphiql.d.ts +8 -0
  98. package/dist/esm/middleware/forward-to-graphiql.d.ts.map +1 -0
  99. package/dist/esm/middleware/forward-to-graphiql.js +17 -0
  100. package/dist/esm/middleware/forward-to-graphiql.js.map +1 -0
  101. package/dist/esm/middleware/index.d.ts +2 -0
  102. package/dist/esm/middleware/index.d.ts.map +1 -0
  103. package/dist/esm/middleware/index.js +2 -0
  104. package/dist/esm/middleware/index.js.map +1 -0
  105. package/dist/esm/package.json +1 -0
  106. package/dist/esm/plugins/add-error-codes-enum-plugin.d.ts +27 -0
  107. package/dist/esm/plugins/add-error-codes-enum-plugin.d.ts.map +1 -0
  108. package/dist/esm/plugins/add-error-codes-enum-plugin.js +74 -0
  109. package/dist/esm/plugins/add-error-codes-enum-plugin.js.map +1 -0
  110. package/dist/esm/plugins/annotate-types-with-permissions-plugin.d.ts +22 -0
  111. package/dist/esm/plugins/annotate-types-with-permissions-plugin.d.ts.map +1 -0
  112. package/dist/esm/plugins/annotate-types-with-permissions-plugin.js +140 -0
  113. package/dist/esm/plugins/annotate-types-with-permissions-plugin.js.map +1 -0
  114. package/dist/esm/plugins/bulk-edit/bulk-edit-async-plugin-factory.d.ts +61 -0
  115. package/dist/esm/plugins/bulk-edit/bulk-edit-async-plugin-factory.d.ts.map +1 -0
  116. package/dist/esm/plugins/bulk-edit/bulk-edit-async-plugin-factory.js +397 -0
  117. package/dist/esm/plugins/bulk-edit/bulk-edit-async-plugin-factory.js.map +1 -0
  118. package/dist/esm/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.d.ts +15 -0
  119. package/dist/esm/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.d.ts.map +1 -0
  120. package/dist/esm/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.js +82 -0
  121. package/dist/esm/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.js.map +1 -0
  122. package/dist/esm/plugins/deprecate-stray-node-id-fields-plugin.d.ts +14 -0
  123. package/dist/esm/plugins/deprecate-stray-node-id-fields-plugin.d.ts.map +1 -0
  124. package/dist/esm/plugins/deprecate-stray-node-id-fields-plugin.js +33 -0
  125. package/dist/esm/plugins/deprecate-stray-node-id-fields-plugin.js.map +1 -0
  126. package/dist/esm/plugins/generic-bulk-plugin-factory.d.ts +51 -0
  127. package/dist/esm/plugins/generic-bulk-plugin-factory.d.ts.map +1 -0
  128. package/dist/esm/plugins/generic-bulk-plugin-factory.js +178 -0
  129. package/dist/esm/plugins/generic-bulk-plugin-factory.js.map +1 -0
  130. package/dist/esm/plugins/graphiql-management-mode-plugin-hook.d.ts +13 -0
  131. package/dist/esm/plugins/graphiql-management-mode-plugin-hook.d.ts.map +1 -0
  132. package/dist/esm/plugins/graphiql-management-mode-plugin-hook.js +41 -0
  133. package/dist/esm/plugins/graphiql-management-mode-plugin-hook.js.map +1 -0
  134. package/dist/esm/plugins/index.d.ts +12 -0
  135. package/dist/esm/plugins/index.d.ts.map +1 -0
  136. package/dist/esm/plugins/index.js +12 -0
  137. package/dist/esm/plugins/index.js.map +1 -0
  138. package/dist/esm/plugins/omit-from-query-root-plugin.d.ts +17 -0
  139. package/dist/esm/plugins/omit-from-query-root-plugin.d.ts.map +1 -0
  140. package/dist/esm/plugins/omit-from-query-root-plugin.js +39 -0
  141. package/dist/esm/plugins/omit-from-query-root-plugin.js.map +1 -0
  142. package/dist/esm/plugins/operations-enum-generator-plugin-factory.d.ts +21 -0
  143. package/dist/esm/plugins/operations-enum-generator-plugin-factory.d.ts.map +1 -0
  144. package/dist/esm/plugins/operations-enum-generator-plugin-factory.js +112 -0
  145. package/dist/esm/plugins/operations-enum-generator-plugin-factory.js.map +1 -0
  146. package/dist/esm/plugins/subscriptions-plugin-factory.d.ts +9 -0
  147. package/dist/esm/plugins/subscriptions-plugin-factory.d.ts.map +1 -0
  148. package/dist/esm/plugins/subscriptions-plugin-factory.js +103 -0
  149. package/dist/esm/plugins/subscriptions-plugin-factory.js.map +1 -0
  150. package/dist/esm/plugins/validation-directives-plugin.d.ts +6 -0
  151. package/dist/esm/plugins/validation-directives-plugin.d.ts.map +1 -0
  152. package/dist/esm/plugins/validation-directives-plugin.js +109 -0
  153. package/dist/esm/plugins/validation-directives-plugin.js.map +1 -0
  154. package/dist/esm/postgraphile/enhance-graphql-errors.d.ts +49 -0
  155. package/dist/esm/postgraphile/enhance-graphql-errors.d.ts.map +1 -0
  156. package/dist/esm/postgraphile/enhance-graphql-errors.js +77 -0
  157. package/dist/esm/postgraphile/enhance-graphql-errors.js.map +1 -0
  158. package/dist/esm/postgraphile/index.d.ts +4 -0
  159. package/dist/esm/postgraphile/index.d.ts.map +1 -0
  160. package/dist/esm/postgraphile/index.js +4 -0
  161. package/dist/esm/postgraphile/index.js.map +1 -0
  162. package/dist/esm/postgraphile/postgraphile-options-builder.d.ts +285 -0
  163. package/dist/esm/postgraphile/postgraphile-options-builder.d.ts.map +1 -0
  164. package/dist/esm/postgraphile/postgraphile-options-builder.js +436 -0
  165. package/dist/esm/postgraphile/postgraphile-options-builder.js.map +1 -0
  166. package/dist/esm/postgraphile/websocket-utils.d.ts +11 -0
  167. package/dist/esm/postgraphile/websocket-utils.d.ts.map +1 -0
  168. package/dist/esm/postgraphile/websocket-utils.js +13 -0
  169. package/dist/esm/postgraphile/websocket-utils.js.map +1 -0
  170. package/package.json +24 -15
  171. package/src/common/index.ts +2 -2
  172. package/src/index.ts +4 -4
  173. package/src/middleware/forward-to-graphiql.ts +1 -1
  174. package/src/middleware/index.ts +1 -1
  175. package/src/plugins/add-error-codes-enum-plugin.ts +2 -2
  176. package/src/plugins/annotate-types-with-permissions-plugin.spec.ts +1 -1
  177. package/src/plugins/annotate-types-with-permissions-plugin.ts +3 -3
  178. package/src/plugins/bulk-edit/bulk-edit-async-plugin-factory.spec.ts +4 -4
  179. package/src/plugins/bulk-edit/bulk-edit-async-plugin-factory.ts +9 -9
  180. package/src/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.spec.ts +3 -3
  181. package/src/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.ts +5 -5
  182. package/src/plugins/deprecate-stray-node-id-fields-plugin.ts +2 -2
  183. package/src/plugins/generic-bulk-plugin-factory.ts +3 -3
  184. package/src/plugins/graphiql-management-mode-plugin-hook.ts +1 -1
  185. package/src/plugins/index.ts +11 -11
  186. package/src/plugins/omit-from-query-root-plugin.ts +3 -3
  187. package/src/plugins/operations-enum-generator-plugin-factory.ts +28 -5
  188. package/src/plugins/subscriptions-plugin-factory.ts +4 -4
  189. package/src/plugins/validation-directives-plugin.ts +2 -2
  190. package/src/postgraphile/enhance-graphql-errors.spec.ts +2 -2
  191. package/src/postgraphile/enhance-graphql-errors.ts +5 -5
  192. package/src/postgraphile/index.ts +3 -3
  193. package/src/postgraphile/postgraphile-options-builder.spec.ts +10 -7
  194. package/src/postgraphile/postgraphile-options-builder.ts +20 -11
  195. package/src/postgraphile/websocket-utils.ts +2 -2
  196. package/dist/common/checks.d.ts.map +0 -1
  197. package/dist/common/checks.js.map +0 -1
  198. package/dist/common/index.d.ts +0 -3
  199. package/dist/common/index.d.ts.map +0 -1
  200. package/dist/common/index.js.map +0 -1
  201. package/dist/common/types.d.ts.map +0 -1
  202. package/dist/common/types.js.map +0 -1
  203. package/dist/index.d.ts +0 -5
  204. package/dist/index.d.ts.map +0 -1
  205. package/dist/index.js.map +0 -1
  206. package/dist/middleware/forward-to-graphiql.d.ts.map +0 -1
  207. package/dist/middleware/forward-to-graphiql.js.map +0 -1
  208. package/dist/middleware/index.d.ts +0 -2
  209. package/dist/middleware/index.d.ts.map +0 -1
  210. package/dist/middleware/index.js.map +0 -1
  211. package/dist/plugins/add-error-codes-enum-plugin.d.ts.map +0 -1
  212. package/dist/plugins/add-error-codes-enum-plugin.js.map +0 -1
  213. package/dist/plugins/annotate-types-with-permissions-plugin.d.ts.map +0 -1
  214. package/dist/plugins/annotate-types-with-permissions-plugin.js.map +0 -1
  215. package/dist/plugins/bulk-edit/bulk-edit-async-plugin-factory.d.ts.map +0 -1
  216. package/dist/plugins/bulk-edit/bulk-edit-async-plugin-factory.js.map +0 -1
  217. package/dist/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.d.ts.map +0 -1
  218. package/dist/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.js.map +0 -1
  219. package/dist/plugins/deprecate-stray-node-id-fields-plugin.d.ts.map +0 -1
  220. package/dist/plugins/deprecate-stray-node-id-fields-plugin.js.map +0 -1
  221. package/dist/plugins/generic-bulk-plugin-factory.d.ts.map +0 -1
  222. package/dist/plugins/generic-bulk-plugin-factory.js.map +0 -1
  223. package/dist/plugins/graphiql-management-mode-plugin-hook.d.ts.map +0 -1
  224. package/dist/plugins/graphiql-management-mode-plugin-hook.js.map +0 -1
  225. package/dist/plugins/index.d.ts +0 -12
  226. package/dist/plugins/index.d.ts.map +0 -1
  227. package/dist/plugins/index.js.map +0 -1
  228. package/dist/plugins/omit-from-query-root-plugin.d.ts.map +0 -1
  229. package/dist/plugins/omit-from-query-root-plugin.js.map +0 -1
  230. package/dist/plugins/operations-enum-generator-plugin-factory.d.ts.map +0 -1
  231. package/dist/plugins/operations-enum-generator-plugin-factory.js.map +0 -1
  232. package/dist/plugins/subscriptions-plugin-factory.d.ts.map +0 -1
  233. package/dist/plugins/subscriptions-plugin-factory.js.map +0 -1
  234. package/dist/plugins/validation-directives-plugin.d.ts.map +0 -1
  235. package/dist/plugins/validation-directives-plugin.js.map +0 -1
  236. package/dist/postgraphile/enhance-graphql-errors.d.ts.map +0 -1
  237. package/dist/postgraphile/enhance-graphql-errors.js.map +0 -1
  238. package/dist/postgraphile/index.d.ts +0 -4
  239. package/dist/postgraphile/index.d.ts.map +0 -1
  240. package/dist/postgraphile/index.js.map +0 -1
  241. package/dist/postgraphile/postgraphile-options-builder.d.ts.map +0 -1
  242. package/dist/postgraphile/postgraphile-options-builder.js.map +0 -1
  243. package/dist/postgraphile/websocket-utils.d.ts.map +0 -1
  244. package/dist/postgraphile/websocket-utils.js.map +0 -1
  245. /package/dist/{common → cjs/common}/checks.d.ts +0 -0
  246. /package/dist/{common → cjs/common}/checks.js +0 -0
  247. /package/dist/{common → cjs/common}/types.d.ts +0 -0
  248. /package/dist/{common → cjs/common}/types.js +0 -0
  249. /package/dist/{middleware → cjs/middleware}/forward-to-graphiql.js +0 -0
  250. /package/dist/{plugins → cjs/plugins}/add-error-codes-enum-plugin.js +0 -0
  251. /package/dist/{plugins → cjs/plugins}/bulk-edit/bulk-edit-item-change-handler-helpers.js +0 -0
  252. /package/dist/{plugins → cjs/plugins}/graphiql-management-mode-plugin-hook.js +0 -0
  253. /package/dist/{postgraphile → cjs/postgraphile}/websocket-utils.js +0 -0
@@ -0,0 +1,397 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { buildPgSettings, transactionWithContext, } from '@axinom/mosaic-db-common';
3
+ import { MULTIPLE_AGGREGATE_IDS } from '@axinom/mosaic-message-bus';
4
+ import { CommonServiceMessagingSettings, } from '@axinom/mosaic-messages';
5
+ import { gql as gqlExtended } from 'graphile-utils';
6
+ import GraphQL, { GraphQLBoolean, GraphQLInputObjectType, GraphQLList, GraphQLObjectType, GraphQLString, } from 'graphql';
7
+ import { IsolationLevel } from 'pg-transactional-outbox';
8
+ /**
9
+ * This factory will generate a Postgraphile plugin that adds a mutation to the selected entities allowing the user to perform a bulk edit operation on the specified entity and its relations.
10
+ *
11
+ * @param tableName Name of the table to enable the BulkEdit mutation
12
+ * @param bulkEditMutationName Name of the BulkEdit mutation to be generated
13
+ * @param messageSettings The settings for the MultiTenantMessaging for the service that implements the ItemChangeCommand (e.g. ImageServiceMultiTenantMessagingSettings.ImageServicePerformItemChange)
14
+ * @param excludedForeignKeyRelations Optional array of FK table names to exclude from bulk edit operations
15
+ * @returns The Postgraphile plugin that enables the BulkEdit mutation.
16
+ */
17
+ export const BulkEditAsyncPluginFactory = (tableName, bulkEditMutationName, getLongLivedToken, excludedForeignKeyRelations) => {
18
+ return (builder) => {
19
+ builder.hook('GraphQLObjectType:fields', (fields, build, ctx) => {
20
+ const inflection = build.inflection;
21
+ if (ctx.scope.isRootMutation && fields !== undefined) {
22
+ const pgIntrospectionResultsByKind = build.pgIntrospectionResultsByKind;
23
+ const pgTable = pgIntrospectionResultsByKind.class.find((cls) => cls.name === tableName);
24
+ if (!pgTable) {
25
+ // TODO: Log a warning for `Table "${tableName}" not found.`
26
+ return fields;
27
+ }
28
+ if (pgTable.primaryKeyConstraint?.keyAttributes.length !== 1) {
29
+ // TODO: Log a warning for `Table "${tableName}" skipped since the PK attribute count is not exactly 1.`
30
+ return fields;
31
+ }
32
+ const graphQLObjectTypeName = inflection.tableType(pgTable);
33
+ const graphQLObjectType = build.getTypeByName(graphQLObjectTypeName);
34
+ const connectionFilterType = build.connectionFilterTypesByTypeName[`${graphQLObjectTypeName}Filter`];
35
+ const patchType = build.getTypeByName(inflection.patchType(graphQLObjectType.name));
36
+ // Check if there are any FK relations after filtering exclusions
37
+ const foreignKeyRelations = getAffectedForeignKeyRelations(pgTable, excludedForeignKeyRelations);
38
+ const hasForeignKeyRelations = foreignKeyRelations.length > 0;
39
+ const clearInputTypeForFKs = hasForeignKeyRelations
40
+ ? generateClearInputTypeForFKs(build, pgTable, excludedForeignKeyRelations)
41
+ : undefined;
42
+ const removeInputTypeForFKs = hasForeignKeyRelations
43
+ ? generateInputTypeForFKs(build, pgTable, 'Remove', excludedForeignKeyRelations)
44
+ : undefined;
45
+ const addInputTypeForFKs = hasForeignKeyRelations
46
+ ? generateInputTypeForFKs(build, pgTable, 'Add', excludedForeignKeyRelations)
47
+ : undefined;
48
+ const BulkEditPayloadType = getBulkEditPayloadType(build);
49
+ const args = {
50
+ filter: {
51
+ type: connectionFilterType,
52
+ },
53
+ set: {
54
+ type: patchType,
55
+ },
56
+ };
57
+ if (clearInputTypeForFKs) {
58
+ args.relatedEntitiesToClear = {
59
+ type: clearInputTypeForFKs,
60
+ };
61
+ }
62
+ if (removeInputTypeForFKs) {
63
+ args.relatedEntitiesToRemove = {
64
+ type: removeInputTypeForFKs,
65
+ };
66
+ }
67
+ if (addInputTypeForFKs) {
68
+ args.relatedEntitiesToAdd = {
69
+ type: addInputTypeForFKs,
70
+ };
71
+ }
72
+ const operation = {
73
+ type: BulkEditPayloadType,
74
+ args,
75
+ async resolve(_parent, input, context, resolveInfo) {
76
+ const { config, jwtToken, subject, ownerPool, envOwnerPool, storeInboxMessage, } = context;
77
+ if (config === undefined) {
78
+ throw new Error(`The service config [field: config] was unable to be resolved from the GQL context for the Bulk Edit operations.`);
79
+ }
80
+ if (jwtToken === undefined) {
81
+ throw new Error(`The JWT token [field: jwtToken] was unable to be resolved from the GQL context for the Bulk Edit operations.`);
82
+ }
83
+ if (subject === undefined) {
84
+ throw new Error(`The authenticated subject [field: subject] was unable to be resolved from the GQL context for the Bulk Edit operations.`);
85
+ }
86
+ if (envOwnerPool === undefined && ownerPool === undefined) {
87
+ throw new Error(`The DB connection pool [fields: envOwnerPool, ownerPool] was unable to be resolved from the GQL context for the Bulk Edit operations.`);
88
+ }
89
+ if (storeInboxMessage === undefined) {
90
+ throw new Error(`The storeInboxMessage function [field: storeInboxMessage] was unable to be resolved from the GQL context for the Bulk Edit operations. Ensure that the service uses the Transactional Inbox-Outbox implementation.`);
91
+ }
92
+ const longLivedToken = await getLongLivedToken(jwtToken, config);
93
+ const entityIds = await getEntityIds({
94
+ filterName: connectionFilterType.name,
95
+ queryName: inflection.allRows(pgTable),
96
+ primaryKeyFieldName: inflection.column(pgTable.primaryKeyConstraint?.keyAttributes[0]),
97
+ }, build.graphql, input, context, resolveInfo.schema);
98
+ const { set, relatedEntitiesToClear, relatedEntitiesToRemove, relatedEntitiesToAdd, } = input;
99
+ const { clears, removals, additions } = getFkResolverPayload(build, pgTable, relatedEntitiesToClear, relatedEntitiesToRemove, relatedEntitiesToAdd, excludedForeignKeyRelations);
100
+ await asyncResolverImplementation({
101
+ set: getMainResolverPayload(build, pgTable, set),
102
+ clears,
103
+ removals,
104
+ additions,
105
+ }, entityIds, config, ownerPool, envOwnerPool, longLivedToken, subject, storeInboxMessage);
106
+ return {
107
+ filterMatchedIds: entityIds,
108
+ };
109
+ },
110
+ };
111
+ build.extend(fields, {
112
+ [bulkEditMutationName]: operation,
113
+ });
114
+ }
115
+ return fields;
116
+ });
117
+ };
118
+ };
119
+ /**
120
+ * Get all the database IDs from the entities that were selected via the GraphQL filter
121
+ */
122
+ const getEntityIds = async (metadata, graphql, args, context, schema) => {
123
+ const queryResult = await graphql.execute(schema, gqlExtended `
124
+ query getEntityIds($filter: ${metadata.filterName}) {
125
+ entities: ${metadata.queryName}(filter: $filter) {
126
+ nodes {
127
+ ${metadata.primaryKeyFieldName}
128
+ }
129
+ }
130
+ }
131
+ `, undefined, context, args);
132
+ return queryResult?.data?.entities?.nodes.map((entity) => {
133
+ return entity[metadata.primaryKeyFieldName];
134
+ });
135
+ };
136
+ function getMainResolverPayload(build, pgTable, set) {
137
+ const inflection = build.inflection;
138
+ return {
139
+ mainTableName: pgTable.name,
140
+ gqlFieldNameToColumnNameMap: pgTable.attributes.reduce((map, curr) => {
141
+ map[inflection.column(curr)] = curr.name;
142
+ return map;
143
+ }, {}),
144
+ inputData: set,
145
+ };
146
+ }
147
+ /**
148
+ * Processes foreign key relation inputs and converts them into structured payloads
149
+ * for additions, removals, and clears operations.
150
+ *
151
+ * @returns Object containing metadata for all FK operations:
152
+ * - clears: Boolean flags for clearing all entities in a relation
153
+ * - removals: Specific entities to remove from relations
154
+ * - additions: Specific entities to add to relations
155
+ *
156
+ * TODO: Can be potentially optimized (i.e. with getAffectedForeignKeyRelations or with asyncResolverImplementation)
157
+ */
158
+ function getFkResolverPayload(build, pgTable, relatedEntitiesToClear, relatedEntitiesToRemove, relatedEntitiesToAdd, excludedForeignKeyRelations) {
159
+ const inflection = build.inflection;
160
+ const foreignKeyRelations = getAffectedForeignKeyRelations(pgTable, excludedForeignKeyRelations);
161
+ const fkProcessingMetadata = {};
162
+ for (const fkConstraint of foreignKeyRelations) {
163
+ const parentKey = fkConstraint.keyAttributes[fkConstraint.foreignKeyAttributeNums.indexOf(pgTable.primaryKeyConstraint?.keyAttributes[0].num ?? -1)];
164
+ fkProcessingMetadata[fkConstraint.class.name] = {
165
+ fkGqlFieldNameToColumnNameMap: fkConstraint.class.attributes.reduce((map, curr) => {
166
+ map[inflection.column(curr)] = curr.name;
167
+ return map;
168
+ }, {}),
169
+ fkGqlFieldName: inflection.allRows(fkConstraint.class),
170
+ parentKeyFieldName: inflection.column(parentKey),
171
+ parentKeyColumnName: parentKey.name,
172
+ };
173
+ }
174
+ const clears = {};
175
+ const removals = {};
176
+ const additions = {};
177
+ for (const fkProps of Object.keys(fkProcessingMetadata)) {
178
+ if (relatedEntitiesToClear) {
179
+ const shouldClear = relatedEntitiesToClear[fkProcessingMetadata[fkProps].fkGqlFieldName];
180
+ if (shouldClear) {
181
+ clears[fkProps] = {
182
+ parentKeyColumnName: fkProcessingMetadata[fkProps].parentKeyColumnName,
183
+ shouldClear: true,
184
+ };
185
+ }
186
+ }
187
+ if (relatedEntitiesToRemove) {
188
+ removals[fkProps] = {
189
+ parentKeyColumnName: fkProcessingMetadata[fkProps].parentKeyColumnName,
190
+ inputData: relatedEntitiesToRemove[fkProcessingMetadata[fkProps].fkGqlFieldName],
191
+ fkGqlFieldNameToColumnNameMap: fkProcessingMetadata[fkProps].fkGqlFieldNameToColumnNameMap,
192
+ };
193
+ }
194
+ if (relatedEntitiesToAdd) {
195
+ additions[fkProps] = {
196
+ parentKeyColumnName: fkProcessingMetadata[fkProps].parentKeyColumnName,
197
+ inputData: relatedEntitiesToAdd[fkProcessingMetadata[fkProps].fkGqlFieldName],
198
+ fkGqlFieldNameToColumnNameMap: fkProcessingMetadata[fkProps].fkGqlFieldNameToColumnNameMap,
199
+ };
200
+ }
201
+ }
202
+ return { clears, removals, additions };
203
+ }
204
+ /**
205
+ * Exported for testing purposes
206
+ * @internal
207
+ */
208
+ export async function asyncResolverImplementation(bulkItemChangePayload, entityIds, config, ownerPool, envOwnerPool, longLivedToken, subject, storeInboxMessage) {
209
+ const pool = envOwnerPool ? envOwnerPool : ownerPool;
210
+ const dbRole = envOwnerPool ? config.dbEnvOwner : config.dbOwner;
211
+ const pgSettings = buildPgSettings(subject, dbRole, config.serviceId);
212
+ await transactionWithContext(pool, IsolationLevel.ReadCommitted, pgSettings, async (txn) => {
213
+ // Process each entity ID and send messages in this order:
214
+ // 1. SET_FIELD_VALUES (update main entity fields)
215
+ // 2. CLEAR_RELATED_ENTITIES (clear all FK relations)
216
+ // 3. REMOVE_RELATED_ENTITY (remove specific FK entities, skip if cleared)
217
+ // 4. ADD_RELATED_ENTITY (add new FK entities)
218
+ for (const entity_id of entityIds) {
219
+ // SET_FIELD_VALUES
220
+ if (bulkItemChangePayload.set.inputData) {
221
+ const actionSetPayload = {
222
+ table_name: bulkItemChangePayload.set.mainTableName,
223
+ action: 'SET_FIELD_VALUES',
224
+ stringified_condition: JSON.stringify({ id: entity_id }),
225
+ stringified_payload: JSON.stringify(mapGqlInputObjectToSqlColumnNames(bulkItemChangePayload.set.inputData, bulkItemChangePayload.set.gqlFieldNameToColumnNameMap)),
226
+ };
227
+ // TODO: Add a DEBUG log for `actionSetPayload`
228
+ await sendMessage(config, storeInboxMessage, actionSetPayload, txn, longLivedToken);
229
+ }
230
+ // CLEAR_RELATED_ENTITIES - Process clears FIRST before any deletions
231
+ const clearedRelations = new Set();
232
+ if (bulkItemChangePayload.clears) {
233
+ const fkTableNames = Object.keys(bulkItemChangePayload.clears);
234
+ for (const fkTableName of fkTableNames) {
235
+ const fkClearMetadata = bulkItemChangePayload.clears[fkTableName];
236
+ if (fkClearMetadata.shouldClear) {
237
+ clearedRelations.add(fkTableName); // Track cleared relations
238
+ const clearPayload = {
239
+ table_name: fkTableName,
240
+ action: 'CLEAR_RELATED_ENTITIES',
241
+ stringified_condition: JSON.stringify({
242
+ [fkClearMetadata.parentKeyColumnName]: entity_id,
243
+ }),
244
+ stringified_payload: JSON.stringify({}),
245
+ };
246
+ // TODO: Add a DEBUG log for `clearPayload`
247
+ await sendMessage(config, storeInboxMessage, clearPayload, txn, longLivedToken);
248
+ }
249
+ }
250
+ }
251
+ // REMOVE_RELATED_ENTITY - Skip if relation is being cleared
252
+ if (bulkItemChangePayload.removals) {
253
+ const fkTableNames = Object.keys(bulkItemChangePayload.removals);
254
+ for (const fkTableName of fkTableNames) {
255
+ // Skip if this relation is being cleared (optimization)
256
+ if (clearedRelations.has(fkTableName)) {
257
+ continue;
258
+ }
259
+ const fkRemovalMetadata = bulkItemChangePayload.removals[fkTableName];
260
+ if (fkRemovalMetadata.inputData) {
261
+ for (const itemToRemove of fkRemovalMetadata.inputData) {
262
+ const removePayload = {
263
+ table_name: fkTableName,
264
+ action: 'REMOVE_RELATED_ENTITY',
265
+ stringified_condition: '',
266
+ stringified_payload: JSON.stringify({
267
+ [fkRemovalMetadata.parentKeyColumnName]: entity_id,
268
+ ...mapGqlInputObjectToSqlColumnNames(itemToRemove, fkRemovalMetadata.fkGqlFieldNameToColumnNameMap),
269
+ }),
270
+ };
271
+ // TODO: Add a DEBUG log for `removePayload`
272
+ await sendMessage(config, storeInboxMessage, removePayload, txn, longLivedToken);
273
+ }
274
+ }
275
+ }
276
+ }
277
+ // ADD_RELATED_ENTITY
278
+ if (bulkItemChangePayload.additions) {
279
+ const fkTableNames = Object.keys(bulkItemChangePayload.additions);
280
+ for (const fkTableName of fkTableNames) {
281
+ const fkAdditionMetadata = bulkItemChangePayload.additions[fkTableName];
282
+ if (fkAdditionMetadata.inputData) {
283
+ for (const itemToAdd of fkAdditionMetadata.inputData) {
284
+ const addPayload = {
285
+ table_name: fkTableName,
286
+ action: 'ADD_RELATED_ENTITY',
287
+ stringified_condition: '',
288
+ stringified_payload: JSON.stringify({
289
+ [fkAdditionMetadata.parentKeyColumnName]: entity_id,
290
+ ...mapGqlInputObjectToSqlColumnNames(itemToAdd, fkAdditionMetadata.fkGqlFieldNameToColumnNameMap),
291
+ }),
292
+ };
293
+ // TODO: Add a DEBUG log for `addPayload`
294
+ await sendMessage(config, storeInboxMessage, addPayload, txn, longLivedToken);
295
+ }
296
+ }
297
+ }
298
+ }
299
+ }
300
+ });
301
+ }
302
+ async function sendMessage(config, storeInboxMessage, changeSetPayload, client, longLivedToken) {
303
+ const messageSettings = CommonServiceMessagingSettings.GetPerformItemChangeSettings(config.serviceId);
304
+ return storeInboxMessage(MULTIPLE_AGGREGATE_IDS, messageSettings, changeSetPayload, client, {
305
+ metadata: { authToken: longLivedToken },
306
+ concurrency: 'sequential',
307
+ segment: `${changeSetPayload.table_name}`,
308
+ });
309
+ }
310
+ function mapGqlInputObjectToSqlColumnNames(sourceGqlInputObject, gqlToSqlColumnNameMap) {
311
+ const gqlFiledNames = Object.keys(sourceGqlInputObject);
312
+ return gqlFiledNames.reduce((map, gqlFieldName) => {
313
+ map[gqlToSqlColumnNameMap[gqlFieldName]] =
314
+ sourceGqlInputObject[gqlFieldName];
315
+ return map;
316
+ }, {});
317
+ }
318
+ // Generate input type for clearing FK relations (boolean flags)
319
+ function generateClearInputTypeForFKs(build, pgTable, excludedForeignKeyRelations) {
320
+ const inflection = build.inflection;
321
+ const clearInputFieldsMap = {};
322
+ // Filter only the interesting FK relations
323
+ const foreignKeyRelations = getAffectedForeignKeyRelations(pgTable, excludedForeignKeyRelations);
324
+ for (const fkConstraint of foreignKeyRelations) {
325
+ // Add a boolean field for each FK relation
326
+ clearInputFieldsMap[inflection.allRows(fkConstraint.class)] = {
327
+ type: GraphQLBoolean,
328
+ };
329
+ }
330
+ const ClearInputType = new GraphQLInputObjectType({
331
+ name: `BulkEditAsync${inflection.tableType(pgTable)}ClearInput`,
332
+ fields: () => ({
333
+ ...clearInputFieldsMap,
334
+ }),
335
+ });
336
+ build.addType(ClearInputType);
337
+ return ClearInputType;
338
+ }
339
+ // TODO: Handle `insertable` | `deletable` GRANTS for FK Relations
340
+ function generateInputTypeForFKs(build, pgTable, action, excludedForeignKeyRelations) {
341
+ const inflection = build.inflection;
342
+ const allFkInputTypesFieldMap = {};
343
+ // Filter only the interesting FK relations
344
+ const foreignKeyRelations = getAffectedForeignKeyRelations(pgTable, excludedForeignKeyRelations);
345
+ for (const fkConstraint of foreignKeyRelations) {
346
+ const parentPgTable = fkConstraint.foreignClass;
347
+ const parentKey = fkConstraint.keyAttributes[fkConstraint.foreignKeyAttributeNums.indexOf(parentPgTable?.primaryKeyConstraint?.keyAttributes[0].num ?? -1)];
348
+ const parentKeyFieldName = inflection.column(parentKey);
349
+ const fkTableInput = build.pgGetGqlInputTypeByTypeIdAndModifier(fkConstraint.class.type.id, null);
350
+ const fkTableInputTypeGqlFieldMap = {};
351
+ for (const key of Object.keys(fkTableInput.getFields())) {
352
+ if (key !== parentKeyFieldName) {
353
+ fkTableInputTypeGqlFieldMap[key] = fkTableInput.getFields()[key];
354
+ }
355
+ }
356
+ allFkInputTypesFieldMap[inflection.allRows(fkConstraint.class)] = {
357
+ type: new GraphQLList(new GraphQLInputObjectType({
358
+ name: `BulkEditAsync${inflection.tableType(parentPgTable)}${action}${inflection.tableType(fkConstraint.class)}Input`,
359
+ fields: () => ({
360
+ ...fkTableInputTypeGqlFieldMap,
361
+ }),
362
+ })),
363
+ };
364
+ }
365
+ const BulkEditAddInputTypeForFK = new GraphQLInputObjectType({
366
+ name: `BulkEditAsync${inflection.tableType(pgTable)}${action}Input`,
367
+ fields: () => ({
368
+ ...allFkInputTypesFieldMap,
369
+ }),
370
+ });
371
+ build.addType(BulkEditAddInputTypeForFK);
372
+ return BulkEditAddInputTypeForFK;
373
+ }
374
+ function getAffectedForeignKeyRelations(pgTable, excludedForeignKeyRelations) {
375
+ return pgTable.foreignConstraints.filter((constraint) => constraint.type === 'f' &&
376
+ (constraint.isFake === undefined || constraint.isFake === false) &&
377
+ !constraint.name.startsWith('multitenancy_relation_') &&
378
+ (!excludedForeignKeyRelations ||
379
+ !excludedForeignKeyRelations.includes(constraint.class.name)));
380
+ }
381
+ function getBulkEditPayloadType(build) {
382
+ const existingType = build.getTypeByName('BulkEditAsyncPayloadType');
383
+ if (existingType && existingType instanceof GraphQLObjectType) {
384
+ return existingType;
385
+ }
386
+ const BulkEditPayloadType = new GraphQLObjectType({
387
+ name: 'BulkEditAsyncPayloadType',
388
+ fields: () => ({
389
+ filterMatchedIds: {
390
+ type: new GraphQLList(GraphQLString),
391
+ },
392
+ }),
393
+ });
394
+ build.addType(BulkEditPayloadType);
395
+ return BulkEditPayloadType;
396
+ }
397
+ //# sourceMappingURL=bulk-edit-async-plugin-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-edit-async-plugin-factory.js","sourceRoot":"","sources":["../../../../src/plugins/bulk-edit/bulk-edit-async-plugin-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { PerformItemChangeCommand } from '@axinom/mosaic-messages';
2
+ import type { BasicConfig } from '@axinom/mosaic-service-common';
3
+ import type { StoreOutboxMessage, TypedTransactionalMessage } from '@axinom/mosaic-transactional-inbox-outbox';
4
+ import type { ClientBase } from 'pg';
5
+ import type { DatabaseClient } from 'pg-transactional-outbox';
6
+ export declare function handlePerformItemChangeCommand(payload: PerformItemChangeCommand, client: ClientBase): Promise<void>;
7
+ /**
8
+ * !NOTE!
9
+ *
10
+ * This is a temporary stub implementation that needs to be properly implemented later.
11
+ * The idea is to have a way to track failed item change commands and notify the users
12
+ * or systems about the failures.
13
+ */
14
+ export declare function handlePerformItemChangeCommandError(_config: BasicConfig, _error: Error, _message: TypedTransactionalMessage<PerformItemChangeCommand>, _storeOutboxMessage: StoreOutboxMessage, _client: DatabaseClient): Promise<void>;
15
+ //# sourceMappingURL=bulk-edit-item-change-handler-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-edit-item-change-handler-helpers.d.ts","sourceRoot":"","sources":["../../../../src/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,IAAI,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoE9D,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;;GAMG;AACH,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,KAAK,EACb,QAAQ,EAAE,yBAAyB,CAAC,wBAAwB,CAAC,EAC7D,mBAAmB,EAAE,kBAAkB,EACvC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,82 @@
1
+ async function upsert(client, tableName, jsonObject) {
2
+ const columns = Object.keys(jsonObject)
3
+ .map((col) => `"${col}"`)
4
+ .join(', ');
5
+ const values = Object.values(jsonObject);
6
+ const placeholders = values.map((_, index) => `$${index + 1}`).join(', ');
7
+ const query = `INSERT INTO "${tableName}" (${columns}) VALUES (${placeholders}) ON CONFLICT DO NOTHING RETURNING *`;
8
+ return client.query(query, values);
9
+ }
10
+ async function update(client, tableName, jsonObject, condition) {
11
+ const setClause = Object.keys(jsonObject)
12
+ .map((key, index) => `"${key}" = $${index + 1}`)
13
+ .join(', ');
14
+ const values = Object.values(jsonObject);
15
+ const { clause: conditionClause, values: conditionValues } = buildWhereClause(condition, values.length);
16
+ const query = `UPDATE "${tableName}" SET ${setClause} WHERE ${conditionClause} RETURNING *`;
17
+ return client.query(query, [...values, ...conditionValues]);
18
+ }
19
+ /**
20
+ * Helper to build WHERE clause from a condition object
21
+ */
22
+ function buildWhereClause(condition, parameterOffset = 0) {
23
+ const values = Object.values(condition);
24
+ const clause = Object.keys(condition)
25
+ .map((key, index) => `"${key}" = $${index + 1 + parameterOffset}`)
26
+ .join(' AND ');
27
+ return { clause, values };
28
+ }
29
+ /**
30
+ * Deletes records from a table matching the given condition
31
+ */
32
+ async function deleteWhere(client, tableName, condition) {
33
+ const { clause, values } = buildWhereClause(condition);
34
+ const query = `DELETE FROM "${tableName}" WHERE ${clause} RETURNING *`;
35
+ return client.query(query, values);
36
+ }
37
+ export async function handlePerformItemChangeCommand(payload, client) {
38
+ switch (payload.action) {
39
+ case 'SET_FIELD_VALUES':
40
+ await update(client, payload.table_name, JSON.parse(payload.stringified_payload), { id: JSON.parse(payload.stringified_condition).id });
41
+ break;
42
+ case 'CLEAR_RELATED_ENTITIES':
43
+ await deleteWhere(client, payload.table_name, JSON.parse(payload.stringified_condition));
44
+ break;
45
+ case 'REMOVE_RELATED_ENTITY':
46
+ await deleteWhere(client, payload.table_name, JSON.parse(payload.stringified_payload));
47
+ break;
48
+ case 'ADD_RELATED_ENTITY':
49
+ await upsert(client, payload.table_name, JSON.parse(payload.stringified_payload));
50
+ break;
51
+ }
52
+ // TODO: Publish success event or implement a JOB tracking/monitoring mechanism
53
+ }
54
+ /**
55
+ * !NOTE!
56
+ *
57
+ * This is a temporary stub implementation that needs to be properly implemented later.
58
+ * The idea is to have a way to track failed item change commands and notify the users
59
+ * or systems about the failures.
60
+ */
61
+ export async function handlePerformItemChangeCommandError(_config, _error, _message, _storeOutboxMessage, _client) {
62
+ // TODO: Publish failed event or implement a JOB tracking/monitoring mechanism
63
+ //
64
+ // await storeOutboxMessage<PerformItemChangeFailedEvent>(
65
+ // MULTIPLE_AGGREGATE_IDS,
66
+ // CommonServiceMessagingSettings.GetPerformItemChangeSettings(
67
+ // config.serviceId,
68
+ // ),
69
+ // {
70
+ // ...message.payload,
71
+ // error_message: error.message,
72
+ // },
73
+ // client,
74
+ // {
75
+ // envelopeOverrides: {
76
+ // auth_token: message.metadata.authToken,
77
+ // message_context: message.metadata.messageContext,
78
+ // },
79
+ // },
80
+ // );
81
+ }
82
+ //# sourceMappingURL=bulk-edit-item-change-handler-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-edit-item-change-handler-helpers.js","sourceRoot":"","sources":["../../../../src/plugins/bulk-edit/bulk-edit-item-change-handler-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Plugin } from 'postgraphile';
2
+ type DeprecateMode = 'DEPRECATE' | 'DROP';
3
+ /**
4
+ * NodePlugin is excluded by default to remove all references of NodeId fields
5
+ * and byNodeId operations. A few such instances are not removed and handled
6
+ * explicitly by this plugin, e.g. deletedEntityNodeId in the
7
+ * DeleteEntityPayload types.
8
+ *
9
+ * By default, the plugin marks each field as deprecated. Pass an explicit
10
+ * `DROP` value to drop the fields instead.
11
+ */
12
+ export declare const DeprecateStrayNodeIdFieldsPlugin: (mode?: DeprecateMode) => Plugin;
13
+ export {};
14
+ //# sourceMappingURL=deprecate-stray-node-id-fields-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecate-stray-node-id-fields-plugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/deprecate-stray-node-id-fields-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,KAAK,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,GAC1C,OAAM,aAA2B,KAAG,MAyBpC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { UnreachableCaseError } from '../common/index.js';
2
+ /**
3
+ * NodePlugin is excluded by default to remove all references of NodeId fields
4
+ * and byNodeId operations. A few such instances are not removed and handled
5
+ * explicitly by this plugin, e.g. deletedEntityNodeId in the
6
+ * DeleteEntityPayload types.
7
+ *
8
+ * By default, the plugin marks each field as deprecated. Pass an explicit
9
+ * `DROP` value to drop the fields instead.
10
+ */
11
+ export const DeprecateStrayNodeIdFieldsPlugin = (mode = 'DEPRECATE') => (builder) => {
12
+ builder.hook('GraphQLObjectType:fields', (fields, _build, context) => {
13
+ const typeName = context.Self.name;
14
+ if (typeName.startsWith('Delete') && typeName.endsWith('Payload')) {
15
+ Object.keys(fields)
16
+ .filter((name) => name.startsWith('deleted') && name.endsWith('NodeId'))
17
+ .map((name) => {
18
+ switch (mode) {
19
+ case 'DEPRECATE':
20
+ fields[name].deprecationReason = 'The field is obsolete.';
21
+ break;
22
+ case 'DROP':
23
+ delete fields[name];
24
+ break;
25
+ default:
26
+ throw new UnreachableCaseError(mode);
27
+ }
28
+ });
29
+ }
30
+ return fields;
31
+ });
32
+ };
33
+ //# sourceMappingURL=deprecate-stray-node-id-fields-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecate-stray-node-id-fields-plugin.js","sourceRoot":"","sources":["../../../src/plugins/deprecate-stray-node-id-fields-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI1D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,CAAC,OAAsB,WAAW,EAAU,EAAE,CAC9C,CAAC,OAAO,EAAE,EAAE;IACV,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAc,CAAC;QAC7C,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;iBAChB,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAChE;iBACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,WAAW;wBACd,MAAM,CAAC,IAAI,CAAC,CAAC,iBAAiB,GAAG,wBAAwB,CAAC;wBAC1D,MAAM;oBACR,KAAK,MAAM;wBACT,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;wBACpB,MAAM;oBAER;wBACE,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import GraphQL from 'graphql';
2
+ import type { Plugin } from 'postgraphile';
3
+ /**
4
+ * A collection of parameters to decide on which entities and by which criteria bulk operation should be performed.
5
+ */
6
+ export interface BulkFilter {
7
+ tableName: string;
8
+ primaryKeyName: string;
9
+ primaryKeyType: string;
10
+ filterType: GraphQL.GraphQLInputType;
11
+ filterName: string;
12
+ queryName: string;
13
+ typeName: string;
14
+ }
15
+ /**
16
+ * Interface for specifying bulk action endpoint name
17
+ */
18
+ export interface CustomBulkSettings {
19
+ graphQLEndpointName: string;
20
+ }
21
+ /**
22
+ * Callback that decides for which filters a bulk action is defined
23
+ */
24
+ export interface DefinePlugin {
25
+ (filter: BulkFilter): CustomBulkSettings | undefined;
26
+ }
27
+ /**
28
+ * Parameters that GenericBulkPluginFactory will provide to the callback, so that the actual bulk operation can be performed.
29
+ */
30
+ export interface BulkIdParameters {
31
+ entityIds: number[] | string[];
32
+ entityType: string;
33
+ primaryKeyName: string;
34
+ tableName: string;
35
+ graphQLAdditionalInput: unknown;
36
+ graphQLContext: {
37
+ [str: string]: unknown;
38
+ };
39
+ }
40
+ /**
41
+ * Plugin factory to create bulk mutations based on query filters
42
+ * @param callback The callback that shall perform the actual bulk operation. It
43
+ * receives different parameters from the base plugin to assist with the
44
+ * operation, e.g. a list of ids for which the bulk operation shall be performed.
45
+ * @param definePlugin The callback that decides for which filters a bulk action is defined.
46
+ * @param inputType Defines additional input parameters for the bulk action. The values are forwarded as part of the message payload.
47
+ */
48
+ export declare const GenericBulkPluginFactory: (callback: {
49
+ (parameters: BulkIdParameters): Promise<void>;
50
+ }, definePlugin: DefinePlugin, inputType?: GraphQL.GraphQLInputObjectType) => Plugin;
51
+ //# sourceMappingURL=generic-bulk-plugin-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-bulk-plugin-factory.d.ts","sourceRoot":"","sources":["../../../src/plugins/generic-bulk-plugin-factory.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAS,MAAM,EAAE,MAAM,cAAc,CAAC;AAGlD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC,gBAAgB,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,OAAO,CAAC;IAChC,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;CAC5C;AAgHD;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU;IAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,EAC3D,cAAc,YAAY,EAC1B,YAAY,OAAO,CAAC,sBAAsB,KACzC,MAiJF,CAAC"}