zaikio-directory 0.0.6 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8e9927801204a0fd2cbf4f4b33916e5eb096c864fa9029c0397c36c9e17fad2b
4
- data.tar.gz: 0d178e8cf201ab36d6830e9f897cfbc4aeb6349275ce310ecfcf065b4d2ff220
3
+ metadata.gz: 07fb7419f188af643dfaa5440d77827a4bedd91b820e18a6714b8d45f194d2f7
4
+ data.tar.gz: 878c7ba7a273c9526c556727cc9673d02956298d5b820a1f724949557d73eab0
5
5
  SHA512:
6
- metadata.gz: 9b3569ef1779d9ab6a1cd7969f34884a75908c8b2b4d2a8b4099d6167abab015aa0e50d22c7baa4dda41a20de58e5fe87f3b096d50508ba86ef99face7b0bfd5
7
- data.tar.gz: 2c711726d46af8c22fbd163f3e04a13fef7eb6357e93f67feef105bfb1c559e23b5945ce4078974158baa93ba4e95fe80d1de19732ae914869bd7865bdd6bf74
6
+ metadata.gz: ad30c796f5615df1ef8c1f61d8a11f01460d085db6c2e2e054bb25e588b36fec61ac657c66b019b1b6f5412f8568211af50b3aa25797c7cc31a8a63db89ccded
7
+ data.tar.gz: 65c882cdf8824f5bed2d7c1da73d7b8dcf03e89d74961b72010f04b365da04374289b319e5ef4a93a33f7d73641dde2fd869852dd215fa938443389c728e5e0a
data/README.md CHANGED
@@ -26,7 +26,7 @@ $ gem install zaikio-directory
26
26
  # config/initializers/zaikio_directory.rb
27
27
 
28
28
  Zaikio::Directory.configure do |config|
29
- config.host :production # sandbox or production
29
+ config.environment = :production # sandbox or production
30
30
  end
31
31
  ```
32
32
 
@@ -106,3 +106,38 @@ Zaikio::Directory.with_token(token) do
106
106
  Zaikio::Directory::RevokedAccessToken.create
107
107
  end
108
108
  ```
109
+
110
+ ### Error Handling
111
+
112
+ If an unexpected error occurs with an API call (i.e. an error that has no status code `2xx`, `404` or `422`) then a `Zaikio::ConnectionError` is thrown automatically (for `404` there will be a `Zaikio::ResourceNotFound`).
113
+
114
+ This can be easily caught using the `with_fallback` method. We recommend to always work with fallbacks.
115
+
116
+ ```rb
117
+ Zaikio::Directory.with_token(token) do
118
+ person = Zaikio::Directory::CurrentPerson
119
+ .find_with_fallback(Zaikio::Directory::CurrentPerson.new(full_name: "Hello World"))
120
+
121
+ person.organizations # Automatically uses empty array as fallback
122
+ end
123
+
124
+ Zaikio::Directory.with_token(token) do
125
+ organization = Zaikio::Directory::CurrentOrganization.new
126
+
127
+ organization.machines.with_fallback.all
128
+ organization.machines
129
+ .with_fallback(Zaikio::Directory::Machine.new(name: 'My Machine'))
130
+ .find('machine-id')
131
+
132
+
133
+ organization.machines
134
+ .with_fallback(Zaikio::Directory::Machine.new(name: 'My Machine'))
135
+ .find('machine-does-not-exist') # => raises Zaikio::ResourceNotFound
136
+
137
+ begin
138
+ organization.machines.create(name: "Machine Name")
139
+ rescue Zaikio::ConnectionError
140
+ # Do something
141
+ end
142
+ end
143
+ ```
@@ -6,13 +6,16 @@ require "zaikio/directory/authorization_middleware"
6
6
  require "zaikio/directory/basic_auth_middleware"
7
7
 
8
8
  # Models
9
+ require "zaikio/error"
9
10
  require "zaikio/directory/base"
11
+ require "zaikio/directory/asset"
10
12
  require "zaikio/directory/organization_membership"
11
13
  require "zaikio/directory/business_relationship"
12
14
  require "zaikio/directory/organization"
13
15
  require "zaikio/directory/person"
14
16
  require "zaikio/directory/machine"
15
17
  require "zaikio/directory/software"
18
+ require "zaikio/directory/specialist"
16
19
  require "zaikio/directory/site"
17
20
  require "zaikio/directory/membership"
18
21
  require "zaikio/directory/current_person"
