ecoportal-api-graphql 1.3.5 → 1.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +943 -477
  3. data/LICENSE +21 -21
  4. data/README.md +24 -24
  5. data/lib/ecoportal/api/common/graphql/auth_service.rb +115 -115
  6. data/lib/ecoportal/api/common/graphql/class_helpers.rb +46 -46
  7. data/lib/ecoportal/api/common/graphql/client.rb +69 -69
  8. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  9. data/lib/ecoportal/api/common/graphql/http_client.rb +195 -145
  10. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -51
  11. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -47
  12. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -180
  13. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff.rb +55 -55
  14. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +295 -242
  15. data/lib/ecoportal/api/common/graphql/model/diffable.rb +54 -54
  16. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  17. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  18. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  19. data/lib/ecoportal/api/common/graphql.rb +16 -16
  20. data/lib/ecoportal/api/common.graphql.rb +8 -8
  21. data/lib/ecoportal/api/graphql/base/action.rb +43 -43
  22. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  23. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
  24. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +67 -67
  25. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  26. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  27. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
  28. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  29. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  30. data/lib/ecoportal/api/graphql/base/file_container.rb +14 -14
  31. data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
  32. data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
  33. data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
  34. data/lib/ecoportal/api/graphql/base/force.rb +65 -0
  35. data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
  36. data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
  37. data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
  38. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +15 -15
  39. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  40. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  41. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  42. data/lib/ecoportal/api/graphql/base/location_structure.rb +27 -27
  43. data/lib/ecoportal/api/graphql/base/organization.rb +15 -15
  44. data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
  45. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
  46. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
  47. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
  48. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +119 -0
  49. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
  50. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
  51. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
  52. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
  53. data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
  54. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
  55. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
  56. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
  57. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
  58. data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
  59. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
  60. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
  61. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
  62. data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
  63. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
  64. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
  65. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
  66. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
  67. data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
  68. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
  69. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -14
  70. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -12
  71. data/lib/ecoportal/api/graphql/base/page/section_collection.rb +85 -0
  72. data/lib/ecoportal/api/graphql/base/page/task.rb +24 -0
  73. data/lib/ecoportal/api/graphql/base/page.rb +17 -14
  74. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  75. data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
  76. data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
  77. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
  78. data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
  79. data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
  80. data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
  81. data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
  82. data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
  83. data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
  84. data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
  85. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
  86. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
  87. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
  88. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
  89. data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
  90. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
  91. data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
  92. data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
  93. data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
  94. data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
  95. data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
  96. data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
  97. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
  98. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  99. data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
  100. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
  101. data/lib/ecoportal/api/graphql/base/register.rb +18 -0
  102. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  103. data/lib/ecoportal/api/graphql/base/template.rb +35 -0
  104. data/lib/ecoportal/api/graphql/base.rb +37 -24
  105. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  106. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +41 -41
  107. data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
  108. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  109. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  110. data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
  111. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
  112. data/lib/ecoportal/api/graphql/builder/register.rb +49 -41
  113. data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
  114. data/lib/ecoportal/api/graphql/builder/template_builder.rb +174 -0
  115. data/lib/ecoportal/api/graphql/builder.rb +17 -14
  116. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +142 -0
  117. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
  118. data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
  119. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
  120. data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
  121. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
  122. data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
  123. data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
  124. data/lib/ecoportal/api/graphql/compat.rb +17 -0
  125. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
  126. data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
  127. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -75
  128. data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
  129. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
  130. data/lib/ecoportal/api/graphql/concerns.rb +14 -10
  131. data/lib/ecoportal/api/graphql/connection/action.rb +11 -11
  132. data/lib/ecoportal/api/graphql/connection/action_category.rb +11 -11
  133. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +11 -11
  134. data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
  135. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
  136. data/lib/ecoportal/api/graphql/connection/person_member.rb +11 -11
  137. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
  138. data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
  139. data/lib/ecoportal/api/graphql/connection.rb +17 -13
  140. data/lib/ecoportal/api/graphql/diff/change.rb +59 -0
  141. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +329 -0
  142. data/lib/ecoportal/api/graphql/diff/cross_object_diff.rb +165 -0
  143. data/lib/ecoportal/api/graphql/diff/deploy.rb +121 -0
  144. data/lib/ecoportal/api/graphql/diff/id_resolver.rb +64 -0
  145. data/lib/ecoportal/api/graphql/diff/pairing/candidate.rb +32 -0
  146. data/lib/ecoportal/api/graphql/diff/pairing/engine.rb +173 -0
  147. data/lib/ecoportal/api/graphql/diff/pairing/ledger.rb +119 -0
  148. data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +104 -0
  149. data/lib/ecoportal/api/graphql/diff/strategy.rb +113 -0
  150. data/lib/ecoportal/api/graphql/diff/version_diff.rb +332 -0
  151. data/lib/ecoportal/api/graphql/diff.rb +34 -0
  152. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  153. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  154. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  155. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  156. data/lib/ecoportal/api/graphql/error.rb +12 -12
  157. data/lib/ecoportal/api/graphql/file_upload/client.rb +192 -0
  158. data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
  159. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  160. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  161. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  162. data/lib/ecoportal/api/graphql/fragment/field_configuration.rb +38 -0
  163. data/lib/ecoportal/api/graphql/fragment/force.rb +34 -0
  164. data/lib/ecoportal/api/graphql/fragment/location_draft.rb +53 -53
  165. data/lib/ecoportal/api/graphql/fragment/location_node.rb +26 -26
  166. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  167. data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
  168. data/lib/ecoportal/api/graphql/fragment/page_task.rb +39 -0
  169. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +396 -0
  170. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
  171. data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
  172. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  173. data/lib/ecoportal/api/graphql/fragment/template.rb +51 -0
  174. data/lib/ecoportal/api/graphql/fragment.rb +40 -27
  175. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  176. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  177. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  178. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  179. data/lib/ecoportal/api/graphql/input/action/update.rb +14 -14
  180. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  181. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  182. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  183. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +41 -16
  184. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +14 -14
  185. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
  186. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  187. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +47 -47
  188. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  189. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  190. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +49 -49
  191. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  192. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  193. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  194. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  195. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  196. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +13 -13
  197. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  198. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  199. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  200. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +27 -27
  201. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  202. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
  203. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
  204. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
  205. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
  206. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
  207. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
  208. data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
  209. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
  210. data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
  211. data/lib/ecoportal/api/graphql/input/page.rb +26 -0
  212. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
  213. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
  214. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
  215. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
  216. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
  217. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
  218. data/lib/ecoportal/api/graphql/input/register.rb +13 -0
  219. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  220. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
  221. data/lib/ecoportal/api/graphql/input/search_conf.rb +436 -0
  222. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  223. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  224. data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
  225. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
  226. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
  227. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
  228. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
  229. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
  230. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
  231. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +27 -0
  232. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
  233. data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
  234. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
  235. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
  236. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
  237. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
  238. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
  239. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
  240. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
  241. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
  242. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
  243. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
  244. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
  245. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
  246. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
  247. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
  248. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
  249. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
  250. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
  251. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
  252. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
  253. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
  254. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
  255. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
  256. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
  257. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
  258. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
  259. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
  260. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
  261. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
  262. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
  263. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
  264. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
  265. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
  266. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
  267. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
  268. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
  269. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
  270. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
  271. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
  272. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
  273. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
  274. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
  275. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
  276. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
  277. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
  278. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
  280. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
  281. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
  282. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
  283. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
  284. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
  285. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
  286. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
  287. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
  288. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
  289. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
  290. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
  291. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
  292. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
  293. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
  294. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
  295. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
  296. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
  297. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
  298. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
  299. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
  300. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
  301. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
  302. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
  303. data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
  304. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
  305. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
  306. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
  307. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
  308. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
  309. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
  310. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
  311. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
  312. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
  313. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
  314. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
  315. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
  316. data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
  317. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
  318. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
  319. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
  320. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
  321. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
  322. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
  323. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
  324. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
  325. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
  326. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
  327. data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
  328. data/lib/ecoportal/api/graphql/input.rb +24 -16
  329. data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
  330. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +30 -30
  331. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  332. data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
  333. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  334. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  335. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -13
  336. data/lib/ecoportal/api/graphql/logic/base_query.rb +193 -150
  337. data/lib/ecoportal/api/graphql/logic/connection.rb +34 -34
  338. data/lib/ecoportal/api/graphql/logic/input.rb +26 -11
  339. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  340. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  341. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  342. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  343. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  344. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  345. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  346. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  347. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
  348. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  349. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  350. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  351. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  352. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  353. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  354. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  355. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  356. data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
  357. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
  358. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  359. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  360. data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
  361. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  362. data/lib/ecoportal/api/graphql/model/page/task.rb +16 -0
  363. data/lib/ecoportal/api/graphql/model/page.rb +16 -14
  364. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
  365. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
  366. data/lib/ecoportal/api/graphql/model/person_member.rb +15 -15
  367. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
  368. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
  369. data/lib/ecoportal/api/graphql/model/register.rb +10 -0
  370. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  371. data/lib/ecoportal/api/graphql/model/template.rb +15 -0
  372. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  373. data/lib/ecoportal/api/graphql/model.rb +32 -22
  374. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  375. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  376. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  377. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  378. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
  379. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
  380. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
  381. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  382. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  383. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  384. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +14 -14
  385. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
  386. data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
  387. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
  388. data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
  389. data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
  390. data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
  391. data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
  392. data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
  393. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  394. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  395. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  396. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  397. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  398. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  399. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  400. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  401. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
  402. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
  403. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +38 -0
  404. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
  405. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +38 -0
  406. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
  407. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +38 -0
  408. data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
  409. data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +52 -0
  410. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +38 -0
  411. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
  412. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
  413. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
  414. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
  415. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
  416. data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
  417. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
  418. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
  419. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +34 -0
  420. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
  421. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
  422. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
  423. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
  424. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
  425. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
  426. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
  427. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
  428. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
  429. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
  430. data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
  431. data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
  432. data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
  433. data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
  434. data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
  435. data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
  436. data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
  437. data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
  438. data/lib/ecoportal/api/graphql/mutation.rb +20 -12
  439. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  440. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  441. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  442. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  443. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
  444. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  445. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  446. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  447. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +14 -14
  448. data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
  449. data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
  450. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
  451. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
  452. data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
  453. data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
  454. data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
  455. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  456. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  457. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  458. data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
  459. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  460. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  461. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  462. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  463. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  464. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +36 -0
  465. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
  466. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
  467. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
  468. data/lib/ecoportal/api/graphql/payload/page/draft.rb +26 -0
  469. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
  470. data/lib/ecoportal/api/graphql/payload/page/review_task_batch.rb +23 -0
  471. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
  472. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
  473. data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
  474. data/lib/ecoportal/api/graphql/payload/page.rb +20 -0
  475. data/lib/ecoportal/api/graphql/payload/preset_view.rb +15 -0
  476. data/lib/ecoportal/api/graphql/payload/register.rb +15 -0
  477. data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
  478. data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
  479. data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
  480. data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
  481. data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
  482. data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
  483. data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
  484. data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
  485. data/lib/ecoportal/api/graphql/payload.rb +23 -12
  486. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  487. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  488. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  489. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  490. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
  491. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  492. data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +62 -62
  493. data/lib/ecoportal/api/graphql/query/location_structure.rb +61 -61
  494. data/lib/ecoportal/api/graphql/query/location_structures.rb +57 -57
  495. data/lib/ecoportal/api/graphql/query/page.rb +45 -0
  496. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
  497. data/lib/ecoportal/api/graphql/query/page_with_forces.rb +49 -0
  498. data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
  499. data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +65 -0
  500. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
  501. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
  502. data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
  503. data/lib/ecoportal/api/graphql/query.rb +27 -16
  504. data/lib/ecoportal/api/graphql.rb +143 -80
  505. data/lib/ecoportal/api/graphql_version.rb +5 -5
  506. data/lib/ecoportal/api-graphql.rb +10 -10
  507. metadata +328 -25
  508. data/.gitignore +0 -24
  509. data/.markdownlint.json +0 -4
  510. data/.rspec +0 -3
  511. data/.rubocop.yml +0 -97
  512. data/.ruby-version +0 -1
  513. data/.yardopts +0 -10
  514. data/Gemfile +0 -6
  515. data/Rakefile +0 -38
  516. data/bin/console +0 -14
  517. data/bin/setup +0 -8
  518. data/bin/setup.ps1 +0 -6
  519. data/ecoportal-api-graphql.gemspec +0 -40
  520. data/tests/actions_get.rb +0 -7
  521. data/tests/contractor_entities_get.rb +0 -20
  522. data/tests/contractor_entity_create.rb +0 -19
  523. data/tests/contractor_entity_udpate.rb +0 -20
  524. data/tests/loc_structure_get.rb +0 -11
  525. data/tests/loc_structure_update.rb +0 -51
  526. data/tests/loc_structures_get.rb +0 -15
  527. data/tests/local_libs.rb +0 -20
