ecoportal-api-graphql 1.3.13 → 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 (275) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -0
  3. data/lib/ecoportal/api/common/graphql/client.rb +0 -2
  4. data/lib/ecoportal/api/common/graphql/http_client.rb +6 -0
  5. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -17
  6. data/lib/ecoportal/api/graphql/base/file_container.rb +14 -14
  7. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +15 -15
  8. data/lib/ecoportal/api/graphql/base/location_structure.rb +27 -27
  9. data/lib/ecoportal/api/graphql/base/organization.rb +15 -15
  10. data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
  11. data/lib/ecoportal/api/graphql/base/page.rb +17 -16
  12. data/lib/ecoportal/api/graphql/base/template.rb +35 -0
  13. data/lib/ecoportal/api/graphql/base.rb +37 -35
  14. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +41 -41
  15. data/lib/ecoportal/api/graphql/compat/response.rb +35 -35
  16. data/lib/ecoportal/api/graphql/connection/action.rb +11 -11
  17. data/lib/ecoportal/api/graphql/connection/action_category.rb +11 -11
  18. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -11
  19. data/lib/ecoportal/api/graphql/connection/page.rb +11 -11
  20. data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -11
  21. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -11
  22. data/lib/ecoportal/api/graphql/connection.rb +17 -17
  23. data/lib/ecoportal/api/graphql/file_upload/client.rb +21 -10
  24. data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
  25. data/lib/ecoportal/api/graphql/fragment/force.rb +14 -10
  26. data/lib/ecoportal/api/graphql/fragment/location_node.rb +26 -26
  27. data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
  28. data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
  29. data/lib/ecoportal/api/graphql/fragment.rb +3 -0
  30. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +14 -14
  31. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -16
  32. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -18
  33. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -21
  34. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -28
  35. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -18
  36. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -23
  37. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -20
  38. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -20
  39. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -24
  40. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -20
  41. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -20
  42. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -20
  43. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -18
  44. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -18
  45. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -18
  46. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -251
  47. data/lib/ecoportal/api/graphql/input.rb +24 -24
  48. data/lib/ecoportal/api/graphql/logic/connection.rb +34 -34
  49. data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
  50. data/lib/ecoportal/api/graphql/model/page.rb +16 -15
  51. data/lib/ecoportal/api/graphql/model/person_member.rb +15 -15
  52. data/lib/ecoportal/api/graphql/model/template.rb +15 -0
  53. data/lib/ecoportal/api/graphql/model.rb +32 -30
  54. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -45
  55. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -40
  56. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +14 -14
  57. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -40
  58. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -40
  59. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -40
  60. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -40
  61. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +7 -7
  62. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +8 -7
  63. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -40
  64. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -40
  65. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -40
  66. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -40
  67. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -35
  68. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -35
  69. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -36
  70. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -40
  71. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -13
  72. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -46
  73. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +1 -1
  74. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +1 -1
  75. data/lib/ecoportal/api/graphql/mutation.rb +20 -20
  76. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +14 -14
  77. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -21
  78. data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -13
  79. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -13
  80. data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
  81. data/lib/ecoportal/api/graphql/payload/page.rb +20 -19
  82. data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -11
  83. data/lib/ecoportal/api/graphql/payload/register.rb +15 -11
  84. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +1 -1
  85. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +1 -1
  86. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +1 -1
  87. data/lib/ecoportal/api/graphql/payload.rb +23 -23
  88. data/lib/ecoportal/api/graphql/query/location_structures.rb +57 -57
  89. data/lib/ecoportal/api/graphql/query/page.rb +45 -45
  90. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +9 -3
  91. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +9 -3
  92. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -78
  93. data/lib/ecoportal/api/graphql/query.rb +27 -27
  94. data/lib/ecoportal/api/graphql.rb +9 -5
  95. data/lib/ecoportal/api/graphql_version.rb +1 -1
  96. metadata +9 -180
  97. data/.ai-assistance/bridge/CLAUDE.md +0 -338
  98. data/.ai-assistance/bridge/archive/.gitkeep +0 -0
  99. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +0 -29
  100. data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +0 -18
  101. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +0 -42
  102. data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +0 -115
  103. data/.ai-assistance/bridge/context/gemini-review-prompt.txt +0 -48
  104. data/.ai-assistance/bridge/context/gemini-review-response.md +0 -104
  105. data/.ai-assistance/bridge/context/project.md +0 -42
  106. data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
  107. data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
  108. data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +0 -48
  109. data/.ai-assistance/bridge/queue/.gitkeep +0 -1
  110. data/.ai-assistance/capabilities/CLAUDE.md +0 -27
  111. data/.ai-assistance/capabilities/assumptions-log.md +0 -80
  112. data/.ai-assistance/capabilities/code.md +0 -47
  113. data/.ai-assistance/capabilities/connectors.md +0 -37
  114. data/.ai-assistance/capabilities/cowork.md +0 -55
  115. data/.ai-assistance/code/OVERVIEW.md +0 -155
  116. data/.ai-assistance/code/data_fields.md +0 -242
  117. data/.ai-assistance/code/dependencies.md +0 -151
  118. data/.ai-assistance/code/diff_as_input.md +0 -234
  119. data/.ai-assistance/code/diff_pairing_engine.md +0 -243
  120. data/.ai-assistance/code/diff_service_deep_dive.md +0 -192
  121. data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +0 -55
  122. data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +0 -181
  123. data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +0 -192
  124. data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +0 -147
  125. data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +0 -277
  126. data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +0 -200
  127. data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +0 -228
  128. data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +0 -197
  129. data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +0 -243
  130. data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +0 -196
  131. data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +0 -132
  132. data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +0 -187
  133. data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +0 -236
  134. data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +0 -183
  135. data/.ai-assistance/code/ecoportal_schema_reference.md +0 -240
  136. data/.ai-assistance/code/filter_contract_matrix.md +0 -177
  137. data/.ai-assistance/code/graphql_domain_knowledge.md +0 -240
  138. data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +0 -71
  139. data/.ai-assistance/code/refactoring/opportunities.md +0 -251
  140. data/.ai-assistance/code/schema_analysis.md +0 -321
  141. data/.ai-assistance/code/search_filters.md +0 -868
  142. data/.ai-assistance/code/spec_coverage.md +0 -73
  143. data/.ai-assistance/code/template_diff_pairing_domain.md +0 -175
  144. data/.ai-assistance/code/workflow-command-guide.md +0 -466
  145. data/.ai-assistance/code/workflow-space.md +0 -353
  146. data/.ai-assistance/conventions/CLAUDE.md +0 -30
  147. data/.ai-assistance/conventions/code-working-tree-protocol.md +0 -199
  148. data/.ai-assistance/conventions/gitignore-rules.md +0 -42
  149. data/.ai-assistance/conventions/permission-guidance.md +0 -120
  150. data/.ai-assistance/integrations/README.md +0 -70
  151. data/.ai-assistance/integrations/gitkraken-mcp.md +0 -107
  152. data/.ai-assistance/integrations/gitlab-mcp.md +0 -123
  153. data/.ai-assistance/integrations/local-git.md +0 -60
  154. data/.ai-assistance/local_paths.example.md +0 -17
  155. data/.ai-assistance/projects/TODO.md +0 -118
  156. data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +0 -168
  157. data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +0 -60
  158. data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +0 -267
  159. data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +0 -53
  160. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +0 -102
  161. data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +0 -139
  162. data/.ai-assistance/projects/compat-layer-audit/COMPAT_AUDIT.md +0 -244
  163. data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +0 -93
  164. data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +0 -244
  165. data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +0 -266
  166. data/.ai-assistance/projects/eco-helpers-compat/TODO.md +0 -86
  167. data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +0 -101
  168. data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +0 -177
  169. data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +0 -161
  170. data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +0 -125
  171. data/.ai-assistance/projects/ooze-graphql-native-migration/INVENTORY.md +0 -136
  172. data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +0 -126
  173. data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +0 -261
  174. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +0 -122
  175. data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +0 -148
  176. data/.ai-assistance/projects/page-model/DECISIONS.md +0 -245
  177. data/.ai-assistance/projects/page-model/TODO.md +0 -190
  178. data/.ai-assistance/projects/qa-services-delivery/DECISIONS.md +0 -93
  179. data/.ai-assistance/projects/qa-services-delivery/INTENT.md +0 -76
  180. data/.ai-assistance/projects/qa-services-delivery/PHASE3-SCOPE.md +0 -115
  181. data/.ai-assistance/projects/qa-services-delivery/ROADMAP.md +0 -99
  182. data/.ai-assistance/projects/qa-services-delivery/TODO.md +0 -81
  183. data/.ai-assistance/projects/search-filter-builder/INTENT.md +0 -107
  184. data/.ai-assistance/projects/search-filter-builder/TODO.md +0 -131
  185. data/.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md +0 -87
  186. data/.ai-assistance/projects/template-automatic-build-maintenance/TODO.md +0 -108
  187. data/.ai-assistance/projects/template-diff-deploy/INTENT.md +0 -12
  188. data/.ai-assistance/projects/template-diff-deploy/TODO.md +0 -9
  189. data/.ai-assistance/projects/template-maintenance/DESIGN.md +0 -134
  190. data/.ai-assistance/projects/template-maintenance/PHASE0-FINDINGS.md +0 -93
  191. data/.ai-assistance/projects/template-maintenance/README.md +0 -14
  192. data/.ai-assistance/projects/template-model-logic/CATEGORY_CATALOG.md +0 -236
  193. data/.ai-assistance/projects/template-model-logic/CLASSIFICATION_SPIKE.md +0 -243
  194. data/.ai-assistance/projects/template-model-logic/DESIGN_NOTE.md +0 -154
  195. data/.ai-assistance/projects/workflow-space/TODO.md +0 -213
  196. data/.ai-assistance/reinstall-claude-desktop-windows.md +0 -136
  197. data/.ai-assistance/scripts/CLAUDE.md +0 -150
  198. data/.ai-assistance/scripts/bridge-inbox-check.sh +0 -75
  199. data/.ai-assistance/scripts/bridge-init.sh +0 -86
  200. data/.ai-assistance/scripts/bridge-status.sh +0 -44
  201. data/.ai-assistance/scripts/capabilities-check.ts +0 -104
  202. data/.ai-assistance/scripts/check-outbox.sh +0 -43
  203. data/.ai-assistance/scripts/dep_graph.rb +0 -91
  204. data/.ai-assistance/scripts/lock-acquire.sh +0 -103
  205. data/.ai-assistance/scripts/lock-multi.sh +0 -124
  206. data/.ai-assistance/scripts/lock-queue.sh +0 -94
  207. data/.ai-assistance/scripts/setup-mcps.test.ts +0 -188
  208. data/.ai-assistance/scripts/setup-mcps.ts +0 -234
  209. data/.ai-assistance/scripts/task-complete.ts +0 -74
  210. data/.ai-assistance/scripts/task-create.ts +0 -75
  211. data/.ai-assistance/scripts/task-read.ts +0 -125
  212. data/.ai-assistance/scripts/token-logger.js +0 -220
  213. data/.ai-assistance/scripts/token-report.ts +0 -158
  214. data/.ai-assistance/scripts/token-session-start.js +0 -66
  215. data/.ai-assistance/skills/ai-instructions/SKILL.md +0 -48
  216. data/.ai-assistance/skills/code-specs/SKILL.md +0 -69
  217. data/.ai-assistance/skills/corporate-policies/SKILL.md +0 -201
  218. data/.ai-assistance/skills/dep-graph/SKILL.md +0 -139
  219. data/.ai-assistance/skills/ep-ai-manager/SKILL.md +0 -417
  220. data/.ai-assistance/skills/gemini-assist/SKILL.md +0 -63
  221. data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +0 -205
  222. data/.ai-assistance/skills/gemini-assist/gemini_ask.py +0 -1
  223. data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +0 -240
  224. data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +0 -25
  225. data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +0 -261
  226. data/.ai-assistance/skills/procedural-memory/SKILL.md +0 -319
  227. data/.ai-assistance/skills/project-cycle/SKILL.md +0 -177
  228. data/.ai-assistance/skills/project-self-docs/SKILL.md +0 -181
  229. data/.ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py +0 -378
  230. data/.ai-assistance/skills/refactor/SKILL.md +0 -62
  231. data/.ai-assistance/skills/rubocop/SKILL.md +0 -93
  232. data/.ai-assistance/skills/ruby-scripting/SKILL.md +0 -215
  233. data/.ai-assistance/skills/spec-generation/SKILL.md +0 -72
  234. data/.ai-assistance/standards-version.json +0 -22
  235. data/.ai-assistance/token-budget.json +0 -32
  236. data/.ai-assistance/version.json +0 -39
  237. data/.claude/settings.json +0 -150
  238. data/.env.example +0 -18
  239. data/.gitattributes +0 -15
  240. data/.gitignore +0 -37
  241. data/.gitlab-ci.yml +0 -45
  242. data/.markdownlint.json +0 -4
  243. data/.rspec +0 -3
  244. data/.rubocop.yml +0 -121
  245. data/.ruby-version +0 -1
  246. data/.yardopts +0 -10
  247. data/CLAUDE.md +0 -243
  248. data/Gemfile +0 -30
  249. data/Rakefile +0 -90
  250. data/bin/console +0 -14
  251. data/bin/setup +0 -8
  252. data/bin/setup.ps1 +0 -6
  253. data/docs/self-docs/ARCHITECTURE.md +0 -88
  254. data/docs/self-docs/CHANGES.jsonl +0 -12
  255. data/docs/self-docs/COMPLIANCE.md +0 -79
  256. data/docs/self-docs/CONVENTIONS.md +0 -74
  257. data/docs/self-docs/INTEGRATIONS.md +0 -65
  258. data/docs/self-docs/OPERATIONS.md +0 -76
  259. data/docs/self-docs/OVERVIEW.md +0 -64
  260. data/docs/self-docs/STATUS.md +0 -73
  261. data/docs/self-docs/self-docs-index.json +0 -51
  262. data/docs/worklog.md +0 -977
  263. data/ecoportal-api-graphql.gemspec +0 -40
  264. data/scripts/auto-worker-scheduler.sh +0 -386
  265. data/tests/actions_get.rb +0 -7
  266. data/tests/contractor_entities_get.rb +0 -20
  267. data/tests/contractor_entity_create.rb +0 -19
  268. data/tests/contractor_entity_udpate.rb +0 -20
  269. data/tests/dump_page_model.rb +0 -74
  270. data/tests/dump_template_model.rb +0 -90
  271. data/tests/loc_structure_get.rb +0 -10
  272. data/tests/loc_structure_update.rb +0 -51
  273. data/tests/loc_structures_get.rb +0 -15
  274. data/tests/local_libs.rb +0 -20
  275. data/tests/validate_queries.rb +0 -127