@@ -25,24 +28,25 @@ module Zaikio
25
28
  module Directory
26
29
  class << self
27
30
  attr_accessor :configuration
31
+ class_attribute :connection
28
32
 
29
33
  def configure
30
- @connection = nil
34
+ self.connection = nil
31
35
  self.configuration ||= Configuration.new
32
36
  yield(configuration)
33
37
 
34
- Base.connection = connection
38
+ Base.connection = create_connection
35
39
  end
36
40
 
37
41
  def with_token(token)
38
- AuthorizationMiddleware.token token
42
+ AuthorizationMiddleware.token = token
39
43
  yield
40
44
  ensure
41
45
  AuthorizationMiddleware.reset_token
42
46
  end
43
47
 
44
48
  def with_basic_auth(login, password)
45
- BasicAuthMiddleware.credentials [login, password]
49
+ BasicAuthMiddleware.credentials = [login, password]
46
50
  yield
47
51
  ensure
48
52
  BasicAuthMiddleware.reset_credentials
@@ -56,8 +60,8 @@ module Zaikio
56
60
  create_token_data(payload)
57
61
  end
58
62
 
59
- def connection
60
- @connection ||= Faraday.new(url: "#{configuration.host}/api/v1") do |c|
63
+ def create_connection
64
+ self.connection = Faraday.new(url: "#{configuration.host}/api/v1") do |c|
61
65
  c.request :json
62
66
  c.response :logger, configuration&.logger
63
67
  c.use JSONParser
@@ -0,0 +1,55 @@
1
+ module Zaikio
2
+ module Directory
3
+ module Asset
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ # Callbacks
8
+ after_create :make_organization_owner
9
+ end
10
+
11
+ def make_organization_owner
12
+ if Zaikio::Directory.current_token_data.subject_type == "Organization"
13
+ self.class.request(:post,
14
+ "#{collection_name}/#{id}/#{singular_name}_ownership")
15
+ else
16
+ org_path = "person/organizations/#{organization_id}"
17
+ self.class.request(:post,
18
+ "#{org_path}/#{collection_name}/#{id}/#{singular_name}_ownership")
19
+ end
20
+ end
21
+
22
+ def destroy
23
+ if Zaikio::Directory.current_token_data.subject_type == "Organization"
24
+ self.class.request(:delete,
25
+ "#{collection_name}/#{id}/#{singular_name}_ownership")
26
+ else
27
+ org_path = "person/organizations/#{owner_id || organization_id}"
28
+ self.class.request(:delete,
29
+ "#{org_path}/#{collection_name}/#{id}/#{singular_name}_ownership")
30
+ end
31
+ end
32
+
33
+ def specification
34
+ prefix = if Zaikio::Directory.current_token_data.subject_type == "Person"
35
+ "person/organizations/#{owner_id || organization_id}/"
36
+ else
37
+ ""
38
+ end
39
+ self.class.request(:get,
40
+ "#{prefix}#{collection_name}/#{id}/#{singular_name}_specification")
41
+ &.body&.dig("data")
42
+ end
43
+
44
+ private
45
+
46
+ def collection_name
47
+ self.class.name.demodulize.underscore.pluralize
48
+ end
49
+
50
+ def singular_name
51
+ self.class.name.demodulize.underscore
52
+ end
53
+ end
54
+ end
55
+ end
@@ -4,12 +4,10 @@ require "jwt"
4
4
  module Zaikio
5
5
  module Directory
6
6
  class AuthorizationMiddleware < Faraday::Middleware
7
- def self.reset_token
8
- @token = nil
9
- end
7
+ class_attribute :token
10
8
 
11
- def self.token(token = nil)
12
- @token = token || @token
9
+ def self.reset_token
10
+ self.token = nil
13
11
  end
14
12
 
15
13
  def call(request_env)
@@ -4,12 +4,10 @@ require "base64"
4
4
  module Zaikio
5
5
  module Directory
6
6
  class BasicAuthMiddleware < Faraday::Middleware
7
- def self.reset_credentials
8
- @credentials = nil
9
- end
7
+ class_attribute :credentials
10
8
 
11
- def self.credentials(credentials = nil)
12
- @credentials = credentials || @credentials
9
+ def self.reset_credentials
10
+ self.credentials = nil
13
11
  end
14
12
 
15
13
  def call(request_env)
@@ -9,24 +9,34 @@ module Zaikio
9
9
  all.find_one
10
10
  end
11
11
 