@@ -1,14 +1,17 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Builder
5
- end
6
- end
7
- end
8
- end
9
-
10
- require_relative 'builder/location_structure'
11
- require_relative 'builder/action'
12
- require_relative 'builder/contractor_entity'
13
- require_relative 'builder/register'
14
- require_relative 'builder/page'
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Builder
5
+ end
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'builder/location_structure'
11
+ require_relative 'builder/action'
12
+ require_relative 'builder/contractor_entity'
13
+ require_relative 'builder/register'
14
+ require_relative 'builder/page'
15
+ require_relative 'builder/kickstand'
16
+ require_relative 'builder/template'
17
+ require_relative 'builder/template_builder'
@@ -0,0 +1,142 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # Translates v2-style filter hashes to GraphQL-compatible filter hashes.
6
+ # Extracted from Compat::Registers so any part of the compat layer can use it.
7
+ #
8
+ # SearchConf filter objects (respond_to :to_h, not a Hash) are passed through —
9
+ # callers may also pass already-translated hashes or SearchConf instances directly.
10
+ #
11
+ # v2 → GraphQL translation table:
12
+ # date_filter lbound/ubound → gte/lte; Date FIELD (key 'date.zXXXX') →
13
+ # range_date_filter + membranes.date path; system date → date_filter
14
+ # text_filter {query, key} → match_filter {key, value} (partial text)
15
+ # options_filter Select FIELD (key 'select_str.zXXXX') → has_any_filter
16
+ # {key, path, field_key: 'selected', values} (doesnt_have_any_filter to
17
+ # exclude); system option key → one_of_filter/none_of_filter {key, values}
18
+ # tag_filter passed through (same ES backend, same format)
19
+ # register_filter passed through
20
+ # and_filter / or_filter passed through
21
+ # Operation/param shapes per the repo's internal docs.
22
+ class FilterTranslator
23
+ class << self
24
+ def to_graphql(filter)
25
+ return filter if filter.respond_to?(:to_h) && !filter.is_a?(Hash)
26
+ return filter unless filter.is_a?(Hash)
27
+
28
+ case filter['type'] || filter[:type]
29
+ when 'date_filter'
30
+ translate_date_filter(filter)
31
+ when 'text_filter'
32
+ translate_text_filter(filter)
33
+ when 'exact_filter', 'is_filter'
34
+ translate_exact_filter(filter)
35
+ when 'options_filter'
36
+ translate_options_filter(filter)
37
+ else
38
+ filter
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ # v2 exact_filter {query/value, key} → GraphQL is_filter (whole-value equality).
45
+ # For a register/page field there is NO `exact_filter` operation — `is_filter` is the
46
+ # exact one: it matches the field's `.exact` keyword subfield (backend
47
+ # NewEp::Es::Filters::Pages::IsFilter → ExactFilter on `membranes.<type>.exact`),
48
+ # whereas match_filter/contains_filter hit the analyzed `.value` and miss exact SKUs.
49
+ # A register FIELD key ('plain_text.zXXXX') needs the nested membranes.<type> path;
50
+ # a SYSTEM key (external_id/id/state/creator_id/source) must NOT carry a path — the
51
+ # backend routes it to Global::ExactFilter which joins [@path,@key] into the term key,
52
+ # so a spurious 'membranes.external_id' yields term 'membranes.external_id.external_id'
53
+ # → 0 results (proof: pages/is_filter.rb:36-55 passes path: @path to Global::ExactFilter;
54
+ # global/exact_filter.rb:18 builds the term as [@path, @key].compact.join(".")).
55
+ # CAVEAT: case-insensitive and only the first 64 chars are significant (values are
56
+ # lowercased + truncated at index time). No case-sensitive/>64-char exact exists.
57
+ def translate_exact_filter(filter)
58
+ key = filter['key'] || filter[:key]
59
+ path = filter['path'] || filter[:path]
60
+ path ||= membrane_path_for(key) if membrane_field?(key)
61
+ value = filter['value'] || filter[:value] || filter['query'] || filter[:query]
62
+ { operation: 'is_filter', params: { key: key, path: path, value: value }.compact }
63
+ end
64
+
65
+ # Derive the ES nested path from a field key: `plain_text.zXXXX` → `membranes.plain_text`.
66
+ def membrane_path_for(key)
67
+ prefix = key.to_s.split('.').first
68
+ prefix.empty? ? nil : "membranes.#{prefix}"
69
+ end
70
+
71
+ # A register FIELD key carries a `<type>.<hash>` shape (e.g. 'date.zab1bddc3',
72
+ # 'select_str.z223beb6d'); system/top-level keys (created_at, id, external_id) have
73
+ # no field-type prefix. Field filters need the nested membranes.<type> path (and,
74
+ # for options, a field_key), which system filters do not.
75
+ def membrane_field?(key)
76
+ key.to_s.include?('.')
77
+ end
78
+
79
+ # v2 text_filter {query, key} → GraphQL match_filter (partial/full-text on key).
80
+ def translate_text_filter(filter)
81
+ {
82
+ operation: 'match_filter',
83
+ params: {
84
+ key: filter['key'] || filter[:key],
85
+ value: filter['query'] || filter[:query] || filter['value'] || filter[:value]
86
+ }
87
+ }
88
+ end
89
+
90
+ # v2 options_filter {chosen, key, mode} → GraphQL.
91
+ # A register Select FIELD (key like 'select_str.zXXXX') filters via
92
+ # has_any_filter / doesnt_have_any_filter over its nested path
93
+ # (membranes.select_str) with field_key 'selected' and the chosen option ids as
94
+ # `values` (backend NewEp::Es::Filters::Pages::*::HasAnyFilter). A system/top-level
95
+ # option key (e.g. 'id') keeps one_of_filter / none_of_filter with {key, values}.
96
+ def translate_options_filter(filter)
97
+ key = filter['key'] || filter[:key]
98
+ values = Array(filter['chosen'] || filter[:chosen])
99
+ exclude = exclude_mode?(filter)
100
+
101
+ unless membrane_field?(key)
102
+ op = exclude ? 'none_of_filter' : 'one_of_filter'
103
+ return { operation: op, params: { key: key, values: values } }
104
+ end
105
+
106
+ op = exclude ? 'doesnt_have_any_filter' : 'has_any_filter'
107
+ path = filter['path'] || filter[:path] || membrane_path_for(key)
108
+ field_key = filter['field_key'] || filter[:field_key] || 'selected'
109
+ { operation: op, params: { key: key, path: path, field_key: field_key, values: values } }
110
+ end
111
+
112
+ # v2 date_filter → GraphQL. A register Date FIELD (key like 'date.zXXXX') filters
113
+ # via range_date_filter on its nested path (membranes.date); a system/top-level date
114
+ # (created_at/updated_at) uses date_filter. Both share range params (gte/lte/time_zone)
115
+ # — range_date_filter additionally carries `path` (backend BaseRangeDateFilter < DateFilter).
116
+ def translate_date_filter(filter)
117
+ key = filter['key'] || filter[:key]
118
+ field = membrane_field?(key)
119
+ path = filter['path'] || filter[:path]
120
+ path ||= membrane_path_for(key) if field
121
+
122
+ params = { key: key, time_zone: filter['time_zone'] || filter[:time_zone] || 'UTC' }
123
+ params[:path] = path if path
124
+ lbound = filter['lbound'] || filter[:lbound]
125
+ ubound = filter['ubound'] || filter[:ubound]
126
+ params[:gte] = lbound if lbound
127
+ params[:lte] = ubound if ubound
128
+
129
+ { operation: field ? 'range_date_filter' : 'date_filter', params: params }
130
+ end
131
+
132
+ # "exclude" style modes map to the negative filter operation.
133
+ def exclude_mode?(filter)
134
+ mode = (filter['mode'] || filter[:mode]).to_s.downcase
135
+ %w[none exclude not not_in].include?(mode)
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,23 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # Returned by Compat::Pages#create — mirrors the v2 reference object.
6
+ # Scripts access .page_id and .active_stage_id after page creation.
7
+ class PageReference
8
+ attr_reader :page_id, :active_stage_id, :page
9
+
10
+ def initialize(page)
11
+ @page = page
12
+ @page_id = page.id
13
+ @active_stage_id = page.respond_to?(:current_stage_id) ? page.current_stage_id : nil
14
+ end
15
+
16
+ def success?
17
+ !@page_id.nil?
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,212 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # v2-compatible pages API backed by GraphQL.
6
+ # Exposes the same interface as ecoportal-api-v2's pages object so that
7
+ # existing eco-helpers scripts work without modification.
8
+ #
9
+ # Key difference from v2:
10
+ # - get_new / create is a 2-step GraphQL workflow (build then create)
11
+ # - update requires patchVer — must always fetch the page first
12
+ # - search is via the GraphQL org search (register_filter + searchConf)
13
+ class Pages
14
+ def initialize(client)
15
+ @client = client
16
+ end
17
+
18
+ # Fetch a page by ID with full data — metadata, stages, sections, data fields.
19
+ # When stage_id is provided, wraps the result in a StageView that filters
20
+ # sections and components to that stage only — matching v2 per-stage behaviour.
21
+ def get(id, stage_id: nil)
22
+ page = Query::Page.new(@client).query(id: id) do
23
+ spread :CommonPageUnion
24
+ end
25
+ stage_id ? StageView.new(page, stage_id) : page
26
+ end
27
+
28
+ # Build a draft page from a template.
29
+ # Returns the built PageUnion with server-assigned field IDs and structure.
30
+ # This is step (a) of the 2-step creation sequence:
31
+ # (a) get_new → inspect/modify field values → (b) create
32
+ def get_new(template_id)
33
+ mutation = Mutation::Page::BuildFromTemplate.new(@client)
34
+ payload = mutation.query(input: { templateId: template_id, showHiddenData: true }) do
35
+ clientMutationId
36
+ errors {
37
+ details
38
+ fullMessages
39
+ }
40
+ item { spread :CommonPageUnion }
41
+ end
42
+ # Record the source template on the built draft: the read fragment does not fetch
43
+ # sourceTemplateId, and a built draft carries a (real) patchVer, so without this
44
+ # marker the dry-run can neither detect the draft nor recover its templateId — it
45
+ # would mis-preview a CREATE as an UPDATE. See #new_draft? / #create_body.
46
+ payload.item&.tap do |draft|
47
+ draft._compat_source_template_id = template_id if draft.respond_to?(:_compat_source_template_id=)
48
+ end
49
+ end
50
+
51
+ # Create a page from a filled draft.
52
+ # Serialises any modified data fields from the draft into dataFields.updates.
53
+ # Returns a PageReference with .page_id and .active_stage_id.
54
+ def create(page, from: nil)
55
+ template_id = source_template_id(page, from)
56
+ field_updates = page.respond_to?(:data_fields_updates) ? page.data_fields_updates : []
57
+
58
+ # dataFields is a required (non-null) field on CreateFromTemplateInput — always
59
+ # send it, with an empty updates list when the draft has no field changes.
60
+ input = { templateId: template_id, showHiddenData: true, dataFields: { updates: field_updates } }
61
+
62
+ mutation = Mutation::Page::CreateFromTemplate.new(@client)
63
+ payload = mutation.query(input: input)
64
+ resp = Response.new(payload)
65
+ return PageReference.new(payload.item) if resp.success?
66
+
67
+ resp
68
+ end
69
+
70
+ # Update a page. Builds the mutation input from the page model diff.
71
+ # Returns a Compat::Response with .success? and .status.
72
+ # Returns nil (no-op) if there are no changes.
73
+ #
74
+ # When called with no explicit operation (the base eco-helpers update_ooze path does
75
+ # `pages.update(page)`), any captured submit!/sign_off! intent on the page is folded in
76
+ # so the SINGLE updatePage carries both the dirty fields and the submit.
77
+ def update(page, **kargs)
78
+ kargs = compat_submit_kargs(page) if kargs.empty?
79
+ input = Input::Page::Update.from_model(page, **kargs)
80
+ return nil if input.nil?
81
+
82
+ payload = Builder::Page.new(@client).update(input: input)
83
+ Response.new(payload)
84
+ end
85
+
86
+ # Returns the pending changes on a page wrapped under the 'page' key.
87
+ # v2 equivalent: DocHelpers#get_body(doc, level: 'page') → { 'page' => {...} }.
88
+ # eco-helpers' OozeBaseCase reads patch_doc(ooze)['page'] (display_patch /
89
+ # backup_patch! / dirty?), so the body must be wrapped to match the v2 contract —
90
+ # otherwise ['page'] is always nil → diff never prints and "No changes to update"
91
+ # misfires.
92
+ #
93
+ # CRITICAL: the body is the SAME input #update/#create would send — NOT page.as_update.
94
+ # On a phased page, as_update only carries page-SCALAR changes; data-field edits
95
+ # (the bulk of what scripts do — set/select/add-reference) live in data_fields_updates
96
+ # and are invisible to as_update. Reading as_update here made the dry-run blind to
97
+ # every field change: toocs coded a Breakdown Agency reference yet the preview showed
98
+ # "No changes to update", while a real run (made dirty by submit!) DID patch it. Build
99
+ # the faithful body via the Input serialisers so the dry-run shows exactly what will be
100
+ # written. nil when there is genuinely nothing to send (and no submit/sign-off pending).
101
+ def get_body(page)
102
+ { 'page' => patch_body(page) }
103
+ end
104
+
105
+ # Cursor-paginated iteration over pages matching searchConf.
106
+ # Yields full PageUnion objects (with patchVer and field IDs).
107
+ # Required for update workflows — register search returns PreviewPage only.
108
+ #
109
+ # Usage:
110
+ # api.pages.each(searchConf: SearchConf[:state].is(:active).to_h, first: 50) do |page|
111
+ # # page is a Model::Page::Basic or Model::Page::Phased
112
+ # end
113
+ def each(search_conf: {}, first: 50, &block)
114
+ Query::Pages.new(@client).each(searchConf: search_conf, first: first, &block)
115
+ end
116
+
117
+ private
118
+
119
+ # The faithful "what will be sent" body for dry-run display / backup / dirty checks.
120
+ # - update path: the full UpdatePageInput (folds any captured submit!/sign_off!),
121
+ # which — unlike page.as_update — INCLUDES dataFields.updates (field edits).
122
+ # - create path: a never-saved draft has no patchVer; preview the
123
+ # CreateFromTemplateInput instead (matches #create's payload).
124
+ # Returns nil when there is nothing to send and no operation is pending.
125
+ def patch_body(page)
126
+ return create_body(page) if new_draft?(page)
127
+
128
+ Input::Page::Update.from_model(page, **compat_submit_kargs(page))
129
+ end
130
+
131
+ # Is this a never-saved CREATE draft (vs a persisted page to UPDATE)?
132
+ # A draft built via get_new/buildPageFromTemplate is marked with
133
+ # _compat_source_template_id — the authoritative signal, because such a draft DOES
134
+ # carry a server-assigned patchVer (so patchVer-nil alone misclassifies it as an
135
+ # update, the cans-upsert dry-run mislabel). patchVer-nil remains a fallback for any
136
+ # other unsaved model.
137
+ def new_draft?(page)
138
+ return true if page.respond_to?(:_compat_source_template_id) && page._compat_source_template_id
139
+
140
+ !page.respond_to?(:patchVer) || page.patchVer.nil?
141
+ end
142
+
143
+ # CreateFromTemplateInput preview — mirrors #create's payload (templateId + the
144
+ # field updates serialised from the draft). Uses the SAME templateId resolution as
145
+ # the live #create, so the dry-run can't diverge from what gets sent.
146
+ def create_body(page, from: nil)
147
+ template_id = source_template_id(page, from)
148
+ updates = page.respond_to?(:data_fields_updates) ? page.data_fields_updates : []
149
+ return nil if updates.empty? && template_id.nil?
150
+
151
+ { templateId: template_id, dataFields: { updates: updates } }
152
+ end
153
+
154
+ # Resolve the source template id for a create, most-explicit first:
155
+ # 1. explicit `from:` (the caller passed it)
156
+ # 2. the get_new marker `_compat_source_template_id` — the read fragment does NOT
157
+ # fetch sourceTemplateId, and eco-helpers' Creatable passes `draft.template_id`
158
+ # which is nil on a GraphQL draft, so this marker is what actually carries it
159
+ # 3. a doc-provided `sourceTemplateId` (if the page happens to have one)
160
+ # Shared by the live #create AND the dry-run #create_body so they cannot diverge —
161
+ # they DID: the preview showed the marker's id while #create sent nil, and the server
162
+ # rejected `templateId: null` on a live cans-upsert create.
163
+ def source_template_id(page, from = nil)
164
+ return from if from
165
+ return page._compat_source_template_id if page.respond_to?(:_compat_source_template_id) && page._compat_source_template_id
166
+
167
+ page.respond_to?(:sourceTemplateId) ? page.sourceTemplateId : nil
168
+ end
169
+
170
+ # Translates a page's captured submit!/sign_off! intent (flags set by eco-helpers'
171
+ # OozeRedirect::FieldPatches) into update kwargs. Returns {} when nothing is pending.
172
+ # sign_off implies submit (a not-yet-submitted stage submits + approves inline);
173
+ # submit!(force: true) maps to forcedComplete (admin/superuser: skips required-field check).
174
+ def compat_submit_kargs(page)
175
+ if compat_flag(page, :_compat_sign_off?)
176
+ { submit: true, stage_id: compat_stage_id(page, :_compat_sign_off_stage_id),
177
+ complete_page_task: { sign_off: true } }
178
+ elsif compat_flag(page, :_compat_submit?)
179
+ force = compat_flag(page, :_compat_submit_force?)
180
+ { submit: true, stage_id: compat_stage_id(page, :_compat_submit_stage_id),
181
+ complete_page_task: force ? { forced_complete: true } : true }
182
+ else
183
+ {}
184
+ end
185
+ end
186
+
187
+ def compat_flag(page, name)
188
+ page.respond_to?(name) && page.public_send(name)
189
+ end
190
+
191
+ # Resolve the target stage for a submit/sign-off, most-explicit first:
192
+ # 1. pinned — the script passed submit!(stage_id:)/sign_off!(stage_id:)
193
+ # 2. active — the stage last viewed via a StageView (the stage the work was
194
+ # done on; set by Compat::StageView). This is the reliable source
195
+ # for the OozeSamples path, where the queued object is the full page.
196
+ # 3. current — server-state inference (state=='inprogress'/active==true). Last
197
+ # resort only: it guesses, and on a multi-stage page may name the
198
+ # WRONG stage — so the from_model guard still rejects a nil result.
199
+ def compat_stage_id(page, pinned_name)
200
+ pinned = compat_flag(page, pinned_name)
201
+ return pinned if pinned
202
+
203
+ active = compat_flag(page, :_compat_active_stage_id)
204
+ return active if active
205
+
206
+ page.respond_to?(:current_stage_id) ? page.current_stage_id : nil
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,84 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # v2-compatible registers API backed by GraphQL register search.
6
+ # Scripts call: apiv2.registers.search(register_id, options) { |result| ... }
7
+ #
8
+ # With a block: yields each PreviewPage result (cursor-paginated).
9
+ # Without a block (or only_first: true): returns a SearchResults object
10
+ # with .total and .total_before_filtering.
11
+ #
12
+ # Filter translation:
13
+ # v2 date_filter { lbound:, ubound: } → GraphQL date_filter { gte:, lte: }
14
+ # v2 tag_filter { tags:, mode: } → passed through (same ES backend)
15
+ # SearchConf filter objects → passed through directly
16
+ class Registers
17
+ def initialize(client)
18
+ @client = client
19
+ end
20
+
21
+ # Options:
22
+ # sort: 'created_at' | 'updated_at'
23
+ # dir: 'asc' | 'desc'
24
+ # query: String (full-text search)
25
+ # filters: Array of filter objects or v2 filter hashes
26
+ # batch_size: Integer (results per request, default 20)
27
+ # include_archived: Boolean (default false)
28
+ # only_first: Boolean — return after first page (no block needed)
29
+ def search(register_id, options = {}, &block)
30
+ conf = build_search_conf(options)
31
+ first = options.fetch(:batch_size, 20)
32
+ query = Query::RegisterPreviewPages.new(@client)
33
+
34
+ args = {
35
+ registerId: register_id,
36
+ searchConf: conf.to_h,
37
+ includeArchived: options.fetch(:include_archived, false),
38
+ first: first
39
+ }
40
+
41
+ if block || !options[:only_first]
42
+ # Block mode: yield each result, stop if only_first
43
+ query.each(**args) do |result|
44
+ block&.call(result)
45
+ break if options[:only_first]
46
+ end
47
+ else
48
+ # No-block mode: return SearchResults with .total etc.
49
+ raw = query.query(**args)
50
+ SearchResults.new(raw)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def build_search_conf(options)
57
+ conf = Input::SearchConf.new
58
+
59
+ if (sort_key = options[:sort])
60
+ direction = options.fetch(:dir, 'desc').to_sym
61
+ conf.sort(sort_key.to_sym, direction)
62
+ end
63
+
64
+ conf.query(options[:query]) if options[:query]
65
+
66
+ Array(options[:filters]).compact.each do |filter|
67
+ conf.filter(translate_filter(filter))
68
+ end
69
+
70
+ conf
71
+ end
72
+
73
+ # Translates a v2-style filter hash to a GraphQL-compatible filter hash.
74
+ # SearchConf filter objects (respond to to_h and are not Hash) pass through.
75
+ # v2 date_filter: lbound/ubound → gte/lte
76
+ # Other v2 types (tag_filter etc.): passed through — same ES backend.
77
+ def translate_filter(filter)
78
+ FilterTranslator.to_graphql(filter)
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,35 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # Wraps a GraphQL mutation payload to expose the v2-compatible response interface.
6
+ # Scripts check .success? and .status after update/create operations.
7
+ class Response
8
+ def initialize(payload)
9
+ @payload = payload
10
+ end
11
+
12
+ def success?
13
+ @payload.success?
14
+ end
15
+
16
+ def error?
17
+ @payload.error?
18
+ end
19
+
20
+ def status
21
+ @payload.error? ? :error : :ok
22
+ end
23
+
24
+ def body
25
+ @payload.error_doc
26
+ end
27
+
28
+ def item
29
+ @payload.item
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # Wraps a GraphQL connection object to expose the v2-compatible search
6
+ # result interface. eco-helpers scripts access:
7
+ # search_results.total — filtered count
8
+ # search_results.total_before_filtering — pre-filter count (approximated)
9
+ # (also Enumerable for iteration)
10
+ class SearchResults
11
+ include Enumerable
12
+
13
+ attr_reader :total, :total_before_filtering
14
+
15
+ def initialize(connection)
16
+ @total = connection.totalCount
17
+ # GraphQL does not expose a pre-filter count — use the same value.
18
+ @total_before_filtering = connection.totalCount
19
+ @nodes = connection.nodes
20
+ end
21
+
22
+ def each(&block)
23
+ @nodes.each(&block)
24
+ end
25
+
26
+ def empty?
27
+ @nodes.empty?
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,70 @@
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Compat
5
+ # Wraps the stages array from a PhasedPage to expose the v2-compatible
6
+ # access patterns eco-helpers scripts rely on.
7
+ #
8
+ # Accepts either an array of Base::Page::Phased::Stage objects (the normal
9
+ # path via embeds_many) or raw stage hash docs (for direct construction in
10
+ # specs and legacy callers).
11
+ #
12
+ # v2 patterns supported:
13
+ # page.stages[id_or_name] — find stage by ID or name
14
+ # page.stages.get_by_name(name) — find stage by name
15
+ # page.stages.ordered — stages sorted by ordering
16
+ # page.stages.ordered.map(&:id) — map sorted stages to IDs
17
+ # page.stages.any? — whether the page has stages
18
+ # page.stages.each { |s| ... } — iterate stages
19
+ class StageCollection
20
+ include Enumerable
21
+
22
+ def initialize(stages_array)
23
+ @stages = Array(stages_array).map { |s| coerce_stage(s) }
24
+ end
25
+
26
+ # Find a stage by ID or name (hash-style access matching v2 pattern).
27
+ def [](id_or_name)
28
+ return nil unless id_or_name
29
+
30
+ @stages.find { |s| s.id == id_or_name.to_s || s.name == id_or_name.to_s }
31
+ end
32
+
33
+ # Find a stage by name (explicit v2 method).
34
+ def get_by_name(name)
35
+ return nil unless name
36
+
37
+ @stages.find { |s| s.name == name.to_s }
38
+ end
39
+
40
+ # Stages sorted by ordering (ascending).
41
+ def ordered
42
+ @stages.sort_by { |s| s.ordering.to_i }
43
+ end
44
+
45
+ def each(&block)
46
+ @stages.each(&block)
47
+ end
48
+
49
+ def empty?
50
+ @stages.empty?
51
+ end
52
+
53
+ def length
54
+ @stages.length
55
+ end
56
+
57
+ alias_method :size, :length
58
+
59
+ private
60
+
61
+ # Accept Base::Page::Phased::Stage model objects (from embeds_many) directly.
62
+ # Wrap raw hashes in a Stage model for backwards-compatible direct construction.
63
+ def coerce_stage(stage)
64
+ stage.is_a?(Hash) ? Base::Page::Phased::Stage.new(stage) : stage
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end