@@ -1,11 +1,11 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Connection
5
- class ActionCategory < Logic::Connection
6
- class_resolver :node_class, Base::ActionCategory
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Connection
5
+ class ActionCategory < Logic::Connection
6
+ class_resolver :node_class, Base::ActionCategory
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,11 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Connection
5
- class ContractorEntity < Logic::Connection
6
- class_resolver :node_class, Model::ContractorEntity
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Connection
5
+ class ContractorEntity < Logic::Connection
6
+ class_resolver :node_class, Model::ContractorEntity
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,11 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Connection
5
- class Page < Logic::Connection
6
- class_resolver :node_class, 'Ecoportal::API::GraphQL::Model::PageUnion'
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Connection
5
+ class Page < Logic::Connection
6
+ class_resolver :node_class, 'Ecoportal::API::GraphQL::Model::PageUnion'
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,11 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Connection
5
- class PersonMemberConnection < Logic::Connection
6
- class_resolver :node_class, Model::PersonMember
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Connection
5
+ class PersonMemberConnection < Logic::Connection
6
+ class_resolver :node_class, Model::PersonMember
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,11 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Connection
5
- class PreviewPage < Logic::Connection
6
- class_resolver :node_class, 'Ecoportal::API::GraphQL::Model::PreviewPage'
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Connection
5
+ class PreviewPage < Logic::Connection
6
+ class_resolver :node_class, 'Ecoportal::API::GraphQL::Model::PreviewPage'
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,17 +1,17 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Connection
5
- end
6
- end
7
- end
8
- end
9
-
10
- require_relative 'connection/person_member'
11
- require_relative 'connection/contractor_entity'
12
- require_relative 'connection/action_category'
13
- require_relative 'connection/action'
14
- require_relative 'connection/page'
15
- require_relative 'connection/preview_page'
16
- require_relative 'connection/preset_view'
17
- require_relative 'connection/pages_workflow_command'
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Connection
5
+ end
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'connection/person_member'
11
+ require_relative 'connection/contractor_entity'
12
+ require_relative 'connection/action_category'
13
+ require_relative 'connection/action'
14
+ require_relative 'connection/page'
15
+ require_relative 'connection/preview_page'
16
+ require_relative 'connection/preset_view'
17
+ require_relative 'connection/pages_workflow_command'
@@ -22,7 +22,12 @@ module Ecoportal
22
22
  # page.components.get_by_name('Attachment').file_container_ids = [container_id]
