zaikio-directory 0.0.8 → 0.1.1

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: 83519e37312c30b97c65aca908bbbc1065a6781e2050241a6f1c9c8f9d36e32a
4
- data.tar.gz: 90f53637753cb130d93565027def981f13906ea7c940b118345b078bb1972380
3
+ metadata.gz: 90ecc69c9bfccc037868c41f76b665d456a9588bf9c573a3a53833d81b844419
4
+ data.tar.gz: 0c12da5059d2aadd77c4ec3f4f371c41582d77f0c866911df83216c42ee62b9a
5
5
  SHA512:
6
- metadata.gz: c459a05fdcf957bd0fe8091a9a377480f0467a2978027c4baca49dee853c1f75a3be1b7bfb1864c5f1366736ae5446f729bd6fd55f9cdf0734e1fa3baa6e4554
7
- data.tar.gz: b1f185b1e5c6f9a3b8a5240ad119885694f5a8305cc11d2384119a538fc48aa658a1d160b151d155f8162ddfd7a24f44a7bd4ac2e6f5b9b97dbb12f44e397c87
6
+ metadata.gz: 4d084614b98a1ca2867b7806eb5f6edeeaab2ff29e4c4724de48b3edeadbffb926dccd7a4338f541e8358dd8dc90929b0b9576eda82b82f0195521ac8ce1fe0c
7
+ data.tar.gz: ce5486bccd57d2444533c6cb08380ad103af33ffafe9f41bec02daf1914afeca6f07c07eeb3bd528dc3bd9a7bd655dedf5b30d4fb70cbfcff2acb62992179d2f
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.1.1] - 2020-09-02
11
+
12
+ ### Fixed
13
+ - Thread-Safety on current access token
14
+
15
+ ## [0.1.0] - 2020-08-24
16
+
17
+ ### Added
18
+ - Added subscriptions (migration required)
19
+
20
+ [Unreleased]: https://github.com/crispymtn/zaikio-directory-ruby/compare/v0.1.1...HEAD
21
+ [0.1.1]: https://github.com/crispymtn/zaikio-directory-ruby/compare/5c6cb4dbcac316733560ddb2b1e13b53e55eb66e...v0.1.1
22
+ [0.1.0]: https://github.com/crispymtn/zaikio-directory-ruby/compare/d149fb4c0abe6005f123def3952d2dd2ef6404bb...29889d8a6a496542a81e05688da2a46cf4c44188
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
 
@@ -35,7 +35,7 @@ end
35
35
 
36
36
  The Directory Client has an ORM like design. However, we distinguish between the contexts of the organization and the person.
37
37
 
