ecoportal-api-graphql 1.3.5 → 1.3.17

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 (527) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +943 -477
  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 +195 -145
  10. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -51
  11. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -47
  12. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -180
  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 -242
  15. data/lib/ecoportal/api/common/graphql/model/diffable.rb +54 -54
  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.rb +43 -43
  22. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  23. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
  24. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +67 -67
  25. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  26. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  27. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
  28. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  29. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  30. data/lib/ecoportal/api/graphql/base/file_container.rb +14 -14
  31. data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
  32. data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
  33. data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
  34. data/lib/ecoportal/api/graphql/base/force.rb +65 -0
  35. data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
  36. data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
  37. data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
  38. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +15 -15
  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 +27 -27
  43. data/lib/ecoportal/api/graphql/base/organization.rb +15 -15
  44. data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
  45. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
  46. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
  47. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
  48. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +119 -0
  49. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
  50. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
  51. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
  52. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
  53. data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
  54. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
  55. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
  56. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
  57. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
  58. data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
  59. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
  60. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
  61. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
  62. data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
  63. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
  64. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
  65. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
  66. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
  67. data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
  68. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
  69. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -14
  70. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -12
  71. data/lib/ecoportal/api/graphql/base/page/section_collection.rb +85 -0
  72. data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
  73. data/lib/ecoportal/api/graphql/base/page.rb +17 -14
  74. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  75. data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
  76. data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
  77. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
  78. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
  79. data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
  80. data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
  81. data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
  82. data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
  83. data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
  84. data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
  85. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
  86. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
  87. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
  88. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
  89. data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
  90. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
  91. data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
  92. data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
  93. data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
  94. data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
  95. data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
  96. data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
  97. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
  98. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  99. data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
  100. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
  101. data/lib/ecoportal/api/graphql/base/register.rb +18 -0
  102. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  103. data/lib/ecoportal/api/graphql/base/template.rb +35 -0
  104. data/lib/ecoportal/api/graphql/base.rb +37 -24
  105. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  106. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +41 -41
  107. data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
  108. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  109. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  110. data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
  111. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
  112. data/lib/ecoportal/api/graphql/builder/register.rb +49 -41
  113. data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
  114. data/lib/ecoportal/api/graphql/builder/template_builder.rb +174 -0
  115. data/lib/ecoportal/api/graphql/builder.rb +17 -14
  116. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +142 -0
  117. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
  118. data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
  119. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
  120. data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
  121. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
  122. data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
  123. data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
  124. data/lib/ecoportal/api/graphql/compat.rb +17 -0
  125. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
  126. data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
  127. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -75
  128. data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
  129. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
  130. data/lib/ecoportal/api/graphql/concerns.rb +14 -10
  131. data/lib/ecoportal/api/graphql/connection/action.rb +11 -11
  132. data/lib/ecoportal/api/graphql/connection/action_category.rb +11 -11
  133. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -11
  134. data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
  135. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
  136. data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -11
  137. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
  138. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
  139. data/lib/ecoportal/api/graphql/connection.rb +17 -13
  140. data/lib/ecoportal/api/graphql/diff/change.rb +59 -0
  141. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +329 -0
  142. data/lib/ecoportal/api/graphql/diff/cross_object_diff.rb +165 -0
  143. data/lib/ecoportal/api/graphql/diff/deploy.rb +121 -0
  144. data/lib/ecoportal/api/graphql/diff/id_resolver.rb +64 -0
  145. data/lib/ecoportal/api/graphql/diff/pairing/candidate.rb +32 -0
  146. data/lib/ecoportal/api/graphql/diff/pairing/engine.rb +173 -0
  147. data/lib/ecoportal/api/graphql/diff/pairing/ledger.rb +119 -0
  148. data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +104 -0
  149. data/lib/ecoportal/api/graphql/diff/strategy.rb +113 -0
  150. data/lib/ecoportal/api/graphql/diff/version_diff.rb +332 -0
  151. data/lib/ecoportal/api/graphql/diff.rb +34 -0
  152. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  153. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  154. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  155. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  156. data/lib/ecoportal/api/graphql/error.rb +12 -12
  157. data/lib/ecoportal/api/graphql/file_upload/client.rb +192 -0
  158. data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
  159. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  160. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  161. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  162. data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
  163. data/lib/ecoportal/api/graphql/fragment/force.rb +34 -0
  164. data/lib/ecoportal/api/graphql/fragment/location_draft.rb +53 -53
  165. data/lib/ecoportal/api/graphql/fragment/location_node.rb +26 -26
  166. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  167. data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
  168. data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
  169. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +396 -0
  170. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
  171. data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
  172. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  173. data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
  174. data/lib/ecoportal/api/graphql/fragment.rb +40 -27
  175. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  176. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  177. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  178. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  179. data/lib/ecoportal/api/graphql/input/action/update.rb +14 -14
  180. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  181. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  182. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  183. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +41 -16
  184. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +14 -14
  185. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
  186. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  187. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +47 -47
  188. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  189. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  190. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +49 -49
  191. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  192. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  193. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  194. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  195. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  196. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +13 -13
  197. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  198. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  199. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  200. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +27 -27
  201. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  202. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
  203. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
  204. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
  205. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
  206. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
  207. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
  208. data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
  209. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
  210. data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
  211. data/lib/ecoportal/api/graphql/input/page.rb +26 -0
  212. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
  213. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
  214. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
  215. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
  216. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
  217. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
  218. data/lib/ecoportal/api/graphql/input/register.rb +13 -0
  219. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  220. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
  221. data/lib/ecoportal/api/graphql/input/search_conf.rb +436 -0
  222. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  223. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  224. data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
  225. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
  226. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
  227. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
  228. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
  229. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
  230. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
  231. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +27 -0
  232. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
  233. data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
  234. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
  235. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
  236. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
  237. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
  238. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
  239. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
  240. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
  241. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
  242. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
  243. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
  244. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
  245. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
  246. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
  247. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
  248. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
  249. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
  250. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
  251. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
  252. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
  253. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
  254. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
  255. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
  256. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
  257. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
  258. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
  259. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
  260. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
  261. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
  262. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
  263. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
  264. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
  265. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
  266. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
  267. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
  268. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
  269. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
  270. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
  271. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
  272. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
  273. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
  274. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
  275. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
  277. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
  278. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
  280. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
  281. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
  282. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
  283. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
  284. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
  285. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
  286. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
  287. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
  288. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
  289. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
  290. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
  291. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
  292. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
  293. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
  294. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
  295. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
  296. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
  297. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
  298. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
  299. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
  300. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
  301. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
  302. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
  303. data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
  304. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
  305. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
  306. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
  307. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
  308. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
  309. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
  310. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
  311. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
  312. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
  313. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
  314. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
  315. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
  316. data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
  317. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
  318. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
  319. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
  320. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
  321. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
  322. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
  323. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
  324. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
  325. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
  326. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
  327. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
  328. data/lib/ecoportal/api/graphql/input.rb +24 -16
  329. data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
  330. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +30 -30
  331. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  332. data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
  333. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  334. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  335. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -13
  336. data/lib/ecoportal/api/graphql/logic/base_query.rb +193 -150
  337. data/lib/ecoportal/api/graphql/logic/connection.rb +34 -34
  338. data/lib/ecoportal/api/graphql/logic/input.rb +26 -11
  339. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  340. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  341. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  342. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  343. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  344. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  345. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  346. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  347. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
  348. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  349. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  350. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  351. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  352. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  353. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  354. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  355. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  356. data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
  357. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
  358. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  359. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  360. data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
  361. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  362. data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
  363. data/lib/ecoportal/api/graphql/model/page.rb +16 -14
  364. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
  365. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
  366. data/lib/ecoportal/api/graphql/model/person_member.rb +15 -15
  367. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
  368. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
  369. data/lib/ecoportal/api/graphql/model/register.rb +10 -0
  370. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  371. data/lib/ecoportal/api/graphql/model/template.rb +15 -0
  372. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  373. data/lib/ecoportal/api/graphql/model.rb +32 -22
  374. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  375. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  376. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  377. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  378. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
  379. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
  380. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
  381. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  382. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  383. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  384. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +14 -14
  385. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
  386. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
  387. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
  388. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
  389. data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
  390. data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
  391. data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
  392. data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
  393. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  394. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  395. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  396. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  397. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  398. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  399. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  400. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  401. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
  402. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
  403. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -0
  404. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
  405. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -0
  406. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
  407. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -0
  408. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
  409. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +52 -0
  410. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -0
  411. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
  412. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
  413. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
  414. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
  415. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
  416. data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
  417. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
  418. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
  419. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -0
  420. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
  421. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
  422. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
  423. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
  424. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
  425. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
  426. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
  427. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
  428. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
  429. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
  430. data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
  431. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
  432. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
  433. data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
  434. data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
  435. data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
  436. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
  437. data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
  438. data/lib/ecoportal/api/graphql/mutation.rb +20 -12
  439. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  440. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  441. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  442. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  443. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
  444. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  445. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  446. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  447. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +14 -14
  448. data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
  449. data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
  450. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
  451. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
  452. data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
  453. data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
  454. data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
  455. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  456. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  457. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  458. data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
  459. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  460. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  461. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  462. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  463. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  464. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -0
  465. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
  466. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
  467. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
  468. data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -0
  469. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
  470. data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
  471. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
  472. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
  473. data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
  474. data/lib/ecoportal/api/graphql/payload/page.rb +20 -0
  475. data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -0
  476. data/lib/ecoportal/api/graphql/payload/register.rb +15 -0
  477. data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
  478. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
  479. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
  480. data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
  481. data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
  482. data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
  483. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
  484. data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
  485. data/lib/ecoportal/api/graphql/payload.rb +23 -12
  486. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  487. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  488. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  489. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  490. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
  491. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  492. data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +62 -62
  493. data/lib/ecoportal/api/graphql/query/location_structure.rb +61 -61
  494. data/lib/ecoportal/api/graphql/query/location_structures.rb +57 -57
  495. data/lib/ecoportal/api/graphql/query/page.rb +45 -0
  496. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
  497. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +49 -0
  498. data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
  499. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +65 -0
  500. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
  501. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
  502. data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
  503. data/lib/ecoportal/api/graphql/query.rb +27 -16
  504. data/lib/ecoportal/api/graphql.rb +143 -80
  505. data/lib/ecoportal/api/graphql_version.rb +5 -5
  506. data/lib/ecoportal/api-graphql.rb +10 -10
  507. metadata +328 -25
  508. data/.gitignore +0 -24
  509. data/.markdownlint.json +0 -4
  510. data/.rspec +0 -3
  511. data/.rubocop.yml +0 -97
  512. data/.ruby-version +0 -1
  513. data/.yardopts +0 -10
  514. data/Gemfile +0 -6
  515. data/Rakefile +0 -38
  516. data/bin/console +0 -14
  517. data/bin/setup +0 -8
  518. data/bin/setup.ps1 +0 -6
  519. data/ecoportal-api-graphql.gemspec +0 -40
  520. data/tests/actions_get.rb +0 -7
  521. data/tests/contractor_entities_get.rb +0 -20
  522. data/tests/contractor_entity_create.rb +0 -19
  523. data/tests/contractor_entity_udpate.rb +0 -20
  524. data/tests/loc_structure_get.rb +0 -11
  525. data/tests/loc_structure_update.rb +0 -51
  526. data/tests/loc_structures_get.rb +0 -15
  527. data/tests/local_libs.rb +0 -20