23
23
  # api.pages.update(page)
24
24
  #
25
- # Requires the gem to have been initialised with email/pass (OAuth Bearer token).
25
+ # Step 1 (GraphQL) authenticates via the gem's email/pass OAuth bearer token.
26
+ # Steps 3-4 (REST v2 `/s3/files`) require the gem to ALSO have been initialised
27
+ # with `api_key:` — `Ecoportal::API::GraphQL.new(email:, pass:, api_key:)` — since
28
+ # those endpoints authenticate via `X-ECOPORTAL-API-KEY`, not the GraphQL bearer
29
+ # token (mirrors `Ecoportal::API::Common::Content::Client#base_request` in
30
+ # ecoportal-api-v2).
26
31
  class Client
27
32
  POLL_INTERVAL = 2 # seconds between poll attempts
28
33
  POLL_MAX_WAIT = 120 # seconds before giving up
@@ -111,10 +116,16 @@ module Ecoportal
111
116
  end
112
117
  end
113
118
 
114
- # --- REST helpers (v2 endpoints, Bearer token auth) ---
119
+ # --- REST helpers (v2 endpoints, X-ECOPORTAL-API-KEY auth) ---
115
120
 
116
- def bearer_token
117
- @bearer_token ||= @http_client.send(:key_token)
121
+ def api_key
122
+ @api_key ||= @http_client.api_key.tap do |key|
123
+ if key.nil? || key.to_s.strip.empty?
124
+ raise 'File upload requires an api_key: Ecoportal::API::GraphQL.new(email:, pass:, api_key:). ' \
125
+ 'The v2 REST endpoints used to register/poll an upload authenticate via ' \
126
+ 'X-ECOPORTAL-API-KEY, not the GraphQL OAuth bearer token.'
127
+ end
128
+ end
118
129
  end