38
- For the requests to work, a valid JSON Web token with the correct OAuth Scopes must always be provided. Please refer to [zakio-oauth_client](#todo).
38
+ For the requests to work, a valid JSON Web token with the correct OAuth Scopes must always be provided. Please refer to [zakio-oauth_client](https://github.com/crispymtn/zaikio-oauth_client).
39
39
 
40
40
  If you want to know which actions are available and which scopes are required, please refer to the [Directory API Reference](https://docs.zaikio.com/api/directory/directory.html).
41
41
 
@@ -97,6 +97,10 @@ end
97
97
  ```rb
98
98
  Zaikio::Directory.with_basic_auth(client_id, client_secret) do
99
99
  connections = Zaikio::Directory::Connection.all
100
+ subscription = Zaikio::Directory::Subscription.find("Organization-b1475f65-236c-58b8-96e1-e1778b43beb7")
101
+ subscription.plan # => "advanced"
102
+ subscription.activate!
103
+ subscription.increment_usage_by!(:orders_created, 12)
100
104
  end
101
105
 
102
106
  roles = Zaikio::Directory::Role.all
@@ -8,12 +8,14 @@ require "zaikio/directory/basic_auth_middleware"
8
8
  # Models
9
9
  require "zaikio/error"
10
10
  require "zaikio/directory/base"
11
+ require "zaikio/directory/asset"
11
12
  require "zaikio/directory/organization_membership"
12
13
  require "zaikio/directory/business_relationship"
13
14
  require "zaikio/directory/organization"
14
15
  require "zaikio/directory/person"
15
16
  require "zaikio/directory/machine"
16
17
  require "zaikio/directory/software"
18
+ require "zaikio/directory/specialist"
17
19
  require "zaikio/directory/site"
18
20
  require "zaikio/directory/membership"
19
21
  require "zaikio/directory/current_person"
@@ -21,29 +23,31 @@ require "zaikio/directory/current_organization"
21
23
  require "zaikio/directory/role"
22
24
  require "zaikio/directory/revoked_access_token"
23
25
  require "zaikio/directory/connection"
26
+ require "zaikio/directory/subscription"
24
27
 
25
28
  module Zaikio
26
29
  module Directory
27
30
  class << self
28
31
  attr_accessor :configuration
32
+ class_attribute :connection
29
33
 
30
34
  def configure
31
- @connection = nil
35
+ self.connection = nil
32
36
  self.configuration ||= Configuration.new
33
37
  yield(configuration)
34
38
 
35
- Base.connection = connection
39
+ Base.connection = create_connection
36
40
  end
37
41
 
38
42
  def with_token(token)
39
- AuthorizationMiddleware.token token
43
+ AuthorizationMiddleware.token = token
40
44
  yield
41
45
  ensure
42
46
  AuthorizationMiddleware.reset_token
43
47
  end
44
48
 
45
49
  def with_basic_auth(login, password)
46
- BasicAuthMiddleware.credentials [login, password]
50
+ BasicAuthMiddleware.credentials = [login, password]
47
51
  yield
48
52
  ensure
49
53
  BasicAuthMiddleware.reset_credentials
@@ -57,8 +61,9 @@ module Zaikio
57
61
  create_token_data(payload)
58
62
  end
59
63
 
60
- def connection
61
- @connection ||= Faraday.new(url: "#{configuration.host}/api/v1") do |c|
64
+ def create_connection
65
+ self.connection = Faraday.new(url: "#{configuration.host}/api/v1",
66
+ ssl: { verify: configuration.environment != :test }) do |c|
62
67
  c.request :json
63
68
  c.response :logger, configuration&.logger
64
69
  c.use JSONParser
@@ -70,7 +75,7 @@ module Zaikio
70
75
 
71
76
  private
72
77
 
73
- def create_token_data(payload) # rubocop:disable Metrics/AbcSize
78
+ def create_token_data(payload)
74
79
  subjects = payload["sub"].split(">")
75
80
 
76
81
  OpenStruct.new(
@@ -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
@@ -1,15 +1,22 @@
1
1
  require "faraday"
2
2
  require "jwt"
3
+ require "concurrent"
3
4
 
4
5
  module Zaikio
5
6
  module Directory
6
7
  class AuthorizationMiddleware < Faraday::Middleware
7
- def self.reset_token
8
- @token = nil
8
+ def self.token
9
+ @token ||= Concurrent::ThreadLocalVar.new { nil }
10
+ @token.value
11
+ end
12
+
13
+ def self.token=(value)
14
+ @token ||= Concurrent::ThreadLocalVar.new { nil }
15
+ @token.value = value
9
16
  end
10
17
 
11
- def self.token(token = nil)
12
- @token = token || @token
18
+ def self.reset_token
19
+ self.token = nil
13
20
  end
14
21
 
15
22
  def call(request_env)
@@ -4,12 +4,20 @@ require "base64"
4
4
  module Zaikio
5
5
  module Directory
6
6
  class BasicAuthMiddleware < Faraday::Middleware
7
- def self.reset_credentials
8
- @credentials = nil
7
+ class_attribute :credentials
8
+
9
+ def self.credentials
10
+ @credentials ||= Concurrent::ThreadLocalVar.new { nil }
11
+ @credentials.value
9
12
  end
10
13
 
11
- def self.credentials(credentials = nil)
12
- @credentials = credentials || @credentials
14
+ def self.credentials=(value)
15
+ @credentials ||= Concurrent::ThreadLocalVar.new { nil }
16
+ @credentials.value = value
17
+ end
18
+
19
+ def self.reset_credentials
20
+ self.credentials = nil
13
21
  end
14
22
 
15
23
  def call(request_env)
@@ -4,11 +4,11 @@ module Zaikio
4
4
  module Directory
5
5
  class Configuration
6
6
  HOSTS = {
7
- development: "http://directory.zaikio.test",
8
- test: "http://directory.zaikio.test",
9
- staging: "https://directory.staging.zaikio.com",
10
- sandbox: "https://directory.sandbox.zaikio.com",
11
- production: "https://directory.zaikio.com"
7
+ development: "https://hub.zaikio.test",
8
+ test: "https://hub.zaikio.test",
9
+ staging: "https://hub.staging.zaikio.com",
10
+ sandbox: "https://hub.sandbox.zaikio.com",
11
+ production: "https://hub.zaikio.com"
12
12
  }.freeze
13
13
 
14
14
  attr_accessor :host
@@ -1,9 +1,19 @@
1
1
  module Zaikio
2
2
  module Directory
3
3
  class Connection < Base
4
- uri "connections"
4
+ uri "connections(/:id)"
5
5
 
6
6
  include_root_in_json :connection
7
+
8
+ def initialize(attributes = {})
9
+ if attributes["connectable_id"]
10
+ super(attributes.merge(
11
+ "id" => "#{attributes['connectable_type']}-#{attributes['connectable_id']}"
12
+ ))
13
+ else
14
+ super
15
+ end
16
+ end
7
17
  end
8
18
  end
9
19
  end
@@ -22,6 +22,8 @@ module Zaikio
22
22
  uri: "software(/:id)"
23
23
  has_many :machines, class_name: "Zaikio::Directory::Machine",
24
24
  uri: "machines(/:id)"
25
+ has_many :specialists, class_name: "Zaikio::Directory::Specialist",
26
+ uri: "specialists(/:id)"
25
27
  has_many :sites, class_name: "Zaikio::Directory::Site",
26
28
  uri: "sites(/:id)"
27
29
 
@@ -29,6 +31,10 @@ module Zaikio
29
31
  self.attributes = get
30
32
  end
31
33
 
34
+ def reload
35
+ self.attributes = self.class.find.attributes
36
+ end
37
+
32
38
  def members
33
39
  memberships.with_fallback.map(&:person)
34
40
  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
@@ -0,0 +1,27 @@
1
+ module Zaikio
2
+ module Directory
3
+ class Subscription < Base
4
+ uri "subscriptions(/:id)"
5
+
6
+ include_root_in_json :subscription
7
+
8
+ def initialize(attributes = {})
9
+ if attributes["subscriber_id"]
10
+ super(attributes.merge(
11
+ "id" => "#{attributes['subscriber_type']}-#{attributes['subscriber_id']}"
12
+ ))
13
+ else
14
+ super
15
+ end
16
+ end
17
+
18
+ def activate!
19
+ update(status: "active")
20
+ end
21
+
22
+ def increment_usage_by!(usage, by = 1)
23
+ update(increment_usages_in_current_billing_period: { usage => by })
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  module Zaikio
2
2
  module Directory
3
- VERSION = "0.0.8".freeze
3
+ VERSION = "0.1.1".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zaikio-directory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - crispymtn
@@ -10,8 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-05-11 00:00:00.000000000 Z
13
+ date: 2020-09-02 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: concurrent-ruby
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
15
29
  - !ruby/object:Gem::Dependency
16
30
  name: jwt
17
31
  requirement: !ruby/object:Gem::Requirement
@@ -30,16 +44,22 @@ dependencies:
30
44
  name: multi_json
31
45
  requirement: !ruby/object:Gem::Requirement
32
46
  requirements:
33
- - - "~>"
47
+ - - ">="
34
48
  - !ruby/object:Gem::Version
35
49
  version: 1.14.1
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 1.16.0
36
53
  type: :runtime
37
54
  prerelease: false
38
55
  version_requirements: !ruby/object:Gem::Requirement
39
56
  requirements:
40
- - - "~>"
57
+ - - ">="
41
58
  - !ruby/object:Gem::Version
42
59
  version: 1.14.1
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: 1.16.0
43
63
  - !ruby/object:Gem::Dependency
44
64
  name: oj
45
65
  requirement: !ruby/object:Gem::Requirement
@@ -77,10 +97,12 @@ executables: []
77
97
  extensions: []
78
98
  extra_rdoc_files: []
79
99
  files:
100
+ - CHANGELOG.md
80
101
  - MIT-LICENSE
81
102
  - README.md
82
103
  - Rakefile
83
104
  - lib/zaikio/directory.rb
105
+ - lib/zaikio/directory/asset.rb
84
106
  - lib/zaikio/directory/authorization_middleware.rb
85
107
  - lib/zaikio/directory/base.rb
86
108
  - lib/zaikio/directory/basic_auth_middleware.rb
@@ -99,12 +121,15 @@ files:
99
121
  - lib/zaikio/directory/role.rb
100
122
  - lib/zaikio/directory/site.rb
101
123
  - lib/zaikio/directory/software.rb
124
+ - lib/zaikio/directory/specialist.rb
125
+ - lib/zaikio/directory/subscription.rb
102
126
  - lib/zaikio/directory/version.rb
103
127
  - lib/zaikio/error.rb
104
128
  homepage: https://www.zaikio.com/
105
129
  licenses:
106
130
  - MIT
107
- metadata: {}
131
+ metadata:
132
+ changelog_uri: https://github.com/crispymtn/zaikio-directory-ruby/blob/master/CHANGELOG.md
108
133
  post_install_message:
109
134
  rdoc_options: []
110
135
  require_paths:
@@ -120,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
145
  - !ruby/object:Gem::Version
121
146
  version: '0'
122
147
  requirements: []
123
- rubygems_version: 3.1.2
148
+ rubygems_version: 3.1.4
124
149
  signing_key:
125
150
  specification_version: 4
126
151
  summary: Ruby API Client for Zaikio's Directory