12
+ def self.find_with_fallback(fallback)
13
+ all.with_fallback(fallback).find_one
14
+ end
15
+
12
16
  # Associations
13
17
  has_many :memberships, class_name: "Zaikio::Directory::Membership",
14
- uri: "organization/memberships"
18
+ uri: "organization/memberships(/:id)"
15
19
  has_many :business_relationships, class_name: "Zaikio::Directory::BusinessRelationship",
16
- uri: "organization/business_relationships"
20
+ uri: "organization/business_relationships(/:id)"
17
21
  has_many :software, class_name: "Zaikio::Directory::Software",
18
- uri: "software"
22
+ uri: "software(/:id)"
19
23
  has_many :machines, class_name: "Zaikio::Directory::Machine",
20
- uri: "machines"
24
+ uri: "machines(/:id)"
25
+ has_many :specialists, class_name: "Zaikio::Directory::Specialist",
26
+ uri: "specialists(/:id)"
21
27
  has_many :sites, class_name: "Zaikio::Directory::Site",
22
- uri: "sites"
28
+ uri: "sites(/:id)"
23
29
 
24
30
  def fetch
25
31
  self.attributes = get
26
32
  end
27
33
 
34
+ def reload
35
+ self.attributes = self.class.find.attributes
36
+ end
37
+
28
38
  def members
29
- memberships.map(&:person)
39
+ memberships.with_fallback.map(&:person)
30
40
  end
31
41
  end
32
42
  end
@@ -9,6 +9,10 @@ module Zaikio
9
9
  all.find_one
10
10
  end
11
11
 
12
+ def self.find_with_fallback(fallback)
13
+ all.with_fallback(fallback).find_one
14
+ end
15
+
12
16
  # Associations
13
17
  has_many :organization_memberships, class_name: "Zaikio::Directory::OrganizationMembership",
14
18
  uri: nil
@@ -18,7 +22,7 @@ module Zaikio
18
22
  end
19
23
 
20
24
  def organizations
21
- organization_memberships.map(&:organization)
25
+ organization_memberships.with_fallback.map(&:organization)
22
26
  end
23
27
 
24
28
  def admin_organizations
@@ -3,13 +3,33 @@ require "multi_json"
3
3
  module Zaikio
4
4
  module Directory
5
5
  class JSONParser < Faraday::Response::Middleware
6
- def parse(body)
6
+ def on_complete(env)
7
+ connection_error(env) unless /^(2\d\d)|422|404$/.match?(env.status.to_s)
8
+
9
+ raise Spyke::ResourceNotFound if env.status.to_s == "404"
10
+
11
+ env.body = parse_body(env.body)
12
+ end
13
+
14
+ def connection_error(env)
15
+ Zaikio::Directory.configuration.logger
16
+ .error("Zaikio::Directory Status Code #{env.status}, #{env.body}")
17
+ raise Spyke::ConnectionError, "Status Code #{env.status}, #{env.body}"
18
+ end
19
+
20
+ def parse_body(body)
7
21
  json = MultiJson.load(body, symbolize_keys: true)
8
22
  {
9
23
  data: json,
10
24
  metadata: {},
11
25
  errors: json.is_a?(Hash) ? json[:errors] : {}
12
26
  }
27
+ rescue MultiJson::ParseError
28
+ {
29
+ data: {},
30
+ metadata: {},
31
+ errors: {}
32
+ }
13
33
  end
14
34
  end
15
35
  end
@@ -1,29 +1,10 @@
1
1
  module Zaikio
2
2
  module Directory
3
3
  class Machine < Base
4
+ include Asset
5
+
4
6
  uri "machines(/:id)"
5
7
  include_root_in_json :machine
6
-
7
- # Callbacks
8
- after_create :make_organization_owner
9
-
10
- def make_organization_owner
11
- if Zaikio::Directory.current_token_data.subject_type == "Organization"
12
- self.class.request(:post, "machines/#{id}/machine_ownership")
13
- else
14
- org_path = "person/organizations/#{organization_id}"
15
- self.class.request(:post, "#{org_path}/machines/#{id}/machine_ownership")
16
- end
17
- end
18
-
19
- def destroy
20
- if Zaikio::Directory.current_token_data.subject_type == "Organization"
21
- self.class.request(:delete, "machines/#{id}/machine_ownership")
22
- else
23
- org_path = "person/organizations/#{owner_id || organization_id}"
24
- self.class.request(:delete, "#{org_path}/machines/#{id}/machine_ownership")
25
- end
26
- end
27
8
  end
