ecoportal-api-graphql 1.3.16 → 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 (482) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +746 -6
  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/diffable/leaf_diff_service.rb +97 -0
  16. data/lib/ecoportal/api/common/graphql/model/diffable.rb +1 -0
  17. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  18. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  19. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  20. data/lib/ecoportal/api/common/graphql.rb +16 -16
  21. data/lib/ecoportal/api/common.graphql.rb +8 -8
  22. data/lib/ecoportal/api/graphql/base/action.rb +1 -1
  23. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  24. data/lib/ecoportal/api/graphql/base/action_event.rb +23 -0
  25. data/lib/ecoportal/api/graphql/base/action_event_page.rb +16 -0
  26. data/lib/ecoportal/api/graphql/base/activity.rb +38 -0
  27. data/lib/ecoportal/api/graphql/base/activity_log.rb +38 -0
  28. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +13 -8
  29. data/lib/ecoportal/api/graphql/base/auth_log.rb +24 -0
  30. data/lib/ecoportal/api/graphql/base/authorization_result.rb +20 -0
  31. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +17 -5
  32. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  33. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  34. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  35. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  36. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  37. data/lib/ecoportal/api/graphql/base/file_container.rb +12 -4
  38. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +2 -0
  39. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  40. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  41. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  42. data/lib/ecoportal/api/graphql/base/location_structure.rb +3 -0
  43. data/lib/ecoportal/api/graphql/base/minimal_dashboard.rb +25 -0
  44. data/lib/ecoportal/api/graphql/base/organization.rb +2 -0
  45. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  46. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  47. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  48. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +26 -3
  49. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  50. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  51. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +47 -8
  52. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  53. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +6 -3
  54. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  55. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  56. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +50 -12
  57. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  58. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  59. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  60. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  61. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  62. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  63. data/lib/ecoportal/api/graphql/base/page/data_field.rb +12 -18
  64. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +51 -0
  65. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  66. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  67. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  68. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  69. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  70. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  71. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  72. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  73. data/lib/ecoportal/api/graphql/base/permissions.rb +15 -0
  74. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  75. data/lib/ecoportal/api/graphql/base/person_member_changelog.rb +23 -0
  76. data/lib/ecoportal/api/graphql/base/preset_view.rb +136 -1
  77. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  78. data/lib/ecoportal/api/graphql/base/register.rb +6 -1
  79. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  80. data/lib/ecoportal/api/graphql/base/template/change_log_entry.rb +118 -0
  81. data/lib/ecoportal/api/graphql/base/template.rb +2 -0
  82. data/lib/ecoportal/api/graphql/base.rb +9 -0
  83. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  84. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +10 -0
  85. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  86. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  87. data/lib/ecoportal/api/graphql/builder/page.rb +0 -16
  88. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  89. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  90. data/lib/ecoportal/api/graphql/builder/template.rb +46 -0
  91. data/lib/ecoportal/api/graphql/builder/template_builder.rb +21 -2
  92. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  93. data/lib/ecoportal/api/graphql/compat/pages.rb +7 -2
  94. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  95. data/lib/ecoportal/api/graphql/compat/response.rb +14 -0
  96. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  97. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  98. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  99. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  100. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  101. data/lib/ecoportal/api/graphql/concerns/threadable.rb +58 -0
  102. data/lib/ecoportal/api/graphql/concerns.rb +1 -0
  103. data/lib/ecoportal/api/graphql/connection/action.rb +1 -1
  104. data/lib/ecoportal/api/graphql/connection/action_category.rb +1 -1
  105. data/lib/ecoportal/api/graphql/connection/activity.rb +11 -0
  106. data/lib/ecoportal/api/graphql/connection/activity_log.rb +11 -0
  107. data/lib/ecoportal/api/graphql/connection/auth_log.rb +11 -0
  108. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +1 -1
  109. data/lib/ecoportal/api/graphql/connection/minimal_dashboard.rb +11 -0
  110. data/lib/ecoportal/api/graphql/connection/page.rb +1 -1
  111. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +1 -1
  112. data/lib/ecoportal/api/graphql/connection/person_member.rb +1 -1
  113. data/lib/ecoportal/api/graphql/connection/person_member_changelog.rb +11 -0
  114. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  115. data/lib/ecoportal/api/graphql/connection/preview_page.rb +1 -1
  116. data/lib/ecoportal/api/graphql/connection/template_change_log.rb +19 -0
  117. data/lib/ecoportal/api/graphql/connection.rb +6 -0
  118. data/lib/ecoportal/api/graphql/diff/change.rb +7 -2
  119. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +19 -1
  120. data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +21 -1
  121. data/lib/ecoportal/api/graphql/diff/version_diff.rb +13 -6
  122. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  123. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  124. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  125. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  126. data/lib/ecoportal/api/graphql/error.rb +12 -12
  127. data/lib/ecoportal/api/graphql/file_upload/client.rb +199 -140
  128. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  129. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  130. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  131. data/lib/ecoportal/api/graphql/fragment/activity.rb +84 -0
  132. data/lib/ecoportal/api/graphql/fragment/activity_log.rb +75 -0
  133. data/lib/ecoportal/api/graphql/fragment/auth_log.rb +29 -0
  134. data/lib/ecoportal/api/graphql/fragment/authorization_result.rb +14 -0
  135. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  136. data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -0
  137. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  138. data/lib/ecoportal/api/graphql/fragment/minimal_dashboard.rb +31 -0
  139. data/lib/ecoportal/api/graphql/fragment/page.rb +1 -0
  140. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +23 -0
  141. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  142. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  143. data/lib/ecoportal/api/graphql/fragment/permissions.rb +98 -0
  144. data/lib/ecoportal/api/graphql/fragment/person_member_changelog.rb +33 -0
  145. data/lib/ecoportal/api/graphql/fragment/template_change_log.rb +102 -0
  146. data/lib/ecoportal/api/graphql/fragment.rb +8 -0
  147. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  148. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  149. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  150. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  151. data/lib/ecoportal/api/graphql/input/action/update.rb +12 -0
  152. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  153. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  154. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  155. data/lib/ecoportal/api/graphql/input/contractor_entity/manager_settings.rb +20 -0
  156. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +6 -27
  157. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +1 -0
  158. data/lib/ecoportal/api/graphql/input/date_range.rb +16 -0
  159. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  160. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  161. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +2 -2
  162. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  163. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  164. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +2 -2
  165. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  166. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  167. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  168. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  169. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  170. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +21 -13
  171. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  172. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  173. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  174. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +6 -2
  175. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  176. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  177. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  178. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  179. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  180. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  181. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  182. data/lib/ecoportal/api/graphql/input/page/review_task.rb +27 -14
  183. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  184. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  185. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  186. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  187. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +17 -2
  188. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  189. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  190. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  191. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  192. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  193. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  194. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  195. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  196. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  197. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  198. data/lib/ecoportal/api/graphql/input/workflow_command/add_checklist_field_item.rb +19 -0
  199. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  200. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  201. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  202. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  203. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +10 -9
  204. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  205. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  206. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  207. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  208. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  213. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  216. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  217. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  218. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +25 -19
  219. data/lib/ecoportal/api/graphql/input/workflow_command/add_smart_fill_config.rb +23 -0
  220. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +3 -2
  221. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  224. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  226. data/lib/ecoportal/api/graphql/input/workflow_command/add_viewable_field.rb +45 -0
  227. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  228. data/lib/ecoportal/api/graphql/input/workflow_command/archive_public_config.rb +19 -0
  229. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  230. data/lib/ecoportal/api/graphql/input/workflow_command/create_public_config.rb +19 -0
  231. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  232. data/lib/ecoportal/api/graphql/input/workflow_command/edit_checklist_field_item.rb +19 -0
  233. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  234. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  235. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +17 -2
  236. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +21 -18
  237. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  238. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  239. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  240. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  241. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  242. data/lib/ecoportal/api/graphql/input/workflow_command/edit_public_config.rb +19 -0
  243. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  244. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  245. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  246. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  247. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  248. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  249. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +23 -19
  250. data/lib/ecoportal/api/graphql/input/workflow_command/edit_smart_fill_config.rb +21 -0
  251. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  252. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  253. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  254. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_advanced_settings.rb +19 -0
  255. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +32 -0
  256. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_container_uid.rb +45 -0
  257. data/lib/ecoportal/api/graphql/input/workflow_command/{edit_page_creator_permissions.rb → edit_template_creator_permissions.rb} +3 -2
  258. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_descriptions.rb +19 -0
  259. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  260. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  261. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/action_list.rb +31 -0
  262. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +28 -24
  263. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +9 -1
  264. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +15 -2
  265. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/file.rb +21 -0
  266. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  267. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +3 -2
  268. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  269. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +27 -3
  270. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +9 -2
  271. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +3 -2
  272. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +3 -2
  273. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  274. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  275. data/lib/ecoportal/api/graphql/input/workflow_command/manage_copy_page_configuration.rb +47 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +3 -2
  277. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  278. data/lib/ecoportal/api/graphql/input/workflow_command/move_viewable_field.rb +33 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  280. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  281. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  282. data/lib/ecoportal/api/graphql/input/workflow_command/remove_checklist_field_item.rb +19 -0
  283. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  284. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  285. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  286. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  287. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  288. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  289. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  290. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  291. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  292. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  293. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  294. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  295. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  296. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  297. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  298. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  299. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  300. data/lib/ecoportal/api/graphql/input/workflow_command/remove_smart_fill_config.rb +19 -0
  301. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  302. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  303. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  304. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  305. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  306. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  307. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  308. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  309. data/lib/ecoportal/api/graphql/input/workflow_command/remove_viewable_field.rb +21 -0
  310. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +3 -2
  311. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +3 -2
  312. data/lib/ecoportal/api/graphql/input/workflow_command.rb +46 -5
  313. data/lib/ecoportal/api/graphql/input.rb +1 -0
  314. data/lib/ecoportal/api/graphql/interface/base_page.rb +50 -3
  315. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +2 -1
  316. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  317. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  318. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  319. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  320. data/lib/ecoportal/api/graphql/logic/base_query.rb +260 -193
  321. data/lib/ecoportal/api/graphql/logic/connection.rb +17 -0
  322. data/lib/ecoportal/api/graphql/logic/input.rb +127 -0
  323. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  324. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  325. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  326. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  327. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  328. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  329. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  330. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  331. data/lib/ecoportal/api/graphql/model/action_event.rb +14 -0
  332. data/lib/ecoportal/api/graphql/model/action_event_page.rb +10 -0
  333. data/lib/ecoportal/api/graphql/model/activity.rb +14 -0
  334. data/lib/ecoportal/api/graphql/model/activity_log.rb +31 -0
  335. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  336. data/lib/ecoportal/api/graphql/model/auth_log.rb +11 -0
  337. data/lib/ecoportal/api/graphql/model/authorization_result.rb +12 -0
  338. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  339. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  340. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  341. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  342. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  343. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  344. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  345. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  346. data/lib/ecoportal/api/graphql/model/minimal_dashboard.rb +14 -0
  347. data/lib/ecoportal/api/graphql/model/organization.rb +36 -0
  348. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  349. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  350. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  351. data/lib/ecoportal/api/graphql/model/page/phased.rb +17 -0
  352. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  353. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  354. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  355. data/lib/ecoportal/api/graphql/model/permissions.rb +179 -0
  356. data/lib/ecoportal/api/graphql/model/person_member.rb +7 -0
  357. data/lib/ecoportal/api/graphql/model/person_member_changelog.rb +15 -0
  358. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  359. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  360. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  361. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  362. data/lib/ecoportal/api/graphql/model/template/change_log_entry.rb +19 -0
  363. data/lib/ecoportal/api/graphql/model/template.rb +4 -1
  364. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  365. data/lib/ecoportal/api/graphql/model.rb +9 -0
  366. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  367. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  368. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  369. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  370. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +21 -11
  371. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +26 -11
  372. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  373. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  374. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  375. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  376. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update_manager_settings.rb +37 -0
  377. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +1 -0
  378. data/lib/ecoportal/api/graphql/mutation/file_container/upload.rb +78 -0
  379. data/lib/ecoportal/api/graphql/mutation/file_container.rb +15 -0
  380. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  381. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  382. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  383. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  384. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  385. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  386. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  387. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  388. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  389. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  390. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  391. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  392. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  393. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  394. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  395. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  396. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  397. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  398. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  399. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  400. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  401. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  402. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  403. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  404. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  405. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  406. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  407. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  408. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  409. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  410. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  411. data/lib/ecoportal/api/graphql/mutation/template/update_related_page.rb +79 -0
  412. data/lib/ecoportal/api/graphql/mutation/template.rb +1 -0
  413. data/lib/ecoportal/api/graphql/mutation.rb +1 -1
  414. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  415. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  416. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  417. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  418. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  419. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  420. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  421. data/lib/ecoportal/api/graphql/payload/contractor_entity/manager_settings.rb +20 -0
  422. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  423. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +1 -0
  424. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +2 -2
  425. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +2 -2
  426. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  427. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  428. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  429. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  430. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  431. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  432. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  433. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  434. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  435. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  436. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  437. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  438. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  439. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  440. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  441. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  442. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  443. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  444. data/lib/ecoportal/api/graphql/payload/template/update_related_page.rb +15 -0
  445. data/lib/ecoportal/api/graphql/payload/template.rb +1 -0
  446. data/lib/ecoportal/api/graphql/payload/upload.rb +12 -0
  447. data/lib/ecoportal/api/graphql/payload.rb +1 -0
  448. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  449. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  450. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  451. data/lib/ecoportal/api/graphql/query/activity_logs.rb +78 -0
  452. data/lib/ecoportal/api/graphql/query/auth_logs.rb +51 -0
  453. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  454. data/lib/ecoportal/api/graphql/query/dashboard_search.rb +57 -0
  455. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  456. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  457. data/lib/ecoportal/api/graphql/query/location_structure.rb +2 -0
  458. data/lib/ecoportal/api/graphql/query/location_structures.rb +2 -0
  459. data/lib/ecoportal/api/graphql/query/page.rb +6 -1
  460. data/lib/ecoportal/api/graphql/query/page_activities.rb +56 -0
  461. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  462. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  463. data/lib/ecoportal/api/graphql/query/permissions.rb +35 -0
  464. data/lib/ecoportal/api/graphql/query/person_member_changelogs.rb +53 -0
  465. data/lib/ecoportal/api/graphql/query/person_members.rb +76 -0
  466. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  467. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  468. data/lib/ecoportal/api/graphql/query/template_change_log.rb +118 -0
  469. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  470. data/lib/ecoportal/api/graphql/query.rb +8 -0
  471. data/lib/ecoportal/api/graphql_version.rb +1 -1
  472. data/lib/ecoportal/api-graphql.rb +10 -10
  473. metadata +82 -19
  474. data/lib/ecoportal/api/common/graphql/CLAUDE.md +0 -36
  475. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +0 -28
  476. data/lib/ecoportal/api/graphql/CLAUDE.md +0 -37
  477. data/lib/ecoportal/api/graphql/base/CLAUDE.md +0 -50
  478. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +0 -65
  479. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +0 -28
  480. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +0 -36
  481. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +0 -40
  482. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +0 -13
