ecoportal-api-v2 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +55 -0
  5. data/.travis.yml +5 -0
  6. data/.yardopts +10 -0
  7. data/CHANGELOG.md +171 -0
  8. data/Gemfile +6 -0
  9. data/LICENSE +21 -0
  10. data/README.md +22 -0
  11. data/Rakefile +27 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/ecoportal-api-v2.gemspec +34 -0
  15. data/lib/ecoportal/api-v2.rb +10 -0
  16. data/lib/ecoportal/api/common.rb +18 -0
  17. data/lib/ecoportal/api/common/content.rb +18 -0
  18. data/lib/ecoportal/api/common/content/array_model.rb +286 -0
  19. data/lib/ecoportal/api/common/content/class_helpers.rb +146 -0
  20. data/lib/ecoportal/api/common/content/client.rb +40 -0
  21. data/lib/ecoportal/api/common/content/collection_model.rb +279 -0
  22. data/lib/ecoportal/api/common/content/doc_helpers.rb +67 -0
  23. data/lib/ecoportal/api/common/content/double_model.rb +356 -0
  24. data/lib/ecoportal/api/common/content/hash_diff_patch.rb +183 -0
  25. data/lib/ecoportal/api/common/content/string_digest.rb +27 -0
  26. data/lib/ecoportal/api/common/content/wrapped_response.rb +42 -0
  27. data/lib/ecoportal/api/v2.rb +82 -0
  28. data/lib/ecoportal/api/v2/page.rb +42 -0
  29. data/lib/ecoportal/api/v2/page/component.rb +133 -0
  30. data/lib/ecoportal/api/v2/page/component/action.rb +28 -0
  31. data/lib/ecoportal/api/v2/page/component/action_field.rb +54 -0
  32. data/lib/ecoportal/api/v2/page/component/chart_field.rb +54 -0
  33. data/lib/ecoportal/api/v2/page/component/chart_field/frequency.rb +29 -0
  34. data/lib/ecoportal/api/v2/page/component/chart_field/heatmap.rb +27 -0
  35. data/lib/ecoportal/api/v2/page/component/chart_field/indicator.rb +26 -0
  36. data/lib/ecoportal/api/v2/page/component/chart_field/multiseries.rb +31 -0
  37. data/lib/ecoportal/api/v2/page/component/chart_field/sankey.rb +27 -0
  38. data/lib/ecoportal/api/v2/page/component/chart_field/serie.rb +26 -0
  39. data/lib/ecoportal/api/v2/page/component/chart_field/series_config.rb +23 -0
  40. data/lib/ecoportal/api/v2/page/component/chart_fr_field.rb +32 -0
  41. data/lib/ecoportal/api/v2/page/component/checklist_field.rb +49 -0
  42. data/lib/ecoportal/api/v2/page/component/checklist_item.rb +25 -0
  43. data/lib/ecoportal/api/v2/page/component/date_field.rb +34 -0
  44. data/lib/ecoportal/api/v2/page/component/file.rb +16 -0
  45. data/lib/ecoportal/api/v2/page/component/files_field.rb +13 -0
  46. data/lib/ecoportal/api/v2/page/component/gauge_field.rb +36 -0
  47. data/lib/ecoportal/api/v2/page/component/gauge_stop.rb +88 -0
  48. data/lib/ecoportal/api/v2/page/component/geo_field.rb +13 -0
  49. data/lib/ecoportal/api/v2/page/component/image.rb +16 -0
  50. data/lib/ecoportal/api/v2/page/component/images_field.rb +23 -0
  51. data/lib/ecoportal/api/v2/page/component/law_field.rb +12 -0
  52. data/lib/ecoportal/api/v2/page/component/number_field.rb +12 -0
  53. data/lib/ecoportal/api/v2/page/component/people_field.rb +25 -0
  54. data/lib/ecoportal/api/v2/page/component/plain_text_field.rb +15 -0
  55. data/lib/ecoportal/api/v2/page/component/reference_field.rb +16 -0
  56. data/lib/ecoportal/api/v2/page/component/rich_text_field.rb +13 -0
  57. data/lib/ecoportal/api/v2/page/component/selection_field.rb +78 -0
  58. data/lib/ecoportal/api/v2/page/component/selection_option.rb +25 -0
  59. data/lib/ecoportal/api/v2/page/component/signature_field.rb +25 -0
  60. data/lib/ecoportal/api/v2/page/component/tag_field.rb +14 -0
  61. data/lib/ecoportal/api/v2/page/components.rb +42 -0
  62. data/lib/ecoportal/api/v2/page/section.rb +59 -0
  63. data/lib/ecoportal/api/v2/page/sections.rb +47 -0
  64. data/lib/ecoportal/api/v2/page/stage.rb +29 -0
  65. data/lib/ecoportal/api/v2/page/stages.rb +26 -0
  66. data/lib/ecoportal/api/v2/pages.rb +92 -0
  67. data/lib/ecoportal/api/v2/pages/page_stage.rb +16 -0
  68. data/lib/ecoportal/api/v2/pages/stages.rb +55 -0
  69. data/lib/ecoportal/api/v2/people.rb +31 -0
  70. data/lib/ecoportal/api/v2/registers.rb +89 -0
  71. data/lib/ecoportal/api/v2/registers/page_result.rb +21 -0
  72. data/lib/ecoportal/api/v2/registers/register.rb +37 -0
  73. data/lib/ecoportal/api/v2/registers/stage_result.rb +14 -0
  74. data/lib/ecoportal/api/v2/registers/stages_result.rb +13 -0
  75. data/lib/ecoportal/api/v2/registers/template.rb +12 -0
  76. data/lib/ecoportal/api/v2/version.rb +7 -0
  77. metadata +254 -0
