ecoportal-api-graphql 1.3.5 → 1.3.9

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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/.ai-assistance/bridge/CLAUDE.md +338 -0
  3. data/.ai-assistance/bridge/archive/.gitkeep +0 -0
  4. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +29 -0
  5. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +18 -0
  6. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +42 -0
  7. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +115 -0
  8. data/.ai-assistance/bridge/context/gemini-review-prompt.txt +48 -0
  9. data/.ai-assistance/bridge/context/gemini-review-response.md +104 -0
  10. data/.ai-assistance/bridge/context/project.md +42 -0
  11. data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
  12. data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
  13. data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +48 -0
  14. data/.ai-assistance/bridge/queue/.gitkeep +1 -0
  15. data/.ai-assistance/capabilities/CLAUDE.md +27 -0
  16. data/.ai-assistance/capabilities/assumptions-log.md +80 -0
  17. data/.ai-assistance/capabilities/code.md +47 -0
  18. data/.ai-assistance/capabilities/connectors.md +37 -0
  19. data/.ai-assistance/capabilities/cowork.md +55 -0
  20. data/.ai-assistance/code/OVERVIEW.md +155 -0
  21. data/.ai-assistance/code/data_fields.md +242 -0
  22. data/.ai-assistance/code/dependencies.md +151 -0
  23. data/.ai-assistance/code/diff_as_input.md +234 -0
  24. data/.ai-assistance/code/diff_service_deep_dive.md +192 -0
  25. data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +55 -0
  26. data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +181 -0
  27. data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +192 -0
  28. data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +147 -0
  29. data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +277 -0
  30. data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +200 -0
  31. data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +228 -0
  32. data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +197 -0
  33. data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +243 -0
  34. data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +196 -0
  35. data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +132 -0
  36. data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +187 -0
  37. data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +236 -0
  38. data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +183 -0
  39. data/.ai-assistance/code/ecoportal_schema_reference.md +240 -0
  40. data/.ai-assistance/code/graphql_domain_knowledge.md +230 -0
  41. data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +71 -0
  42. data/.ai-assistance/code/refactoring/opportunities.md +251 -0
  43. data/.ai-assistance/code/schema_analysis.md +321 -0
  44. data/.ai-assistance/code/search_filters.md +868 -0
  45. data/.ai-assistance/code/spec_coverage.md +73 -0
  46. data/.ai-assistance/code/workflow-command-guide.md +438 -0
  47. data/.ai-assistance/code/workflow-space.md +353 -0
  48. data/.ai-assistance/conventions/CLAUDE.md +30 -0
  49. data/.ai-assistance/conventions/code-working-tree-protocol.md +199 -0
  50. data/.ai-assistance/conventions/gitignore-rules.md +42 -0
  51. data/.ai-assistance/conventions/permission-guidance.md +120 -0
  52. data/.ai-assistance/integrations/README.md +70 -0
  53. data/.ai-assistance/integrations/gitkraken-mcp.md +107 -0
  54. data/.ai-assistance/integrations/gitlab-mcp.md +123 -0
  55. data/.ai-assistance/integrations/local-git.md +60 -0
  56. data/.ai-assistance/local_paths.example.md +17 -0
  57. data/.ai-assistance/projects/TODO.md +97 -0
  58. data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +168 -0
  59. data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +60 -0
  60. data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +267 -0
  61. data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +53 -0
  62. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +102 -0
  63. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +139 -0
  64. data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +93 -0
  65. data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +244 -0
  66. data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +266 -0
  67. data/.ai-assistance/projects/eco-helpers-compat/TODO.md +86 -0
  68. data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +101 -0
  69. data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +177 -0
  70. data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +161 -0
  71. data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +125 -0
  72. data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +126 -0
  73. data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +256 -0
  74. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +122 -0
  75. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +148 -0
  76. data/.ai-assistance/projects/page-model/DECISIONS.md +245 -0
  77. data/.ai-assistance/projects/page-model/TODO.md +190 -0
  78. data/.ai-assistance/projects/search-filter-builder/INTENT.md +107 -0
  79. data/.ai-assistance/projects/search-filter-builder/TODO.md +131 -0
  80. data/.ai-assistance/projects/template-maintenance/DESIGN.md +134 -0
  81. data/.ai-assistance/projects/workflow-space/TODO.md +213 -0
  82. data/.ai-assistance/reinstall-claude-desktop-windows.md +136 -0
  83. data/.ai-assistance/scripts/CLAUDE.md +150 -0
  84. data/.ai-assistance/scripts/bridge-init.sh +86 -0
  85. data/.ai-assistance/scripts/bridge-status.sh +44 -0
  86. data/.ai-assistance/scripts/capabilities-check.ts +104 -0
  87. data/.ai-assistance/scripts/check-outbox.sh +43 -0
  88. data/.ai-assistance/scripts/dep_graph.rb +91 -0
  89. data/.ai-assistance/scripts/lock-acquire.sh +103 -0
  90. data/.ai-assistance/scripts/lock-multi.sh +124 -0
  91. data/.ai-assistance/scripts/lock-queue.sh +94 -0
  92. data/.ai-assistance/scripts/setup-mcps.test.ts +188 -0
  93. data/.ai-assistance/scripts/setup-mcps.ts +234 -0
  94. data/.ai-assistance/scripts/task-complete.ts +74 -0
  95. data/.ai-assistance/scripts/task-create.ts +75 -0
  96. data/.ai-assistance/scripts/task-read.ts +125 -0
  97. data/.ai-assistance/scripts/token-logger.js +220 -0
  98. data/.ai-assistance/scripts/token-report.ts +158 -0
  99. data/.ai-assistance/scripts/token-session-start.js +66 -0
  100. data/.ai-assistance/skills/ai-instructions/SKILL.md +48 -0
  101. data/.ai-assistance/skills/code-specs/SKILL.md +69 -0
  102. data/.ai-assistance/skills/corporate-policies/SKILL.md +201 -0
  103. data/.ai-assistance/skills/dep-graph/SKILL.md +139 -0
  104. data/.ai-assistance/skills/ep-ai-manager/SKILL.md +417 -0
  105. data/.ai-assistance/skills/gemini-assist/SKILL.md +63 -0
  106. data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +205 -0
  107. data/.ai-assistance/skills/gemini-assist/gemini_ask.py +1 -0
  108. data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +240 -0
  109. data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +25 -0
  110. data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +261 -0
  111. data/.ai-assistance/skills/project-cycle/SKILL.md +177 -0
  112. data/.ai-assistance/skills/refactor/SKILL.md +62 -0
  113. data/.ai-assistance/skills/rubocop/SKILL.md +93 -0
  114. data/.ai-assistance/skills/ruby-scripting/SKILL.md +215 -0
  115. data/.ai-assistance/skills/spec-generation/SKILL.md +72 -0
  116. data/.ai-assistance/standards-version.json +21 -0
  117. data/.ai-assistance/token-budget.json +32 -0
  118. data/.ai-assistance/version.json +39 -0
  119. data/.claude/settings.json +146 -0
  120. data/.env.example +18 -0
  121. data/.gitattributes +15 -0
  122. data/.gitignore +13 -0
  123. data/.rubocop.yml +121 -97
  124. data/CHANGELOG.md +673 -477
  125. data/CLAUDE.md +232 -0
  126. data/Gemfile +30 -6
  127. data/Rakefile +90 -38
  128. data/docs/worklog.md +574 -0
  129. data/ecoportal-api-graphql.gemspec +40 -40
  130. data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
  131. data/lib/ecoportal/api/common/graphql/client.rb +1 -1
  132. data/lib/ecoportal/api/common/graphql/http_client.rb +35 -3
  133. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
  134. data/lib/ecoportal/api/common/graphql/model/as_input.rb +8 -5
  135. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +3 -1
  136. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +31 -23
  137. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +54 -1
  138. data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
  139. data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
  140. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
  141. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
  142. data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
  143. data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
  144. data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
  145. data/lib/ecoportal/api/graphql/base/force.rb +65 -0
  146. data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
  147. data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
  148. data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
  149. data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
  150. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
  151. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
  152. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
  153. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +112 -0
  154. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
  155. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
  156. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
  157. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
  158. data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
  159. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
  160. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
  161. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
  162. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
  163. data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
  164. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
  165. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
  166. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
  167. data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
  168. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
  169. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
  170. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
  171. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
  172. data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
  173. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
  174. data/lib/ecoportal/api/graphql/base/page/phased.rb +1 -0
  175. data/lib/ecoportal/api/graphql/base/page/section.rb +36 -0
  176. data/lib/ecoportal/api/graphql/base/page/section_collection.rb +79 -0
  177. data/lib/ecoportal/api/graphql/base/page.rb +2 -0
  178. data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
  179. data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
  180. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
  181. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
  182. data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
  183. data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
  184. data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
  185. data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
  186. data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
  187. data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
  188. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
  189. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
  190. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
  191. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
  192. data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
  193. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
  194. data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
  195. data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
  196. data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
  197. data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
  198. data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
  199. data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
  200. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
  201. data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
  202. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
  203. data/lib/ecoportal/api/graphql/base/register.rb +18 -0
  204. data/lib/ecoportal/api/graphql/base.rb +11 -0
  205. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
  206. data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
  207. data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
  208. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
  209. data/lib/ecoportal/api/graphql/builder/register.rb +27 -19
  210. data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
  211. data/lib/ecoportal/api/graphql/builder.rb +2 -0
  212. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +107 -0
  213. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
  214. data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
  215. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
  216. data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
  217. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
  218. data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
  219. data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
  220. data/lib/ecoportal/api/graphql/compat.rb +17 -0
  221. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
  222. data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
  223. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +21 -28
  224. data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
  225. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
  226. data/lib/ecoportal/api/graphql/concerns.rb +4 -0
  227. data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
  228. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
  229. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
  230. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
  231. data/lib/ecoportal/api/graphql/connection.rb +4 -0
  232. data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -0
  233. data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
  234. data/lib/ecoportal/api/graphql/fragment/action.rb +1 -1
  235. data/lib/ecoportal/api/graphql/fragment/action_category.rb +1 -1
  236. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +1 -1
  237. data/lib/ecoportal/api/graphql/fragment/force.rb +30 -0
  238. data/lib/ecoportal/api/graphql/fragment/location_draft.rb +2 -2
  239. data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -1
  240. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +1 -1
  241. data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
  242. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +395 -0
  243. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
  244. data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
  245. data/lib/ecoportal/api/graphql/fragment/pagination.rb +1 -1
  246. data/lib/ecoportal/api/graphql/fragment.rb +37 -27
  247. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +25 -0
  248. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
  249. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
  250. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
  251. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
  252. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
  253. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
  254. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
  255. data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
  256. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
  257. data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
  258. data/lib/ecoportal/api/graphql/input/page.rb +26 -0
  259. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
  260. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
  261. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
  262. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
  263. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
  264. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
  265. data/lib/ecoportal/api/graphql/input/register.rb +13 -0
  266. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
  267. data/lib/ecoportal/api/graphql/input/search_conf.rb +367 -0
  268. data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
  269. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
  270. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
  271. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
  272. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
  273. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
  274. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
  275. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +18 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
  277. data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
  278. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
  280. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
  281. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
  282. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
  283. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
  284. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
  285. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
  286. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
  287. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
  288. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
  289. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
  290. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
  291. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
  292. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
  293. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
  294. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
  295. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
  296. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
  297. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
  298. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
  299. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
  300. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
  301. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
  302. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
  303. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
  304. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
  305. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
  306. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
  307. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
  308. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
  309. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
  310. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
  311. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
  312. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
  313. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
  314. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
  315. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
  316. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
  317. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
  318. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
  319. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
  320. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
  321. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
  322. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
  323. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
  324. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
  325. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
  326. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
  327. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
  328. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
  329. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
  330. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
  331. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
  332. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
  333. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
  334. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
  335. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
  336. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
  337. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
  338. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
  339. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
  340. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
  341. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
  342. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
  343. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
  344. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
  345. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
  346. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
  347. data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
  348. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
  349. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
  350. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
  351. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
  352. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
  353. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
  354. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
  355. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
  356. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
  357. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
  358. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
  359. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
  360. data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
  361. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
  362. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
  363. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
  364. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
  365. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
  366. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
  367. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
  368. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
  369. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
  370. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
  371. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
  372. data/lib/ecoportal/api/graphql/input.rb +8 -0
  373. data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
  374. data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
  375. data/lib/ecoportal/api/graphql/logic/base_model.rb +2 -0
  376. data/lib/ecoportal/api/graphql/logic/base_query.rb +45 -2
  377. data/lib/ecoportal/api/graphql/logic/input.rb +15 -0
  378. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
  379. data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
  380. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
  381. data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
  382. data/lib/ecoportal/api/graphql/model/page.rb +1 -0
  383. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
  384. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
  385. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
  386. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
  387. data/lib/ecoportal/api/graphql/model/register.rb +10 -0
  388. data/lib/ecoportal/api/graphql/model.rb +8 -0
  389. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
  390. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
  391. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
  392. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
  393. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
  394. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
  395. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
  396. data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
  397. data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
  398. data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
  399. data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
  400. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +3 -3
  401. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +2 -2
  402. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +2 -2
  403. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +3 -3
  404. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +3 -3
  405. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
  406. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
  407. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +40 -0
  408. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
  409. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +40 -0
  410. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
  411. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +40 -0
  412. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
  413. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +51 -0
  414. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +40 -0
  415. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
  416. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
  417. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
  418. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
  419. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
  420. data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
  421. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
  422. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
  423. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +35 -0
  424. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
  425. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
  426. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
  427. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
  428. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
  429. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
  430. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
  431. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
  432. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
  433. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
  434. data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
  435. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
  436. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
  437. data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
  438. data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
  439. data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
  440. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
  441. data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
  442. data/lib/ecoportal/api/graphql/mutation.rb +8 -0
  443. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
  444. data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
  445. data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
  446. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
  447. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
  448. data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
  449. data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
  450. data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
  451. data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
  452. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +21 -0
  453. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
  454. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
  455. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
  456. data/lib/ecoportal/api/graphql/payload/page/draft.rb +13 -0
  457. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
  458. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
  459. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
  460. data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
  461. data/lib/ecoportal/api/graphql/payload/page.rb +19 -0
  462. data/lib/ecoportal/api/graphql/payload/preset_view.rb +11 -0
  463. data/lib/ecoportal/api/graphql/payload/register.rb +11 -0
  464. data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
  465. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
  466. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
  467. data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
  468. data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
  469. data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
  470. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
  471. data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
  472. data/lib/ecoportal/api/graphql/payload.rb +11 -0
  473. data/lib/ecoportal/api/graphql/query/action.rb +1 -1
  474. data/lib/ecoportal/api/graphql/query/action_categories.rb +1 -1
  475. data/lib/ecoportal/api/graphql/query/actions.rb +2 -2
  476. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +1 -1
  477. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
  478. data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +2 -2
  479. data/lib/ecoportal/api/graphql/query/location_structure.rb +1 -1
  480. data/lib/ecoportal/api/graphql/query/location_structures.rb +1 -1
  481. data/lib/ecoportal/api/graphql/query/page.rb +45 -0
  482. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
  483. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +43 -0
  484. data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
  485. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +59 -0
  486. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
  487. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
  488. data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
  489. data/lib/ecoportal/api/graphql/query.rb +11 -0
  490. data/lib/ecoportal/api/graphql.rb +60 -2
  491. data/lib/ecoportal/api/graphql_version.rb +5 -5
  492. data/scripts/auto-worker-scheduler.sh +386 -0
  493. data/tests/contractor_entity_create.rb +19 -19
  494. data/tests/contractor_entity_udpate.rb +20 -20
  495. data/tests/dump_page_model.rb +74 -0
  496. data/tests/loc_structure_get.rb +1 -2
  497. data/tests/loc_structure_update.rb +51 -51
  498. data/tests/loc_structures_get.rb +15 -15
  499. metadata +436 -5