@@ -1,193 +1,260 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Logic
5
- class BaseQuery
6
- include Ecoportal::API::Common::GraphQL::ClassHelpers
7
-
8
- inheritable_attrs :accepted_params, :param_defaults
9
-
10
- DETAIL_ERRORS = [
11
- Ecoportal::API::Common::GraphQL::ResponseError,
12
- Ecoportal::API::Common::Client::Error::UnexpectedServerError,
13
- Faraday::ParsingError,
14
- Graphlient::Errors::FaradayServerError,
15
- Graphlient::Errors::GraphQLError,
16
- Graphlient::Errors::ClientError
17
- ].freeze
18
-
19
- class << self
20
- def param_defaults
21
- @param_defaults ||= {}
22
- end
23
-
24
- def accepted_params(*keys, default: :unused)
25
- @accepted_params ||= []
26
- return @accepted_params if keys.empty?
27
-
28
- keys.map(&:to_sym).uniq.each do |key|
29
- @accepted_params |= [key]
30
- param_defaults[key] = default unless default == :unused
31
- end
32
-
33
- @accepted_params.push(*keys).tap(&:uniq!)
34
- @accepted_params
35
- end
36
-
37
- def clear_accepted_params
38
- @param_defaults = {}
39
- @accepted_params = []
40
- end
41
-
42
- def slice_params(kargs)
43
- kargs.slice(*accepted_params)
44
- end
45
-
46
- # Used to obtain the full `path` in the GraphQL query by using `base_path`
47
- # @note it is meant for reusability of queries from different end-points
48
- def field_name(str = nil)
49
- return @field_name unless str
50
-
51
- @field_name = nil
52
- @field_name = str.to_s if str
53
- @field_name
54
- end
55
-
56
- def base_path(path = :unused)
57
- return @base_path if path == :unused
58
-
59
- path ||= []
60
- path = path.to_s.split('.') if path.is_a?(String)
61
- path = path.map(&:to_s).compact
62
-
63
- @base_path = path
64
- end
65
- end
66
-
67
- include Ecoportal::API::Common::Concerns::Benchmarkable
68
-
69
- attr_reader :client, :base_path
70
-
71
- def initialize(client, path: nil, base_path: self.class.base_path)
72
- @path = path
73
- @base_path = base_path
74
- @client = client
75
- end
76
-
77
- # Resolves the `path` by using `path` or `base_path` + `class.field_name`.
78
- def path(field_name = self.class.field_name)
79
- result = @path
80
- result ||= default_path if respond_to?(:default_path, true)
81
- result ||= (base_path + [field_name]) if base_path && field_name
82
- result ||= [field_name]
83
- result
84
- end
85
-
86
- # Query rely that manages the different blocks.
87
- # @return [Class] an object of `response_class` with the results hanging from `path`.
88
- def query(path: self.path, raw_response: {}, **kargs, &block)
89
- print = !is_a?(Mutation)
90
-
91
- benchmarking("#{self.class}##{__method__}", print: print) do
92
- graphql_query(
93
- path: path,
94
- raw_response: raw_response,
95
- **kargs,
96
- &basic_block(&block)
97
- )
98
- end
99
- end
100
-
101
- def response_class
102
- raise "You should override this method in #{self.class}"
103
- end
104
-
105
- def access_point(path = [])
106
- path.last
107
- end
108
-
109
- private
110
-
111
- def basic_block
112
- raise "This method should be implemented in the child class #{self.class}"
113
- end
114
-
115
- # Types that should be passed through as-is as GraphQL variable values.
116
- # Anything else that responds to to_h is treated as a serialisable value object.
117
- VARIABLE_PRIMITIVES = [
118
- ::NilClass, ::TrueClass, ::FalseClass,
119
- ::Integer, ::Float, ::String, ::Symbol,
120
- ::Hash, ::Array
121
- ].freeze
122
- private_constant :VARIABLE_PRIMITIVES
123
-
124
- def normalize_variables(kargs)
125
- kargs.transform_values do |v|
126
- VARIABLE_PRIMITIVES.any? { |t| v.is_a?(t) } || !v.respond_to?(:to_h) ? v : v.to_h
127
- end
128
- end
129
-
130
- def graphql_query(path: self.path, raw_response: {}, **kargs, &block)
131
- default_params = self.class.param_defaults.dup
132
- query_params = self.class.slice_params(normalize_variables(default_params.merge(kargs)))
133
-
134
- query_str = client.to_query_string(&block)
135
- fragment_str = assemble_fragments(query_str)
136
- full_query = fragment_str.empty? ? query_str : "#{query_str}\n\n#{fragment_str}"
137
-
138
- request(*path) do
139
- client.http_client.execute(full_query, variables: query_params).tap do |response|
140
- raw_response[:data] = response
141
- end
142
- end
143
- rescue *DETAIL_ERRORS => _err
144
- pp kargs
145
- puts "Internal Error with these params:\n"
146
- pp query_params
147
- pp block
148
- raise
149
- end
150
-
151
- def request(*path)
152
- response = yield
153
- wrap_response(response, path)
154
- end
155
-
156
- # Resolves all fragment spreads in query_str, recursively following
157
- # spreads inside assembled fragment bodies until no new names are found.
158
- # Names that don't resolve to a registered fragment are skipped safely.
159
- def assemble_fragments(query_str)
160
- tried = {}
161
- assembled = {}
162
- pending = query_str.scan(/\.\.\.(\w+)/).flatten.map(&:to_sym).uniq
163
-
164
- until (unresolved = pending.reject { |n| tried.key?(n) }).empty?
165
- unresolved.each do |name|
166
- tried[name] = true
167
- frag = Ecoportal::API::GraphQL::Fragment.assemble(name)
168
- next if frag.empty?
169
-
170
- assembled[name] = frag
171
- pending |= frag.scan(/\.\.\.(\w+)/).flatten.map(&:to_sym)
172
- end
173
- end
174
-
175
- assembled.values.join("\n\n")
176
- end
177
-
178
- def wrap_response(response, path = [])
179
- # we use the Hash, because fragments are persmissioned
180
- # see Use of Fragments at https://github.com/ashkan18/graphlient/tree/master?tab=readme-ov-file#use-of-fragments
181
- unless (res = response.to_h.dig(*path.dup.unshift('data')))
182
- msg = "Complete failure on request. Path: #{path}\n#{response.to_h.pretty_inspect}"
183
- raise msg
184
- end
185
-
186
- data = Ecoportal::API::Common::GraphQL::HashHelpers.deep_dup(res)
187
- response_class.new(data)
188
- end
189
- end
190
- end
191
- end
192
- end
193
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Logic
5
+ class BaseQuery
6
+ include Ecoportal::API::Common::GraphQL::ClassHelpers
7
+
8
+ inheritable_attrs :accepted_params, :param_defaults
9
+
10
+ DETAIL_ERRORS = [
11
+ Ecoportal::API::Common::GraphQL::ResponseError,
12
+ Ecoportal::API::Common::Client::Error::UnexpectedServerError,
13
+ Faraday::ParsingError,
14
+ Graphlient::Errors::FaradayServerError,
15
+ Graphlient::Errors::GraphQLError,
16
+ Graphlient::Errors::ClientError
17
+ ].freeze
18
+
19
+ class << self
20
+ def param_defaults
21
+ @param_defaults ||= {}
22
+ end
23
+
24
+ def accepted_params(*keys, default: :unused)
25
+ @accepted_params ||= []
26
+ return @accepted_params if keys.empty?
27
+
28
+ keys.map(&:to_sym).uniq.each do |key|
29
+ @accepted_params |= [key]
30
+ param_defaults[key] = default unless default == :unused
31
+ end
32
+
33
+ @accepted_params.push(*keys).tap(&:uniq!)
34
+ @accepted_params
35
+ end
36
+
37
+ def clear_accepted_params
38
+ @param_defaults = {}
39
+ @accepted_params = []
40
+ end
41
+
42
+ def slice_params(kargs)
43
+ kargs.slice(*accepted_params)
44
+ end
45
+
46
+ # Used to obtain the full `path` in the GraphQL query by using `base_path`
47
+ # @note it is meant for reusability of queries from different end-points
48
+ def field_name(str = nil)
49
+ return @field_name unless str
50
+
51
+ @field_name = nil
52
+ @field_name = str.to_s if str
53
+ @field_name
54
+ end
55
+
56
+ def base_path(path = :unused)
57
+ return @base_path if path == :unused
58
+
59
+ path ||= []
60
+ path = path.to_s.split('.') if path.is_a?(String)
61
+ path = path.map(&:to_s).compact
62
+
63
+ @base_path = path
64
+ end
65
+ end
66
+
67
+ include Ecoportal::API::Common::Concerns::Benchmarkable
68
+
69
+ attr_reader :client, :base_path
70
+
71
+ def initialize(client, path: nil, base_path: self.class.base_path)
72
+ @path = path
73
+ @base_path = base_path
74
+ @client = client
75
+ end
76
+
77
+ # Resolves the `path` by using `path` or `base_path` + `class.field_name`.
78
+ def path(field_name = self.class.field_name)
79
+ result = @path
80
+ result ||= default_path if respond_to?(:default_path, true)
81
+ result ||= (base_path + [field_name]) if base_path && field_name
82
+ result ||= [field_name]
83
+ result
84
+ end
85
+
86
+ # Query rely that manages the different blocks.
87
+ # @return [Class] an object of `response_class` with the results hanging from `path`.
88
+ def query(path: self.path, raw_response: {}, **kargs, &block)
89
+ print = !is_a?(Mutation)
90
+
91
+ benchmarking("#{self.class}##{__method__}", print: print) do
92
+ graphql_query(
93
+ path: path,
94
+ raw_response: raw_response,
95
+ **kargs,
96
+ &basic_block(&block)
97
+ )
98
+ end
99
+ end
100
+
101
+ def response_class
102
+ raise "You should override this method in #{self.class}"
103
+ end
104
+
105
+ def access_point(path = [])
106
+ path.last
107
+ end
108
+
109
+ private
110
+
111
+ def basic_block
112
+ raise "This method should be implemented in the child class #{self.class}"
113
+ end
114
+
115
+ # Types that should be passed through as-is as GraphQL variable values.
116
+ # Anything else that responds to to_h is treated as a serialisable value object.
117
+ VARIABLE_PRIMITIVES = [
118
+ ::NilClass, ::TrueClass, ::FalseClass,
119
+ ::Integer, ::Float, ::String, ::Symbol,
120
+ ::Hash, ::Array
121
+ ].freeze
122
+ private_constant :VARIABLE_PRIMITIVES
123
+
124
+ def normalize_variables(kargs)
125
+ kargs.transform_values do |v|
126
+ VARIABLE_PRIMITIVES.any? { |t| v.is_a?(t) } || !v.respond_to?(:to_h) ? v : v.to_h
127
+ end
128
+ end
129
+
130
+ def graphql_query(path: self.path, raw_response: {}, **kargs, &block)
131
+ default_params = self.class.param_defaults.dup
132
+ query_params = self.class.slice_params(normalize_variables(default_params.merge(kargs)))
133
+
134
+ query_str = client.to_query_string(&block)
135
+ fragment_str = assemble_fragments(query_str)
136
+ full_query = fragment_str.empty? ? query_str : "#{query_str}\n\n#{fragment_str}"
137
+
138
+ request(*path) do
139
+ client.http_client.execute(full_query, variables: query_params).tap do |response|
140
+ raw_response[:data] = response
141
+ end
142
+ end
143
+ rescue *DETAIL_ERRORS => err
144
+ report_query_failure(err, query_params)
145
+ raise
146
+ end
147
+
148
+ # Reports WHERE a query failed, on stderr, and re-raises untouched.
149
+ #
150
+ # ★ This replaces an unconditional `pp kargs` / `pp query_params` / `pp block`
151
+ # to STDOUT. That dump was NOT debug litter — it existed because graphlient
152
+ # masks the origin of a failure: `Client#parse`/`#execute` do
153
+ # `raise Graphlient::Errors::ClientError, e.message`, which leaves graphlient's
154
+ # own `inner_exception` nil AND replaces the backtrace, discarding the source
155
+ # location `graphql-client` deliberately sets via
156
+ # `set_backtrace(["#{filename}:#{line}"])`. With that gone there was no other
157
+ # way to see which query blew up. (Tracked upstream; see
158
+ # `.ai-assistance/code/refactoring/opportunities.md`.)
159
+ #
160
+ # But the location was never actually destroyed. Ruby populates `.cause`
161
+ # automatically when you raise inside a rescue, so the original error — with the
162
+ # location intact — is one hop away. Verified by execution:
163
+ #
164
+ # err.inner_exception => nil (graphlient's api, broken)
165
+ # err.backtrace.first => ".../client.rb:20" (the raise site, useless)
166
+ # err.cause.backtrace.first => "app/queries/x.rb:198" (the QUERY site)
167
+ #
168
+ # So this reports MORE of what the dump was for (the failing query's own source
169
+ # location) and LESS of what it should never have emitted: `query_params` holds
170
+ # GraphQL variables — page ids, emails, field values — and printing them to
171
+ # stdout put customer data into CI logs. Variables are now shown only when the
172
+ # client's existing `deep_logging` flag is on (see `dump_variables?` for why NOT
173
+ # the logger level). `pp block` is dropped outright: inspecting a Proc never
174
+ # identified anything.
175
+ #
176
+ # Emitted with `warn` (stderr, and suppressible via the Warning module) rather than
177
+ # `puts`, so tools that pipe query results keep a clean stdout. Tracked as Q-43.
178
+ def report_query_failure(err, query_params = nil)
179
+ origin = err.cause
180
+ lines = ["[#{self.class.name || self.class}] #{err.class}: #{failure_message(err)}"]
181
+ lines << " origin: #{origin.class}" if origin
182
+ lines << " at: #{origin.backtrace.first}" if origin&.backtrace&.first
183
+ lines << " params: #{query_params.inspect}" if dump_variables?
184
+
185
+ warn(lines.join("\n"))
186
+ end
187
+
188
+ # graphlient's `GraphQLError#to_s` / `ExecutionError#to_s` format from
189
+ # `errors.details` and render an EMPTY string when that is empty — and because
190
+ # they override `to_s`, the fallback text their constructors pass to `super` is
191
+ # unreachable. An exception with a blank message is invisible in a log, so say
192
+ # so rather than printing nothing.
193
+ def failure_message(err)
194
+ msg = err.message.to_s
195
+ return msg unless msg.empty?
196
+
197
+ "(blank — #{err.class} renders its message from errors.details, which was empty)"
198
+ end
199
+
200
+ # Opt-in via the client's EXISTING `deep_logging` flag ("whether or not batch
201
+ # responses should be logged") — the same class of thing as dumping variables,
202
+ # and it defaults to false. No new env var and no new config knob.
203
+ #
204
+ # ⚠ Do NOT gate this on `logger.debug?`, which is the obvious-looking choice and
205
+ # is wrong: `HttpClient`'s default logger is `::Logger.new(IO::NULL)`, and a
206
+ # fresh Logger's level is DEBUG (0) — so `logger.debug?` is `true` out of the
207
+ # box and variables would leak by default, which is the whole thing being fixed.
208
+ # A spec pins this.
209
+ def dump_variables?
210
+ http = client&.http_client
211
+ return false unless http.respond_to?(:deep_logging?, true)
212
+
213
+ !!http.send(:deep_logging?)
214
+ rescue StandardError
215
+ false
216
+ end
217
+
218
+ def request(*path)
219
+ response = yield
220
+ wrap_response(response, path)
221
+ end
222
+
223
+ # Resolves all fragment spreads in query_str, recursively following
224
+ # spreads inside assembled fragment bodies until no new names are found.
225
+ # Names that don't resolve to a registered fragment are skipped safely.
226
+ def assemble_fragments(query_str)
227
+ tried = {}
228
+ assembled = {}
229
+ pending = query_str.scan(/\.\.\.(\w+)/).flatten.map(&:to_sym).uniq
230
+
231
+ until (unresolved = pending.reject { |n| tried.key?(n) }).empty?
232
+ unresolved.each do |name|
233
+ tried[name] = true
234
+ frag = Ecoportal::API::GraphQL::Fragment.assemble(name)
235
+ next if frag.empty?
236
+
237
+ assembled[name] = frag
238
+ pending |= frag.scan(/\.\.\.(\w+)/).flatten.map(&:to_sym)
239
+ end
240
+ end
241
+
242
+ assembled.values.join("\n\n")
243
+ end
244
+
245
+ def wrap_response(response, path = [])
246
+ # we use the Hash, because fragments are persmissioned
247
+ # see Use of Fragments at https://github.com/ashkan18/graphlient/tree/master?tab=readme-ov-file#use-of-fragments
248
+ unless (res = response.to_h.dig(*path.dup.unshift('data')))
249
+ msg = "Complete failure on request. Path: #{path}\n#{response.to_h.pretty_inspect}"
250
+ raise msg
251
+ end
252
+
253
+ data = Ecoportal::API::Common::GraphQL::HashHelpers.deep_dup(res)
254
+ response_class.new(data)
255
+ end
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
@@ -18,6 +18,23 @@ module Ecoportal
18
18
  embeds_many :nodes, klass: :node_class
