ecoportal-api-graphql 1.3.11 → 1.3.12

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/.ai-assistance/code/filter_contract_matrix.md +177 -0
  3. data/.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md +10 -0
  4. data/.ai-assistance/projects/template-automatic-build-maintenance/TODO.md +11 -0
  5. data/.ai-assistance/skills/procedural-memory/SKILL.md +319 -0
  6. data/.ai-assistance/standards-version.json +21 -20
  7. data/CHANGELOG.md +32 -0
  8. data/CLAUDE.md +10 -0
  9. data/docs/self-docs/ARCHITECTURE.md +88 -0
  10. data/docs/self-docs/CHANGES.jsonl +7 -0
  11. data/docs/self-docs/CONVENTIONS.md +74 -0
  12. data/docs/self-docs/INTEGRATIONS.md +63 -0
  13. data/docs/self-docs/OVERVIEW.md +51 -0
  14. data/docs/self-docs/STATUS.md +69 -0
  15. data/docs/self-docs/self-docs-index.json +39 -0
  16. data/docs/worklog.md +0 -23
  17. data/lib/ecoportal/api/common/graphql/model/diffable.rb +54 -54
  18. data/lib/ecoportal/api/graphql/base/action.rb +43 -43
  19. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +67 -67
  20. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +7 -0
  21. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -28
  22. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -25
  23. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -24
  24. data/lib/ecoportal/api/graphql/base/page/section_collection.rb +85 -79
  25. data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -17
  26. data/lib/ecoportal/api/graphql/base/register.rb +18 -18
  27. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +63 -28
  28. data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -51
  29. data/lib/ecoportal/api/graphql/concerns.rb +14 -14
  30. data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -181
  31. data/lib/ecoportal/api/graphql/fragment/page.rb +85 -85
  32. data/lib/ecoportal/api/graphql/input/action/update.rb +14 -14
  33. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +41 -41
  34. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +47 -47
  35. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +49 -49
  36. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +27 -27
  37. data/lib/ecoportal/api/graphql/input/search_conf.rb +436 -367
  38. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +30 -30
  39. data/lib/ecoportal/api/graphql/logic/input.rb +26 -26
  40. data/lib/ecoportal/api/graphql_version.rb +1 -1
  41. metadata +10 -1