119
130
 
120
131
  def upload_base_url
@@ -124,18 +135,18 @@ module Ecoportal
124
135
  def upload_get(path)
125
136
  uri = URI("#{upload_base_url}#{path}")
126
137
  request = Net::HTTP::Get.new(uri)
127
- request['Authorization'] = "Bearer #{bearer_token}"
128
- request['Accept'] = 'application/json'
138
+ request['X-ECOPORTAL-API-KEY'] = api_key
139
+ request['Accept'] = 'application/json'
129
140
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
130
141
  end
131
142
 
132
143
  def upload_post(path, body)
133
144
  uri = URI("#{upload_base_url}#{path}")
134
145
  request = Net::HTTP::Post.new(uri)
135
- request['Authorization'] = "Bearer #{bearer_token}"
136
- request['Content-Type'] = 'application/json'
137
- request['Accept'] = 'application/json'
138
- request.body = JSON.generate(body)
146
+ request['X-ECOPORTAL-API-KEY'] = api_key
147
+ request['Content-Type'] = 'application/json'
148
+ request['Accept'] = 'application/json'
149
+ request.body = JSON.generate(body)
139
150
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
140
151
  end
141
152
 
@@ -0,0 +1,38 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # `RegisterPresetView#fieldConfigurations` returns a FieldConfigurationUnion.
6
+ # Selections can't be made directly on a union (GraphQL error: "Selections can't
7
+ # be made directly on unions"); the common fields live on FieldConfigurationInterface,
8
+ # which every union member implements, so they're pulled via an inline fragment on
9
+ # the interface rather than repeated per concrete type. Verified against the real
10
+ # frontend fragment (RegisterDataGrid/api/fieldConfigurationFragments/
11
+ # fieldConfigurationFields.graphql) — kept to the interface surface + the same three
12
+ # concrete-type extras it selects; other concrete types fall back to interface-only
13
+ # fields (matches the frontend, which doesn't cover every member either).
14
+ fragment :FieldConfiguration, <<~GRAPHQL
15
+ fragment FieldConfiguration on FieldConfigurationUnion {
16
+ __typename
17
+ ... on FieldConfigurationInterface {
18
+ id
19
+ key
20
+ name
21
+ dataFieldLabel
22
+ weight
23
+ }
24
+ ... on DateFieldConfiguration {
25
+ showTime
26
+ }
27
+ ... on DisplayLocationsFieldConfiguration {
28
+ mode
29
+ }
30
+ ... on PageNameFieldConfiguration {
31
+ displayUid
32
+ }
33
+ }
34
+ GRAPHQL
35
+ end
36
+ end
37
+ end
38
+ end
@@ -3,6 +3,17 @@ module Ecoportal
3
3
  class GraphQL