19
19
  embeds_one :pageInfo, klass: Base::PageInfo
20
20
 
21
+ # Bind a connection subclass to its concrete node type.
22
+ #
23
+ # The base `embeds_many :nodes, klass: :node_class` builds a SINGLE dynamic
24
+ # `CollectionModel` ("nodes::node_class") that every subclass inherits and shares.
25
+ # The v2 collection layer memoizes the resolved class on that shared collection
26
+ # (items_klass.rb:62-63), so the FIRST connection instantiated in a process poisons
27
+ # every other connection's instance `nodes` typing (e.g. a MinimalDashboard connection
28
+ # returning AuthLog nodes). Declaring `embeds_many :nodes` per subclass with the concrete
29
+ # class gives each subclass its OWN collection ("nodes::Model::X") bound to a real Class —
30
+ # no shared symbol, nothing to memoize wrongly.
31
+ #
32
+ # Use `nodes_of Model::X` in a subclass instead of `class_resolver :node_class, Model::X`.
33
+ def self.nodes_of(klass)
34
+ class_resolver :node_class, klass
35
+ embeds_many :nodes, klass: klass
36
+ end
37
+
21
38
  def empty?
22
39
  count < 1
23
40
  end
@@ -5,6 +5,133 @@ module Ecoportal
5
5
  class Input < Logic::BaseModel