@@ -1,85 +1,85 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- class Fragment
5
- # Shared fields for both BasicPage and PhasedPage (spread on BasePageInterface).
6
- # Always include __typename so PageUnion can dispatch to the right concrete class.
7
- fragment :PageFields, <<~GRAPHQL
8
- fragment PageFields on BasePageInterface {
9
- __typename
10
- id
11
- name
12
- uid
13
- icon
14
- patchVer
15
- state
16
- archived
17
- archivedAt { dateTime }
18
- draft
19
- externalId
20
- timeZone
21
- otherTags
22
- taskPriority
23
- sourceTemplateId
24
- createdAt { dateTime }
25
- updatedAt { dateTime }
26
- creatorName
27
- locations {
28
- ...LocationNode
29
- }
30
- workflow {
31
- autoPageCreationEnabled
32
- fields { key name type total missing }
33
- }
34
- }
35
- GRAPHQL
36
-
37
- # BasicPage-only fields — spread alongside PageFields for basic pages.
38
- # BasicPage has sections directly (PhasedPage sections live under stages).
39
- fragment :BasicPageFields, <<~GRAPHQL
40
- fragment BasicPageFields on BasicPage {
41
- sections {
42
- __typename
43
- ... on ContentSection {
44
- id
45
- heading
46
- }
47
- ... on SplitSection {
48
- id
49
- heading
50
- }
51
- }
52
- }
53
- GRAPHQL
54
-
55
- # PhasedPage-only fields — spread alongside PageFields for phased pages.
56
- # Provides lightweight stage index, current stage, and active stages.
57
- # For full stage content (sections, data fields), use CommonPageUnion.
58
- fragment :PhasedPageFields, <<~GRAPHQL
59
- fragment PhasedPageFields on PhasedPage {
60
- stagesIndex {
61
- id
62
- name
63
- ordering
64
- state
65
- started
66
- hasCompleteTask
67
- hasReviewTask
68
- }
69
- currentStage {
70
- id
71
- name
72
- ordering
73
- state
74
- }
75
- activeStages {
76
- id
77
- name
78
- ordering
79
- }
80
- }
81
- GRAPHQL
82
- end
83
- end
84
- end
85
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ class Fragment
5
+ # Shared fields for both BasicPage and PhasedPage (spread on BasePageInterface).
6
+ # Always include __typename so PageUnion can dispatch to the right concrete class.
7
+ fragment :PageFields, <<~GRAPHQL
8
+ fragment PageFields on BasePageInterface {
9
+ __typename
10
+ id
11
+ name
12
+ uid
13
+ icon
14
+ patchVer
15
+ state
16
+ archived
17
+ archivedAt { dateTime }
18
+ draft
19
+ externalId
20
+ timeZone
21
+ otherTags
22
+ taskPriority
23
+ sourceTemplateId
24
+ createdAt { dateTime }
25
+ updatedAt { dateTime }
26
+ creatorName
27
+ locations {
28
+ ...LocationNode
29
+ }
30
+ workflow {
31
+ autoPageCreationEnabled
32
+ fields { key name type total missing }
33
+ }
34
+ }
35
+ GRAPHQL
36
+
37
+ # BasicPage-only fields — spread alongside PageFields for basic pages.
38
+ # BasicPage has sections directly (PhasedPage sections live under stages).
39
+ fragment :BasicPageFields, <<~GRAPHQL
40
+ fragment BasicPageFields on BasicPage {
41
+ sections {
42
+ __typename
43
+ ... on ContentSection {
44
+ id
45
+ heading
46
+ }
47
+ ... on SplitSection {
48
+ id
49
+ heading
50
+ }
51
+ }
52
+ }
53
+ GRAPHQL
54
+
55
+ # PhasedPage-only fields — spread alongside PageFields for phased pages.
56
+ # Provides lightweight stage index, current stage, and active stages.
57
+ # For full stage content (sections, data fields), use CommonPageUnion.
58
+ fragment :PhasedPageFields, <<~GRAPHQL
59
+ fragment PhasedPageFields on PhasedPage {
60
+ stagesIndex {
61
+ id
62
+ name
63
+ ordering
64
+ state
65
+ started
66
+ hasCompleteTask
67
+ hasReviewTask
68
+ }
69
+ currentStage {
70
+ id
71
+ name
72
+ ordering
73
+ state
74
+ }
75
+ activeStages {
76
+ id
77
+ name
78
+ ordering
79
+ }
80
+ }
81
+ GRAPHQL
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,14 +1,14 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- module Action
6
- class Update < Ecoportal::API::GraphQL::Base::Action
7
- passthrough :clientMutationId
8
- passthrough :updateMode
9
- end
10
- end
11
- end
12
- end
13
- end
14
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ module Action
6
+ class Update < Ecoportal::API::GraphQL::Base::Action
7
+ passthrough :clientMutationId
8
+ passthrough :updateMode
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,41 +1,41 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- module ContractorEntity
6
- class Update < Input::ContractorEntity::Create
7
- passthrough :clientMutationId
8
- class_resolver :id_diff_input, "Ecoportal::API::GraphQL::Input::IdDiff"
9
- embeds_one :associatedPeopleIds, klass: :id_diff_input
10
- embeds_one :leadContractorIds, klass: :id_diff_input
11
-
12
- ID_DIFF_FIELDS = %i[associatedPeopleIds leadContractorIds].freeze
13
-
14
- class << self
15
- # Overrides Logic::Input.from_model to reshape array fields into
16
- # IdDiffInput format: { additions: [...], removals: [...] }
17
- # Array fields are stripped from the flat diff, so we compare
18
- # doc vs original_doc directly rather than relying on the diff hash.
19
- def from_model(model, **kargs)
20
- diff = Logic::Input.from_model(model, **kargs)
21
-
22
- ID_DIFF_FIELDS.each do |field|
23
- key = field.to_s
24
- current = Array(model.doc[key])
25
- original = Array(model.original_doc[key])
26
- next if current == original
27
-
28
- diff ||= {}
29
- diff[:id] ||= model.id
30
- diff[field] = { additions: current - original, removals: original - current }
31
- end
32
-
33
- diff
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
41
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ module ContractorEntity
6
+ class Update < Input::ContractorEntity::Create
7
+ passthrough :clientMutationId
8
+ class_resolver :id_diff_input, "Ecoportal::API::GraphQL::Input::IdDiff"
9
+ embeds_one :associatedPeopleIds, klass: :id_diff_input
10
+ embeds_one :leadContractorIds, klass: :id_diff_input
11
+
12
+ ID_DIFF_FIELDS = %i[associatedPeopleIds leadContractorIds].freeze
13
+
14
+ class << self
15
+ # Overrides Logic::Input.from_model to reshape array fields into
16
+ # IdDiffInput format: { additions: [...], removals: [...] }
17
+ # Array fields are stripped from the flat diff, so we compare
18
+ # doc vs original_doc directly rather than relying on the diff hash.
19
+ def from_model(model, **kargs)
20
+ diff = Logic::Input.from_model(model, **kargs)
21
+
22
+ ID_DIFF_FIELDS.each do |field|
23
+ key = field.to_s
24
+ current = Array(model.doc[key])
25
+ original = Array(model.original_doc[key])
26
+ next if current == original
27
+
28
+ diff ||= {}
29
+ diff[:id] ||= model.id
30
+ diff[field] = { additions: current - original, removals: original - current }
31
+ end
32
+
33
+ diff
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,47 +1,47 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- module LocationStructure
6
- class ApplyCommands < Logic::Input
7
- passkey :id
8
- passboolean :force
9
- embeds_many :commands, klass: Interface::LocationStructure::Command
10
- passboolean :preview
11
-
12
- def add(type, **kargs)
13
- if (command = new_command(type))
14
- command.set_values(**kargs) unless kargs.empty?
15
- yield(command) if block_given?
16
- end
17
- command
18
- end
19
-
20
- private
21
-
22
- def new_command(type)
23
- case type
24
- when :archive
25
- Input::LocationStructure::ArchiveCommand.new
26
- when :unarchive
27
- Input::LocationStructure::UnarchiveCommand.new
28
- when :delete
29
- Input::LocationStructure::DeleteCommand.new
30
- when :move
31
- Input::LocationStructure::MoveCommand.new
32
- when :insert
33
- Input::LocationStructure::InsertCommand.new
34
- when :update
35
- Input::LocationStructure::UpdateCommand.new
36
- when :reoder
37
- Input::LocationStructure::ReoderCommand.new
38
- else
39
- raise "Unknown command type: '#{type}'"
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ module LocationStructure
6
+ class ApplyCommands < Logic::Input
7
+ passkey :id
8
+ passboolean :force
9
+ embeds_many :commands, klass: Interface::LocationStructure::Command
10
+ passboolean :preview
11
+
12
+ def add(type, **kargs)
13
+ if (command = new_command(type))
14
+ command.set_values(**kargs) unless kargs.empty?
15
+ yield(command) if block_given?
16
+ end
17
+ command
18
+ end
19
+
20
+ private
21
+
22
+ def new_command(type)
23
+ case type
24
+ when :archive
25
+ Input::LocationStructure::ArchiveCommand.new
26
+ when :unarchive
27
+ Input::LocationStructure::UnarchiveCommand.new
28
+ when :delete
29
+ Input::LocationStructure::DeleteCommand.new
30
+ when :move
31
+ Input::LocationStructure::MoveCommand.new
32
+ when :insert
33
+ Input::LocationStructure::InsertCommand.new
34
+ when :update
35
+ Input::LocationStructure::UpdateCommand.new
36
+ when :reoder
37
+ Input::LocationStructure::ReoderCommand.new
38
+ else
39
+ raise "Unknown command type: '#{type}'"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,49 +1,49 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- module LocationStructure
6
- module Draft
7
- class AddCommands < Logic::Input
8
- passkey :id
9
-
10
- passboolean :preview
11
- embeds_many :commands, klass: Interface::LocationStructure::Command
12
-
13
- def add(type, **kargs)
14
- if (command = new_command(type))
15
- command.set_values(**kargs) unless kargs.empty?
16
- yield(command) if block_given?
17
- end
18
- command
19
- end
20
-
21
- private
22
-
23
- def new_command(type)
24
- case type
25
- when :archive
26
- Input::LocationStructure::ArchiveCommand.new
27
- when :unarchive
28
- Input::LocationStructure::UnarchiveCommand.new
29
- when :delete
30
- Input::LocationStructure::DeleteCommand.new
31
- when :move
32
- Input::LocationStructure::MoveCommand.new
33
- when :insert
34
- Input::LocationStructure::InsertCommand.new
35
- when :update
36
- Input::LocationStructure::UpdateCommand.new
37
- when :reoder
38
- Input::LocationStructure::ReoderCommand.new
39
- else
40
- raise "Unknown command type: '#{type}'"
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ module LocationStructure
6
+ module Draft
7
+ class AddCommands < Logic::Input
8
+ passkey :id
9
+
10
+ passboolean :preview
11
+ embeds_many :commands, klass: Interface::LocationStructure::Command
12
+
13
+ def add(type, **kargs)
14
+ if (command = new_command(type))
15
+ command.set_values(**kargs) unless kargs.empty?
16
+ yield(command) if block_given?
17
+ end
18
+ command
19
+ end
20
+
21
+ private
22
+
23
+ def new_command(type)
24
+ case type
25
+ when :archive
26
+ Input::LocationStructure::ArchiveCommand.new
27
+ when :unarchive
28
+ Input::LocationStructure::UnarchiveCommand.new
29
+ when :delete
30
+ Input::LocationStructure::DeleteCommand.new
31
+ when :move
32
+ Input::LocationStructure::MoveCommand.new
33
+ when :insert
34
+ Input::LocationStructure::InsertCommand.new
35
+ when :update
36
+ Input::LocationStructure::UpdateCommand.new
37
+ when :reoder
38
+ Input::LocationStructure::ReoderCommand.new
39
+ else
40
+ raise "Unknown command type: '#{type}'"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,27 +1,27 @@
1
- module Ecoportal
2
- module API
3
- class GraphQL
4
- module Input
5
- module LocationStructure
6
- class UpdateCommand < Interface::LocationStructure::Command
7
- passthrough :nodeId, :newId
8
- passthrough :name, :newName
9
- passthrough :classificationIds, :newClassificationIds
10
-
11
- def name
12
- super if newName.nil?
13
-
14
- newName
15
- end
16
-
17
- def classificationIds
18
- super if newClassificationIds.empty?
19
-
20
- newClassificationIds
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
1
+ module Ecoportal
2
+ module API
3
+ class GraphQL
4
+ module Input
5
+ module LocationStructure
6
+ class UpdateCommand < Interface::LocationStructure::Command
7
+ passthrough :nodeId, :newId
8
+ passthrough :name, :newName
9
+ passthrough :classificationIds, :newClassificationIds
10
+
11
+ def name
12
+ super if newName.nil?
13
+
14
+ newName
15
+ end
16
+
17
+ def classificationIds
18
+ super if newClassificationIds.empty?
19
+
20
+ newClassificationIds
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end