4
4
  class Fragment
5
5
  # Fields for a Force object, including all bindings needed for scripting.
6
+ #
7
+ # `Force.bindings` is `[BindingInterface]` (verified in the backend:
8
+ # `app/graphql/types/force_type.rb` + `types/forces/binding_interface.rb`), so its common
9
+ # fields are selected directly on the interface — no per-member inline fragments needed.
10
+ #
11
+ # ★ The interface exposes ONLY `name` and `referenceId` (+ `reference` per concrete type):
12
+ # there is NO `id` on a binding. The previous selection asked for `id` inside
13
+ # `... on DataFieldBinding` / `... on SectionBinding`, which makes the whole query invalid.
14
+ # Read/write asymmetry to be aware of: `WorkflowEditBindingInput` / `removeBinding` DO
15
+ # require a binding `id`, so `Force::Binding#id` (and `BindingCollection#delete!`) has no
16
+ # readable source for it — tracked as a shape-asymmetry finding, not fixable client-side.
6
17
  fragment :ForceFields, <<~GRAPHQL
7
18
  fragment ForceFields on Force {
8
19
  id
@@ -11,16 +22,9 @@ module Ecoportal
11
22
  customScript
12
23
  globalBindingIds
13
24
  bindings {
14
- ... on DataFieldBinding {
15
- id
16
- name
17
- referenceId
18
- }
19
- ... on SectionBinding {
20
- id
21
- name
22
- referenceId
23
- }
25
+ __typename
26
+ name
27
+ referenceId
24
28
  }
25
29
  }
