ecoportal-api-graphql 2.0.0 → 2.2.0

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 (355) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +363 -1
  3. data/LICENSE +21 -21
  4. data/README.md +24 -24
  5. data/lib/ecoportal/api/common/graphql/auth_service.rb +115 -115
  6. data/lib/ecoportal/api/common/graphql/class_helpers.rb +46 -46
  7. data/lib/ecoportal/api/common/graphql/client.rb +69 -69
  8. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  9. data/lib/ecoportal/api/common/graphql/http_client.rb +85 -2
  10. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -54
  11. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -49
  12. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -188
  13. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff.rb +55 -55
  14. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +295 -295
  15. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  16. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  17. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  18. data/lib/ecoportal/api/common/graphql.rb +16 -16
  19. data/lib/ecoportal/api/common.graphql.rb +8 -8
  20. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  21. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +1 -1
  22. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  23. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  24. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  25. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  26. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  27. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  28. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  29. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  30. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  31. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  32. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  33. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  34. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  35. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  36. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +1 -1
  37. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  38. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  39. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  40. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  41. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  42. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  43. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  44. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  45. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +51 -0
  46. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  47. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  48. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  49. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  50. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  51. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  52. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  53. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  54. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  55. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  56. data/lib/ecoportal/api/graphql/base/register.rb +1 -1
  57. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  58. data/lib/ecoportal/api/graphql/base/template/change_log_entry.rb +118 -0
  59. data/lib/ecoportal/api/graphql/base/template.rb +2 -0
  60. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  61. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  62. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  63. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  64. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  65. data/lib/ecoportal/api/graphql/builder/template.rb +28 -0
  66. data/lib/ecoportal/api/graphql/builder/template_builder.rb +21 -2
  67. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  68. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  69. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  70. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  71. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  72. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  73. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  74. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  75. data/lib/ecoportal/api/graphql/connection/template_change_log.rb +19 -0
  76. data/lib/ecoportal/api/graphql/connection.rb +1 -0
  77. data/lib/ecoportal/api/graphql/diff/change.rb +7 -2
  78. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +19 -1
  79. data/lib/ecoportal/api/graphql/diff/version_diff.rb +13 -6
  80. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  81. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  82. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  83. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  84. data/lib/ecoportal/api/graphql/error.rb +12 -12
  85. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  86. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  87. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  88. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  89. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  90. data/lib/ecoportal/api/graphql/fragment/page.rb +1 -0
  91. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +2 -0
  92. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  93. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  94. data/lib/ecoportal/api/graphql/fragment/template_change_log.rb +102 -0
  95. data/lib/ecoportal/api/graphql/fragment.rb +1 -0
  96. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  97. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  98. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  99. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  100. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  101. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  102. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  103. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  104. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  105. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  106. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  107. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  108. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  109. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  110. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  111. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  112. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +21 -13
  113. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  114. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  115. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  116. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  117. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  118. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  119. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  120. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  121. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  122. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  123. data/lib/ecoportal/api/graphql/input/page/review_task.rb +27 -14
  124. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  125. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  126. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  127. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  128. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +1 -1
  129. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  130. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  131. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  132. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  133. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  134. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  135. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  136. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  137. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  138. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  139. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  140. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  141. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  142. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  143. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +10 -9
  144. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  145. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  146. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  147. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  148. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  149. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  150. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  151. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  152. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  153. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  154. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  155. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  156. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  157. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  158. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +25 -19
  159. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  160. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  161. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  162. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  163. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  164. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  165. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  166. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  167. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  168. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  169. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +7 -2
  170. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +21 -18
  171. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  172. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  173. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  174. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  175. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  176. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  177. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  178. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  179. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  180. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  181. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  182. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +23 -19
  183. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  184. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  185. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  186. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +7 -2
  187. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  188. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  189. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +28 -24
  190. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +8 -2
  191. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  192. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  193. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +8 -2
  194. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  195. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  196. data/lib/ecoportal/api/graphql/input/workflow_command/manage_copy_page_configuration.rb +47 -0
  197. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  198. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  199. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  200. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  201. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  202. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  203. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  204. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  205. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  206. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  207. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  208. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  213. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  216. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  217. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  218. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  219. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  220. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  221. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  224. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  226. data/lib/ecoportal/api/graphql/input/workflow_command.rb +3 -0
  227. data/lib/ecoportal/api/graphql/interface/base_page.rb +14 -0
  228. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  229. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  230. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  231. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  232. data/lib/ecoportal/api/graphql/logic/base_query.rb +260 -193
  233. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  234. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  235. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  236. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  237. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  238. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  239. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  240. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  241. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  242. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  243. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  244. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  245. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  246. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  247. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  248. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  249. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  250. data/lib/ecoportal/api/graphql/model/organization.rb +9 -0
  251. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  252. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  253. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  254. data/lib/ecoportal/api/graphql/model/page/phased.rb +17 -0
  255. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  256. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  257. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  258. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  259. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  260. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  261. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  262. data/lib/ecoportal/api/graphql/model/template/change_log_entry.rb +19 -0
  263. data/lib/ecoportal/api/graphql/model/template.rb +4 -1
  264. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  265. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  266. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  267. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  268. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  269. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +1 -1
  270. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +1 -1
  271. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  272. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  273. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  274. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  275. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  276. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  277. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  278. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  279. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  280. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  281. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  282. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  283. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  284. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  285. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  286. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  287. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  288. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  289. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  290. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  291. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  292. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  293. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  294. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  295. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  296. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  297. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  298. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  299. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  300. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  301. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  302. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  303. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  304. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  305. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  306. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  307. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  308. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  309. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  310. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  311. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  312. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  313. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  314. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +2 -2
  315. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +2 -2
  316. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  317. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  318. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  319. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  320. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  321. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  322. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  323. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  324. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  325. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  326. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  327. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  328. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  329. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  330. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  331. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  332. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  333. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  334. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  335. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  336. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  337. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  338. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  339. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  340. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  341. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  342. data/lib/ecoportal/api/graphql/query/person_members.rb +76 -0
  343. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  344. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  345. data/lib/ecoportal/api/graphql/query/template_change_log.rb +118 -0
  346. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  347. data/lib/ecoportal/api/graphql/query.rb +2 -0
  348. data/lib/ecoportal/api/graphql_version.rb +1 -1
  349. data/lib/ecoportal/api-graphql.rb +10 -10
  350. metadata +10 -8
  351. data/lib/ecoportal/api/common/graphql/CLAUDE.md +0 -36
  352. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +0 -28
  353. data/lib/ecoportal/api/graphql/CLAUDE.md +0 -37
  354. data/lib/ecoportal/api/graphql/base/CLAUDE.md +0 -50
  355. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +0 -65
