ecoportal-api 0.3.8 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +11 -3
- data/.yardopts +10 -0
- data/Gemfile.lock +10 -5
- data/Rakefile +22 -1
- data/ecoportal-api.gemspec +6 -4
- data/lib/ecoportal/api/common.rb +7 -4
- data/lib/ecoportal/api/common/base_class.rb +29 -0
- data/lib/ecoportal/api/common/base_model.rb +89 -20
- data/lib/ecoportal/api/common/batch_operation.rb +0 -1
- data/lib/ecoportal/api/common/batch_response.rb +5 -0
- data/lib/ecoportal/api/common/client.rb +61 -1
- data/lib/ecoportal/api/common/doc_helpers.rb +2 -0
- data/lib/ecoportal/api/common/hash_diff.rb +25 -23
- data/lib/ecoportal/api/common/response.rb +4 -0
- data/lib/ecoportal/api/common/wrapped_response.rb +19 -10
- data/lib/ecoportal/api/internal.rb +17 -20
- data/lib/ecoportal/api/internal/account.rb +23 -16
- data/lib/ecoportal/api/internal/login_provider.rb +1 -1
- data/lib/ecoportal/api/internal/login_providers.rb +10 -0
- data/lib/ecoportal/api/internal/people.rb +3 -8
- data/lib/ecoportal/api/internal/permissions.rb +1 -1
- data/lib/ecoportal/api/internal/person.rb +18 -16
- data/lib/ecoportal/api/internal/person_details.rb +1 -5
- data/lib/ecoportal/api/internal/person_schema.rb +1 -5
- data/lib/ecoportal/api/internal/person_schemas.rb +2 -6
- data/lib/ecoportal/api/internal/policy_group.rb +1 -1
- data/lib/ecoportal/api/internal/policy_groups.rb +10 -1
- data/lib/ecoportal/api/v1.rb +27 -4
- data/lib/ecoportal/api/v1/people.rb +62 -25
- data/lib/ecoportal/api/v1/person.rb +47 -28
- data/lib/ecoportal/api/v1/person_details.rb +27 -13
- data/lib/ecoportal/api/v1/person_schema.rb +3 -6
- data/lib/ecoportal/api/v1/person_schemas.rb +26 -9
- data/lib/ecoportal/api/v1/schema_field.rb +1 -1
- data/lib/ecoportal/api/v1/schema_field_value.rb +2 -1
- data/lib/ecoportal/api/version.rb +1 -1
- metadata +45 -3
@@ -2,6 +2,7 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
module DocHelpers
|
5
|
+
|
5
6
|
def get_body(doc)
|
6
7
|
if doc.respond_to?(:as_update)
|
7
8
|
doc.as_update
|
@@ -11,6 +12,7 @@ module Ecoportal
|
|
11
12
|
doc
|
12
13
|
end
|
13
14
|
end
|
15
|
+
|
14
16
|
def get_id(doc)
|
15
17
|
id = nil
|
16
18
|
id ||= doc.id if doc.respond_to?(:id)
|
@@ -4,32 +4,34 @@ module Ecoportal
|
|
4
4
|
module HashDiff
|
5
5
|
ID_KEYS = %w[id]
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
class << self
|
8
|
+
def diff(a, b)
|
9
|
+
return a if a.class != b.class
|
10
|
+
case a
|
11
|
+
when Hash
|
12
|
+
{}.tap do |diffed|
|
13
|
+
a.each do |key, a_value|
|
14
|
+
b_value = b[key]
|
15
|
+
next if a_value == b_value && !ID_KEYS.include?(key)
|
16
|
+
diffed[key] = diff(a_value, b_value)
|
17
|
+
diffed.delete(key) if diffed[key] == {}
|
18
|
+
end
|
19
|
+
# All keys are IDs, so it's actually blank
|
20
|
+
if (diffed.keys - ID_KEYS).empty?
|
21
|
+
return {}
|
22
|
+
end
|
17
23
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
24
|
+
when Array
|
25
|
+
return a unless a.length == b.length
|
26
|
+
a.map.with_index do |a_value, idx|
|
27
|
+
b_value = b[idx]
|
28
|
+
diff(a_value, b_value)
|
29
|
+
end.reject do |el|
|
30
|
+
el == {}
|
21
31
|
end
|
32
|
+
else
|
33
|
+
a
|
22
34
|
end
|
23
|
-
when Array
|
24
|
-
return a unless a.length == b.length
|
25
|
-
a.map.with_index do |a_value, idx|
|
26
|
-
b_value = b[idx]
|
27
|
-
diff(a_value, b_value)
|
28
|
-
end.reject do |el|
|
29
|
-
el == {}
|
30
|
-
end
|
31
|
-
else
|
32
|
-
a
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -2,7 +2,9 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
class Response
|
5
|
+
|
5
6
|
attr_reader :status, :body
|
7
|
+
|
6
8
|
def initialize(response)
|
7
9
|
@status = response.status
|
8
10
|
@body = [].tap do |body_data|
|
@@ -13,9 +15,11 @@ module Ecoportal
|
|
13
15
|
@body = JSON.parse(@body.to_s) rescue nil
|
14
16
|
response
|
15
17
|
end
|
18
|
+
|
16
19
|
def success?
|
17
20
|
@status.success?
|
18
21
|
end
|
22
|
+
|
19
23
|
def print
|
20
24
|
puts "Status: #{@status.code}"
|
21
25
|
puts "Body:"
|
@@ -3,35 +3,43 @@ module Ecoportal
|
|
3
3
|
module Common
|
4
4
|
class WrappedResponse
|
5
5
|
include Enumerable
|
6
|
+
|
6
7
|
attr_reader :response, :result
|
8
|
+
|
7
9
|
def initialize(response, klass)
|
8
10
|
@response = response
|
9
11
|
@klass = klass
|
10
12
|
|
11
13
|
if @response.success?
|
12
|
-
@result =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
@result =
|
15
|
+
if @response.body.is_a?(Array)
|
16
|
+
@response.body.map do |doc|
|
17
|
+
@klass.new(doc)
|
18
|
+
end
|
19
|
+
else
|
20
|
+
@klass.new(@response.body)
|
21
|
+
end
|
19
22
|
end
|
20
23
|
end
|
24
|
+
|
21
25
|
def body
|
22
26
|
response.body.to_s
|
23
27
|
end
|
28
|
+
|
24
29
|
def each
|
25
|
-
[
|
30
|
+
[*result].each do |doc|
|
26
31
|
yield doc
|
27
32
|
end
|
28
33
|
end
|
34
|
+
|
29
35
|
def status
|
30
|
-
|
36
|
+
response.status.code
|
31
37
|
end
|
38
|
+
|
32
39
|
def success?
|
33
|
-
|
40
|
+
response.success?
|
34
41
|
end
|
42
|
+
|
35
43
|
def print
|
36
44
|
if success?
|
37
45
|
each(&:print)
|
@@ -39,6 +47,7 @@ module Ecoportal
|
|
39
47
|
puts "Request failed."
|
40
48
|
end
|
41
49
|
end
|
50
|
+
|
42
51
|
end
|
43
52
|
end
|
44
53
|
end
|
@@ -1,34 +1,31 @@
|
|
1
1
|
module Ecoportal
|
2
2
|
module API
|
3
|
-
class Internal
|
3
|
+
class Internal < V1
|
4
4
|
include Common::Logging
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def people
|
16
|
-
Internal::People.new(client)
|
17
|
-
end
|
18
|
-
def person_schemas
|
19
|
-
Internal::PersonSchemas.new(client)
|
20
|
-
end
|
5
|
+
|
6
|
+
VERSION = "v0"
|
7
|
+
class_resolver :people_class, "Ecoportal::API::Internal::People"
|
8
|
+
class_resolver :person_schemas_class, "Ecoportal::API::Internal::PersonSchemas"
|
9
|
+
|
10
|
+
class_resolver :policy_groups_class, "Ecoportal::API::Internal::PolicyGroups"
|
11
|
+
class_resolver :login_providers_class, "Ecoportal::API::Internal::LoginProviders"
|
12
|
+
|
13
|
+
# Obtain specific object for policy groups api requests.
|
14
|
+
# @return [PolicyGroups] an instance object ready to make policy groups api requests.
|
21
15
|
def policy_groups
|
22
|
-
|
16
|
+
policy_groups_class.new(client)
|
23
17
|
end
|
18
|
+
|
19
|
+
# Obtain specific object for login providers api requests.
|
20
|
+
# @return [LoginProviders] an instance object ready to make login providers api requests.
|
24
21
|
def login_providers
|
25
|
-
|
22
|
+
login_providers_class.new(client)
|
26
23
|
end
|
27
24
|
end
|
28
25
|
end
|
29
26
|
end
|
30
27
|
|
31
|
-
require 'ecoportal/api/internal/people'
|
32
28
|
require 'ecoportal/api/internal/person_schemas'
|
33
29
|
require 'ecoportal/api/internal/policy_groups'
|
34
30
|
require 'ecoportal/api/internal/login_providers'
|
31
|
+
require 'ecoportal/api/internal/people'
|
@@ -2,14 +2,36 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
class Internal
|
4
4
|
class Account < Common::BaseModel
|
5
|
-
passthrough :policy_group_ids, :landing_page_id, :permissions_preset, :permissions_custom,
|
5
|
+
passthrough :policy_group_ids, :landing_page_id, :permissions_preset, :permissions_custom,
|
6
|
+
:preferences, :prefilter, :filter_tags, :login_provider_ids, :starred_ids, :accept_eula,
|
7
|
+
:send_invites, :default_tag
|
8
|
+
|
9
|
+
class_resolver :preferences_class, "Ecoportal::API::Internal::Preferences"
|
10
|
+
class_resolver :permissions_class, "Ecoportal::API::Internal::Permissions"
|
11
|
+
|
12
|
+
embeds_one :permissions, key: "permissions_custom", klass: :permissions_class
|
13
|
+
embeds_one :preferences, klass: :preferences_class
|
6
14
|
|
7
15
|
VALID_TAG_REGEX = /^[A-Za-z0-9 &_'\/-]+$/
|
8
16
|
|
17
|
+
# Sets the `permissions_preset`.
|
18
|
+
# @note basically the same as `permissions_preset=` but when `"custom"`, it's changed to `nil`
|
19
|
+
# @param value [nil, String] preset name.
|
9
20
|
def preset=(value)
|
10
21
|
self.permissions_preset = value == "custom" ? nil : value
|
11
22
|
end
|
12
23
|
|
24
|
+
# Gets the `permissions_preset`.
|
25
|
+
# @note basically the same as `permissions_preset` but when 'nil', it returns `"custom"` instead
|
26
|
+
# @return [nil, String] preset name.
|
27
|
+
def preset
|
28
|
+
self.permissions_preset.nil? ? "custom" : self.permissions_preset
|
29
|
+
end
|
30
|
+
|
31
|
+
# Validates the string tags of the array, and sets the `filter_tags` property of the account.
|
32
|
+
# @note all is set in upper case.
|
33
|
+
# @raise [Exception] if there was any invalid string tag.
|
34
|
+
# @param value [Array<String>] array of tags.
|
13
35
|
def filter_tags=(value)
|
14
36
|
unless value.is_a?(Array)
|
15
37
|
raise "filter_tags= needs to be passed an Array, got #{value.class}"
|
@@ -22,10 +44,6 @@ module Ecoportal
|
|
22
44
|
end
|
23
45
|
end
|
24
46
|
|
25
|
-
def preset
|
26
|
-
self.permissions_preset.nil? ? "custom" : self.permissions_preset
|
27
|
-
end
|
28
|
-
|
29
47
|
def as_json
|
30
48
|
super.tap do |hash|
|
31
49
|
if preset == "custom"
|
@@ -37,17 +55,6 @@ module Ecoportal
|
|
37
55
|
end
|
38
56
|
end
|
39
57
|
|
40
|
-
def permissions
|
41
|
-
return @permissions if defined?(@permissions)
|
42
|
-
doc["permissions_custom"] ||= {}
|
43
|
-
@permissions = Internal::Permissions.new(doc["permissions_custom"])
|
44
|
-
end
|
45
|
-
|
46
|
-
def preferences
|
47
|
-
return @preferences if defined?(@preferences)
|
48
|
-
doc["preferences"] ||= {}
|
49
|
-
@preferences = Internal::Preferences.new(doc["preferences"])
|
50
|
-
end
|
51
58
|
end
|
52
59
|
end
|
53
60
|
end
|
@@ -1,20 +1,30 @@
|
|
1
1
|
module Ecoportal
|
2
2
|
module API
|
3
3
|
class Internal
|
4
|
+
# @attr_reader client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
|
4
5
|
class LoginProviders
|
5
6
|
include Enumerable
|
7
|
+
|
6
8
|
attr_reader :client
|
9
|
+
|
10
|
+
# @param client [Common::Client] a `Common::Client` object that holds the configuration of the api connection.
|
11
|
+
# @return [LoginProviders] an instance object ready to make login providers api requests.
|
7
12
|
def initialize(client)
|
8
13
|
@client = client
|
9
14
|
end
|
15
|
+
|
16
|
+
# Gets all the login providers via api request.
|
17
|
+
# @return [Enumerable<LoginProvider>] an `Enumerable` with all login providers already wrapped as `LoginProvider` objects.
|
10
18
|
def get_all
|
11
19
|
response = @client.get("/login_providers")
|
12
20
|
Common::WrappedResponse.new(response, Internal::LoginProvider)
|
13
21
|
end
|
22
|
+
|
14
23
|
def each(&block)
|
15
24
|
return to_enum(:each) unless block
|
16
25
|
get_all.each(&block)
|
17
26
|
end
|
27
|
+
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
@@ -1,19 +1,14 @@
|
|
1
|
-
require 'ecoportal/api/common/doc_helpers'
|
2
1
|
module Ecoportal
|
3
2
|
module API
|
4
3
|
class Internal
|
5
4
|
class People < V1::People
|
6
|
-
|
7
|
-
|
8
|
-
def person_class
|
9
|
-
Internal::Person
|
10
|
-
end
|
5
|
+
class_resolver :person_class, "Ecoportal::API::Internal::Person"
|
11
6
|
end
|
12
7
|
end
|
13
8
|
end
|
14
9
|
end
|
15
10
|
|
16
|
-
require 'ecoportal/api/internal/person'
|
17
|
-
require 'ecoportal/api/internal/person_details'
|
18
11
|
require 'ecoportal/api/internal/schema_field_value'
|
12
|
+
require 'ecoportal/api/internal/person_details'
|
19
13
|
require 'ecoportal/api/internal/account'
|
14
|
+
require 'ecoportal/api/internal/person'
|
@@ -2,7 +2,7 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
class Internal
|
4
4
|
class Permissions < Common::BaseModel
|
5
|
-
passthrough :files, :data, :reports, :organization, :people, :pages, :page_editor, :registers
|
5
|
+
passthrough :files, :data, :reports, :organization, :people, :pages, :page_editor, :registers
|
6
6
|
end
|
7
7
|
end
|
8
8
|
end
|
@@ -1,17 +1,23 @@
|
|
1
1
|
module Ecoportal
|
2
2
|
module API
|
3
3
|
class Internal
|
4
|
+
# @attr account [Account, nil] the account of the person or `nil` if missing.
|
4
5
|
class Person < V1::Person
|
6
|
+
class_resolver :person_details_class, "Ecoportal::API::Internal::PersonDetails"
|
7
|
+
class_resolver :person_account_class, "Ecoportal::API::Internal::Account"
|
8
|
+
embeds_one :account, nullable: true, klass: :person_account_class
|
9
|
+
|
5
10
|
def as_json
|
6
11
|
super.update("account" => account&.as_json)
|
7
12
|
end
|
8
13
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
14
|
+
# Sets the Account to the person, depending on the paramter received:
|
15
|
+
# - `nil`: blanks the account.
|
16
|
+
# - `Account`: sets a copy of the object param as account.
|
17
|
+
# - `Hash`: slices the properties of `Account`.
|
18
|
+
# @note this method does not make dirty the account (meaning that `as_json` will be an empty hash `{}`)
|
19
|
+
# @param value [nil, Account, Hash] value to be set.
|
20
|
+
# @return [nil, Account] the resulting `Account` set to the person.
|
15
21
|
def account=(value)
|
16
22
|
case value
|
17
23
|
when NilClass
|
@@ -19,7 +25,9 @@ module Ecoportal
|
|
19
25
|
when Internal::Account
|
20
26
|
doc["account"] = JSON.parse(value.to_json)
|
21
27
|
when Hash
|
22
|
-
# TODO
|
28
|
+
# TODO:
|
29
|
+
# => missing send_invites
|
30
|
+
# => better use an Internal::Account::PROPERTIES const for this kind of stuff
|
23
31
|
doc["account"] = value.slice(%w[policy_group_ids landing_page_id permissions_preset permissions_custom preferences prefilter filter_tags login_provider_ids starred_ids])
|
24
32
|
else
|
25
33
|
# TODO
|
@@ -29,19 +37,13 @@ module Ecoportal
|
|
29
37
|
return account
|
30
38
|
end
|
31
39
|
|
40
|
+
# Adds an empty account to the person.
|
41
|
+
# @note if the person exists, and does not have an account, an this will send an invite.
|
42
|
+
# @note this will **not** change the account properties of this person.
|
32
43
|
def add_account
|
33
44
|
self.account = {}
|
34
45
|
end
|
35
46
|
|
36
|
-
private
|
37
|
-
|
38
|
-
def person_schema_class
|
39
|
-
Internal::PersonSchema
|
40
|
-
end
|
41
|
-
|
42
|
-
def person_details_class
|
43
|
-
Internal::PersonDetails
|
44
|
-
end
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -2,11 +2,7 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
class Internal
|
4
4
|
class PersonDetails < V1::PersonDetails
|
5
|
-
|
6
|
-
|
7
|
-
def schema_field_value_class
|
8
|
-
Internal::SchemaFieldValue
|
9
|
-
end
|
5
|
+
class_resolver :schema_field_value_class, "Ecoportal::API::Internal::SchemaFieldValue"
|
10
6
|
end
|
11
7
|
end
|
12
8
|
end
|
@@ -2,14 +2,10 @@ module Ecoportal
|
|
2
2
|
module API
|
3
3
|
class Internal
|
4
4
|
class PersonSchemas < V1::PersonSchemas
|
5
|
-
|
6
|
-
|
7
|
-
def person_schema_class
|
8
|
-
Internal::PersonSchema
|
9
|
-
end
|
5
|
+
class_resolver :person_schema_class, "Ecoportal::API::Internal::PersonSchema"
|
10
6
|
end
|
11
7
|
end
|
12
8
|
end
|
13
9
|
end
|
14
10
|
|
15
|
-
require 'ecoportal/api/internal/person_schema'
|
11
|
+
require 'ecoportal/api/internal/person_schema'
|