26
30
  GRAPHQL
@@ -1,26 +1,26 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- class Fragment
5
- fragment :LocationNode, <<~GRAPHQL
6
- fragment LocationNode on LocationNodeInterface {
7
- id
8
- name
9
- weight
10
- archived
11
- archivedToken
12
- parent {
13
- id
14
- name
15
- }
16
- classifications {
17
- active
18
- id
19
- name
20
- }
21
- }
22
- GRAPHQL
23
- end
24
- end
25
- end
26
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ fragment :LocationNode, <<~GRAPHQL
6
+ fragment LocationNode on LocationNodeInterface {
7
+ id
8
+ name
9
+ weight
10
+ archived
11
+ archivedToken
12
+ parent {
13
+ id
14
+ name
15
+ }
16
+ classifications {
17
+ active
18
+ id
19
+ name
20
+ }
21
+ }
22
+ GRAPHQL
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # Fields of a page TASK (`TaskInterface`: CompletePage / InComment / ReviewPage).
6
+ #
7
+ # The review-task mutations (`approve/reject/restart/undoReviewPageTask`) return
8
+ # `item: TaskInterface` — NOT a page. They used to select `item { ...PageFields }`,
9
+ # which is invalid GraphQL ("Fragment PageFields on BasePageInterface can't be spread
10
+ # inside TaskInterface") and made every one of those mutations fail. The page the
11
+ # caller was after is reachable through `subject` (a `PageUnion`), so it is spread
12
+ # there — where `PageFields` is legal.
13
+ #
14
+ # Verified against the live schema (2026-07-30): TaskInterface exposes complete,
15
+ # completedAt, completedBy, completedByUser, createdAt, due, escalated, escalatedAt,
16
+ # escalationTimes, escalationsDetails, fromPublicTemplate, id, nextEscalationTime,
17
+ # overdue, relativeStatus, scheduledCallbacks, stageId, subject, taskNotes, users.
18
+ fragment :PageTaskFields, <<~GRAPHQL
19
+ fragment PageTaskFields on TaskInterface {
20
+ __typename
21
+ id
22
+ stageId
23
+ complete
24
+ overdue
25
+ escalated
26
+ relativeStatus
27
+ taskNotes
28
+ createdAt { dateTime }
29
+ completedAt { dateTime }
30
+ due { dateTime }
31
+ subject {
32
+ ...PageFields
33
+ }
34
+ }
35
+ GRAPHQL
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,51 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # `createTemplateRelatedPage` / `destroyTemplateRelatedPage` return
6
+ # `item: RelatedPages` — a related-pages CONFIG entry, not a page. They used to select
7
+ # `item { ...PageFields }` (invalid: "can't be spread inside RelatedPages"), which made
8
+ # both mutations fail.
9
+ #
10
+ # Verified against the live schema (2026-07-30): RelatedPages exposes filters
11
+ # (StoredEsFilter), hasInaccessibleVariables, id, pages (PreviewPageConnection),
12
+ # register (MinimalRegister), registerId, title. Only the scalars are selected here —
13
+ # `pages` is a connection and `filters`/`register` are objects needing their own
14
+ # selections; query them explicitly when needed.
15
+ fragment :TemplateRelatedPages, <<~GRAPHQL
16
+ fragment TemplateRelatedPages on RelatedPages {
17
+ id
18
+ title
19
+ registerId
20
+ hasInaccessibleVariables
21
+ }
22
+ GRAPHQL
23
+
24
+ # `updateTemplateInformation` returns `UpdateInformationPayload { item: Template }`.
25
+ # ★ NOTE the type asymmetry: elsewhere in this gem a "template" is a PAGE
26
+ # (`Query::Templates` and the other template payloads legitimately resolve to
27
+ # `Model::PageUnion`, and validate clean), but THIS mutation returns the narrow
28
+ # `Template` type — hence `item { ...PageFields }` was invalid ("can't be spread
29
+ # inside Template").
30
+ #
31
+ # Verified against the live schema (2026-07-30): Template exposes active,
32
+ # aiDescription, commands (connection), creatorEditable, creatorEnabled, creatorFlags,
33
+ # description, folders, id, public, publicConfig, templateContainerUid, templateType.
34
+ fragment :TemplateInformation, <<~GRAPHQL
35
+ fragment TemplateInformation on Template {
36
+ id
37
+ description
38
+ aiDescription
39
+ templateType
40
+ templateContainerUid
41
+ active
42
+ public
43
+ folders
44
+ creatorEnabled
45
+ creatorEditable
46
+ }
47
+ GRAPHQL
48
+ end
49
+ end
50
+ end
51
+ end
@@ -35,3 +35,6 @@ require_relative 'fragment/page'
35
35
  require_relative 'fragment/pages'