@@ -1,188 +1,188 @@
1
- module Ecoportal::API::Common::GraphQL::Model::Diffable
2
- class DiffService < ClassicDiffService
3
- include Ecoportal::API::Common::GraphQL::Model::Diffable::HashDiffNesting
4
- include Ecoportal::API::Common::GraphQL::HashHelpers
5
-
6
- def initialize(subject, flat: false, ignore: [])
7
- super(subject, ignore: ignore)
8
-
9
- @flat = flat
10
- end
11
-
12
- def flat?
13
- @flat
14
- end
15
-
16
- # @param flat [Boolean] whethere it should skip nested models.
17
- # @param cascaded [Boolean] whether it should cascade the calls through
18
- # the nested models.
19
- # - When `flat` is `true` will only cascade the 1st level of nested models.
20
- # - When `flat` is `false` will do a full cascade.
21
- def diff(flat: flat?, ignore: [])
22
- classic_diff(
23
- flat: true,
24
- ignore: ignore
25
- ).then do |value|
26
- next value if flat
27
-
28
- diff_reduce(
29
- value,
30
- ignore: ignore
31
- )
32
- end
33
- end
34
-
35
- protected
36
-
37
- # Override: GraphQL mutations expect flat changed-prop values, not patch-op wrappers.
38
- # Returns { id: ..., changed_field: new_value, ... } or nil when nothing changed.
39
- def classic_diff(flat: flat?, ignore: [])
40
- curr = keys_to_sym_deep(curr_doc(flat: flat) || {})
41
- prev = keys_to_sym_deep(prev_doc(flat: flat) || {})
42
-
43
- data = change_data(curr, prev, ignore: to_a(ignored, ignore))
44
- return nil if data == NO_CHANGES
45
-
46
- id = get_id(curr, exception: false)
47
- id ? { id: id }.merge(data) : data
48
- end
49
-
50
- # @note it calls `as_update` for nested / cascaded attributes, which in turn
51
- # will use this `DiffService`. Therefore, we aim for a first flat classic diff,
52
- # onto `self`, and cascaded callbacks for the nested attributes.
53
- # - This will translate into `key_path` being lost on each jump between
54
- # `#as_update` and `DiffService#diff`.
55
- # - The `result` object regards, therefore, to the **current level** alone.
56
- # With the aim of building it up (accumulating through the call chain).
57
- def diff_reduce(init, ignore: [])
58
- subject.cascaded_reduce(init, recurs: false) do |result, obj, _key, key_path, _trace|
59
- next result if key_path.empty?
60
- next result if obj == subject
61
-
62
- sym_path = key_path.map(&:to_sym)
63
-
64
- # Remove any flat-diff placeholder for this key before deciding its fate.
65
- dig_delete!(result, sym_path) if result && dig_path?(result, sym_path)
66
-
67
- # Discard root-class objects — they are independent entities, not mutation payload.
68
- next result if root?(obj)
69
- # Only cascade-diff GraphQL model objects; ecoportal-api-v2 DoubleModel
70
- # subclasses (ArrayModel, etc.) have a different as_update signature.
71
- next result unless obj.is_a?(Ecoportal::API::Common::GraphQL::Model)
72
-
73
- value = obj.as_update(ignore: ignore)
74
- next result if value.nil?
75
-
76
- result ||= {}
77
- result[:id] ||= get_id(keys_to_sym_deep(curr_doc(flat: true) || {}), exception: false)
78
- dig_set!(result, sym_path, value)
79
- result
80
- end
81
- end
82
-
83
- # PROBLEM: trace can't be used with knowing if it's the root of the call!
84
- # see `#cascaded_reduce` (when calling `_cascaded_attributes_trace`).
85
- def diff_reduce_with_as_update_and_trace(init = {}, ignore: [], trace: {})
86
- subject.cascaded_reduce(init, recurs: false, trace: trace) do |result, obj, _key, key_path, _trace|
87
- next result if key_path.empty? # first iteration already done
88
- next result if obj == subject # first call had done it
89
-
90
- dig_delete!(result, key_path) if dig_path?(result, key_path)
91
-
92
- # discard rooted (i.e. read_only) objects from the diff.
93
- next result if root?(obj)
94
- next result unless dig_path?(result, key_path)
95
- next result unless obj.respond_to?(:as_update)
96
-
97
- value = obj.as_update(ignore: ignore)
98
-
99
- dig_set!(
100
- result,
101
- key_path,
102
- value
103
- )
104
-
105
- result
106
- end
107
- end
108
-
109
- # FAILS to CALL #as_update on each object!!!
110
- def diff_reduce_preserve_keys(init, flat: flat?, ignore: [])
111
- subject.cascaded_reduce(init, recurs: !flat) do |result, obj, _key, key_path, _trace|
112
- # discard rooted (i.e. read_only) objects from the diff.
113
- if root?(obj)
114
- dig_delete!(result, key_path)
115
- else
116
- value = classic_diff(
117
- obj,
118
- flat: true,
119
- ignore: ignore
120
- )
121
-
122
- dig_set!(result, key_path, value)
123
- end
124
-
125
- result
126
- end
127
- end
128
-
129
- def cascaded_diff(flat: flat?, ignore: [])
130
- subject.cascaded_callback(
131
- method: :as_update,
132
- kargs: {
133
- ignore: to_a(ignored, ignore),
134
- flat: flat
135
- },
136
- recurs: !flat
137
- ) do |result, value, key_path, obj|
138
- result.tap do
139
- # on first call key_path is empty
140
- next result if key_path.empty? # this condition isn't met, first call doesn't yield.
141
-
142
- # discard rooted (i.e. read_only) objects from the diff.
143
- if root?(obj)
144
- dig_delete!(result, key_path)
145
- else
146
- dig_set!(result, key_path, value)
147
- end
148
- end
149
- end
150
- end
151
-
152
- private
153
-
154
- attr_reader :ignored
155
-
156
- def root?(obj)
157
- # root? is a CLASS method (via Rootable::ClassMethods). The instance root?
158
- # is protected and checks parent position, not the class declaration.
159
- # Check the ancestor chain for any class that declared root!.
160
- obj.class.ancestors.any? { |k| k.respond_to?(:root?) && k.root? }
161
- end
162
-
163
- def curr_doc(target = subject, flat: flat?)
164
- may_use_flat_diff(flat) { super(target) }
165
- end
166
-
167
- def prev_doc(target = subject, flat: flat?)
168
- may_use_flat_diff(flat) { super(target) }
169
- end
170
-
171
- # Remove nested attributes
172
- def may_use_flat_diff(flat = flat?)
173
- yield.then do |json|
174
- next json unless flat
175
-
176
- doc_with_non_cascaded_attributes(json)
177
- end
178
- end
179
-
180
- # Remove from `json` doc all the nested properties.
181
- def doc_with_non_cascaded_attributes(json)
182
- return json unless subject.class.respond_to?(:_cascaded_doc_keys)
183
- return json if (excluded = subject.class._cascaded_doc_keys).empty?
184
-
185
- except_keys(json, *excluded)
186
- end
187
- end
188
- end
1
+ module Ecoportal::API::Common::GraphQL::Model::Diffable
2
+ class DiffService < ClassicDiffService
3
+ include Ecoportal::API::Common::GraphQL::Model::Diffable::HashDiffNesting
4
+ include Ecoportal::API::Common::GraphQL::HashHelpers
5
+
6
+ def initialize(subject, flat: false, ignore: [])
7
+ super(subject, ignore: ignore)
8
+
9
+ @flat = flat
10
+ end
11
+
12
+ def flat?
13
+ @flat
14
+ end
15
+
16
+ # @param flat [Boolean] whethere it should skip nested models.
17
+ # @param cascaded [Boolean] whether it should cascade the calls through
18
+ # the nested models.
19
+ # - When `flat` is `true` will only cascade the 1st level of nested models.
20
+ # - When `flat` is `false` will do a full cascade.
21
+ def diff(flat: flat?, ignore: [])
22
+ classic_diff(
23
+ flat: true,
24
+ ignore: ignore
25
+ ).then do |value|
26
+ next value if flat
27
+
28
+ diff_reduce(
29
+ value,
30
+ ignore: ignore
31
+ )
32
+ end
33
+ end
34
+
35
+ protected
36
+
37
+ # Override: GraphQL mutations expect flat changed-prop values, not patch-op wrappers.
38
+ # Returns { id: ..., changed_field: new_value, ... } or nil when nothing changed.
39
+ def classic_diff(flat: flat?, ignore: [])
40
+ curr = keys_to_sym_deep(curr_doc(flat: flat) || {})
41
+ prev = keys_to_sym_deep(prev_doc(flat: flat) || {})
42
+
43
+ data = change_data(curr, prev, ignore: to_a(ignored, ignore))
44
+ return nil if data == NO_CHANGES
45
+
46
+ id = get_id(curr, exception: false)
47
+ id ? { id: id }.merge(data) : data
48
+ end
49
+
50
+ # @note it calls `as_update` for nested / cascaded attributes, which in turn
51
+ # will use this `DiffService`. Therefore, we aim for a first flat classic diff,
52
+ # onto `self`, and cascaded callbacks for the nested attributes.
53
+ # - This will translate into `key_path` being lost on each jump between
54
+ # `#as_update` and `DiffService#diff`.
55
+ # - The `result` object regards, therefore, to the **current level** alone.
56
+ # With the aim of building it up (accumulating through the call chain).
57
+ def diff_reduce(init, ignore: [])
58
+ subject.cascaded_reduce(init, recurs: false) do |result, obj, _key, key_path, _trace|
59
+ next result if key_path.empty?
60
+ next result if obj == subject
61
+
62
+ sym_path = key_path.map(&:to_sym)
63
+
64
+ # Remove any flat-diff placeholder for this key before deciding its fate.
65
+ dig_delete!(result, sym_path) if result && dig_path?(result, sym_path)
66
+
67
+ # Discard root-class objects — they are independent entities, not mutation payload.
68
+ next result if root?(obj)
69
+ # Only cascade-diff GraphQL model objects; ecoportal-api-v2 DoubleModel
70
+ # subclasses (ArrayModel, etc.) have a different as_update signature.
71
+ next result unless obj.is_a?(Ecoportal::API::Common::GraphQL::Model)
72
+
73
+ value = obj.as_update(ignore: ignore)
74
+ next result if value.nil?
75
+
76
+ result ||= {}
77
+ result[:id] ||= get_id(keys_to_sym_deep(curr_doc(flat: true) || {}), exception: false)
78
+ dig_set!(result, sym_path, value)
79
+ result
80
+ end
81
+ end
82
+
83
+ # PROBLEM: trace can't be used with knowing if it's the root of the call!
84
+ # see `#cascaded_reduce` (when calling `_cascaded_attributes_trace`).
85
+ def diff_reduce_with_as_update_and_trace(init = {}, ignore: [], trace: {})
86
+ subject.cascaded_reduce(init, recurs: false, trace: trace) do |result, obj, _key, key_path, _trace|
87
+ next result if key_path.empty? # first iteration already done
88
+ next result if obj == subject # first call had done it
89
+
90
+ dig_delete!(result, key_path) if dig_path?(result, key_path)
91
+
92
+ # discard rooted (i.e. read_only) objects from the diff.
93
+ next result if root?(obj)
94
+ next result unless dig_path?(result, key_path)
95
+ next result unless obj.respond_to?(:as_update)
96
+
97
+ value = obj.as_update(ignore: ignore)
98
+
99
+ dig_set!(
100
+ result,
101
+ key_path,
102
+ value
103
+ )
104
+
105
+ result
106
+ end
107
+ end
108
+
109
+ # FAILS to CALL #as_update on each object!!!
110
+ def diff_reduce_preserve_keys(init, flat: flat?, ignore: [])
111
+ subject.cascaded_reduce(init, recurs: !flat) do |result, obj, _key, key_path, _trace|
112
+ # discard rooted (i.e. read_only) objects from the diff.
113
+ if root?(obj)
114
+ dig_delete!(result, key_path)
115
+ else
116
+ value = classic_diff(
117
+ obj,
118
+ flat: true,
119
+ ignore: ignore
120
+ )
121
+
122
+ dig_set!(result, key_path, value)
123
+ end
124
+
125
+ result
126
+ end
127
+ end
128
+
129
+ def cascaded_diff(flat: flat?, ignore: [])
130
+ subject.cascaded_callback(
131
+ method: :as_update,
132
+ kargs: {
133
+ ignore: to_a(ignored, ignore),
134
+ flat: flat
135
+ },
136
+ recurs: !flat
137
+ ) do |result, value, key_path, obj|
138
+ result.tap do
139
+ # on first call key_path is empty
140
+ next result if key_path.empty? # this condition isn't met, first call doesn't yield.
141
+
142
+ # discard rooted (i.e. read_only) objects from the diff.
143
+ if root?(obj)
144
+ dig_delete!(result, key_path)
145
+ else
146
+ dig_set!(result, key_path, value)
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ private
153
+
154
+ attr_reader :ignored
155
+
156
+ def root?(obj)
157
+ # root? is a CLASS method (via Rootable::ClassMethods). The instance root?
158
+ # is protected and checks parent position, not the class declaration.
159
+ # Check the ancestor chain for any class that declared root!.
160
+ obj.class.ancestors.any? { |k| k.respond_to?(:root?) && k.root? }
161
+ end
162
+
163
+ def curr_doc(target = subject, flat: flat?)
164
+ may_use_flat_diff(flat) { super(target) }
165
+ end
166
+
167
+ def prev_doc(target = subject, flat: flat?)
168
+ may_use_flat_diff(flat) { super(target) }
169
+ end
170
+
171
+ # Remove nested attributes
172
+ def may_use_flat_diff(flat = flat?)
173
+ yield.then do |json|
174
+ next json unless flat
175
+
176
+ doc_with_non_cascaded_attributes(json)
177
+ end
178
+ end
179
+
180
+ # Remove from `json` doc all the nested properties.
181
+ def doc_with_non_cascaded_attributes(json)
182
+ return json unless subject.class.respond_to?(:_cascaded_doc_keys)
183
+ return json if (excluded = subject.class._cascaded_doc_keys).empty?
184
+
185
+ except_keys(json, *excluded)
186
+ end
187
+ end
188
+ end
@@ -1,55 +1,55 @@
1
- # rubocop:disable Naming/MethodParameterName
2
- module Ecoportal::API::Common::GraphQL::Model::Diffable
3
- # @note this is a literal copy of ecoportal-api gem diff function.
4
- # ecoportal-api-graphql uses APIv2 DoubleModel inheritance chain,
5
- # and should rather adapt `HashDiffPatch`
6
- module HashDiff
7
- ID_KEYS = %w[id].freeze
8
-
9
- class << self
10
- def included(base)
11
- super
12
-
13
- base.send :include, InstanceMethods
14
- end
15
- end
16
-
17
- module InstanceMethods
18
- # @todo: refactor to only reach the current level
19
- # @note the aim is to delegate `hash_diff` to the specific classes
20
- # of the model... bulding the payload/input_base in a cascaded
21
- # way (rather than in a one-off way from the top alone).
22
- def diff(a, b, ignore: [])
23
- case a
24
- when Hash
25
- {}.tap do |diffed|
26
- a.each do |key, a_value|
27
- b_value = b[key] if b
28
- no_changes = (a_value == b_value) || ignore.include?(key)
29
- next if !ID_KEYS.include?(key) && no_changes
30
-
31
- diffed[key] = diff(a_value, b_value, ignore: ignore)
32
- diffed.delete(key) if diffed[key] == {}
33
- end
34
-
35
- # All keys are IDs, so it's actually blank
36
- return {} if (diffed.keys - ID_KEYS).empty?
37
- end
38
- when Array
39
- return a unless b.is_a?(Array) && a.length == b.length
40
-
41
- a.map.with_index do |a_value, idx|
42
- b_value = b[idx]
43
- diff(a_value, b_value, ignore: ignore)
44
- end.reject do |el|
45
- el == {}
46
- end
47
- else
48
- a
49
- end
50
- end
51
- end
52
- end
53
- end
54
-
55
- # rubocop:enable Naming/MethodParameterName
1
+ # rubocop:disable Naming/MethodParameterName
2
+ module Ecoportal::API::Common::GraphQL::Model::Diffable
3
+ # @note this is a literal copy of ecoportal-api gem diff function.
4
+ # ecoportal-api-graphql uses APIv2 DoubleModel inheritance chain,
5
+ # and should rather adapt `HashDiffPatch`
6
+ module HashDiff
7
+ ID_KEYS = %w[id].freeze
8
+
9
+ class << self
10
+ def included(base)
11
+ super
12
+
13
+ base.send :include, InstanceMethods
14
+ end
15
+ end
16
+
17
+ module InstanceMethods
18
+ # @todo: refactor to only reach the current level
19
+ # @note the aim is to delegate `hash_diff` to the specific classes
20
+ # of the model... bulding the payload/input_base in a cascaded
21
+ # way (rather than in a one-off way from the top alone).
22
+ def diff(a, b, ignore: [])
23
+ case a
24
+ when Hash
25
+ {}.tap do |diffed|
26
+ a.each do |key, a_value|
27
+ b_value = b[key] if b
28
+ no_changes = (a_value == b_value) || ignore.include?(key)
29
+ next if !ID_KEYS.include?(key) && no_changes
30
+
31
+ diffed[key] = diff(a_value, b_value, ignore: ignore)
32
+ diffed.delete(key) if diffed[key] == {}
33
+ end
34
+
35
+ # All keys are IDs, so it's actually blank
36
+ return {} if (diffed.keys - ID_KEYS).empty?
37
+ end
38
+ when Array
39
+ return a unless b.is_a?(Array) && a.length == b.length
40
+
41
+ a.map.with_index do |a_value, idx|
42
+ b_value = b[idx]
43
+ diff(a_value, b_value, ignore: ignore)
44
+ end.reject do |el|
45
+ el == {}
46
+ end
47
+ else
48
+ a
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ # rubocop:enable Naming/MethodParameterName