6
6
  passthrough :clientMutationId
7
7
 
8
+ # Declarative set-diff macro for id-list fields that the schema exposes as
9
+ # `IdDiffInput { additions: [ID!], removals: [ID!] }` on the *update* mutation.
10
+ #
11
+ # Mixed into any Input class (whether it inherits from {Logic::Input} or from a
12
+ # `Base::` data model) via `extend`. {Logic::Input} extends it for its own subclasses;
13
+ # data-model Input classes call `extend Logic::Input::IdDiffFields` explicitly.
14
+ #
15
+ # Usage:
16
+ # class Update < Base::ContractorEntity
17
+ # extend Logic::Input::IdDiffFields
18
+ # id_diff_fields :associatedPeopleIds, :leadContractorIds
19
+ # end
20
+ #
21
+ # It installs (or augments) a `from_model` that, for each declared field, computes the
22
+ # delta DIRECTLY from the READ model's `doc[key]` vs `original_doc[key]` arrays:
23
+ # additions = current - original
24
+ # removals = original - current
25
+ # A field is omitted when unchanged. The delta is computed directly (NOT via the
26
+ # cascaded DiffService) because these array fields are dropped from the flat diff and
27
+ # the read model is `root!` (so its doc/original_doc resolve without cascade side effects).
28
+ module IdDiffFields
29
+ # @return [Array<Symbol>] the fields declared for set-diff on this class.
30
+ def id_diff_fields_list
31
+ @id_diff_fields_list ||= []
32
+ end
33
+
34
+ # Declares the id-list fields that must be reshaped into IdDiff `{ additions:, removals: }`.
35
+ # @param fields [Array<Symbol>] field names (as they appear in the read model's doc).
36
+ # @return [void]
37
+ def id_diff_fields(*fields)
38
+ id_diff_fields_list.concat(fields.flatten.map(&:to_sym)).uniq!
39
+ end
40
+
41
+ # Computes the IdDiff-shaped deltas for the declared fields and merges them into +diff+.
42
+ # @param model [Common::GraphQL::Model] the subject (read) model.
43
+ # @param diff [Hash, nil] the base mutation input hash to augment (may be nil).
44
+ # @return [Hash, nil] +diff+ with per-field `{ additions:, removals: }` merged in,
45
+ # or the original value when nothing changed.
46
+ def merge_id_diffs(model, diff)
47
+ id_diff_fields_list.each do |field|
48
+ key = field.to_s
49
+ current = Array(model.doc[key])
50
+ original = Array(model.original_doc[key])
51
+ next if current == original
52
+
53
+ diff ||= {}
54
+ diff[:id] ||= model.id if model.respond_to?(:id)
55
+ diff[field] = { additions: current - original, removals: original - current }
56
+ end
57
+ diff
58
+ end
59
+
60
+ # Reshaping `from_model`: base diff (via {Logic::Input.from_model}) + set-diff deltas.
61
+ # @param model [Common::GraphQL::Model] the subject model.
62
+ # @return [Hash, nil] the mutation input hash, or nil when there are no changes.
63
+ def from_model(model, **kargs)
64
+ diff = Logic::Input.from_model(model, **kargs)
65
+ merge_id_diffs(model, diff)
66
+ end
67
+ end
68
+
69
+ # Declarative FULL-ARRAY macro for id-list fields that the schema exposes as a plain
70
+ # `[ID!]` on the *update* mutation (NOT `IdDiffInput`). The server expects the COMPLETE
71
+ # current array, replacing the stored value wholesale — there is no additions/removals
72
+ # delta shape. This is the counterpart to {IdDiffFields}.
73
+ #
74
+ # Mixed into any Input class via `extend`, exactly like {IdDiffFields}. Data-model Input
75
+ # classes call `extend Logic::Input::FullArrayFields` explicitly.
76
+ #
77
+ # Usage:
78
+ # class Update < Base::Action
79
+ # extend Logic::Input::FullArrayFields
80
+ # full_array_fields :assignedPersonMemberIds, :locationIds, :fileContainerIds
81
+ # end
82
+ #
83
+ # It installs (or augments) a `from_model` that, for each declared field, emits the FULL
84
+ # current array taken DIRECTLY from the READ model's `doc[key]` whenever it differs from
85
+ # `original_doc[key]`. A field is omitted when unchanged. The value is read directly (NOT
86
+ # via the cascaded DiffService) because these array fields are dropped from the flat diff
87
+ # and the read model is `root!`.
88
+ #
89
+ # Schema evidence (live introspection 20260605, UpdateActionInput):
90
+ # assignedPersonMemberIds : [ID!]
91
+ # locationIds : [ID!]
92
+ # fileContainerIds : [ID!]
93
+ # None are `IdDiffInput` — hence full-array, not delta.
94
+ module FullArrayFields
95
+ # @return [Array<Symbol>] the fields declared for full-array emission on this class.
96
+ def full_array_fields_list
97
+ @full_array_fields_list ||= []
98
+ end
99
+
100
+ # Declares the id-list fields that must be emitted as their COMPLETE current array.
101
+ # @param fields [Array<Symbol>] field names (as they appear in the read model's doc).
102
+ # @return [void]
103
+ def full_array_fields(*fields)
104
+ full_array_fields_list.concat(fields.flatten.map(&:to_sym)).uniq!
105
+ end
106
+
107
+ # Emits the full current array for each changed declared field and merges it into +diff+.
108
+ # @param model [Common::GraphQL::Model] the subject (read) model.
109
+ # @param diff [Hash, nil] the base mutation input hash to augment (may be nil).
110
+ # @return [Hash, nil] +diff+ with per-field full arrays merged in, or the original
111
+ # value when nothing changed.
112
+ def merge_full_arrays(model, diff)
113
+ full_array_fields_list.each do |field|
114
+ key = field.to_s
115
+ current = Array(model.doc[key])
116
+ original = Array(model.original_doc[key])
117
+ next if current == original
118
+
119
+ diff ||= {}
120
+ diff[:id] ||= model.id if model.respond_to?(:id)
121
+ diff[field] = current
122
+ end
123
+ diff
124
+ end
125
+
126
+ # Reshaping `from_model`: base diff (via {Logic::Input.from_model}) + full arrays.
127
+ # @param model [Common::GraphQL::Model] the subject model.
128
+ # @return [Hash, nil] the mutation input hash, or nil when there are no changes.
129
+ def from_model(model, **kargs)
130
+ diff = Logic::Input.from_model(model, **kargs)
131
+ merge_full_arrays(model, diff)
132
+ end
133
+ end
134
+
8
135
  class << self
9
136
  # Builds a mutation input hash from a model's diff.
10
137
  # Subclasses override this to reshape fields (e.g. array → IdDiffInput).