36
36
  require_relative 'fragment/force'
37
37
  require_relative 'fragment/pages_workflow'
38
+ require_relative 'fragment/field_configuration'
39
+ require_relative 'fragment/page_task'
40
+ require_relative 'fragment/template'
@@ -1,14 +1,14 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- module ContractorEntity
6
- end
7
- end
8
- end
9
- end
10
- end
11
-
12
- require_relative 'contractor_entity/create'
13
- require_relative 'contractor_entity/destroy'
14
- require_relative 'contractor_entity/update'
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ module ContractorEntity
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ require_relative 'contractor_entity/create'
13
+ require_relative 'contractor_entity/destroy'
14
+ require_relative 'contractor_entity/update'
@@ -1,16 +1,16 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- class PresetView
6
- class Update < Logic::Input
7
- passkey :id
8
- passthrough :name, :sorter
9
- passboolean :preview
10
- passarray :fieldConfigs
11
- end
12
- end
13
- end
14
- end
15
- end
16
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ class PresetView
6
+ class Update < Logic::Input
7
+ passkey :id
8
+ passthrough :name, :sorter
9
+ passboolean :preview
10
+ passarray :fieldConfigs
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,18 +1,18 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- class WorkflowCommand
6
- module AddStage
7
- SCHEMA_VERSION = '20260605'.freeze
8
- VALID_KEYS = %i[placeholderId name ordering].freeze
9
-
10
- def self.build(**kwargs)
11
- kwargs.slice(*VALID_KEYS).compact
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ class WorkflowCommand
6
+ module AddStage
7
+ SCHEMA_VERSION = '20260605'.freeze
8
+ VALID_KEYS = %i[placeholderId name ordering].freeze
9
+
10
+ def self.build(**kwargs)
11
+ kwargs.slice(*VALID_KEYS).compact
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,21 +1,21 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- class WorkflowCommand
6
- module EditFieldConfiguration
7
- SCHEMA_VERSION = '20260605'.freeze
8
-
9
- BASE_KEYS = %i[dataFieldId label tooltip description hideView hiddenOnMobile enableActions globalBinding].freeze
10
-
11
- def self.build(data_field_id:, **kwargs)
12
- { dataFieldId: data_field_id }.
13
- merge(kwargs.slice(*(BASE_KEYS - [:dataFieldId])).compact).
14
- tap { |h| h[:byType] = kwargs[:byType] if kwargs.key?(:byType) }
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ class WorkflowCommand
6
+ module EditFieldConfiguration
7
+ SCHEMA_VERSION = '20260605'.freeze
8
+
9
+ BASE_KEYS = %i[dataFieldId label tooltip description hideView hiddenOnMobile enableActions globalBinding].freeze
10
+
11
+ def self.build(data_field_id:, **kwargs)
12
+ { dataFieldId: data_field_id }.
13
+ merge(kwargs.slice(*(BASE_KEYS - [:dataFieldId])).compact).
14
+ tap { |h| h[:byType] = kwargs[:byType] if kwargs.key?(:byType) }
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,28 +1,28 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- class WorkflowCommand
6
- module EditPage
7
- SCHEMA_VERSION = '20260605'.freeze
8
- VALID_KEYS = %i[
9
- name icon themeId timeZone disableDirectPermissions mobileEnabled useSectionsOnMobile
10
- showStrategyForRestrictedStages showAssigneeNamesForRestrictedStages showTaskDueDateForRestrictedStages
11
- hideActivityStream disableComments enableDashboardImport enableActionsOnFields showCreator active
12
- counterPrefix counterPostfix counterEnabled counter
13
- addLocationIds removeLocationIds
14
- addBaseTags removeBaseTags
15
- addOtherTags removeOtherTags
16
- addFolders removeFolders
17
- creatorEnabled creatorEditable creatorFlags
18
- ].freeze
19
-
20
- def self.build(**kwargs)
21
- kwargs.slice(*VALID_KEYS).compact
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ class WorkflowCommand
6
+ module EditPage
7
+ SCHEMA_VERSION = '20260605'.freeze
8
+ VALID_KEYS = %i[
9
+ name icon themeId timeZone disableDirectPermissions mobileEnabled useSectionsOnMobile
10
+ showStrategyForRestrictedStages showAssigneeNamesForRestrictedStages showTaskDueDateForRestrictedStages
11
+ hideActivityStream disableComments enableDashboardImport enableActionsOnFields showCreator active
12
+ counterPrefix counterPostfix counterEnabled counter
13
+ addLocationIds removeLocationIds
14
+ addBaseTags removeBaseTags
15
+ addOtherTags removeOtherTags
16
+ addFolders removeFolders
17
+ creatorEnabled creatorEditable creatorFlags
18
+ ].freeze
19
+
20
+ def self.build(**kwargs)
21
+ kwargs.slice(*VALID_KEYS).compact
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end