cognito-client 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -1
  3. data/Gemfile +37 -0
  4. data/Guardfile +4 -0
  5. data/README.md +55 -18
  6. data/Rakefile +3 -5
  7. data/bin/console +1 -1
  8. data/circle.yml +7 -0
  9. data/cognito.gemspec +4 -6
  10. data/config/devtools.yml +2 -0
  11. data/config/errors.yml +2 -0
  12. data/config/flay.yml +5 -0
  13. data/config/flog.yml +5 -0
  14. data/config/mutant.yml +6 -0
  15. data/config/reek.yml +111 -0
  16. data/config/rubocop.yml +91 -0
  17. data/config/yardstick.yml +2 -0
  18. data/lib/cognito/client.rb +59 -96
  19. data/lib/cognito/client/command.rb +34 -0
  20. data/lib/cognito/client/commands/create_identity.rb +22 -0
  21. data/lib/cognito/client/commands/create_identity_assessment.rb +26 -0
  22. data/lib/cognito/client/commands/create_identity_search.rb +37 -0
  23. data/lib/cognito/client/commands/create_profile.rb +24 -0
  24. data/lib/cognito/client/commands/mixins/create_behavior.rb +20 -0
  25. data/lib/cognito/client/commands/retrieve_identity_location.rb +28 -0
  26. data/lib/cognito/client/commands/retrieve_identity_search_job.rb +40 -0
  27. data/lib/cognito/client/connection.rb +36 -0
  28. data/lib/cognito/client/document.rb +32 -0
  29. data/lib/cognito/client/params.rb +13 -0
  30. data/lib/cognito/client/params/identity.rb +48 -0
  31. data/lib/cognito/client/params/identity_assessment.rb +23 -0
  32. data/lib/cognito/client/params/identity_search.rb +25 -0
  33. data/lib/cognito/client/params/omitted.rb +9 -0
  34. data/lib/cognito/client/request.rb +98 -0
  35. data/lib/cognito/client/resource.rb +124 -0
  36. data/lib/cognito/client/resource/identity_assessment.rb +53 -0
  37. data/lib/cognito/client/resource/identity_search.rb +64 -0
  38. data/lib/cognito/client/resource/identity_search_job.rb +12 -0
  39. data/lib/cognito/client/resource/profile.rb +10 -0
  40. data/lib/cognito/client/resource_identifier.rb +17 -0
  41. data/lib/cognito/client/response.rb +17 -0
  42. data/lib/cognito/client/response/builder.rb +48 -0
  43. data/lib/cognito/client/response/identity_assessment.rb +10 -0
  44. data/lib/cognito/client/response/identity_search.rb +32 -0
  45. data/lib/cognito/client/response/identity_search_job.rb +20 -0
  46. data/lib/cognito/client/response/profile.rb +10 -0
  47. data/lib/cognito/version.rb +3 -3
  48. metadata +77 -83
  49. data/.rubocop.yml +0 -57
  50. data/.travis.yml +0 -4
  51. data/lib/cognito.rb +0 -32
  52. data/lib/cognito/cleaner.rb +0 -30
  53. data/lib/cognito/constants.rb +0 -8
  54. data/lib/cognito/document.rb +0 -33
  55. data/lib/cognito/error.rb +0 -8
  56. data/lib/cognito/notary.rb +0 -56
  57. data/lib/cognito/resource.rb +0 -129
  58. data/lib/cognito/resource/identity_assessment.rb +0 -40
  59. data/lib/cognito/resource/identity_search.rb +0 -63
  60. data/lib/cognito/resource/identity_search_job.rb +0 -11
  61. data/lib/cognito/resource/profile.rb +0 -9
  62. data/lib/cognito/responder.rb +0 -61
@@ -0,0 +1,2 @@
1
+ ---
2
+ threshold: 100
@@ -1,104 +1,67 @@
1
1
  # frozen_string_literal: true