data/CHANGELOG.md CHANGED
@@ -1,477 +1,943 @@
1
- # Change Log
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- ## [1.3.6] - 2026-05-26
6
-
7
- ### Added
8
-
9
- ### Changed
10
-
11
- ### Fixed
12
-
13
- ## [1.3.5] - 2026-05-26
14
-
15
- ### Changed
16
-
17
- - Moved `graphql` endpoint to `external/graphql`
18
- - Missing env var (i.e. `ORG_ID`) will **raise** now an error (instead of just a print)
19
-
20
- ## [1.3.4] - 2025-09-04
21
-
22
- ### Added
23
-
24
- - Command execution result: **added** command doc when there's a `results` error.
25
- - Payload improvements:
26
- - On `LocationsError.validationErrors`: fetch `property` property.
27
- - On **results**, `Command` always fetch `__typename` and the other properties.
28
-
29
- ### Changed
30
-
31
- - Changed base `error_doc`: **consistent property name**
32
-
33
- ### Fixed
34
-
35
- - Correct fetch on `ok` (sometimes it is `null`: that doesn't mean failed).
36
- - **Consistent order** on `error?` and `error_doc`.
37
- - `Draft`
38
- - **Overlapping** name `ConflictingIds` (vs `LocationsError.conflictingIds`)
39
- - **Wrong** include on `FetchNested`
40
-
41
- ## [1.3.3] - 2025-08-29
42
-
43
- ### Added
44
-
45
- - Better error handling
46
-
47
- ### Fixed
48
-
49
- - Unused parameter/variable `$includeArchivedNodes`
50
-
51
- ## [1.3.2] - 2025-08-19
52
-
53
- ### Added
54
-
55
- - `Mutation`: allow parameters other than **input**.
56
- - Location Structure `Draft` models
57
- - `Interface::LocationStructure::Nodes` for `LocationStructure` and `Draft::Structure`
58
- - `raw_response` as optional query parameter (for debugging)
59
- - `Logic::Input` (out of consistency)
60
- - Fragments:
61
- - `LocationDraft`
62
- - `LocationsError`
63
- - Query to include `draft` list when fetching an **RS**.
64
- - Location `Draft` queries:
65
- - `Draft#byId`
66
- - `Draft#create`
67
- - `Draft#delete`
68
- - `Draft#addCommands`
69
- - `Draft#publish`
70
- - `Draft#dropBadCommands`
71
- - Error tracking througout the payload models of location mutations
72
-
73
- ### Changed
74
-
75
- - Upgrade dependency (`ecoportal-api` **gem**).
76
- - Moved rescue on fragment definition to `#define` itself.
77
- - `NodeInterface` moved to `Interface::LocationStructure::Node`
78
- - Code: Shorten namespace referral.
79
- - Swap to `Logic::BaseModel`
80
- - `Mutation` to introduce `:input` required parameter by using parent class.
81
-
82
- ### Fixed
83
-
84
- - `QueryConnection`: bad code.
85
- - `conflictingIds` should be array.
86
-
87
- ## [1.3.1] - 2025-06-11
88
-
89
- ### Changed
90
-
91
- - upgraded gem dependencies
92
- - **Moded** `Ecoportal::API::GraphQL::Base::Model` to
93
- - > `Ecoportal::API::GraphQL::BaseModel`
94
- - **Added** `Interface::LocationNode`
95
- - **Added** `Interface::BasePage`
96
-
97
- ### Fixed
98
-
99
- - **Fragments**
100
- - `Action` fragment to use `PageUnion` (**upgrade**)
101
- - **Memoize** fragments.
102
- - Add what fragment failed in the **error**.
103
-
104
- ## [1.2.1] - 2025-05-16
105
-
106
- ### Changed
107
-
108
- - upgrade `ecoportal-api` gem
109
- - upgrade `ecoportal-api-v2` gem
110
-
111
- ## [1.1.1] - 2025-05-14
112
-
113
- ### Added
114
-
115
- - `MemberChanges` helpers for `Base::ContractorEntity`
116
- - Custom **Diff** logic that can be used in GraphQL content:
117
- - `Common::GraphQL::Model::Diffable::HashDiffNesting`
118
- - Reused from `HashDiffPatch` (`ecoportal-api-v2`):
119
- 1. It does not use `patch_ver`, but rather just `id` property alone.
120
- 2. The _operation_ property has been renamed to `api_operation` (to ensure no collisions). And the operation types are symbols, and renamed to: `:delete`, `:update` and `:create`. This can show up to be useful when, for instance, reusing the output of `#as_update` to generate actual input objects (i.e. `#as_input`) that feed some GraphQL query.
121
- 3. The _data_ property has been renamed to `change_data`.
122
- 4. `Hash` **keys** are of type `Symbol`.
123
- - `Common::GraphQL::Model::Diffable::DiffService`. In a GraphQL context, this aims to be able to implement a function called `#as_input` (equivalent to `#as_update`):
124
- 1. It uses the `HashDiffNesting` helpers.
125
- 2. It has capability to `ignore` certain keys.
126
- 3. It can calculate **diff** excluding nested models (i.e. those that are `root?` and, therefore, not part of the changed target model). This functionality is an optimization to `cascaded_callbacks` throughout the nested models.
127
-
128
- ### Changed
129
-
130
- - `Common::GraphQL::Model::Diffable` by using `Diffable::DiffService` (with `cascaded_callbacks` implementation).
131
- - `#as_update`
132
- - `#dirty?`
133
- - upgraded `ecoportal-api` gem
134
- - updraded `ecoportal-api-v2` gem
135
-
136
- ## [0.4.7] - 2025-04-02
137
-
138
- ### Added
139
-
140
- - `page.id` to Action linked resources.
141
-
142
- ## [0.4.6] - 2025-04-02
143
-
144
- ### Added
145
-
146
- - `Ecoportal::API::GraphQL::Logic::QueryConnection`
147
- - **Require** `default_connection_block` to child classes
148
- - This aims to **not** having have client code having to define the block for `#each`
149
-
150
- ### Changed
151
-
152
- - upgraded `ecoportal-api` gem
153
- - upgraded `ecoportal-api-v2` gem
154
-
155
- ## [0.4.5] - 2025-03-14
156
-
157
- ### Added
158
-
159
- - Query `actionCategories`
160
- - Mutation **create** `Action`
161
-
162
- ### Changed
163
-
164
- - `Action` model to have `locations` (**RS** upgrade)
165
-
166
- ## [0.4.4] - 2025-02-23
167
-
168
- ### Changed
169
-
170
- - Upgraded `ecoportal-api` gem (maintanance)
171
- - Upgraded `ecoportal-api-v2` gem (to provision `root!` class method)
172
- - Defined some models that hand on their own as `root!`
173
- - Refactored `Base::Model` by moving its loggic to `Common::GraphQL`
174
-
175
- ### Fixed
176
-
177
- - `Ecoportal::API::Common::GraphQL::HashHelpers`
178
- - Truly make the iterator generic
179
-
180
- ## [0.4.3] - 2024-11-21
181
-
182
- ### Changed
183
-
184
- - upgrade gems
185
- - `ecoportal-api`
186
- - `ecoportal-api-v2`
187
- - `Ecoportal::API::Common::GraphQL::HttpClient.new` ceased to default `version` to `v1` (now it defaults to `nil`)
188
-
189
- ## [0.4.2] - 2024-10-01
190
-
191
- ### Changed
192
-
193
- - upgrade gems
194
- - `ecoportal-api-v2`
195
- - add explicit dependency onto `ecoportal-api` gem (client)
196
-
197
- ## [0.4.1] - 2024-08-09
198
-
199
- ### Added
200
-
201
- - `ContractorEntity` added field `externalId`
202
-
203
- ### Changed
204
-
205
- - gem upgrade `ecoportal-api-v2`
206
-
207
- ## [0.4.0] - 2024-08-01
208
-
209
- ### Changed
210
-
211
- - require `ruby 3`
212
-
213
- ## [0.3.18] - 2024-05-16
214
-
215
- ### Fixed
216
-
217
- - `Ecoportal::API::GraphQL::Payload::LocationStructure::CommandExecutionResult`
218
- - Error is nullable
219
-
220
- ## [0.3.17] - 2024-05-14
221
-
222
- ### Fixed
223
-
224
- - `field_name` should add up to the path
225
-
226
- ## [0.3.16] - 2024-04-29
227
-
228
- ### Added
229
-
230
- - Exposed `graphql` `ContractorEntity` `destroy`
231
-
232
- ### Fixed
233
-
234
- - incorrect loading
235
-
236
- ### Changed
237
-
238
- - Input for ContractorEntity create moved as `update` (as it wasn't correct)
239
-
240
- ## [0.3.15] - 2024-04-13
241
-
242
- ### Added
243
-
244
- - `Ecoportal::API::GraphQL::Logic::BaseQuery`
245
- - `::base_path` class instance var.
246
- - query to retrieve `currentOrganization.classifications`
247
-
248
- ### Fixed
249
-
250
- - upgraded `ecoportal-api-v2` gem
251
-
252
- ## [0.3.14] - 2024-03-13
253
-
254
- ### Added
255
-
256
- - some benchmarking on
257
- 1. core graphql base `query`
258
- - `#parent_id` to location node model
259
-
260
- ### Changed
261
-
262
- - upgraded `ecoportal-v2-api` gem
263
-
264
- ### Fixed
265
-
266
- - Optimized `treeify` and locations structure class
267
-
268
- ## [0.3.13] - 2024-02-03
269
-
270
- ### Changed
271
-
272
- - upgrade `ecoportal-api-v2`
273
-
274
- ## [0.3.12] - 2024-01-27
275
-
276
- ### Added
277
-
278
- - Exposed `graphql` `Action` `update` and get a single `action`
279
-
280
- ## [0.3.11] - 2023-09-19
281
-
282
- ### Added
283
-
284
- - Exposed `graphql` `ContractorEntity` `create` and `update`
285
-
286
- ## [0.3.10] - 2023-08-12
287
-
288
- ### Fixed
289
-
290
- - `Ecopotal::API::GraphQL::Query::LocationStructure`
291
- - `query` in basic_block missed an explicitly declared parameter.
292
-
293
- ## [0.3.9] - 2023-08-03
294
-
295
- ### Added
296
-
297
- - `Ecoportal::API::GraphQL::Logic::BaseQuery`
298
- - Added support for **default** values.
299
-
300
- ## [0.3.8] - 2023-07-18
301
-
302
- ### Added
303
-
304
- - Integration for archiving actions.
305
- - `LocationNodeInterface` -> support for `classifications`
306
- - `Treeify` to dump more data per node (classifications)
307
-
308
- ### Fixed
309
-
310
- - Silenced waning messages when redefining `Fragment`s
311
-
312
- ## [0.3.7] - 2023-05-23
313
-
314
- ### Fixed
315
-
316
- - `Ecoportal::API::Common::GraphQL::Client` adjusted `read_timeout` and `write_timeout` to `90` seconds.
317
-
318
- ## [0.3.6] - 2023-04-17
319
-
320
- ### Changed
321
-
322
- - Softened max version of **gem** dependencies
323
-
324
- ### Fixed
325
-
326
- - `Ecoportal::API::GraphQL::Fragment#define` was not removing previous constants
327
- - Changed check method to be `::const_defined?`
328
-
329
- ## [0.3.5] - 2023-04-03
330
-
331
- ### Fixed
332
-
333
- - `Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify`
334
- - Make it real id-case-insensitive (parents in lower case were being missed due to this)
335
-
336
- ## [0.3.4] - 2023-04-03
337
-
338
- ### Added
339
-
340
- - `Ecoportal::API::Common::GraphQL::AuthService`
341
- - `#session_token` added **token auto-renew** functionality (when token expires in less than 90 minutes)
342
- - `#session_token_renewed`
343
-
344
- ### Fixed
345
-
346
- - Enabled to specify `host` (other than `live.ecoportal.com`) by the user
347
-
348
- ## [0.3.3] - 2023-04-02
349
-
350
- ### Fixed
351
-
352
- - `Ecoportal::API::GraphQL::Base::LocationNode` **added** attribute `archivedToken`
353
-
354
- ## [0.3.2] - 2023-04-02
355
-
356
- ### Changed
357
-
358
- - `Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify` added support for `archived_token`
359
-
360
- ## [0.3.1] - 2023-03-09
361
-
362
- ### Changed
363
-
364
- - Upgraded core gem dependency `ecoportal-api-v2`
365
-
366
- ## [0.2.3] - 2023-02-27
367
-
368
- ### Fixed
369
-
370
- - Typo in tests LocationsStructures... should read `locationStructures`
371
-
372
- ## [0.2.2] - 2023-02-24
373
-
374
- ### Fixed
375
-
376
- - Build gem correctly
377
-
378
- ## [0.2.1] - 2023-02-24
379
-
380
- ### Changed
381
-
382
- - Migrate from TagTrees to **reporting structures** (breaking change)
383
-
384
- ### Added
385
-
386
- - Basics for reporting structure mutations
387
-
388
- ## [0.1.11] - 2022-11-29
389
-
390
- ### Added
391
-
392
- - `Ecoportal::API::GraphQL::Base::Mutation`
393
- - Added `createContractorEntity`
394
-
395
- ### Changed
396
-
397
- - **upgraded** `graphlient` gem dependency (support for framents)
398
- - removed patch in this gem
399
- - Slight internal refactor of `Ecoportal::API::GraphQL::Base::Query`
400
- - Upgraded `ecoportal-api-v2` **gem** dependency
401
-
402
- ## [0.1.10] - 2022-09-29
403
-
404
- ### Changed
405
-
406
- - **upgraded** `ecoportal-api-v2` gem dependency
407
-
408
- ### Fixed
409
-
410
- - Remove debugging message
411
-
412
- ## [0.1.9] - 2022-09-26
413
-
414
- ### Added
415
-
416
- - `Ecoportal::API::GraphQL::Query::TagTree`
417
-
418
- ### Changed
419
-
420
- - **upgraded** `ecoportal-api-v2` gem dependency
421
- - added `Ecoportal::API::Common::GraphQL::QueryIntegration`
422
- - restructured `Ecoportal::API::GraphQL::Model::Organization` class
423
- - **Patch** on `Graphlient::Query` for fragments support (**pull request**: <https://github.com/ashkan18/graphlient/pull/94>)
424
-
425
- ## [0.1.8] - 2022-09-23
426
-
427
- ### Added
428
-
429
- - `currentOrganization.tagTrees` query
430
-
431
- ### Changed
432
-
433
- - **upgraded** `ecoportal-api-v2` gem dependency
434
- - Restructured the `Query` inheritance chain to make things simpler
435
-
436
- ## [0.1.6] - 2022-09-19
437
-
438
- ### Fixed
439
-
440
- - Call to **private** method `remove_const` in `Ecoportal::API::GraphQL::Fragment#define`
441
-
442
- ## [0.1.5] - 2022-09-19
443
-
444
- ### Added
445
-
446
- - Patch `GraphQL::Query#append_node` so we can use Fragments in blocks using `___` as start of the constant, and `__` for namespace separator
447
- - Issue/feature request: <https://github.com/ashkan18/graphlient/issues/93>
448
- - `Ecoportal::API::GraphQL::Fragment#define` provided that client scripts can create their own fragments in their own namespace
449
- - Exposed `Ecoportal::API::GraphQL#fragments`
450
- - It will always (re)define in the `Fragment` root namespace
451
-
452
- ## [0.1.4] - 2022-09-16
453
-
454
- ### Fixed
455
-
456
- - Able to inject connection block to `each`
457
- - Error handling delegated to parent class (`QueryConnection`)
458
- - Retrieve `id` on elements of `Array`
459
-
460
- ## [0.1.3] - 2022-09-15
461
-
462
- ### Fixed
463
-
464
- - Fixed circular reference to `org_id` in `Ecoportal::API::Common::GraphQL::Client`
465
-
466
- ## [0.1.2] - 2022-09-15
467
-
468
- ### Changed
469
-
470
- - `Ecoportal::API::GraphQL` addded `email` and `pass` parameters on initialization
471
- - This allows for integration in some client lib
472
-
473
- ## [0.1.0] - 2022-09-15
474
-
475
- ### Added
476
-
477
- - First commit with some basic structure
1
+ # Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [1.3.17] - 2026-09-30
6
+
7
+ ### Security
8
+
9
+ - Security republish of `1.3.16` -- backwards-compatible, no code change: removes customer and
10
+ internal identifiers from shipped comments and this changelog; stops shipping internal
11
+ files (packaging allowlist: only `lib/**/*.rb` plus the named root docs ship, so the internal
12
+ `CLAUDE.md` files under `lib/` no longer do).
13
+
14
+ ## [1.3.16] - 2026-08-13
15
+
16
+ ### Fixed
17
+
18
+ - Packaging-only republish of `1.3.15` with an allowlisted gemspec (backported from `2.0.0`).
19
+ Versions `1.3.9`-`1.3.15` shipped internal repository content (internal AI-tooling project notes,
20
+ `docs/worklog.md`, architecture docs) to rubygems.org via the old denylist `spec.files`; they
21
+ will be yanked. `1.3.16` is the identical `lib/` code (including the `1.3.15` OozeRedirect
22
+ `executeWorkflowCommands` fix) packaged clean, so the `1.x` line keeps a clean latest release.
23
+
24
+ ## [1.3.15] - 2026-07-30
25
+
26
+ **Backwards-compatible.** Every change here fixes a query or mutation document that the live
27
+ schema rejected — i.e. code paths that could not run at all — plus the CI gate that found them.
28
+ Cherry-picked onto the 1.3.x line from `main`, where they landed alongside **breaking** changes
29
+ that are deliberately NOT in this release (see "Deferred to 1.4.0" below).
30
+
31
+ ### Fixed
32
+
33
+ - **`FileUpload::Client` authenticated the v2 REST endpoints wrongly.** The ported S3
34
+ register/poll steps sent `Authorization: Bearer <oauth_token>`; those endpoints authenticate via
35
+ `X-ECOPORTAL-API-KEY`, so step 3 404'd and `#upload` never completed. `Ecoportal::API::GraphQL.new`
36
+ accepts an additive `api_key:` (independent of the GraphQL endpoint's own email/pass OAuth),
37
+ `HttpClient#api_key` is public, and the client raises a clear error when it is missing.
38
+ ⚠ **Not yet live-verified** — verify against a sandbox org before relying on it.
39
+ - **Three invalid union selections.** `Query::RegisterPresetViews` (`fieldConfigurations`),
40
+ `Query::PageWithForces` (`forces`) and `Query::PagesWorkflowCommands` (`workflow`) selected
41
+ fields directly on a union, which is invalid GraphQL ("Selections can't be made directly on
42
+ unions") — all three queries failed outright. They now select through the members' shared
43
+ interface (`FieldConfigurationInterface` / `BasePageInterface`). Response shapes are unchanged.
44
+ - **`fragment ForceFields` asked for a non-existent `id` on bindings.** `Force.bindings` is
45
+ `[BindingInterface]`, whose only fields are `name` / `referenceId` (+ per-member `reference`),
46
+ so every query spreading the fragment was invalid. Now selects on the interface directly.
47
+ NOTE the read/write asymmetry this exposes: `WorkflowEditBindingInput` / `removeBinding` require
48
+ a binding `id` that no read exposes, so `BindingCollection#delete!(binding)` has no source for it.
49
+ - **7 invalid `PageFields` spreads.** The four review-task mutations return `item: TaskInterface`
50
+ (not a page — the page is reachable via `subject`), `Template::{Create,Destroy}RelatedPage`
51
+ return `RelatedPages`, and `Template::UpdateInformation` returns the narrow `Template` type. New
52
+ `:PageTaskFields` / `:TemplateRelatedPages` / `:TemplateInformation` fragments and read-only
53
+ `Base/Model::Page::Task` + `Base/Model::Template::{RelatedPages,Information}` models; the payload
54
+ `item_class`es pointed at `Model::PageUnion`, which never matched the schema. The template
55
+ mutations that genuinely return a page (`Create`/`Publish`/`Unpublish`/`Update`) are unchanged.
56
+ - **6 payloads selected an `item` their type does not have.** `Page::CreateDraft` → `{ id }`,
57
+ `Page::{DeleteDraft,PublishDraft}` → `{ ok }`, `Page::BatchUpdateReviewTask` → `{ count }` (and
58
+ its own `Payload::Page::ReviewTaskBatch`), `Register::Destroy` → `{ ok }`, `PresetView::Destroy`
59
+ → `{ clientMutationId errors }`. `Payload::Page::Draft` gained `id`/`ok`, `Payload::Register`
60
+ gained `ok`.
61
+ - **`executeWorkflowCommands` was rendered with arguments it never accepted** — the schema takes a
62
+ single `input: ExecuteWorkflowCommandsInput!`, so the **page-level command bus could not run**.
63
+ Both classes' `#query` already built the right `input` hash; only the documents were wrong.
64
+ - **`Payload::OkPayload` now models `errors`** — it selected them but computed `success?` purely
65
+ from `ok`, silently ignoring a populated errors object.
66
+
67
+ ### Added (tooling — no runtime effect)
68
+
69
+ - **`validate-queries` CI job** (`.gitlab-ci.yml`): renders every query + mutation against a
70
+ freshly introspected schema and fails on render failures plus the always-invalid selection
71
+ classes ("must have selections", "can't be made on scalars", "can't be made directly on unions",
72
+ "can't be spread inside"). This gate is what found everything above.
73
+ - **`tests/dump_schema.rb`**: fresh introspection through the gem's own `HttpClient`. Requires
74
+ `SERVER` explicitly (the gem's default host is production). Schema dumps are never committed.
75
+
76
+ ### Deferred to 1.4.0 (breaking — intentionally absent here)
77
+
78
+ - The AI-summary rewire (`generateAiSummary` → `generatePageSummary`,
79
+ `submitAiSummaryFeedback` → `submitPageAiSummaryFeedback`, changed `#query` keywords,
80
+ `Base::AiSummaryVersion` field removals) and the removal of the `SmartFill` mutations
81
+ (`smartFillGenerate` / `smartFillSubmitFeedback` do not exist in the schema).
82
+ - The 2026-07-13 `WorkflowCommandInput` schema sync and the polymorphic read-model layer.
83
+
84
+ ## [1.3.14] - 2026-07-16
85
+
86
+ Re-issue of the **1.3.13 HttpClient resilience fix** under a fresh version. The `1.3.13`
87
+ artifact published to the gem server (2026-07-11) could not be relied upon to contain the
88
+ fix below — RubyGems versions are immutable and cannot be re-pushed, so the fix ships here
89
+ as `1.3.14`. Functionally identical to the *intended* `1.3.13` (this is `1.3.12` + the
90
+ resilience fix, nothing else). **Backwards-compatible.**
91
+
92
+ Consumers that need the 429/1015 resilience (e.g. bulk `cans-upsert` live runs) must floor
93
+ `ecoportal-api-graphql >= 1.3.14` — a `>= 1.3.13` floor is not sufficient.
94
+
95
+ ### Fixed
96
+
97
+ - Same fix as documented under `[1.3.13]` below: `Common::GraphQL::HttpClient#execute` routes
98
+ through the inherited `instrument → with_retry { rate_throttling }` pipeline, so a single
99
+ HTTP 429 (Cloudflare edge rate-limit `1015`) no longer aborts the run.
100
+
101
+ ## [1.3.13] - 2026-07-12
102
+
103
+ Reliability: the GraphQL `HttpClient` now inherits the **same request-resilience
104
+ contingencies as the REST clients** instead of a bespoke, divergent request path.
105
+ **Backwards-compatible** — `execute` returns the same parsed body and raises the same
106
+ error classes; only the transport path changed.
107
+
108
+ ### Fixed
109
+
110
+ - **`Common::GraphQL::HttpClient#execute` no longer bypasses the inherited
111
+ `Common::Client` pipeline.** It previously issued the POST raw
112
+ (`base_request.post`) and handled the response itself, so GraphQL requests got
113
+ **none** of the resilience baked into `ecoportal-api`'s client over the years —
114
+ a single **HTTP 429** (Cloudflare edge rate-limit, error `1015`) aborted the whole
115
+ run. `execute` now routes through `instrument` → `with_retry { rate_throttling }`,
116
+ gaining for free:
117
+ - **rate-limit backoff** via `rate_throttle_client` (default
118
+ `ExponentialIncreaseProportionalDecrease`) — 429s are throttled + retried, not fatal.
119
+ - **retry on 5xx / connection errors** (`WithRetry`, 5 attempts) + empty-body guard.
120
+ - timeouts, and (deep-)logging / APM instrumentation.
121
+ - `handle_http_response` now consumes the wrapped `Common::Response` (single body
122
+ read — also removes a latent double-read hazard). The GraphQL-errors-in-a-200-body
123
+ path (`ResponseError`) is unchanged.
124
+ This is convergence on the shared base, so any future contingency added to
125
+ `Common::Client` now applies to GraphQL automatically.
126
+
127
+ ## [1.3.12] - 2026-07-09
128
+
129
+ Compat-layer correctness for register **field filters** + the native `SearchConf` field-filter DSL.
130
+ **Backwards-compatible** — bug fixes (broken field filters returned 0 results) + additive methods;
131
+ no public return type changed. (The `get_by_name`→collection contract change is intentionally **not**
132
+ in this release — it is a breaking change parked on `feature/model-input-fixes` for a deliberate,
133
+ signed-off future decision.)
134
+
135
+ ### Fixed
136
+
137
+ - **`Compat::FilterTranslator`** now routes register **FIELD** filters to the backend-correct ES
138
+ operation (previously emitted the system-key operation → 0 results):
139
+ - Date FIELD (key `date.zXXXX`) → `range_date_filter` + `path: membranes.date` (system date keeps
140
+ `date_filter`).
141
+ - Select FIELD (key `select_str.zXXXX`) → `has_any_filter` / `doesnt_have_any_filter` +
142
+ `path: membranes.select_str` + `field_key: 'selected'` (system option key keeps
143
+ `one_of_filter`/`none_of_filter`).
144
+ - `exact_filter` no longer derives a `membranes.<type>` path for **system** keys
145
+ (`external_id`/`id`/`state`) — a spurious path produced term `membranes.external_id.external_id`
146
+ → 0 results (silent miss → dup-on-upsert). Register FIELD keys still get the nested path.
147
+ - Verified against the backend filter definitions; catalogued in
148
+ the repo's internal docs.
149
+
150
+ ### Added
151
+
152
+ - **`SearchConf` field-filter DSL:** `sc[:'date.zXXXX'].between/since/before` now emits
153
+ `range_date_filter` + `membranes.date` for register Date FIELDs; new `FieldRef#any_of` / `#none_of`
154
+ → `has_any_filter` / `doesnt_have_any_filter` (path + `field_key`) for register field value
155
+ membership (distinct from `one_of`, which ORs `exact_filter` for system keys).
156
+ - **`get_by_id`** on `DataField::Collection` and `SectionCollection` (v2-compat find-by-id) — fixes
157
+ `NoMethodError` in consumers that resolve a field/section by id.
158
+
159
+ ## [1.3.11] - 2026-07-04
160
+
161
+ Template automatic **build & maintenance** engine (backwards-compatible — a self-contained new
162
+ `Diff` module + a build emitter; nothing existing changed). Validated **offline** (specs + fixtures +
163
+ shapes checked against the live schema dump); the live UAT→PROD round trip is pending a sandbox org.
164
+
165
+ ### Added
166
+
167
+ - **`genomeSignature`** fetched on every data-field type (added once to the `dataFieldInterface`
168
+ fragment, `@skip(if: $only_content)`) + `passthrough :genomeSignature` on `Base::Page::DataField` —
169
+ a strong-but-fallible field-pairing signal.
170
+ - **`Diff::VersionDiff`** — two same-object (retained-id) template snapshots → an exact structural
171
+ changelog: added/removed/changed/moved for stages, sections, fields (label/type/section-move),
172
+ select options (label/weight), **gauge stops** (add/remove/threshold/color, matched by stop id), and
173
+ typed **`byType` field config** (conservative, only confirmed read↔input-key matches: Gauge `max`;
174
+ Select `dataType/multiple/flat/other/otherDesc`; Date `showTime/pastOnly/todayButton`).
175
+ - **`Diff::Change`** — command-ready change (`op`/`kind`/`id`/`label`/`path`/`attribute`/`before`/
176
+ `after`/`parent_id`/`by_type`) with a human `#description`; `#to_h` is the stable interchange shape.
177
+ - **`Diff::CommandSynthesizer`** — a `Change` set → an ordered `WorkflowCommand` batch (the replayable
178
+ "commit"): moves/renames/config, options, gauge stops, `editFieldConfiguration(byType:)`, with
179
+ **`placeholderId` threading** so dependent intra-batch creates reference not-yet-created nodes.
180
+ Genuinely ambiguous cases (field type change, moves without a target id) are left **UNSUPPORTED** —
181
+ never guessed.
182
+ - **`Diff::Deploy`** — `from_versions(before, after, target_doc:)` / `from_cross_object(...)` produce
183
+ the ordered batch ready for `executeWorkflowCommands`; `#execute!` refuses to run while the honest
184
+ `unsupported` list is non-empty unless `allow_partial: true`; inert until an executor is passed.
185
+ - **`Diff::IdResolver`** — indexes a target doc's stage names + section headings → ids for move
186
+ resolution; duplicate keys resolve to `nil` (never guesses).
187
+ - **`Diff::Pairing::{Engine,Signals,Candidate,Ledger}`** — multi-signal equivalence matching for
188
+ cross-object templates (genome 0.5 + type 0.2 + label 0.2 + options-by-value 0.1, averaged over
189
+ applicable signals; greedy 1:1; auto-accept ≥0.85, ambiguous 0.5–0.85, unmatched <0.5; genome
190
+ mismatch scores 0 but does **not** veto). `Ledger` persists confirmed pairs (consulted first;
191
+ human corrections supersede).
192
+ - **`Diff::Strategy`** — composable diff modalities: pairing (`:id`/`:genome`/`:type_label`/
193
+ `:assisted`) × scope (`:structural`/`:config_only`/`:data_migration`) × move-sensitivity × intent
194
+ (`:changelog`/`:deploy`/`:sync_readiness`). `.default` reproduces exact pre-existing behaviour.
195
+ - **`Diff::CrossObjectDiff`** — diffs two templates with **no shared ids** by building the
196
+ id-correspondence map via `Pairing::Engine` (+ optional `Ledger`), then emitting the same `Change`
197
+ output that feeds `CommandSynthesizer`/`Deploy`. Ambiguous/unmatched held in `#unresolved` for a
198
+ human — never auto-paired.
199
+ - **`Builder::TemplateBuilder`** — a declarative template spec (stages→sections→fields→options→
200
+ config→gauge-stops) → an ordered `WorkflowCommand` batch for `Builder::Template#create/update`,
201
+ using the **same `placeholderId` threading** as the diff synthesizer so build-from-scratch and
202
+ diff-deploy emit through one layer. Emits only verified input `VALID_KEYS`. A field's `description`
203
+ (e.g. a CSV/hidden-field identity token) is emitted as a follow-up `editFieldConfiguration(
204
+ dataFieldId:, description:)` — the correct schema seam, since `WorkflowAddFieldInput` has no
205
+ `description` key.
206
+ - **Stage/section back-refs on added nodes** (`Diff::CommandSynthesizer`) — an added field's `addField`
207
+ now carries `sectionId` (`Change#parent_id`) + `stageId` (new `Change#owner_id`); an added section
208
+ emits a follow-up `addStageSection(stageId:, sectionId:)`. All threaded via `ref()` (parent
209
+ placeholder when created same-batch, else real id; omitted when unknown → historical behaviour
210
+ unchanged). `VersionDiff` records `parent_id`/`owner_id` on added field/section changes.
211
+
212
+ ### Fixed
213
+
214
+ - **Fragment references migrated to the `spread :Name` registry convention.** The Action and
215
+ ContractorEntity **mutations** (`create`/`update`/`destroy`, `create`/`update`/`archive`) still used
216
+ the dead `___Const__Fragment` convention, which resolves a Ruby constant `Fragment::<Name>` that no
217
+ longer exists (fragments are a registry now) → `uninitialized constant … Fragment::… (NameError)` at
218
+ render time. Now `spread :Action` / `spread :ContractorEntity`, matching the already-migrated queries.
219
+ (The sibling breakage in eco-helpers' location-command optimizations is fixed in eco-helpers 3.2.17;
220
+ it crashed a customer's live locations sync.)
221
+ - **Kickstand workflow mutations — bare `DateTime` selection.** `Kickstand::{Start,Stop,Fail}Workflow`
222
+ selected `startedAt`/`stoppedAt`/`failedAt` bare → "Field must have selections". Now
223
+ `{ dateTime timeZone }` (same class as the 1.3.10 LocationStructure fix).
224
+ - **`tests/validate_queries.rb` now renders MUTATIONS too** (was queries only) and **hard-fails on a
225
+ render error** (dead fragment / unresolved constant), not just a soft skip — the offline guard for
226
+ both classes above. It caught the 3 Kickstand bugs immediately.
227
+
228
+ ### Schema realities (verified against the live introspection dump)
229
+
230
+ - **`required` cannot be set via the workflow command bus** — there is NO `required` input key anywhere
231
+ in the schema (not on `WorkflowAddFieldInput`, not on `WorkflowEditFieldConfigurationInput` or any of
232
+ its 12 byType sub-inputs). Callers must treat field-`required` as **read-only / out-of-band**
233
+ (ecoportal-qa `:skip`s `required`-readiness by design).
234
+
235
+ ### Dependencies
236
+
237
+ - **Requires `ecoportal-api-v2 >= 3.3.3`** (was `>= 3.3.2`). 3.3.2 has a Ruby-3.x `TypeError` in the
238
+ `DoubleModel` cascade (`_cascaded_attributes_trace`) that crashes `as_update`/`DiffService` on any
239
+ model with nested attributes — fixed in v2 3.3.3. Raising the floor stops the broken v2 from
240
+ resolving on consumers.
241
+
242
+ ### Known gaps (tracked, not in this release)
243
+
244
+ - Live characterization (UAT→PROD replay + verify) is pending a sandbox org + credentials.
245
+
246
+ ## [1.3.10] - 2026-07-03
247
+
248
+ Hotfix (backwards-compatible). Resolves a live failure on a customer's users sync.
249
+
250
+ ### Fixed
251
+
252
+ - **LocationStructure query — `updatedAt` bare selection** → `Field must have selections (field
253
+ 'updatedAt' returns DateTime but has no selections)`. `LocationStructureType.updatedAt` returns the
254
+ `DateTime` object (`{ dateTime, timeZone }`), so it must be selected with sub-fields. Fixed in
255
+ `Query::LocationStructure` and `Query::LocationStructure::Draft` (now `updatedAt { dateTime timeZone }`).
256
+ The plural `Query::LocationStructures` does not select it and was unaffected.
257
+ - **Root cause:** the bare selection has existed since 2023 (v0.3.x) but was **never exercised** —
258
+ no spec covered these queries, and the tagtree/users-sync path only began fetching the location
259
+ structure via GraphQL (rather than APIv2) as of the cutover, so it first ran in production.
260
+ - **Regression guard added:** `spec/.../query/location_structure_spec.rb` renders the query blocks
261
+ offline and asserts `updatedAt` carries `{ dateTime timeZone }` — this would have failed in CI.
262
+ - **LocationDraft fragment — `createdAt` over-selection** (found by the full audit below): selected
263
+ `createdAt { dateTime }`, but `Draft.createdAt` is an `ISO8601DateTime` **scalar** → would throw
264
+ `Selections can't be made on scalars` whenever the location-structure **draft** query runs. Now bare
265
+ `createdAt`. Guarded by the same spec.
266
+
267
+ ### Added
268
+
269
+ - **`tests/validate_queries.rb`** — offline audit: renders every gem query (auth stubbed, no network),
270
+ assembles its fragments, and validates the full document against a schema introspection JSON. Flags
271
+ the whole bug class — object fields selected bare ("must have selections") and scalars over-selected
272
+ ("selections can't be made on scalars"). A full run confirmed these two location fixes are the ONLY
273
+ such issues across all 17 query classes (contractors, actions, pages, register, templates: clean).
274
+
275
+ ## [1.3.9] - 2026-07-02
276
+
277
+ APIv2→GraphQL cutover hardening (backwards-compatible). Live-validated on the maintained ooze
278
+ integrations (toocs-coding, cans-upsert).
279
+
280
+ ### Fixed
281
+
282
+ - **Faithful dry-run body** — `Compat::Pages#get_body` returns the SAME input `#update`/`#create`
283
+ would send (under the `'page'` key), incl. `dataFields.updates` (invisible to `page.as_update`
284
+ on phased pages). Create previews render as `CreateFromTemplateInput` (marker-based
285
+ `#new_draft?`) instead of mislabelling as updates.
286
+ - **Stage submit/sign-off carries `stageId`** — `Input::Page::Update.from_model` raises if a
287
+ submit/task is requested without a stage; `Compat::StageView` records the viewed stage on the
288
+ page; `compat_stage_id` resolves pinned → active(stage-view) → current. People-field
289
+ permissions are stage-scoped, so a submit must name its stage.
290
+ - **`CrossReference#dirty?`** compares the reference-id SET vs `original_doc` — no phantom
291
+ `referenceIds: []` clears (empty→empty / same→same is not dirty).
292
+ - **`Number`/`Gauge` blank → nil, never `0.0`** — an empty CSV cell no longer coerces to a real
293
+ zero. Shared `DataField#numeric_or_nil`.
294
+ - **`People` reader** falls back to the `people{id}` nodes when `peopleIds` is blank — an append
295
+ can't wipe existing people.
296
+ - **`Compat::Pages#create` resolves `templateId` from the get_new marker**
297
+ (`_compat_source_template_id`), matching the dry-run — fixes a live `templateId: null` failure.
298
+
299
+ ### Added
300
+
301
+ - **Exact-match register filter** — `Compat::FilterTranslator` maps a v2 `type: 'exact_filter'`
302
+ (alias `'is_filter'`) → GraphQL `is_filter` (whole-value equality on a field's `.exact` keyword
303
+ subfield), deriving the `membranes.<type>` path. Fixes exact-id existence checks (partial
304
+ `match_filter` missed exact SKUs → duplicate pages). Note: case-insensitive, first-64-chars.
305
+ - **`Builder::Page#archive(clear_external_id:)`** — optionally blanks `externalId` (a separate
306
+ `updatePage`) before archiving, for cleanup of a failed/duplicate creation; default `false`
307
+ keeps it. externalId is the per-org, per-model integration pairing key.
308
+
309
+ ## [1.3.8] - 2026-06-12
310
+
311
+ ### Added
312
+
313
+ - **Template mutations** — full lifecycle for creating and updating workflow templates:
314
+ - `Mutation::Template::{Create,Update}` — `createPageTemplate` / `updatePageTemplate` (both accept `WorkflowCommandInput` command bus)
315
+ - `Mutation::Template::{Publish,Unpublish}` — `publishTemplate` / `unpublishTemplate`
316
+ - `Mutation::Template::UpdateInformation` — update template `description`, `aiDescription`, `templateType`
317
+ - `Mutation::Template::{CreateRelatedPage,DestroyRelatedPage}` — manage template related-pages
318
+ - `Builder::Template` wired as `api.template`
319
+ - **`updateVariableBindings`** — `Mutation::Page::UpdateVariableBindings` maps named force variable slots to data field IDs on a page; `Input::VariableBinding` value object
320
+ - **Kickstand job mutations** — `Mutation::Kickstand::{StartJob,FailJob,BulkUpdateJobs}`; `Builder::Kickstand` extended with `start_job`, `fail_job`, `bulk_update_jobs`
321
+
322
+ ## [1.3.7] - 2026-06-12
323
+
324
+ ### Added
325
+
326
+ - **PagesWorkflow space (W1–W5)**
327
+ - `Base::PagesWorkflow` + sub-model tree (`pages_workflow/`): `RegisterField`, `CallbackType`,
328
+ `OperationInterface`, `TriggerInterface`, and supporting types — read model for the
329
+ page-workflow configuration (`autoPageCreationEnabled`, `fields`, `stages`).
330
+ - `Model::PagesWorkflow` with class resolver.
331
+ - **Workflow command bus**: `Input::WorkflowCommandInput` covering ~80 command types under
332
+ `input/workflow_command/`. `Mutation::Page::ExecuteWorkflowCommands` +
333
+ `Payload::ExecuteWorkflowCommands`.
334
+ - Workflow fragments registered for assembly.
335
+ - _Note: the workflow command surface is volatile upstream — designed to absorb change._
336
+ - **Force model / ForceCompat**
337
+ - `Base::Force` (+ `force/` sub-models), Force fragment.
338
+ - `Mutation::Page::ExecuteForceCommands`, `Payload::ForceCommands`, `Query::PageWithForces`.
339
+ - **DataField type hierarchy (Phase E)**
340
+ - Full set of typed `Base::Page::DataField` subclasses: `PlainText`, `RichText`, `DateField`,
341
+ `Number`, `Gauge`, `People`, `Select`, `Checklist`, `TagField`, `Geo`, `Signature`,
342
+ `ContractorEntities`, `CrossReference`, `ImageGallery`, `FileField`, `Mailbox`,
343
+ `ActionsList`, `Law`, `AiSummary`, `Table`, `SmartFill`, dispatched via `TYPE_MAP`/`from_doc`.
344
+ - `DataField::Collection` — `dirty_inputs`, `dirty_additions`, `dirty_deletions`,
345
+ `add`, `mark_for_deletion`.
346
+ - **Register builder & models**
347
+ - `Builder::Register` (+ `register/preset_view`), `Model::Register`,
348
+ `Mutation::Register` (`create`/`update`/`destroy`), `Input::Register`, `Payload::Register`.
349
+ - **Preset views**
350
+ - `Model::PresetView`, `Mutation::PresetView` (`create`/`update`/`destroy`/`permission`),
351
+ `Query::RegisterPresetViews`, `Input::PresetView`, `Payload::PresetView`.
352
+ - **AI mutations**
353
+ - `Mutation::SmartFill` (`generate`/`submit_feedback`).
354
+ - `Mutation::AiSummary` (`generate`/`submit_feedback`), `Model::AiSummaryVersion`,
355
+ `Payload::AiSummaryGenerate`.
356
+ - **Review task & draft lifecycle mutations**
357
+ - Review tasks: `approve`/`reject`/`restart`/`undo`/`batch_update` (`Mutation::Page::*ReviewTask`),
358
+ `Payload::Page::ReviewTask`.
359
+ - Drafts: `Mutation::Page::CreateDraft`/`PublishDraft`/`DeleteDraft`, `Payload::Page::Draft`.
360
+ - Templates: `Mutation::Page::BuildFromTemplate`/`CreateFromTemplate` + payloads.
361
+ - **Queries**
362
+ - `Query::PageDelta` (+ `Base::DeltaResult`, `Input::DeltaInput`).
363
+ - `Query::RegisterPreviewPages` (+ `Base::PreviewPage`).
364
+ - `Query::FileUploadSignature` + file-upload helper.
365
+ - **`Input::SearchConf`** — fluent/chainable filter DSL and `SearchConf.from_description`
366
+ (AI-assisted filter generation from natural language).
367
+ - **Compat layer for `eco-helpers`** — `Compat::Pages` (`#each` cursor-paginated full iteration),
368
+ `Compat::Registers`, `Compat::FilterTranslator`, `Compat::PageReference`,
369
+ `Compat::StageCollection`, `Compat::StageView`, `Compat::SearchResults`, `Compat::Response`.
370
+ - **Concerns** — `SnakeCamelAccess` (camelCase→snake_case delegation), `DataFieldAccess`,
371
+ `PageCompat`, `Deprecation`.
372
+ - `Payload::OkPayload` base payload.
373
+ - **Page read layer (Phase A)**
374
+ - `Fragment::PageFields` — named fragment on `BasePageInterface` covering identity, state,
375
+ lifecycle, and location fields. Includes `__typename` for union dispatch.
376
+ - `Interface::BasePage` — added `passboolean :draft` and `passthrough :externalId`.
377
+ - `Base::Page::Basic < Interface::BasePage` — concrete basic page class.
378
+ - `Base::Page::Phased` — `passarray :stages` (raw array until typed in Phase C).
379
+ - `Model::Page::Basic`, `Model::Page::Phased` — concrete model classes with class resolvers.
380
+ - `Model::PageUnion` — factory module: dispatches `.new(doc)` to `Basic` or `Phased`
381
+ based on `__typename`. Used as `item_class` / `node_class` throughout.
382
+ - `Connection::Page < Logic::Connection` — paginated page connection with `PageUnion` nodes.
383
+ - `Query::Page` (single page by ID), `Query::Pages` (paginated list), `Query::Templates`.
384
+ - `Model::Organization` — wired `query :page`, `query :pages`, `query :templates`.
385
+ - **Page write layer (Phase B)**
386
+ - `Input::Page` — maps `PageInput` fields; owns `PAGE_FIELD_KEYS` as single source of truth.
387
+ - `Input::Page::Update` — maps `UpdatePageInput`; `from_model` builds the nested `page:`
388
+ sub-hash and always injects `patchVer` (a current `patchVer` must be fetched before update).
389
+ - `Input::Page::Archive`, `Input::Page::Unarchive`.
390
+ - `Mutation::Page::Update`/`Archive`/`Unarchive`, `Payload::Page::Update`/`Archive`/`Unarchive`
391
+ (all return a `PageUnion` item), `Builder::Page` (`update`/`archive`/`unarchive`),
392
+ `Ecoportal::API::GraphQL#page` top-level accessor.
393
+ - **Fragment infrastructure**
394
+ - `Fragment::Pages` sub-namespace with `CommonPageUnion` — customer-facing fragment covering
395
+ stages, sections, all 20 data field types, actions, files, and emails. Parametric via
396
+ `$content`, `$only_content`, `$fields`.
397
+ - `FragmentDefinitions.register_namespace(klass)` — cross-namespace fragment discovery without
398
+ polluting the parent `fragments` hash.
399
+ - `BaseQuery#assemble_fragments` — resolves fragment spreads **recursively** (cycle-safe).
400
+ - **`as_input` / diff pipeline**
401
+ - `Common::GraphQL::Model::AsInput#as_input(target_class:)` — delegates to a specified
402
+ `Input` subclass for field reshaping (e.g. `IdDiffInput` for array fields).
403
+ - `Logic::Input.from_model` — builds mutation input from a model diff; injects `patchVer`
404
+ and `clientMutationId`.
405
+ - `Input::ContractorEntity::Update.from_model` — reshapes array fields
406
+ (`associatedPeopleIds`, `leadContractorIds`) into `IdDiffInput` format.
407
+
408
+ ### Changed
409
+
410
+ - **`Gemfile`** — override `graphlient` with the fork branch (GraphQL directives support).
411
+ - **DataField dirty detection** — removed the per-field `@_dirty` flag in favour of
412
+ diff-based detection. `DataField` now uses a leaf-specific `DIFF_CLASS` (`LeafDiffService`)
413
+ so its `passarray` attributes are diffed inline instead of being stripped as cascaded keys.
414
+ - **AI generator** — compatibility with the Anthropic Ruby SDK 1.x.
415
+
416
+ ### Fixed
417
+
418
+ - **DataField array fields** (`Select`, `People`, `Checklist`, `ContractorEntities`,
419
+ `CrossReference`, `FileField`, `ImageGallery`) — were never reported dirty after a setter,
420
+ so `as_input` returned `nil`. `passarray` keys are *cascaded* attributes and the flat classic
421
+ diff strips them, expecting `diff_reduce` to re-add them by cascading into nested
422
+ `GraphQL::Model` children — but leaf-field arrays are plain hashes/strings, so they vanished.
423
+ Fixed with `DataField::LeafDiffService` (keeps cascaded keys) and by adding the missing
424
+ `array_ids` / `array_id_index` / `array_id_item` helpers to `HashDiffNesting`.
425
+ - **Live AI specs** — resilient to SSL / auth failures in offline environments (skip instead of error).
426
+ - **`HashDiffNesting#dig_path?`** — corrected to use `Hash#key?` rather than `respond_to?(:[])`,
427
+ preventing false positives on non-Hash objects.
428
+ - **`DiffService#classic_diff`** — now returns a flat changed-prop hash (no `api_operation` /
429
+ `change_data` wrapper keys). `as_input` / `as_update` return `nil` when there are no changes.
430
+ - **`assemble_fragments`** — fixed silent bug where a fragment referencing another fragment
431
+ (e.g. `PageFields → ...LocationNode`) would omit the referenced fragment from the query,
432
+ causing a server-side `unknown fragment` error.
433
+ - **`Fragment.assemble`** — fixed silent bug where fragments defined in sub-namespaces
434
+ (e.g. `Fragment::Pages`) were never found, always returning empty.
435
+
436
+ ## [1.3.6] - 2026-06-05
437
+
438
+ ### Added
439
+
440
+ - **`HttpClient#execute`**: new HTTP dispatch method — POSTs `{ query, variables, operationName }` as
441
+ JSON to `/api/:org_id/graphql` and returns the parsed response hash.
442
+ - **`Common::GraphQL::ResponseError`**: typed exception raised when the GraphQL response body
443
+ contains an `errors` array.
444
+ - **`Fragment.assemble(*syms)`**: class method that returns concatenated named fragment definition
445
+ strings for the given symbols, ready to append to a query document before dispatch.
446
+ - **`Graphlient::Query#spread(name)`** _(graphlient fork)_: DSL helper that emits `...FragmentName`
447
+ in the query string. Replaces the `___Const` convention from graphql-client.
448
+ - **`Client#to_query_string(&block)`** _(graphlient fork)_: builds a full GraphQL query document
449
+ from the DSL block and returns a `String` without touching Faraday or HTTP.
450
+
451
+ ### Changed
452
+
453
+ - upgraded ecoportal upstream **gem** dependencies:
454
+ - `ecoportal-api`
455
+ - `ecoportal-api-v2`
456
+ - **`BaseQuery#graphql_query`**: wired to the new dispatch path — builds query string via
457
+ `client.to_query_string`, appends needed named fragment strings, dispatches via
458
+ `client.http_client.execute`. Removes the graphql-client/Faraday dispatch path.
459
+ - **`Common::GraphQL::Client`**: added `attr_accessor :http_client` to carry the HTTP dispatch
460
+ client alongside the DSL client.
461
+ - **`Ecoportal::API::GraphQL#initialize`**: constructs and attaches a `Common::GraphQL::HttpClient`
462
+ instance to `@client.http_client`.
463
+ - **Fragment strings**: all 7 fragment heredocs updated to use named fragment syntax
464
+ (e.g. `fragment Action on Action { ... }`), required for `Fragment.assemble` to emit
465
+ valid named fragment definitions.
466
+ - **`FragmentDefinitions`**: stripped of `client.parse` and `namespace.const_set` — fragment
467
+ strings are now stored as plain Ruby strings. No longer depends on graphql-client for
468
+ fragment loading.
469
+ - **Query/mutation blocks** (12 files): replaced `___Ecoportal__API__GraphQL__Fragment__X`
470
+ spread syntax with `spread :X` throughout all `default_block` and `default_payload_block` procs.
471
+
472
+ ### Fixed
473
+
474
+ - **`HttpClient#base_request`**: added `request ||= HTTP` guard for the unmatched `@version` case
475
+ to prevent nil errors.
476
+ - **`HttpClient#api_url`**: use `ENDPOINT_PATH` constant (`external/graphql`) consistently
477
+ instead of an inline hardcoded string.
478
+
479
+ ## [1.3.5] - 2026-05-26
480
+
481
+ ### Changed
482
+
483
+ - Moved `graphql` endpoint to `external/graphql`
484
+ - Missing env var (i.e. `ORG_ID`) will **raise** now an error (instead of just a print)
485
+
486
+ ## [1.3.4] - 2025-09-04
487
+
488
+ ### Added
489
+
490
+ - Command execution result: **added** command doc when there's a `results` error.
491
+ - Payload improvements:
492
+ - On `LocationsError.validationErrors`: fetch `property` property.
493
+ - On **results**, `Command` always fetch `__typename` and the other properties.
494
+
495
+ ### Changed
496
+
497
+ - Changed base `error_doc`: **consistent property name**
498
+
499
+ ### Fixed
500
+
501
+ - Correct fetch on `ok` (sometimes it is `null`: that doesn't mean failed).
502
+ - **Consistent order** on `error?` and `error_doc`.
503
+ - `Draft`
504
+ - **Overlapping** name `ConflictingIds` (vs `LocationsError.conflictingIds`)
505
+ - **Wrong** include on `FetchNested`
506
+
507
+ ## [1.3.3] - 2025-08-29
508
+
509
+ ### Added
510
+
511
+ - Better error handling
512
+
513
+ ### Fixed
514
+
515
+ - Unused parameter/variable `$includeArchivedNodes`
516
+
517
+ ## [1.3.2] - 2025-08-19
518
+
519
+ ### Added
520
+
521
+ - `Mutation`: allow parameters other than **input**.
522
+ - Location Structure `Draft` models
523
+ - `Interface::LocationStructure::Nodes` for `LocationStructure` and `Draft::Structure`
524
+ - `raw_response` as optional query parameter (for debugging)
525
+ - `Logic::Input` (out of consistency)
526
+ - Fragments:
527
+ - `LocationDraft`
528
+ - `LocationsError`
529
+ - Query to include `draft` list when fetching an **RS**.
530
+ - Location `Draft` queries:
531
+ - `Draft#byId`
532
+ - `Draft#create`
533
+ - `Draft#delete`
534
+ - `Draft#addCommands`
535
+ - `Draft#publish`
536
+ - `Draft#dropBadCommands`
537
+ - Error tracking througout the payload models of location mutations
538
+
539
+ ### Changed
540
+
541
+ - Upgrade dependency (`ecoportal-api` **gem**).
542
+ - Moved rescue on fragment definition to `#define` itself.
543
+ - `NodeInterface` moved to `Interface::LocationStructure::Node`
544
+ - Code: Shorten namespace referral.
545
+ - Swap to `Logic::BaseModel`
546
+ - `Mutation` to introduce `:input` required parameter by using parent class.
547
+
548
+ ### Fixed
549
+
550
+ - `QueryConnection`: bad code.
551
+ - `conflictingIds` should be array.
552
+
553
+ ## [1.3.1] - 2025-06-11
554
+
555
+ ### Changed
556
+
557
+ - upgraded gem dependencies
558
+ - **Moded** `Ecoportal::API::GraphQL::Base::Model` to
559
+ - > `Ecoportal::API::GraphQL::BaseModel`
560
+ - **Added** `Interface::LocationNode`
561
+ - **Added** `Interface::BasePage`
562
+
563
+ ### Fixed
564
+
565
+ - **Fragments**
566
+ - `Action` fragment to use `PageUnion` (**upgrade**)
567
+ - **Memoize** fragments.
568
+ - Add what fragment failed in the **error**.
569
+
570
+ ## [1.2.1] - 2025-05-16
571
+
572
+ ### Changed
573
+
574
+ - upgrade `ecoportal-api` gem
575
+ - upgrade `ecoportal-api-v2` gem
576
+
577
+ ## [1.1.1] - 2025-05-14
578
+
579
+ ### Added
580
+
581
+ - `MemberChanges` helpers for `Base::ContractorEntity`
582
+ - Custom **Diff** logic that can be used in GraphQL content:
583
+ - `Common::GraphQL::Model::Diffable::HashDiffNesting`
584
+ - Reused from `HashDiffPatch` (`ecoportal-api-v2`):
585
+ 1. It does not use `patch_ver`, but rather just `id` property alone.
586
+ 2. The _operation_ property has been renamed to `api_operation` (to ensure no collisions). And the operation types are symbols, and renamed to: `:delete`, `:update` and `:create`. This can show up to be useful when, for instance, reusing the output of `#as_update` to generate actual input objects (i.e. `#as_input`) that feed some GraphQL query.
587
+ 3. The _data_ property has been renamed to `change_data`.
588
+ 4. `Hash` **keys** are of type `Symbol`.
589
+ - `Common::GraphQL::Model::Diffable::DiffService`. In a GraphQL context, this aims to be able to implement a function called `#as_input` (equivalent to `#as_update`):
590
+ 1. It uses the `HashDiffNesting` helpers.
591
+ 2. It has capability to `ignore` certain keys.
592
+ 3. It can calculate **diff** excluding nested models (i.e. those that are `root?` and, therefore, not part of the changed target model). This functionality is an optimization to `cascaded_callbacks` throughout the nested models.
593
+
594
+ ### Changed
595
+
596
+ - `Common::GraphQL::Model::Diffable` by using `Diffable::DiffService` (with `cascaded_callbacks` implementation).
597
+ - `#as_update`
598
+ - `#dirty?`
599
+ - upgraded `ecoportal-api` gem
600
+ - updraded `ecoportal-api-v2` gem
601
+
602
+ ## [0.4.7] - 2025-04-02
603
+
604
+ ### Added
605
+
606
+ - `page.id` to Action linked resources.
607
+
608
+ ## [0.4.6] - 2025-04-02
609
+
610
+ ### Added
611
+
612
+ - `Ecoportal::API::GraphQL::Logic::QueryConnection`
613
+ - **Require** `default_connection_block` to child classes
614
+ - This aims to **not** having have client code having to define the block for `#each`
615
+
616
+ ### Changed
617
+
618
+ - upgraded `ecoportal-api` gem
619
+ - upgraded `ecoportal-api-v2` gem
620
+
621
+ ## [0.4.5] - 2025-03-14
622
+
623
+ ### Added
624
+
625
+ - Query `actionCategories`
626
+ - Mutation **create** `Action`
627
+
628
+ ### Changed
629
+
630
+ - `Action` model to have `locations` (**RS** upgrade)
631
+
632
+ ## [0.4.4] - 2025-02-23
633
+
634
+ ### Changed
635
+
636
+ - Upgraded `ecoportal-api` gem (maintanance)
637
+ - Upgraded `ecoportal-api-v2` gem (to provision `root!` class method)
638
+ - Defined some models that hand on their own as `root!`
639
+ - Refactored `Base::Model` by moving its loggic to `Common::GraphQL`
640
+
641
+ ### Fixed
642
+
643
+ - `Ecoportal::API::Common::GraphQL::HashHelpers`
644
+ - Truly make the iterator generic
645
+
646
+ ## [0.4.3] - 2024-11-21
647
+
648
+ ### Changed
649
+
650
+ - upgrade gems
651
+ - `ecoportal-api`
652
+ - `ecoportal-api-v2`
653
+ - `Ecoportal::API::Common::GraphQL::HttpClient.new` ceased to default `version` to `v1` (now it defaults to `nil`)
654
+
655
+ ## [0.4.2] - 2024-10-01
656
+
657
+ ### Changed
658
+
659
+ - upgrade gems
660
+ - `ecoportal-api-v2`
661
+ - add explicit dependency onto `ecoportal-api` gem (client)
662
+
663
+ ## [0.4.1] - 2024-08-09
664
+
665
+ ### Added
666
+
667
+ - `ContractorEntity` added field `externalId`
668
+
669
+ ### Changed
670
+
671
+ - gem upgrade `ecoportal-api-v2`
672
+
673
+ ## [0.4.0] - 2024-08-01
674
+
675
+ ### Changed
676
+
677
+ - require `ruby 3`
678
+
679
+ ## [0.3.18] - 2024-05-16
680
+
681
+ ### Fixed
682
+
683
+ - `Ecoportal::API::GraphQL::Payload::LocationStructure::CommandExecutionResult`
684
+ - Error is nullable
685
+
686
+ ## [0.3.17] - 2024-05-14
687
+
688
+ ### Fixed
689
+
690
+ - `field_name` should add up to the path
691
+
692
+ ## [0.3.16] - 2024-04-29
693
+
694
+ ### Added
695
+
696
+ - Exposed `graphql` `ContractorEntity` `destroy`
697
+
698
+ ### Fixed
699
+
700
+ - incorrect loading
701
+
702
+ ### Changed
703
+
704
+ - Input for ContractorEntity create moved as `update` (as it wasn't correct)
705
+
706
+ ## [0.3.15] - 2024-04-13
707
+
708
+ ### Added
709
+
710
+ - `Ecoportal::API::GraphQL::Logic::BaseQuery`
711
+ - `::base_path` class instance var.
712
+ - query to retrieve `currentOrganization.classifications`
713
+
714
+ ### Fixed
715
+
716
+ - upgraded `ecoportal-api-v2` gem
717
+
718
+ ## [0.3.14] - 2024-03-13
719
+
720
+ ### Added
721
+
722
+ - some benchmarking on
723
+ 1. core graphql base `query`
724
+ - `#parent_id` to location node model
725
+
726
+ ### Changed
727
+
728
+ - upgraded `ecoportal-v2-api` gem
729
+
730
+ ### Fixed
731
+
732
+ - Optimized `treeify` and locations structure class
733
+
734
+ ## [0.3.13] - 2024-02-03
735
+
736
+ ### Changed
737
+
738
+ - upgrade `ecoportal-api-v2`
739
+
740
+ ## [0.3.12] - 2024-01-27
741
+
742
+ ### Added
743
+
744
+ - Exposed `graphql` `Action` `update` and get a single `action`
745
+
746
+ ## [0.3.11] - 2023-09-19
747
+
748
+ ### Added
749
+
750
+ - Exposed `graphql` `ContractorEntity` `create` and `update`
751
+
752
+ ## [0.3.10] - 2023-08-12
753
+
754
+ ### Fixed
755
+
756
+ - `Ecopotal::API::GraphQL::Query::LocationStructure`
757
+ - `query` in basic_block missed an explicitly declared parameter.
758
+
759
+ ## [0.3.9] - 2023-08-03
760
+
761
+ ### Added
762
+
763
+ - `Ecoportal::API::GraphQL::Logic::BaseQuery`
764
+ - Added support for **default** values.
765
+
766
+ ## [0.3.8] - 2023-07-18
767
+
768
+ ### Added
769
+
770
+ - Integration for archiving actions.
771
+ - `LocationNodeInterface` -> support for `classifications`
772
+ - `Treeify` to dump more data per node (classifications)
773
+
774
+ ### Fixed
775
+
776
+ - Silenced waning messages when redefining `Fragment`s
777
+
778
+ ## [0.3.7] - 2023-05-23
779
+
780
+ ### Fixed
781
+
782
+ - `Ecoportal::API::Common::GraphQL::Client` adjusted `read_timeout` and `write_timeout` to `90` seconds.
783
+
784
+ ## [0.3.6] - 2023-04-17
785
+
786
+ ### Changed
787
+
788
+ - Softened max version of **gem** dependencies
789
+
790
+ ### Fixed
791
+
792
+ - `Ecoportal::API::GraphQL::Fragment#define` was not removing previous constants
793
+ - Changed check method to be `::const_defined?`
794
+
795
+ ## [0.3.5] - 2023-04-03
796
+
797
+ ### Fixed
798
+
799
+ - `Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify`
800
+ - Make it real id-case-insensitive (parents in lower case were being missed due to this)
801
+
802
+ ## [0.3.4] - 2023-04-03
803
+
804
+ ### Added
805
+
806
+ - `Ecoportal::API::Common::GraphQL::AuthService`
807
+ - `#session_token` added **token auto-renew** functionality (when token expires in less than 90 minutes)
808
+ - `#session_token_renewed`
809
+
810
+ ### Fixed
811
+
812
+ - Enabled to specify `host` (other than `live.ecoportal.com`) by the user
813
+
814
+ ## [0.3.3] - 2023-04-02
815
+
816
+ ### Fixed
817
+
818
+ - `Ecoportal::API::GraphQL::Base::LocationNode` **added** attribute `archivedToken`
819
+
820
+ ## [0.3.2] - 2023-04-02
821
+
822
+ ### Changed
823
+
824
+ - `Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify` added support for `archived_token`
825
+
826
+ ## [0.3.1] - 2023-03-09
827
+
828
+ ### Changed
829
+
830
+ - Upgraded core gem dependency `ecoportal-api-v2`
831
+
832
+ ## [0.2.3] - 2023-02-27
833
+
834
+ ### Fixed
835
+
836
+ - Typo in tests LocationsStructures... should read `locationStructures`
837
+
838
+ ## [0.2.2] - 2023-02-24
839
+
840
+ ### Fixed
841
+
842
+ - Build gem correctly
843
+
844
+ ## [0.2.1] - 2023-02-24
845
+
846
+ ### Changed
847
+
848
+ - Migrate from TagTrees to **reporting structures** (breaking change)
849
+
850
+ ### Added
851
+
852
+ - Basics for reporting structure mutations
853
+
854
+ ## [0.1.11] - 2022-11-29
855
+
856
+ ### Added
857
+
858
+ - `Ecoportal::API::GraphQL::Base::Mutation`
859
+ - Added `createContractorEntity`
860
+
861
+ ### Changed
862
+
863
+ - **upgraded** `graphlient` gem dependency (support for framents)
864
+ - removed patch in this gem
865
+ - Slight internal refactor of `Ecoportal::API::GraphQL::Base::Query`
866
+ - Upgraded `ecoportal-api-v2` **gem** dependency
867
+
868
+ ## [0.1.10] - 2022-09-29
869
+
870
+ ### Changed
871
+
872
+ - **upgraded** `ecoportal-api-v2` gem dependency
873
+
874
+ ### Fixed
875
+
876
+ - Remove debugging message
877
+
878
+ ## [0.1.9] - 2022-09-26
879
+
880
+ ### Added
881
+
882
+ - `Ecoportal::API::GraphQL::Query::TagTree`
883
+
884
+ ### Changed
885
+
886
+ - **upgraded** `ecoportal-api-v2` gem dependency
887
+ - added `Ecoportal::API::Common::GraphQL::QueryIntegration`
888
+ - restructured `Ecoportal::API::GraphQL::Model::Organization` class
889
+ - **Patch** on `Graphlient::Query` for fragments support (**pull request**: <https://github.com/ashkan18/graphlient/pull/94>)
890
+
891
+ ## [0.1.8] - 2022-09-23
892
+
893
+ ### Added
894
+
895
+ - `currentOrganization.tagTrees` query
896
+
897
+ ### Changed
898
+
899
+ - **upgraded** `ecoportal-api-v2` gem dependency
900
+ - Restructured the `Query` inheritance chain to make things simpler
901
+
902
+ ## [0.1.6] - 2022-09-19
903
+
904
+ ### Fixed
905
+
906
+ - Call to **private** method `remove_const` in `Ecoportal::API::GraphQL::Fragment#define`
907
+
908
+ ## [0.1.5] - 2022-09-19
909
+
910
+ ### Added
911
+
912
+ - Patch `GraphQL::Query#append_node` so we can use Fragments in blocks using `___` as start of the constant, and `__` for namespace separator
913
+ - Issue/feature request: <https://github.com/ashkan18/graphlient/issues/93>
914
+ - `Ecoportal::API::GraphQL::Fragment#define` provided that client scripts can create their own fragments in their own namespace
915
+ - Exposed `Ecoportal::API::GraphQL#fragments`
916
+ - It will always (re)define in the `Fragment` root namespace
917
+
918
+ ## [0.1.4] - 2022-09-16
919
+
920
+ ### Fixed
921
+
922
+ - Able to inject connection block to `each`
923
+ - Error handling delegated to parent class (`QueryConnection`)
924
+ - Retrieve `id` on elements of `Array`
925
+
926
+ ## [0.1.3] - 2022-09-15
927
+
928
+ ### Fixed
929
+
930
+ - Fixed circular reference to `org_id` in `Ecoportal::API::Common::GraphQL::Client`
931
+
932
+ ## [0.1.2] - 2022-09-15
933
+
934
+ ### Changed
935
+
936
+ - `Ecoportal::API::GraphQL` addded `email` and `pass` parameters on initialization
937
+ - This allows for integration in some client lib
938
+
939
+ ## [0.1.0] - 2022-09-15
940
+
941
+ ### Added
942
+
943
+ - First commit with some basic structure