data/CHANGELOG.md CHANGED
@@ -1,477 +1,673 @@
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.9] - 2026-07-02
6
+
7
+ APIv2→GraphQL cutover hardening (backwards-compatible). Live-validated on the maintained ooze
8
+ integrations (toocs-coding, cans-upsert).
9
+
10
+ ### Fixed
11
+
12
+ - **Faithful dry-run body** — `Compat::Pages#get_body` returns the SAME input `#update`/`#create`
13
+ would send (under the `'page'` key), incl. `dataFields.updates` (invisible to `page.as_update`
14
+ on phased pages). Create previews render as `CreateFromTemplateInput` (marker-based
15
+ `#new_draft?`) instead of mislabelling as updates.
16
+ - **Stage submit/sign-off carries `stageId`** — `Input::Page::Update.from_model` raises if a
17
+ submit/task is requested without a stage; `Compat::StageView` records the viewed stage on the
18
+ page; `compat_stage_id` resolves pinned active(stage-view) current. People-field
19
+ permissions are stage-scoped, so a submit must name its stage.
20
+ - **`CrossReference#dirty?`** compares the reference-id SET vs `original_doc` — no phantom
21
+ `referenceIds: []` clears (empty→empty / same→same is not dirty).
22
+ - **`Number`/`Gauge` blank → nil, never `0.0`** — an empty CSV cell no longer coerces to a real
23
+ zero. Shared `DataField#numeric_or_nil`.
24
+ - **`People` reader** falls back to the `people{id}` nodes when `peopleIds` is blank — an append
25
+ can't wipe existing people.
26
+ - **`Compat::Pages#create` resolves `templateId` from the get_new marker**
27
+ (`_compat_source_template_id`), matching the dry-run fixes a live `templateId: null` failure.
28
+
29
+ ### Added
30
+
31
+ - **Exact-match register filter** — `Compat::FilterTranslator` maps a v2 `type: 'exact_filter'`
32
+ (alias `'is_filter'`) → GraphQL `is_filter` (whole-value equality on a field's `.exact` keyword
33
+ subfield), deriving the `membranes.<type>` path. Fixes exact-id existence checks (partial
34
+ `match_filter` missed exact SKUs → duplicate pages). Note: case-insensitive, first-64-chars.
35
+ - **`Builder::Page#archive(clear_external_id:)`** optionally blanks `externalId` (a separate
36
+ `updatePage`) before archiving, for cleanup of a failed/duplicate creation; default `false`
37
+ keeps it. externalId is the per-org, per-model integration pairing key.
38
+
39
+ ## [1.3.8] - 2026-06-12
40
+
41
+ ### Added
42
+
43
+ - **Template mutations** — full lifecycle for creating and updating workflow templates:
44
+ - `Mutation::Template::{Create,Update}` — `createPageTemplate` / `updatePageTemplate` (both accept `WorkflowCommandInput` command bus)
45
+ - `Mutation::Template::{Publish,Unpublish}` `publishTemplate` / `unpublishTemplate`
46
+ - `Mutation::Template::UpdateInformation` — update template `description`, `aiDescription`, `templateType`
47
+ - `Mutation::Template::{CreateRelatedPage,DestroyRelatedPage}` — manage template related-pages
48
+ - `Builder::Template` wired as `api.template`
49
+ - **`updateVariableBindings`** — `Mutation::Page::UpdateVariableBindings` maps named force variable slots to data field IDs on a page; `Input::VariableBinding` value object
50
+ - **Kickstand job mutations** — `Mutation::Kickstand::{StartJob,FailJob,BulkUpdateJobs}`; `Builder::Kickstand` extended with `start_job`, `fail_job`, `bulk_update_jobs`
51
+
52
+ ## [1.3.7] - 2026-06-12
53
+
54
+ ### Added
55
+
56
+ - **PagesWorkflow space (W1–W5)**
57
+ - `Base::PagesWorkflow` + sub-model tree (`pages_workflow/`): `RegisterField`, `CallbackType`,
58
+ `OperationInterface`, `TriggerInterface`, and supporting types read model for the
59
+ page-workflow configuration (`autoPageCreationEnabled`, `fields`, `stages`).
60
+ - `Model::PagesWorkflow` with class resolver.
61
+ - **Workflow command bus**: `Input::WorkflowCommandInput` covering ~80 command types under
62
+ `input/workflow_command/`. `Mutation::Page::ExecuteWorkflowCommands` +
63
+ `Payload::ExecuteWorkflowCommands`.
64
+ - Workflow fragments registered for assembly.
65
+ - _Note: the workflow command surface is volatile upstream — designed to absorb change._
66
+ - **Force model / ForceCompat**
67
+ - `Base::Force` (+ `force/` sub-models), Force fragment.
68
+ - `Mutation::Page::ExecuteForceCommands`, `Payload::ForceCommands`, `Query::PageWithForces`.
69
+ - **DataField type hierarchy (Phase E)**
70
+ - Full set of typed `Base::Page::DataField` subclasses: `PlainText`, `RichText`, `DateField`,
71
+ `Number`, `Gauge`, `People`, `Select`, `Checklist`, `TagField`, `Geo`, `Signature`,
72
+ `ContractorEntities`, `CrossReference`, `ImageGallery`, `FileField`, `Mailbox`,
73
+ `ActionsList`, `Law`, `AiSummary`, `Table`, `SmartFill`, dispatched via `TYPE_MAP`/`from_doc`.
74
+ - `DataField::Collection` — `dirty_inputs`, `dirty_additions`, `dirty_deletions`,
75
+ `add`, `mark_for_deletion`.
76
+ - **Register builder & models**
77
+ - `Builder::Register` (+ `register/preset_view`), `Model::Register`,
78
+ `Mutation::Register` (`create`/`update`/`destroy`), `Input::Register`, `Payload::Register`.
79
+ - **Preset views**
80
+ - `Model::PresetView`, `Mutation::PresetView` (`create`/`update`/`destroy`/`permission`),
81
+ `Query::RegisterPresetViews`, `Input::PresetView`, `Payload::PresetView`.
82
+ - **AI mutations**
83
+ - `Mutation::SmartFill` (`generate`/`submit_feedback`).
84
+ - `Mutation::AiSummary` (`generate`/`submit_feedback`), `Model::AiSummaryVersion`,
85
+ `Payload::AiSummaryGenerate`.
86
+ - **Review task & draft lifecycle mutations**
87
+ - Review tasks: `approve`/`reject`/`restart`/`undo`/`batch_update` (`Mutation::Page::*ReviewTask`),
88
+ `Payload::Page::ReviewTask`.
89
+ - Drafts: `Mutation::Page::CreateDraft`/`PublishDraft`/`DeleteDraft`, `Payload::Page::Draft`.
90
+ - Templates: `Mutation::Page::BuildFromTemplate`/`CreateFromTemplate` + payloads.
91
+ - **Queries**
92
+ - `Query::PageDelta` (+ `Base::DeltaResult`, `Input::DeltaInput`).
93
+ - `Query::RegisterPreviewPages` (+ `Base::PreviewPage`).
94
+ - `Query::FileUploadSignature` + file-upload helper.
95
+ - **`Input::SearchConf`** — fluent/chainable filter DSL and `SearchConf.from_description`
96
+ (AI-assisted filter generation from natural language).
97
+ - **Compat layer for `eco-helpers`** — `Compat::Pages` (`#each` cursor-paginated full iteration),
98
+ `Compat::Registers`, `Compat::FilterTranslator`, `Compat::PageReference`,
99
+ `Compat::StageCollection`, `Compat::StageView`, `Compat::SearchResults`, `Compat::Response`.
100
+ - **Concerns** `SnakeCamelAccess` (camelCase→snake_case delegation), `DataFieldAccess`,
101
+ `PageCompat`, `Deprecation`.
102
+ - `Payload::OkPayload` base payload.
103
+ - **Page read layer (Phase A)**
104
+ - `Fragment::PageFields` named fragment on `BasePageInterface` covering identity, state,
105
+ lifecycle, and location fields. Includes `__typename` for union dispatch.
106
+ - `Interface::BasePage` — added `passboolean :draft` and `passthrough :externalId`.
107
+ - `Base::Page::Basic < Interface::BasePage` — concrete basic page class.
108
+ - `Base::Page::Phased` `passarray :stages` (raw array until typed in Phase C).
109
+ - `Model::Page::Basic`, `Model::Page::Phased` — concrete model classes with class resolvers.
110
+ - `Model::PageUnion` — factory module: dispatches `.new(doc)` to `Basic` or `Phased`
111
+ based on `__typename`. Used as `item_class` / `node_class` throughout.
112
+ - `Connection::Page < Logic::Connection` — paginated page connection with `PageUnion` nodes.
113
+ - `Query::Page` (single page by ID), `Query::Pages` (paginated list), `Query::Templates`.
114
+ - `Model::Organization` — wired `query :page`, `query :pages`, `query :templates`.
115
+ - **Page write layer (Phase B)**
116
+ - `Input::Page` maps `PageInput` fields; owns `PAGE_FIELD_KEYS` as single source of truth.
117
+ - `Input::Page::Update` — maps `UpdatePageInput`; `from_model` builds the nested `page:`
118
+ sub-hash and always injects `patchVer` (a current `patchVer` must be fetched before update).
119
+ - `Input::Page::Archive`, `Input::Page::Unarchive`.
120
+ - `Mutation::Page::Update`/`Archive`/`Unarchive`, `Payload::Page::Update`/`Archive`/`Unarchive`
121
+ (all return a `PageUnion` item), `Builder::Page` (`update`/`archive`/`unarchive`),
122
+ `Ecoportal::API::GraphQL#page` top-level accessor.
123
+ - **Fragment infrastructure**
124
+ - `Fragment::Pages` sub-namespace with `CommonPageUnion` — customer-facing fragment covering
125
+ stages, sections, all 20 data field types, actions, files, and emails. Parametric via
126
+ `$content`, `$only_content`, `$fields`.
127
+ - `FragmentDefinitions.register_namespace(klass)` — cross-namespace fragment discovery without
128
+ polluting the parent `fragments` hash.
129
+ - `BaseQuery#assemble_fragments` — resolves fragment spreads **recursively** (cycle-safe).
130
+ - **`as_input` / diff pipeline**
131
+ - `Common::GraphQL::Model::AsInput#as_input(target_class:)` — delegates to a specified
132
+ `Input` subclass for field reshaping (e.g. `IdDiffInput` for array fields).
133
+ - `Logic::Input.from_model` — builds mutation input from a model diff; injects `patchVer`
134
+ and `clientMutationId`.
135
+ - `Input::ContractorEntity::Update.from_model` — reshapes array fields
136
+ (`associatedPeopleIds`, `leadContractorIds`) into `IdDiffInput` format.
137
+
138
+ ### Changed
139
+
140
+ - **`Gemfile`** — override `graphlient` with the fork branch (GraphQL directives support).
141
+ - **DataField dirty detection** — removed the per-field `@_dirty` flag in favour of
142
+ diff-based detection. `DataField` now uses a leaf-specific `DIFF_CLASS` (`LeafDiffService`)
143
+ so its `passarray` attributes are diffed inline instead of being stripped as cascaded keys.
144
+ - **AI generator** — compatibility with the Anthropic Ruby SDK 1.x.
145
+
146
+ ### Fixed
147
+
148
+ - **DataField array fields** (`Select`, `People`, `Checklist`, `ContractorEntities`,
149
+ `CrossReference`, `FileField`, `ImageGallery`) — were never reported dirty after a setter,
150
+ so `as_input` returned `nil`. `passarray` keys are *cascaded* attributes and the flat classic
151
+ diff strips them, expecting `diff_reduce` to re-add them by cascading into nested
152
+ `GraphQL::Model` children — but leaf-field arrays are plain hashes/strings, so they vanished.
153
+ Fixed with `DataField::LeafDiffService` (keeps cascaded keys) and by adding the missing
154
+ `array_ids` / `array_id_index` / `array_id_item` helpers to `HashDiffNesting`.
155
+ - **Live AI specs** — resilient to SSL / auth failures in offline environments (skip instead of error).
156
+ - **`HashDiffNesting#dig_path?`** — corrected to use `Hash#key?` rather than `respond_to?(:[])`,
157
+ preventing false positives on non-Hash objects.
158
+ - **`DiffService#classic_diff`** — now returns a flat changed-prop hash (no `api_operation` /
159
+ `change_data` wrapper keys). `as_input` / `as_update` return `nil` when there are no changes.
160
+ - **`assemble_fragments`** fixed silent bug where a fragment referencing another fragment
161
+ (e.g. `PageFields → ...LocationNode`) would omit the referenced fragment from the query,
162
+ causing a server-side `unknown fragment` error.
163
+ - **`Fragment.assemble`** — fixed silent bug where fragments defined in sub-namespaces
164
+ (e.g. `Fragment::Pages`) were never found, always returning empty.
165
+
166
+ ## [1.3.6] - 2026-06-05
167
+
168
+ ### Added
169
+
170
+ - **`HttpClient#execute`**: new HTTP dispatch method — POSTs `{ query, variables, operationName }` as
171
+ JSON to `/api/:org_id/graphql` and returns the parsed response hash.
172
+ - **`Common::GraphQL::ResponseError`**: typed exception raised when the GraphQL response body
173
+ contains an `errors` array.
174
+ - **`Fragment.assemble(*syms)`**: class method that returns concatenated named fragment definition
175
+ strings for the given symbols, ready to append to a query document before dispatch.
176
+ - **`Graphlient::Query#spread(name)`** _(graphlient fork)_: DSL helper that emits `...FragmentName`
177
+ in the query string. Replaces the `___Const` convention from graphql-client.
178
+ - **`Client#to_query_string(&block)`** _(graphlient fork)_: builds a full GraphQL query document
179
+ from the DSL block and returns a `String` without touching Faraday or HTTP.
180
+
181
+ ### Changed
182
+
183
+ - upgraded ecoportal upstream **gem** dependencies:
184
+ - `ecoportal-api`
185
+ - `ecoportal-api-v2`
186
+ - **`BaseQuery#graphql_query`**: wired to the new dispatch path — builds query string via
187
+ `client.to_query_string`, appends needed named fragment strings, dispatches via
188
+ `client.http_client.execute`. Removes the graphql-client/Faraday dispatch path.
189
+ - **`Common::GraphQL::Client`**: added `attr_accessor :http_client` to carry the HTTP dispatch
190
+ client alongside the DSL client.
191
+ - **`Ecoportal::API::GraphQL#initialize`**: constructs and attaches a `Common::GraphQL::HttpClient`
192
+ instance to `@client.http_client`.
193
+ - **Fragment strings**: all 7 fragment heredocs updated to use named fragment syntax
194
+ (e.g. `fragment Action on Action { ... }`), required for `Fragment.assemble` to emit
195
+ valid named fragment definitions.
196
+ - **`FragmentDefinitions`**: stripped of `client.parse` and `namespace.const_set` — fragment
197
+ strings are now stored as plain Ruby strings. No longer depends on graphql-client for
198
+ fragment loading.
199
+ - **Query/mutation blocks** (12 files): replaced `___Ecoportal__API__GraphQL__Fragment__X`
200
+ spread syntax with `spread :X` throughout all `default_block` and `default_payload_block` procs.
201
+
202
+ ### Fixed
203
+
204
+ - **`HttpClient#base_request`**: added `request ||= HTTP` guard for the unmatched `@version` case
205
+ to prevent nil errors.
206
+ - **`HttpClient#api_url`**: use `ENDPOINT_PATH` constant (`external/graphql`) consistently
207
+ instead of an inline hardcoded string.
208
+
209
+ ## [1.3.5] - 2026-05-26
210
+
211
+ ### Changed
212
+
213
+ - Moved `graphql` endpoint to `external/graphql`
214
+ - Missing env var (i.e. `ORG_ID`) will **raise** now an error (instead of just a print)
215
+
216
+ ## [1.3.4] - 2025-09-04
217
+
218
+ ### Added
219
+
220
+ - Command execution result: **added** command doc when there's a `results` error.
221
+ - Payload improvements:
222
+ - On `LocationsError.validationErrors`: fetch `property` property.
223
+ - On **results**, `Command` always fetch `__typename` and the other properties.
224
+
225
+ ### Changed
226
+
227
+ - Changed base `error_doc`: **consistent property name**
228
+
229
+ ### Fixed
230
+
231
+ - Correct fetch on `ok` (sometimes it is `null`: that doesn't mean failed).
232
+ - **Consistent order** on `error?` and `error_doc`.
233
+ - `Draft`
234
+ - **Overlapping** name `ConflictingIds` (vs `LocationsError.conflictingIds`)
235
+ - **Wrong** include on `FetchNested`
236
+
237
+ ## [1.3.3] - 2025-08-29
238
+
239
+ ### Added
240
+
241
+ - Better error handling
242
+
243
+ ### Fixed
244
+
245
+ - Unused parameter/variable `$includeArchivedNodes`
246
+
247
+ ## [1.3.2] - 2025-08-19
248
+
249
+ ### Added
250
+
251
+ - `Mutation`: allow parameters other than **input**.
252
+ - Location Structure `Draft` models
253
+ - `Interface::LocationStructure::Nodes` for `LocationStructure` and `Draft::Structure`
254
+ - `raw_response` as optional query parameter (for debugging)
255
+ - `Logic::Input` (out of consistency)
256
+ - Fragments:
257
+ - `LocationDraft`
258
+ - `LocationsError`
259
+ - Query to include `draft` list when fetching an **RS**.
260
+ - Location `Draft` queries:
261
+ - `Draft#byId`
262
+ - `Draft#create`
263
+ - `Draft#delete`
264
+ - `Draft#addCommands`
265
+ - `Draft#publish`
266
+ - `Draft#dropBadCommands`
267
+ - Error tracking througout the payload models of location mutations
268
+
269
+ ### Changed
270
+
271
+ - Upgrade dependency (`ecoportal-api` **gem**).
272
+ - Moved rescue on fragment definition to `#define` itself.
273
+ - `NodeInterface` moved to `Interface::LocationStructure::Node`
274
+ - Code: Shorten namespace referral.
275
+ - Swap to `Logic::BaseModel`
276
+ - `Mutation` to introduce `:input` required parameter by using parent class.
277
+
278
+ ### Fixed
279
+
280
+ - `QueryConnection`: bad code.
281
+ - `conflictingIds` should be array.
282
+
283
+ ## [1.3.1] - 2025-06-11
284
+
285
+ ### Changed
286
+
287
+ - upgraded gem dependencies
288
+ - **Moded** `Ecoportal::API::GraphQL::Base::Model` to
289
+ - > `Ecoportal::API::GraphQL::BaseModel`
290
+ - **Added** `Interface::LocationNode`
291
+ - **Added** `Interface::BasePage`
292
+
293
+ ### Fixed
294
+
295
+ - **Fragments**
296
+ - `Action` fragment to use `PageUnion` (**upgrade**)
297
+ - **Memoize** fragments.
298
+ - Add what fragment failed in the **error**.
299
+
300
+ ## [1.2.1] - 2025-05-16
301
+
302
+ ### Changed
303
+
304
+ - upgrade `ecoportal-api` gem
305
+ - upgrade `ecoportal-api-v2` gem
306
+
307
+ ## [1.1.1] - 2025-05-14
308
+
309
+ ### Added
310
+
311
+ - `MemberChanges` helpers for `Base::ContractorEntity`
312
+ - Custom **Diff** logic that can be used in GraphQL content:
313
+ - `Common::GraphQL::Model::Diffable::HashDiffNesting`
314
+ - Reused from `HashDiffPatch` (`ecoportal-api-v2`):
315
+ 1. It does not use `patch_ver`, but rather just `id` property alone.
316
+ 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.
317
+ 3. The _data_ property has been renamed to `change_data`.
318
+ 4. `Hash` **keys** are of type `Symbol`.
319
+ - `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`):
320
+ 1. It uses the `HashDiffNesting` helpers.
321
+ 2. It has capability to `ignore` certain keys.
322
+ 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.
323
+
324
+ ### Changed
325
+
326
+ - `Common::GraphQL::Model::Diffable` by using `Diffable::DiffService` (with `cascaded_callbacks` implementation).
327
+ - `#as_update`
328
+ - `#dirty?`
329
+ - upgraded `ecoportal-api` gem
330
+ - updraded `ecoportal-api-v2` gem
331
+
332
+ ## [0.4.7] - 2025-04-02
333
+
334
+ ### Added
335
+
336
+ - `page.id` to Action linked resources.
337
+
338
+ ## [0.4.6] - 2025-04-02
339
+
340
+ ### Added
341
+
342
+ - `Ecoportal::API::GraphQL::Logic::QueryConnection`
343
+ - **Require** `default_connection_block` to child classes
344
+ - This aims to **not** having have client code having to define the block for `#each`
345
+
346
+ ### Changed
347
+
348
+ - upgraded `ecoportal-api` gem
349
+ - upgraded `ecoportal-api-v2` gem
350
+
351
+ ## [0.4.5] - 2025-03-14
352
+
353
+ ### Added
354
+
355
+ - Query `actionCategories`
356
+ - Mutation **create** `Action`
357
+
358
+ ### Changed
359
+
360
+ - `Action` model to have `locations` (**RS** upgrade)
361
+
362
+ ## [0.4.4] - 2025-02-23
363
+
364
+ ### Changed
365
+
366
+ - Upgraded `ecoportal-api` gem (maintanance)
367
+ - Upgraded `ecoportal-api-v2` gem (to provision `root!` class method)
368
+ - Defined some models that hand on their own as `root!`
369
+ - Refactored `Base::Model` by moving its loggic to `Common::GraphQL`
370
+
371
+ ### Fixed
372
+
373
+ - `Ecoportal::API::Common::GraphQL::HashHelpers`
374
+ - Truly make the iterator generic
375
+
376
+ ## [0.4.3] - 2024-11-21
377
+
378
+ ### Changed
379
+
380
+ - upgrade gems
381
+ - `ecoportal-api`
382
+ - `ecoportal-api-v2`
383
+ - `Ecoportal::API::Common::GraphQL::HttpClient.new` ceased to default `version` to `v1` (now it defaults to `nil`)
384
+
385
+ ## [0.4.2] - 2024-10-01
386
+
387
+ ### Changed
388
+
389
+ - upgrade gems
390
+ - `ecoportal-api-v2`
391
+ - add explicit dependency onto `ecoportal-api` gem (client)
392
+
393
+ ## [0.4.1] - 2024-08-09
394
+
395
+ ### Added
396
+
397
+ - `ContractorEntity` added field `externalId`
398
+
399
+ ### Changed
400
+
401
+ - gem upgrade `ecoportal-api-v2`
402
+
403
+ ## [0.4.0] - 2024-08-01
404
+
405
+ ### Changed
406
+
407
+ - require `ruby 3`
408
+
409
+ ## [0.3.18] - 2024-05-16
410
+
411
+ ### Fixed
412
+
413
+ - `Ecoportal::API::GraphQL::Payload::LocationStructure::CommandExecutionResult`
414
+ - Error is nullable
415
+
416
+ ## [0.3.17] - 2024-05-14
417
+
418
+ ### Fixed
419
+
420
+ - `field_name` should add up to the path
421
+
422
+ ## [0.3.16] - 2024-04-29
423
+
424
+ ### Added
425
+
426
+ - Exposed `graphql` `ContractorEntity` `destroy`
427
+
428
+ ### Fixed
429
+
430
+ - incorrect loading
431
+
432
+ ### Changed
433
+
434
+ - Input for ContractorEntity create moved as `update` (as it wasn't correct)
435
+
436
+ ## [0.3.15] - 2024-04-13
437
+
438
+ ### Added
439
+
440
+ - `Ecoportal::API::GraphQL::Logic::BaseQuery`
441
+ - `::base_path` class instance var.
442
+ - query to retrieve `currentOrganization.classifications`
443
+
444
+ ### Fixed
445
+
446
+ - upgraded `ecoportal-api-v2` gem
447
+
448
+ ## [0.3.14] - 2024-03-13
449
+
450
+ ### Added
451
+
452
+ - some benchmarking on
453
+ 1. core graphql base `query`
454
+ - `#parent_id` to location node model
455
+
456
+ ### Changed
457
+
458
+ - upgraded `ecoportal-v2-api` gem
459
+
460
+ ### Fixed
461
+
462
+ - Optimized `treeify` and locations structure class
463
+
464
+ ## [0.3.13] - 2024-02-03
465
+
466
+ ### Changed
467
+
468
+ - upgrade `ecoportal-api-v2`
469
+
470
+ ## [0.3.12] - 2024-01-27
471
+
472
+ ### Added
473
+
474
+ - Exposed `graphql` `Action` `update` and get a single `action`
475
+
476
+ ## [0.3.11] - 2023-09-19
477
+
478
+ ### Added
479
+
480
+ - Exposed `graphql` `ContractorEntity` `create` and `update`
481
+
482
+ ## [0.3.10] - 2023-08-12
483
+
484
+ ### Fixed
485
+
486
+ - `Ecopotal::API::GraphQL::Query::LocationStructure`
487
+ - `query` in basic_block missed an explicitly declared parameter.
488
+
489
+ ## [0.3.9] - 2023-08-03
490
+
491
+ ### Added
492
+
493
+ - `Ecoportal::API::GraphQL::Logic::BaseQuery`
494
+ - Added support for **default** values.
495
+
496
+ ## [0.3.8] - 2023-07-18
497
+
498
+ ### Added
499
+
500
+ - Integration for archiving actions.
501
+ - `LocationNodeInterface` -> support for `classifications`
502
+ - `Treeify` to dump more data per node (classifications)
503
+
504
+ ### Fixed
505
+
506
+ - Silenced waning messages when redefining `Fragment`s
507
+
508
+ ## [0.3.7] - 2023-05-23
509
+
510
+ ### Fixed
511
+
512
+ - `Ecoportal::API::Common::GraphQL::Client` adjusted `read_timeout` and `write_timeout` to `90` seconds.
513
+
514
+ ## [0.3.6] - 2023-04-17
515
+
516
+ ### Changed
517
+
518
+ - Softened max version of **gem** dependencies
519
+
520
+ ### Fixed
521
+
522
+ - `Ecoportal::API::GraphQL::Fragment#define` was not removing previous constants
523
+ - Changed check method to be `::const_defined?`
524
+
525
+ ## [0.3.5] - 2023-04-03
526
+
527
+ ### Fixed
528
+
529
+ - `Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify`
530
+ - Make it real id-case-insensitive (parents in lower case were being missed due to this)
531
+
532
+ ## [0.3.4] - 2023-04-03
533
+
534
+ ### Added
535
+
536
+ - `Ecoportal::API::Common::GraphQL::AuthService`
537
+ - `#session_token` added **token auto-renew** functionality (when token expires in less than 90 minutes)
538
+ - `#session_token_renewed`
539
+
540
+ ### Fixed
541
+
542
+ - Enabled to specify `host` (other than `live.ecoportal.com`) by the user
543
+
544
+ ## [0.3.3] - 2023-04-02
545
+
546
+ ### Fixed
547
+
548
+ - `Ecoportal::API::GraphQL::Base::LocationNode` **added** attribute `archivedToken`
549
+
550
+ ## [0.3.2] - 2023-04-02
551
+
552
+ ### Changed
553
+
554
+ - `Ecoportal::API::GraphQL::Helpers::LocationsTree#treeify` added support for `archived_token`
555
+
556
+ ## [0.3.1] - 2023-03-09
557
+
558
+ ### Changed
559
+
560
+ - Upgraded core gem dependency `ecoportal-api-v2`
561
+
562
+ ## [0.2.3] - 2023-02-27
563
+
564
+ ### Fixed
565
+
566
+ - Typo in tests LocationsStructures... should read `locationStructures`
567
+
568
+ ## [0.2.2] - 2023-02-24
569
+
570
+ ### Fixed
571
+
572
+ - Build gem correctly
573
+
574
+ ## [0.2.1] - 2023-02-24
575
+
576
+ ### Changed
577
+
578
+ - Migrate from TagTrees to **reporting structures** (breaking change)
579
+
580
+ ### Added
581
+
582
+ - Basics for reporting structure mutations
583
+
584
+ ## [0.1.11] - 2022-11-29
585
+
586
+ ### Added
587
+
588
+ - `Ecoportal::API::GraphQL::Base::Mutation`
589
+ - Added `createContractorEntity`
590
+
591
+ ### Changed
592
+
593
+ - **upgraded** `graphlient` gem dependency (support for framents)
594
+ - removed patch in this gem
595
+ - Slight internal refactor of `Ecoportal::API::GraphQL::Base::Query`
596
+ - Upgraded `ecoportal-api-v2` **gem** dependency
597
+
598
+ ## [0.1.10] - 2022-09-29
599
+
600
+ ### Changed
601
+
602
+ - **upgraded** `ecoportal-api-v2` gem dependency
603
+
604
+ ### Fixed
605
+
606
+ - Remove debugging message
607
+
608
+ ## [0.1.9] - 2022-09-26
609
+
610
+ ### Added
611
+
612
+ - `Ecoportal::API::GraphQL::Query::TagTree`
613
+
614
+ ### Changed
615
+
616
+ - **upgraded** `ecoportal-api-v2` gem dependency
617
+ - added `Ecoportal::API::Common::GraphQL::QueryIntegration`
618
+ - restructured `Ecoportal::API::GraphQL::Model::Organization` class
619
+ - **Patch** on `Graphlient::Query` for fragments support (**pull request**: <https://github.com/ashkan18/graphlient/pull/94>)
620
+
621
+ ## [0.1.8] - 2022-09-23
622
+
623
+ ### Added
624
+
625
+ - `currentOrganization.tagTrees` query
626
+
627
+ ### Changed
628
+
629
+ - **upgraded** `ecoportal-api-v2` gem dependency
630
+ - Restructured the `Query` inheritance chain to make things simpler
631
+
632
+ ## [0.1.6] - 2022-09-19
633
+
634
+ ### Fixed
635
+
636
+ - Call to **private** method `remove_const` in `Ecoportal::API::GraphQL::Fragment#define`
637
+
638
+ ## [0.1.5] - 2022-09-19
639
+
640
+ ### Added
641
+
642
+ - Patch `GraphQL::Query#append_node` so we can use Fragments in blocks using `___` as start of the constant, and `__` for namespace separator
643
+ - Issue/feature request: <https://github.com/ashkan18/graphlient/issues/93>
644
+ - `Ecoportal::API::GraphQL::Fragment#define` provided that client scripts can create their own fragments in their own namespace
645
+ - Exposed `Ecoportal::API::GraphQL#fragments`
646
+ - It will always (re)define in the `Fragment` root namespace
647
+
648
+ ## [0.1.4] - 2022-09-16
649
+
650
+ ### Fixed
651
+
652
+ - Able to inject connection block to `each`
653
+ - Error handling delegated to parent class (`QueryConnection`)
654
+ - Retrieve `id` on elements of `Array`
655
+
656
+ ## [0.1.3] - 2022-09-15
657
+
658
+ ### Fixed
659
+
660
+ - Fixed circular reference to `org_id` in `Ecoportal::API::Common::GraphQL::Client`
661
+
662
+ ## [0.1.2] - 2022-09-15
663
+
664
+ ### Changed
665
+
666
+ - `Ecoportal::API::GraphQL` addded `email` and `pass` parameters on initialization
667
+ - This allows for integration in some client lib
668
+
669
+ ## [0.1.0] - 2022-09-15
670
+
671
+ ### Added
672
+
673
+ - First commit with some basic structure