2
-
3
- module Cognito
2
+ require 'bundler/setup'
3
+
4
+ require 'concord'
5
+ require 'anima'
6
+ require 'procto'
7
+ require 'adamantium'
8
+ require 'abstract_type'
9
+ require 'http'
10
+ require 'addressable'
11
+ require 'openssl'
12
+ require 'base64'
13
+
14
+ require 'cognito/client/connection'
15
+ require 'cognito/client/request'
16
+ require 'cognito/client/document'
17
+ require 'cognito/client/resource_identifier'
18
+
19
+ # resources
20
+ require 'cognito/client/resource'
21
+ require 'cognito/client/resource/profile'
22
+ require 'cognito/client/resource/identity_search'
23
+ require 'cognito/client/resource/identity_search_job'
24
+ require 'cognito/client/resource/identity_assessment'
25
+
26
+ # responses
27
+ require 'cognito/client/response'
28
+ require 'cognito/client/response/builder'
29
+ require 'cognito/client/response/profile'
30
+ require 'cognito/client/response/identity_assessment'
31
+ require 'cognito/client/response/identity_search'
32
+ require 'cognito/client/response/identity_search_job'
33
+
34
+ # params
35
+ require 'cognito/client/params'
36
+ require 'cognito/client/params/omitted'
37
+ require 'cognito/client/params/identity'
38
+ require 'cognito/client/params/identity_assessment'
39
+ require 'cognito/client/params/identity_search'
40
+
41
+ # commands
42
+ require 'cognito/client/command'
43
+ require 'cognito/client/commands/mixins/create_behavior'
44
+ require 'cognito/client/commands/create_profile'
45
+ require 'cognito/client/commands/create_identity'
46
+ require 'cognito/client/commands/create_identity_assessment'
47
+ require 'cognito/client/commands/create_identity_search'
48
+ require 'cognito/client/commands/retrieve_identity_search_job'
49
+ require 'cognito/client/commands/retrieve_identity_location'
50
+
51
+ class Cognito
4
52
  class Client
5
- include HTTParty,
6
- Responder
7
-
8
- URI = 'https://sandbox.cognitohq.com'
9
-
10
- # Default URI, can be override with Client#base_uri
11
- base_uri URI
12
-
13
- # Don't follow redirects.
14
- no_follow true
15
- follow_redirects false
16
-
17
- def initialize(options = {})
18
- @errors = []
19
- @api_key = options.fetch(:api_key) { @errors << :api_key }
20
- @api_secret = options.fetch(:api_secret) { @errors << :api_secret }
21
- self.base_uri = options.fetch(:base_uri) { URI }
22
-
23
- if @errors.any?
24
- raise ArgumentError, "missing keyword: #{@errors.join(',')}"
25
- end
26
- end
27
-
28
- def base_uri=(uri)
29
- self.class.base_uri(uri)
30
- end
31
-
32
- def create_profile!
33
- post('/profiles', profile_params.to_json)
34
- end
35
-
36
- def search!(profile_id, phone_number, options = {})
37
- payload = search_params(profile_id, phone_number).to_json
38
- post('/identity_searches', payload, options)
39
- end
40
-
41
- def search_status!(search_job_id, options = {})
42
- get("/identity_searches/jobs/#{search_job_id}", options)
43
- end
44
-
45
- def retrieve_search(search_id, options = {})
46
- get("/identity_searches/#{search_id}", options)
47
- end
48
-
49
- protected
50
-
51
- def get(path, options = {})
52
- headers = notarize_request('get', path, '').headers
53
- response_from(self.class.get(path, headers: headers), options)
54
- end
55
-
56
- def post(path, payload, options = {})
57
- headers = notarize_request('post', path, payload).headers
58
- response_from(self.class.post(path, headers: headers, body: payload), options)
59
- end
60
-
61
- private
62
-
63
- def notarize_request(verb, path, body)
64
- target = "#{verb} #{path}"
53
+ include Concord.new(:server)
65
54
 
