ecoportal-api-graphql 2.0.0 → 3.0.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 (393) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +793 -14
  3. data/LICENSE +21 -21
  4. data/README.gem.md +53 -0
  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 +107 -69
  8. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  9. data/lib/ecoportal/api/common/graphql/http_client.rb +124 -8
  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 +1 -1
  16. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  17. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  18. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  19. data/lib/ecoportal/api/common/graphql.rb +16 -16
  20. data/lib/ecoportal/api/common.graphql.rb +8 -8
  21. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  22. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +1 -1
  23. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  24. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  25. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  26. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  27. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  28. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  29. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  30. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  31. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  32. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  33. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  34. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +1 -1
  35. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  36. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  37. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  38. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +160 -12
  39. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  40. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  41. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  42. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  43. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  44. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  45. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  46. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  47. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +51 -0
  48. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  49. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  50. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  51. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  52. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  53. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  54. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  55. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  56. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  57. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  58. data/lib/ecoportal/api/graphql/base/register.rb +1 -1
  59. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  60. data/lib/ecoportal/api/graphql/base/temp_image.rb +28 -0
  61. data/lib/ecoportal/api/graphql/base/template/change_log_entry.rb +118 -0
  62. data/lib/ecoportal/api/graphql/base/template.rb +2 -0
  63. data/lib/ecoportal/api/graphql/base.rb +1 -0
  64. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  65. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  66. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  67. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  68. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  69. data/lib/ecoportal/api/graphql/builder/template.rb +37 -4
  70. data/lib/ecoportal/api/graphql/builder/template_builder.rb +21 -2
  71. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +1 -1
  72. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  73. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  74. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  75. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  76. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  77. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  78. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  79. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  80. data/lib/ecoportal/api/graphql/connection/template_change_log.rb +19 -0
  81. data/lib/ecoportal/api/graphql/connection.rb +1 -0
  82. data/lib/ecoportal/api/graphql/diff/change.rb +7 -2
  83. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +19 -1
  84. data/lib/ecoportal/api/graphql/diff/version_diff.rb +13 -6
  85. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  86. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  87. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  88. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  89. data/lib/ecoportal/api/graphql/error.rb +12 -12
  90. data/lib/ecoportal/api/graphql/file_upload/client.rb +140 -35
  91. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  92. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  93. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  94. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  95. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  96. data/lib/ecoportal/api/graphql/fragment/page.rb +1 -0
  97. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +10 -3
  98. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  99. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  100. data/lib/ecoportal/api/graphql/fragment/permissions.rb +0 -2
  101. data/lib/ecoportal/api/graphql/fragment/template_change_log.rb +102 -0
  102. data/lib/ecoportal/api/graphql/fragment.rb +1 -0
  103. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  104. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  105. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  106. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  107. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  108. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  109. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  110. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  111. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  112. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  113. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  114. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  115. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  116. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  117. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  118. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  119. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +21 -13
  120. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  121. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  122. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  123. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  124. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  125. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  126. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  127. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  128. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  129. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  130. data/lib/ecoportal/api/graphql/input/page/review_task.rb +27 -14
  131. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  132. data/lib/ecoportal/api/graphql/input/page/update.rb +109 -6
  133. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  134. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  135. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  136. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +1 -1
  137. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  138. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  139. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  140. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  141. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  142. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  143. data/lib/ecoportal/api/graphql/input/search_conf.rb +1 -1
  144. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  145. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  146. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  147. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  148. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  149. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  150. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  151. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  152. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +10 -9
  153. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  154. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  155. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  156. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  157. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  158. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  159. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  160. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  161. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  162. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  163. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  164. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  165. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  166. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  167. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +25 -19
  168. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  169. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  170. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  171. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  172. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  173. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  174. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  175. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  176. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  177. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  178. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +7 -2
  179. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +21 -18
  180. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  181. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  182. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  183. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  184. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  185. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  186. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  187. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  188. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  189. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  190. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  191. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +23 -19
  192. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  193. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  194. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  195. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +7 -2
  196. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_container_uid.rb +1 -1
  197. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  198. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  199. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +28 -24
  200. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +8 -2
  201. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  202. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  203. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +8 -2
  204. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  205. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  206. data/lib/ecoportal/api/graphql/input/workflow_command/manage_copy_page_configuration.rb +47 -0
  207. data/lib/ecoportal/api/graphql/input/workflow_command/move_section_to_stage.rb +33 -0
  208. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  213. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  216. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  217. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  218. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  219. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  220. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  221. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  224. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  226. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  227. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  228. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  229. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  230. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  231. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  232. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  233. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  234. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  235. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  236. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  237. data/lib/ecoportal/api/graphql/input/workflow_command.rb +5 -0
  238. data/lib/ecoportal/api/graphql/interface/base_page.rb +14 -0
  239. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  240. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  241. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  242. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  243. data/lib/ecoportal/api/graphql/logic/base_query.rb +260 -193
  244. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  245. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  246. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  247. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  248. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  249. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  250. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  251. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  252. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  253. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  254. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  255. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  256. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  257. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  258. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  259. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  260. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  261. data/lib/ecoportal/api/graphql/model/organization.rb +9 -0
  262. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  263. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  264. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  265. data/lib/ecoportal/api/graphql/model/page/phased.rb +17 -0
  266. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  267. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  268. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  269. data/lib/ecoportal/api/graphql/model/permissions.rb +6 -0
  270. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  271. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  272. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  273. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  274. data/lib/ecoportal/api/graphql/model/temp_image.rb +10 -0
  275. data/lib/ecoportal/api/graphql/model/template/binding.rb +60 -0
  276. data/lib/ecoportal/api/graphql/model/template/change_log_entry.rb +19 -0
  277. data/lib/ecoportal/api/graphql/model/template/command_grouper.rb +107 -0
  278. data/lib/ecoportal/api/graphql/model/template/command_normalizer.rb +116 -0
  279. data/lib/ecoportal/api/graphql/model/template/command_synthesis.rb +262 -0
  280. data/lib/ecoportal/api/graphql/model/template/field.rb +68 -0
  281. data/lib/ecoportal/api/graphql/model/template/force.rb +65 -0
  282. data/lib/ecoportal/api/graphql/model/template/helper.rb +32 -0
  283. data/lib/ecoportal/api/graphql/model/template/instance.rb +202 -0
  284. data/lib/ecoportal/api/graphql/model/template/node.rb +78 -0
  285. data/lib/ecoportal/api/graphql/model/template/option.rb +49 -0
  286. data/lib/ecoportal/api/graphql/model/template/read.rb +164 -0
  287. data/lib/ecoportal/api/graphql/model/template/section.rb +82 -0
  288. data/lib/ecoportal/api/graphql/model/template/stage.rb +49 -0
  289. data/lib/ecoportal/api/graphql/model/template/staged_executor.rb +236 -0
  290. data/lib/ecoportal/api/graphql/model/template.rb +37 -1
  291. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  292. data/lib/ecoportal/api/graphql/model.rb +1 -0
  293. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  294. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  295. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  296. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  297. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +1 -1
  298. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +1 -1
  299. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  300. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  301. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  302. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  303. data/lib/ecoportal/api/graphql/mutation/file_container/upload.rb +11 -4
  304. data/lib/ecoportal/api/graphql/mutation/image/upload.rb +88 -0
  305. data/lib/ecoportal/api/graphql/mutation/image.rb +14 -0
  306. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  307. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  308. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  309. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  310. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  311. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  312. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  313. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  314. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  315. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  316. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  317. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  318. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  319. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  320. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  321. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  322. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  323. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  324. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  325. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  326. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  327. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  328. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  329. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  330. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  331. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  332. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  333. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  334. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  335. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  336. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  337. data/lib/ecoportal/api/graphql/mutation/template/create.rb +35 -3
  338. data/lib/ecoportal/api/graphql/mutation/template/update.rb +4 -2
  339. data/lib/ecoportal/api/graphql/mutation.rb +1 -0
  340. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  341. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  342. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  343. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  344. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  345. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  346. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  347. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  348. data/lib/ecoportal/api/graphql/payload/images_upload.rb +14 -0
  349. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +2 -2
  350. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +2 -2
  351. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  352. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  353. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  354. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  355. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  356. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  357. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  358. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  359. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  360. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  361. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  362. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  363. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  364. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  365. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  366. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  367. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  368. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  369. data/lib/ecoportal/api/graphql/payload.rb +1 -0
  370. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  371. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  372. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  373. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  374. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  375. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  376. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  377. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  378. data/lib/ecoportal/api/graphql/query/permissions.rb +1 -1
  379. data/lib/ecoportal/api/graphql/query/person_members.rb +76 -0
  380. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  381. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  382. data/lib/ecoportal/api/graphql/query/template_change_log.rb +118 -0
  383. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  384. data/lib/ecoportal/api/graphql/query.rb +2 -0
  385. data/lib/ecoportal/api/graphql_version.rb +1 -1
  386. data/lib/ecoportal/api-graphql.rb +10 -10
  387. metadata +45 -9
  388. data/README.md +0 -24
  389. data/lib/ecoportal/api/common/graphql/CLAUDE.md +0 -36
  390. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +0 -28
  391. data/lib/ecoportal/api/graphql/CLAUDE.md +0 -37
  392. data/lib/ecoportal/api/graphql/base/CLAUDE.md +0 -50
  393. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +0 -65
