ecoportal-api-graphql 1.3.5 → 1.3.16

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