66
- Notary.new(
67
- api_key: @api_key,
68
- api_secret: @api_secret,
69
- target: target,
70
- body: body
71
- )
55
+ def self.create(**connection_params)
56
+ new(Connection.parse(**connection_params))
72
57
  end
73
58
 
74
- def profile_params
75
- {
76
- data: {
77
- type: PROFILE
78
- }
79
- }
59
+ def create_profile
60
+ Command::CreateProfile.call(server)
80
61
  end
81
62
 
82
- # rubocop:disable Metrics/MethodLength
83
- def search_params(profile_id, phone_number)
84
- {
85
- data: {
86
- type: IDENTITY_SEARCH,
87
- attributes: {
88
- phone: {
89
- number: phone_number
90
- }
91
- },
92
- relationships: {
93
- profile: {
94
- data: {
95
- type: PROFILE,
96
- id: profile_id
97
- }
98
- }
99
- }
100
- }
101
- }
63
+ def create_identity_search(**params)
64
+ Command::CreateIdentitySearch.call(params.merge(connection: server))
102
65
  end
103
- end
104
- end
66
+ end # Client
67
+ end # Cognito
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Command
5
+ include Procto.call(:run), AbstractType, Adamantium
6
+
7
+ Failed = Class.new(StandardError)
8
+
9
+ def run
10
+ fail Failed, failure_reason unless success?
11
+
12
+ present_response
13
+ end
14
+
15
+ private
16
+
17
+ def failure_reason
18
+ return response.reason if response.to_str.empty?
19
+
20
+ response
21
+ end
22
+
23
+ abstract_method :present_response
24
+ abstract_method :success?
25
+ abstract_method :request
26
+ abstract_method :connection
27
+
28
+ def response
29
+ connection.run(request)
30
+ end
31
+ memoize :response, freezer: :flat
32
+ end # Command
33
+ end # Client
34
+ end # Cognito
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ class Cognito
4
+ class Client
5
+ class Command
6
+ class CreateIdentity < self
7
+ include Mixins::CreateBehavior,
8
+ AbstractType,
9
+ Anima.new(:connection, :name, :phone_number)
10
+
11
+ private :name, :phone_number
12
+
13
+ OMITTED = Params::Omitted.new
14
+
15
+ # ignores :reek:FeatureEnvy:
16
+ def initialize(name: OMITTED, phone_number: OMITTED, **params)
17
+ super(params.merge(name: name, phone_number: phone_number))
18
+ end
19
+ end # CreateIdentity
20
+ end # Command
21
+ end # Client
22
+ end # Cognito
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Command
5
+ class CreateIdentityAssessment < CreateIdentity
6
+ include Mixins::CreateBehavior, anima.add(:identity_search_identifier)
7
+
8
+ ENDPOINT = '/identity_assessments'
9
+
10
+ private
11
+
12
+ def params
13
+ Params::IdentityAssessment.call(
14
+ identity_search_identifier: identity_search_identifier,
15
+ name: name,
16
+ phone_number: phone_number
17
+ )
18
+ end
19
+
20
+ def present_response
21
+ Response::IdentityAssessment.build(response, connection)
22
+ end
23
+ end # CreateIdentityAssessment
24
+ end # Command
25
+ end # Client
26
+ end # Cognito
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Command
5
+ class CreateIdentitySearch < CreateIdentity
6
+ include Mixins::CreateBehavior, anima.add(:profile_id)
7
+
8
+ private :profile_id, :name, :phone_number
9
+
10
+ ENDPOINT = '/identity_searches'
11
+
12
+ private
13
+
14
+ def params
15
+ Params::IdentitySearch.call(
16
+ profile_id: profile_id,
17
+ name: name,
18
+ phone_number: phone_number
19
+ )
20
+ end
21
+
22
+ def present_response
23
+ case response.code
24
+ when 202
25
+ Response::IdentitySearchJob.build(response, connection)
26
+ when 201
27
+ Response::IdentitySearch.build(response, connection)
28
+ end
29
+ end
30
+
31
+ def success?
32
+ response.status.accepted? || response.status.created?
33
+ end
34
+ end # CreateIdentitySearch
35
+ end # Command
36
+ end # Client
37
+ end # Cognito
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Command
5
+ class CreateProfile < self
6
+ include Mixins::CreateBehavior, Concord.new(:connection)
7
+
8
+ ENDPOINT = '/profiles'
9
+ PARAMS = IceNine.deep_freeze(data: { type: 'profile' })
10
+
11
+ private
12
+
13
+ def present_response
14
+ Response::Profile.build(response, connection)
15
+ end
16
+
17
+ # ignores :reek:UtilityFunction:
18
+ def params
19
+ PARAMS
20
+ end
21
+ end # CreateProfile
22
+ end # Command
23
+ end # Client
24
+ end # Cognito
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Command
5
+ module Mixins
6
+ module CreateBehavior
7
+ private
8
+
9
+ def success?
10
+ response.status.created?
11
+ end
12
+
13
+ def request
14
+ Request.post(self.class::ENDPOINT, params)
15
+ end
16
+ end # CreateBehavior
17
+ end # Mixins
18
+ end # Command
19
+ end # Client
20
+ end # Cognito
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Command
5
+ class RetrieveIdentityLocation < self
6
+ include Concord.new(:connection, :endpoint)
7
+
8
+ private
9
+
10
+ def present_response
11
+ identity_resource
12
+ end
13
+
14
+ def identity_resource
15
+ Response::IdentitySearch.build(response, connection)
16
+ end
17
+
18
+ def success?
19
+ response.code.equal?(200)
20
+ end
21
+
22
+ def request
23
+ Request.get(endpoint)
24
+ end
25
+ end # RetrieveIdentityLocation
26
+ end # Command
27
+ end # Client
28
+ end # Cognito
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Cognito
4
+ class Client
5
+ class Command
6
+ class RetrieveIdentitySearchJob < self
7
+ include Concord.new(:connection, :endpoint)
8
+
9
+ private
10
+
11
+ def present_response
12
+ case response.code
13
+ when 303
14
+ identity_resource
15
+ when 200
16
+ processing_response
17
+ else
18
+ fail Failed, response.reason
19
+ end
20
+ end
21
+
22
+ def identity_resource
23
+ RetrieveIdentityLocation.call(connection, response['Location'])
24
+ end
25
+
26
+ def processing_response
27
+ Response::IdentitySearchJob.build(response, connection)
28
+ end
29
+
30
+ def success?
31
+ response.status.success? || response.status.redirect?
32
+ end
33
+
34
+ def request
35
+ Request.get(endpoint)
36
+ end
37
+ end # RetrieveIdentitySearchJob
38
+ end # Command
39
+ end # Client
40
+ end # Cognito
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ class Cognito
3
+ class Client
4
+ class Connection
5
+ include Anima.new(:uri, :api_key, :api_secret, :api_version)
6
+
7
+ def self.parse(uri:, **api_params)
8
+ new(uri: Addressable::URI.parse(uri), **api_params)
9
+ end
10
+
11
+ # ignores :reek:FeatureEnvy:
12
+ def run(request)
13
+ signed_request =
14
+ request.sign(date: Time.now.httpdate, api_key: api_key, api_secret: api_secret)
15
+
16
+ HTTP
17
+ .headers(signed_request.headers.merge(version_headers))
18
+ .request(
19
+ signed_request.verb,
20
+ endpoint(signed_request.endpoint),
21
+ json: signed_request.data
22
+ )
23
+ end
24
+
25
+ def endpoint(route)
26
+ uri.join(route).to_str
27
+ end
28
+
29
+ private
30
+
31
+ def version_headers
32
+ { 'Cognito-Version' => api_version }
33
+ end
34
+ end # Connection
35
+ end # Client
36
+ end # Cognito