28
9
  end
29
10
  end
@@ -12,6 +12,8 @@ module Zaikio
12
12
  uri: "person/organizations/:organization_id/software"
13
13
  has_many :machines, class_name: "Zaikio::Directory::Machine",
14
14
  uri: "person/organizations/:organization_id/machines"
15
+ has_many :specialists, class_name: "Zaikio::Directory::Specialist",
16
+ uri: "person/organizations/:organization_id/specialists"
15
17
  has_many :sites, class_name: "Zaikio::Directory::Site",
16
18
  uri: "person/organizations/:organization_id/sites"
17
19
  end
@@ -1,28 +1,15 @@
1
1
  module Zaikio
2
2
  module Directory
3
3
  class Software < Base
4
+ include Asset
5
+
4
6
  uri "software(/:id)"
5
7
  include_root_in_json :software
6
8
 
7
- # Callbacks
8
- after_create :make_organization_owner
9
-
10
- def make_organization_owner
11
- if Zaikio::Directory.current_token_data.subject_type == "Organization"
12
- self.class.request(:post, "software/#{id}/software_ownership")
13
- else
14
- org_path = "person/organizations/#{organization_id}"
15
- self.class.request(:post, "#{org_path}/software/#{id}/software_ownership")
16
- end
17
- end
9
+ private
18
10
 
19
- def destroy
20
- if Zaikio::Directory.current_token_data.subject_type == "Organization"
21
- self.class.request(:delete, "software/#{id}/software_ownership")
22
- else
23
- org_path = "person/organizations/#{owner_id || organization_id}"
24
- self.class.request(:delete, "#{org_path}/software/#{id}/software_ownership")
25
- end
11
+ def collection_name
12
+ "software"
26
13
  end
27
14
  end
28
15
  end
@@ -0,0 +1,10 @@
1
+ module Zaikio
2
+ module Directory
3
+ class Specialist < Base
4
+ include Asset
5
+
6
+ uri "specialists(/:id)"
7
+ include_root_in_json :specialist
8
+ end
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  module Zaikio
2
2
  module Directory
3
- VERSION = "0.0.6".freeze
3
+ VERSION = "0.0.11".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,16 @@
1
+ module Zaikio
2
+ class Error < StandardError; end
3
+ class ConnectionError < Zaikio::Error; end
4
+ class ResourceNotFound < Zaikio::Error; end
5
+ end
6
+
7
+ module Spyke
8
+ instance_eval do
9
+ # avoid warning: already initialized constant
10
+ remove_const("ConnectionError")
11
+ remove_const("ResourceNotFound")
12
+ end
13
+
14
+ ConnectionError = Class.new Zaikio::ConnectionError
15
+ ResourceNotFound = Class.new Zaikio::ResourceNotFound
16
+ end
metadata CHANGED
@@ -1,14 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zaikio-directory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
- - Zaikio GmbH
7
+ - crispymtn
8
+ - Jalyna Schröder
9
+ - Martin Spickermann
8
10
  autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2020-04-08 00:00:00.000000000 Z
13
+ date: 2020-06-15 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
16
  name: jwt
@@ -68,7 +70,9 @@ dependencies:
68
70
  version: 5.3.4
69
71
  description: Ruby API Client for Zaikio's Directory
70
72
  email:
73
+ - op@crispymtn.com
71
74
  - js@crispymtn.com
75
+ - spickermann@gmail.com
72
76
  executables: []
73
77
  extensions: []
74
78
  extra_rdoc_files: []
@@ -77,6 +81,7 @@ files:
77
81
  - README.md
78
82
  - Rakefile
79
83
  - lib/zaikio/directory.rb
84
+ - lib/zaikio/directory/asset.rb
80
85
  - lib/zaikio/directory/authorization_middleware.rb
81
86
  - lib/zaikio/directory/base.rb
82
87
  - lib/zaikio/directory/basic_auth_middleware.rb
@@ -95,7 +100,9 @@ files:
95
100
  - lib/zaikio/directory/role.rb
96
101
  - lib/zaikio/directory/site.rb
97
102
  - lib/zaikio/directory/software.rb
103
+ - lib/zaikio/directory/specialist.rb
98
104
  - lib/zaikio/directory/version.rb
105
+ - lib/zaikio/error.rb
99
106
  homepage: https://www.zaikio.com/
100
107
  licenses:
101
108
  - MIT