@@ -0,0 +1,25 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Component
6
+ class SignatureField < Page::Component
7
+
8
+ class << self
9
+ def new_doc
10
+ {
11
+ "color" => "#000000"
12
+ }
13
+ end
14
+ end
15
+
16
+ passthrough :signed_by_id, :signed_by_name, :signature_url
17
+ passdate :signature_updated_at
18
+ passthrough :signature_content, :color
19
+
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Component
6
+ class TagField < Page::Component
7
+ passthrough :single_select, :use_defaults
8
+ passthrough :tag_tree_id, :button_text
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Components < Common::Content::CollectionModel
6
+ class_resolver :component_class, "Ecoportal::API::V2::Page::Component"
7
+
8
+ self.klass do |doc|
9
+ component_class.get_class(doc).tap do |klass|
10
+ klass.key = :id
11
+ end
12
+ end
13
+
14
+ order_matters = true
15
+
16
+ def get_by_type(type)
17
+ self.select do |comp|
18
+ comp.type.downcase == type.to_s.strip.downcase
19
+ end
20
+ end
21
+
22
+ def get_by_name(name, type: nil)
23
+ pool = type ? get_by_type(type) : self
24
+
25
+ pool.select do |comp|
26
+ comp.label.to_s.strip.downcase == name.to_s.strip.downcase
27
+ end.first
28
+ end
29
+
30
+ def add(label:, type:)
31
+ fld_doc = component_class.new_doc(type: type)
32
+ upsert!(fld_doc) do |fld|
33
+ fld.label = label
34
+ yield(fld) if block_given?
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,59 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Section < Common::Content::DoubleModel
6
+ class << self
7
+ def new_doc(split: false)
8
+ {
9
+ "id" => new_uuid,
10
+ "type" => split ? "split" : "content",
11
+ "weight" => 9999
12
+ }.tap do |out|
13
+ component_ids = if split
14
+ {
15
+ "left_component_ids" => [],
16
+ "right_component_ids" => []
17
+ }
18
+ else
19
+ {
20
+ "component_ids" => []
21
+ }
22
+ end
23
+ out.merge!(component_ids)
24
+ end
25
+ end
26
+ end
27
+
28
+ passkey :id
29
+ passthrough :patch_ver, :weight, :type
30
+ passthrough :heading, :left_heading, :right_heading
31
+ passarray :component_ids, :left_component_ids, :right_component_ids
32
+ passthrough :minimized
33
+
34
+ def split?
35
+ doc && doc["type"] == "split"
36
+ end
37
+
38
+ def all_component_ids
39
+ return component_ids.to_a unless split?
40
+ left_component_ids.to_a | right_component_ids.to_a
41
+ end
42
+
43
+ def component?(id)
44
+ all_component_ids.include?(id)
45
+ end
46
+
47
+ def components
48
+ fld_ids = all_component_ids
49
+ root.components.values_at(*fld_ids).select.with_index do |fld, i|
50
+ puts "Warning: field #{id} points to missing field #{fld_ids[i]}" if !fld
51
+ fld && (!block_given? || yield(fld))
52
+ end
53
+ end
54
+
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,47 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Sections < Common::Content::CollectionModel
6
+ class_resolver :section_class, "Ecoportal::API::V2::Page::Section"
7
+
8
+ self.klass = :section_class
9
+
10
+ def add(name: nil, split: false, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
11
+ sec_doc = section_class.new_doc(split: split)
12
+ upsert!(sec_doc, pos: pos, before: before, after: after) do |section|
13
+ section.heading = name
14
+ if prev = previous_section(section)
15
+ section.weight = prev.weight
16
+ end
17
+ yield(section) if block_given?
18
+ #fix_weights! # a server bug prevents to set the weight of existing sections
19
+ end
20
+ end
21
+
22
+ def ordered
23
+ each_with_index.sort_by do |section, index|
24
+ (section.weight >= 9999) ? [index, index] : [section.weight, index]
25
+ end.map(&:first)
26
+ end
27
+
28
+ private
29
+
30
+ def fix_weights!
31
+ ordered.each_with_index do |section, index|
32
+ section.weight = index
33
+ end
34
+ end
35
+
36
+ def previous_section(value)
37
+ secs = ordered
38
+ pos = secs.index(value) - 1
39
+ return if pos < 0
40
+ secs[pos]
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,29 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Stage < Common::Content::DoubleModel
6
+ passkey :id
7
+ passthrough :patch_ver
8
+ passthrough :name
9
+ passarray :subtags, order_matters: false
10
+ passarray :section_ids
11
+ passthrough :can
12
+
13
+ def sections
14
+ sec_ids = section_ids.to_a
15
+ root.sections.values_at(*sec_ids).select.with_index do |sec, i|
16
+ puts "Warning: section #{id} points to missing section #{sec_ids[i]}" if !sec
17
+ fld && (!block_given? || yield(sec))
18
+ end.sort_by {|sec| sec.weight}
19
+ end
20
+
21
+ def attach_section(section)
22
+ section_ids.insert_one(section.id)
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Page
5
+ class Stages < Common::Content::CollectionModel
6
+ class_resolver :stage_class, "Ecoportal::API::V2::Page::Stage"
7
+
8
+ self.klass = :stage_class
9
+
10
+ def get_by_name(name)
11
+ find do |stage|
12
+ stage.name.strip.downcase == name.to_s.strip.downcase
13
+ end
14
+ end
15
+
16
+ def ordered_stages
17
+ stages.each_with_index.sort_by do |stage, index|
18
+ (stage.ordering >= 9999) ? [index, index] : [stage.ordering, index]
19
+ end.map(&:first)
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,92 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ # @attr_reader client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
5
+ class Pages
6
+ STAGE_REX = /stages\/(?<sid>.*)/
7
+ extend Common::BaseClass
8
+ include Common::Content::DocHelpers
9
+
10
+ class_resolver :stages_class, "Ecoportal::API::V2::Pages::Stages"
11
+ class_resolver :page_class, "Ecoportal::API::V2::Page"
12
+
13
+ attr_reader :client
14
+
15
+ # @param client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
16
+ # @return [Schemas] an instance object ready to make schema api requests.
17
+ def initialize(client)
18
+ @client = client
19
+ end
20
+
21
+ # Obtain specific object for pages api requests.
22
+ # @return [V2::Pages::Stages] an instance object ready to make pages api requests.
23
+ def stages
24
+ stages_class.new(client)
25
+ end
26
+
27
+ # Gets a page via api.
28
+ # @note
29
+ # - if the request has `success?` the returned `object.result` gives an object with that `Page`.
30
+ # - if it failed to obtain the full page, it returns a `PageStage` with the active stage data.
31
+ # @param id [String, Hash, Stage] the `id` of the target **page**.
32
+ # @param stage_id [String] the `id` of the target **stage**.
33
+ # @return [Ecoportal::API::V2::Page, Ecoportal::API::V2::Pages::PageStage] the target page.
34
+ def get(id, stage_id: nil)
35
+ return stages.get(id: id, stage_id: stage_id) if stage_id
36
+ id = get_id(id)
37
+ response = client.get("/pages/#{CGI.escape(id)}")
38
+ wrapped = Common::Content::WrappedResponse.new(response, page_class)
39
+
40
+ return wrapped.result if wrapped.success?
41
+ if (response.status == 302) && (url = response.body["data"])
42
+ if stage_id = url_to_stage_id(url)
43
+ return stages.get(id: id, stage_id: stage_id)
44
+ end
45
+ end
46
+ raise "Could not get page #{id} - Error #{response.status}: #{response.body}"
47
+ end
48
+
49
+ # Requests to update an existing page via api.
50
+ # @param doc [Hash, Page] data that at least contains an `id` (internal or external) of the target page.
51
+ # @return [Response] an object with the api response.
52
+ def update(doc)
53
+ body = get_body(doc) # , level: "page"
54
+ id = get_id(doc)
55
+ client.patch("/pages/#{CGI.escape(id)}", data: body)
56
+ end
57
+
58
+ # Gets a `new` non-existing page via api with all the ids initialized.
59
+ # @param from [String, Hash, Page] template or `id` of the template
60
+ # @return [Ecoportal::API::V2::Page] the new page object.
61
+ def get_new(from)
62
+ id = get_id(from)
63
+ response = client.get("/pages/new", params: {template_id: id})
64
+ wrapped = Common::Content::WrappedResponse.new(response, page_class)
65
+
66
+ return wrapped.result if wrapped.success?
67
+ raise "Could not get new page from template #{id} - Error #{response.status}: #{response.body}"
68
+ end
69
+
70
+ # Requests a creation of a page via api.
71
+ # @param doc [Hash, Page] data that at least contains an `id` (internal or external) of the target page.
72
+ # @param from [String, Hash, Page] template or `id` of the template
73
+ # @return [Response] an object with the api response.
74
+ def create(doc, from:)
75
+ body = get_body(doc)
76
+ id = get_id(from)
77
+ client.post("/pages", data: body, params: {template_id: id})
78
+ end
79
+
80
+ private
81
+
82
+ def url_to_stage_id(url)
83
+ (matches = url.match(STAGE_REX)) && matches[:sid]
84
+ end
85
+
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ require 'ecoportal/api/v2/page'
92
+ require 'ecoportal/api/v2/pages/stages'
@@ -0,0 +1,16 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Pages
5
+ class PageStage < V2::Page
6
+ passthrough :mould_counter, :archive
7
+ passthrough :task_priority, :state
8
+ passthrough :votes_enabled, :upvotes, :downvotes
9
+
10
+ passarray :force_errors, :subtags, :permits, order_matters: false
11
+ passthrough :evolution
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,55 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ class Pages
5
+ # This API Integration level has been added due to relative permissions
6
+ # - a **user** with api access may have access to a specific `stage` but not to the full `page`
7
+ #
8
+ # @attr_reader client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
9
+ class Stages
10
+ extend Common::BaseClass
11
+ include Common::Content::DocHelpers
12
+
13
+ class_resolver :page_stage_class, "Ecoportal::API::V2::Pages::PageStage"
14
+
15
+ attr_reader :client
16
+
17
+ # @param client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
18
+ # @return [Schemas] an instance object ready to make schema api requests.
19
+ def initialize(client)
20
+ @client = client
21
+ end
22
+
23
+ # Gets a stage via api.
24
+ # @note if the request has `success?` the returned `object.result` gives an object with that `Stage`.
25
+ # @param id [String, Hash, Stage] the `id` of the target **page**.
26
+ # @param stage_id [String] the `id` of the target **stage**.
27
+ # @return [Ecoportal::API::V2::Stage, Ecoportal::API::V2::Pages::PageStage] the target stage.
28
+ def get(id:, stage_id:)
29
+ id = get_id(id)
30
+ response = client.get("/pages/#{CGI.escape(id)}/stages/#{CGI.escape(stage_id)}/")
31
+ wrapped = Common::Content::WrappedResponse.new(response, page_stage_class)
32
+
33
+ return wrapped.result if wrapped.success?
34
+ raise "Could not get stage {#{id}} of page #{stage_id} - Error #{response.status}: #{response.body}"
35
+ end
36
+
37
+ # Requests to update an existing stage via api.
38
+ # @param doc [Hash, Stage] data that at least contains an `id` (internal or external) of the target stage.
39
+ # @param id [String, nil] the `id` of the target **page**.
40
+ # @param stage_id [String] the `id` of the target **stage**.
41
+ # @return [Response] an object with the api response.
42
+ def update(doc, id: nil, stage_id:)
43
+ body = get_body(doc)
44
+ id = id || get_id(doc)
45
+ path = "/pages/#{CGI.escape(id)}/stages/#{CGI.escape(stage_id)}/"
46
+ client.patch(path, data: body)
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ require 'ecoportal/api/v2/pages/page_stage'
@@ -0,0 +1,31 @@
1
+ module Ecoportal
2
+ module API
3
+ class V2
4
+ # @attr_reader client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
5
+ class People < API::Internal::People
6
+
7
+ def batch
8
+ unavailable_method!(__method__)
9
+ end
10
+
11
+ def job
12
+ unavailable_method!(__method__)
13
+ end
14
+
15
+ private
16
+
17
+ # Re-using hook to obtain the raw data response
18
+ def body_data(body)
19
+ return body unless body.is_a?(Hash)
20
+ return body unless body.key?("data")
21
+ body["data"]
22
+ end
23
+
24
+ def unavailable_method!(str)
25
+ raise "Unavailable method '#{str}' for api '#{VERSION}'"
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end