@@ -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
+ # the repo's internal docs.)
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
@@ -1,59 +1,59 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Logic
5
- class Mutation < Logic::BaseQuery
6
- class GenericPayload
7
- def initialize(*_args, **_kargs)
8
- raise 'Missuse error. You should define a payload_class for a class that inherits from Mutation class.'
9
- end
10
- end
11
-
12
- class GenericInput
13
- def initialize(*_args, **_kargs)
14
- raise 'Missuse error. You should define a input_class for a class that inherits from Mutation class.'
15
- end
16
- end
17
-
18
- class_resolver :payload_class, GenericPayload
19
- class_resolver :input_class, GenericInput
20
-
21
- accepted_params :input
22
-
23
- # Query rely that manages the different blocks.
24
- # @return [Class] an object of `response_class` with the results hanving from `path`.
25
- def query(input:, path: self.path, **kargs, &block)
26
- super(
27
- input: as_input(input),
28
- path: path,
29
- **kargs,
30
- &block
31
- )
32
- end
33
-
34
- def response_class
35
- payload_class
36
- end
37
-
38
- private
39
-
40
- def as_input(value)
41
- case value
42
- when input_class, Logic::BaseModel
43
- value.as_input
44
- when Hash
45
- value
46
- # when Hash
47
- # value = Helpers::Model::HashKeys.keys_to_sym_deep(value)
48
- # Ecoportal::API::Base::Model.as_input(value)
49
- when Enumerable
50
- value.map {|v| as_input(v)}
51
- else
52
- raise ArgumentError, "Expecting Hash, GraphQL::Base::Model or Enumerable. Unsupported type '#{value.class}'."
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
59
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Logic
5
+ class Mutation < Logic::BaseQuery
6
+ class GenericPayload
7
+ def initialize(*_args, **_kargs)
8
+ raise 'Missuse error. You should define a payload_class for a class that inherits from Mutation class.'
9
+ end
10
+ end
11
+
12
+ class GenericInput
13
+ def initialize(*_args, **_kargs)
14
+ raise 'Missuse error. You should define a input_class for a class that inherits from Mutation class.'
15
+ end
16
+ end
17
+
18
+ class_resolver :payload_class, GenericPayload
19
+ class_resolver :input_class, GenericInput
20
+
21
+ accepted_params :input
22
+
23
+ # Query rely that manages the different blocks.
24
+ # @return [Class] an object of `response_class` with the results hanving from `path`.
25
+ def query(input:, path: self.path, **kargs, &block)
26
+ super(
27
+ input: as_input(input),
28
+ path: path,
29
+ **kargs,
30
+ &block
31
+ )
32
+ end
33
+
34
+ def response_class
35
+ payload_class
36
+ end
37
+
38
+ private
39
+
40
+ def as_input(value)
41
+ case value
42
+ when input_class, Logic::BaseModel
43
+ value.as_input
44
+ when Hash
45
+ value
46
+ # when Hash
47
+ # value = Helpers::Model::HashKeys.keys_to_sym_deep(value)
48
+ # Ecoportal::API::Base::Model.as_input(value)
49
+ when Enumerable
50
+ value.map {|v| as_input(v)}
51
+ else
52
+ raise ArgumentError, "Expecting Hash, GraphQL::Base::Model or Enumerable. Unsupported type '#{value.class}'."
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,42 +1,42 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Logic
5
- class Payload < Logic::BaseModel
6
- class GenericItem
7
- def initialize(*_args, **_kargs)
8
- raise "Missuse error. You should define a item_class for a class that inherits from GraphqlPayload class."
9
- end
10
- end
11
-
12
- read_only!
13
-
14
- passthrough :clientMutationId
15
-
16
- class_resolver :item_class, GenericItem
17
-
18
- embeds_one :item, klass: :item_class
19
- embeds_one :errors, klass: Error::ValidationErrors, nullable: true
20
-
21
- def success?
22
- !error?
23
- end
24
-
25
- def error?
26
- return false if errors.nil?
27
-
28
- !errors.empty?
29
- end
30
-
31
- def error_doc
32
- return unless (err_doc = errors&.doc)
33
-
34
- {
35
- errors: err_doc
36
- }
37
- end
38
- end
39
- end
40
- end
41
- end
42
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Logic
5
+ class Payload < Logic::BaseModel
6
+ class GenericItem
7
+ def initialize(*_args, **_kargs)
8
+ raise "Missuse error. You should define a item_class for a class that inherits from GraphqlPayload class."
9
+ end
10
+ end
11
+
12
+ read_only!
13
+
14
+ passthrough :clientMutationId
15
+
16
+ class_resolver :item_class, GenericItem
17
+
18
+ embeds_one :item, klass: :item_class
19
+ embeds_one :errors, klass: Error::ValidationErrors, nullable: true
20
+
21
+ def success?
22
+ !error?
23
+ end
24
+
25
+ def error?
26
+ return false if errors.nil?
27
+
28
+ !errors.empty?
29
+ end
30
+
31
+ def error_doc
32
+ return unless (err_doc = errors&.doc)
33
+
34
+ {
35
+ errors: err_doc
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end