iwoca 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce9c1834255a98ef839610f8ccff91efab04f9942b219470de6c769e7bb52a20
4
- data.tar.gz: 37479cab8d5dfefd64be30fd339d7dad18ac8d039b985ffeb3fb7ebe36c3b48b
3
+ metadata.gz: 198e9be11e22df1a0eeaaf7aeadf91a8d915890c83c034232f6c4f6bdf950d6b
4
+ data.tar.gz: 36a2b9b54228c00b077e2bb8a4f4be34e3f71b32631ae90a23fbc5a1d88c32a4
5
5
  SHA512:
6
- metadata.gz: d645e2d9948fe267fcce8e6f706de979b8a17127dd66b9e2acb5f77262b9ba77f7d99556f86bf0b10939ec19a24b61d6728502bca53a63d822c2b008c72fd647
7
- data.tar.gz: d7ab10d7dbcc0c792c68e2b03cccae40c9ff6e71d3fa23d3fe556ce886f66c8618e40407eb4e27ab2aabb976787e07f51094936898972521a82376815481d998
6
+ metadata.gz: 9551708a25561b0ea8355ad4372e6fb65161d9e2b0ad418d48938fab648efe07b26d5191d8b80b99151f206873bef71662c7ad96485dd864629e03ac9f6ae446
7
+ data.tar.gz: 4683b1b27606c672d0feecc6c1160ec51218b223f57c253f4e4a266544587dba07393f6465752a916b0bf6788d2e24050d4252d7a410d0c55ad952bd96d46cbe
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- iwoca (1.0.1)
4
+ iwoca (1.1.0)
5
5
  addressable
6
6
  faraday (~> 2.7)
7
+ json-schema
7
8
  rainbow
8
9
 
9
10
  GEM
@@ -30,6 +31,8 @@ GEM
30
31
  i18n (1.12.0)
31
32
  concurrent-ruby (~> 1.0)
32
33
  json (2.6.3)
34
+ json-schema (4.0.0)
35
+ addressable (>= 2.8)
33
36
  method_source (1.0.0)
34
37
  parallel (1.22.1)
35
38
  parser (3.2.1.0)
data/README.md CHANGED
@@ -36,28 +36,68 @@ Iwoca.configure do |config|
36
36
  end
37
37
  ```
38
38
 
39
- ### Quote
39
+ ### Check authentication
40
40
 
41
- All the available methods are encapsulated in the `Quote` class. The available methods are:
41
+ To check if you're using a good API Key you can invoke the `authentication_check` endpoint by
42
+ running:
42
43
 
43
44
  ```ruby
44
- Iwoca.create_customer(CUSTOMER_JSON)
45
+ Iwoca.authentication_check
46
+ # => Authentication check successful: {"version":"v2.1"}
47
+ ```
48
+
49
+ ### Customer
50
+
51
+ First thing you want to do is to create a customer:
52
+
53
+ ```ruby
54
+ customer_json = Iwoca::CustomerGenerator.generate # for test purposes
55
+ response = Iwoca::Customer.create(data: customer_json)
45
56
  # => This will return a state_key, if the JSON is valid. You need this key to call other methods.
46
57
 
47
- Iwoca.update_customer(state_key, CUSTOMER_JSON)
58
+ customer_id = response.data[:customer_id]
59
+ ```
60
+
61
+ Then you can update it, if you keep track of the customer_id that is returned:
62
+
63
+ ```ruby
64
+ Iwoca::Customer.update(customer_id: customer_id, data: customer_json)
65
+ ```
66
+
67
+ And finally you can get a login link:
68
+
69
+ ```ruby
70
+ Iwoca::Customer.login_link(customer_id: customer_id)
71
+ ```
72
+
73
+ ### Application
48
74
 
49
- Iwoca.approval(state_key)
75
+ After the customer is correctly created you can create an application:
50
76
 
51
- Iwoca.login_link(state_key)
77
+ ```ruby
78
+ app_json = Iwoca::ApplicationGenerator.generate # for test purposes
79
+ response = Iwoca::Application.create(customer_id: customer_id, data: app_json)
80
+
81
+ application_id = response.data[:application_id]
82
+ ```
83
+
84
+ This can then be used to check the status of the latest application for a customer:
52
85
 
53
- Iwoca.credit_facility_status(state_key)
86
+ ```ruby
87
+ Iwoca::Application.latest(customer_id: customer_id)
88
+ ```
89
+
90
+ Or, equally important, to check the offers:
91
+
92
+ ```ruby
93
+ Iwoca::Application.offers(application_id: application_id)
54
94
  ```
55
95
 
56
96
  Every call will return a `Iwoca::Response` instance, that you can use to get all the information
57
97
  you need:
58
98
 
59
99
  ```ruby
60
- response = Iwoca.login_link(state_key)
100
+ response = Iwoca::Customer.login_link(customer_id: customer_id)
61
101
 
62
102
  response.status #=> 200
63
103
  response.success? #=> true
@@ -65,6 +105,19 @@ response.errors #=> []
65
105
  response.data #=> { login_link: 'http://login_link' }
66
106
  ```
67
107
 
108
+ ### Webhooks
109
+
110
+ Newest iwoca version has a nice way to manage the webhooks, so we can change and check the status of
111
+ webhooks at any point.
112
+
113
+ ```ruby
114
+ Iwoca::Webhooks.configuration # what's the webook url and the secret token
115
+ Iwoca::Webhooks.update(config: {}) # update webhook configuration
116
+ Iwoca::Webhooks.event_types # list the webhook event types
117
+ Iwoca::Webhooks.subscribe(event_types: []) # subscribe to an event
118
+ Iwoca::Webhooks.subscriptions # list subscriptions
119
+ ```
120
+
68
121
  ## Development
69
122
 
70
123
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run
@@ -78,9 +131,9 @@ https://developer.iwoca.co.uk/lending-api-v1/testing-your-integration/core-test-
78
131
  In `spec/data` we have the stored customer data that will return a 'approved' state. Use this to
79
132
  generate valid state keys and follow their instructions to generate the other states.
80
133
 
81
- ### Webhook
134
+ ### Webhooks
82
135
 
83
- Iwoca webhook will target this address:
136
+ To test webhooks you may find it easier to use a test endpoint like:
84
137
  https://dev-finpointdev.pagekite.me/fast_lender_webhooks/iwoca_event
85
138
 
86
139
  How to install:
@@ -95,10 +148,5 @@ How to run:
95
148
 
96
149
  pagekite.net details:
97
150
 
98
- * u: hello@finpoint.co.uk
99
- * p: fckx7989
100
-
101
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new
102
- version, update the version number in `version.rb`, and then run `bundle exec rake release`, which
103
- will create a git tag for the version, push git commits and tags, and push the `.gem` file
104
- to [rubygems.org](https://rubygems.org).
151
+ - u: hello@finpoint.co.uk
152
+ - p: fckx7989
data/bin/console CHANGED
@@ -15,8 +15,17 @@ end
15
15
 
16
16
  # Useful if we need to do some tests
17
17
  require 'iwoca/customer_generator'
18
+ require 'iwoca/application_generator'
18
19
 
19
20
  send(:include, Iwoca)
20
21
 
22
+ def generate_customer
23
+ CustomerGenerator.generate
24
+ end
25
+
26
+ def generate_app
27
+ ApplicationGenerator.generate
28
+ end
29
+
21
30
  require 'pry'
22
31
  Pry.start
data/iwoca.gemspec CHANGED
@@ -29,4 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency 'addressable'
30
30
  spec.add_dependency 'faraday', '~> 2.7'
31
31
  spec.add_dependency 'rainbow'
32
+ spec.add_dependency 'json-schema'
32
33
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Iwoca
4
+ class Application
5
+ # This needs to be used after the customer has been created. It returns an application_id that
6
+ # can be used to identify the application in all future requests.
7
+ # The params argument needs to have the following structure:
8
+ # {
9
+ # data: {
10
+ # requests: [
11
+ # {
12
+ # amount: 15000,
13
+ # duration: {
14
+ # amount: 12,
15
+ # unit: "months"
16
+ # },
17
+ # product_type: "flexi_loan", # check the schema JSON for more options
18
+ # purpose: "equipment_purchase", # check the schema JSON for more options
19
+ # urgency: "asap"
20
+ # }
21
+ # ]
22
+ # }
23
+ # }
24
+ def self.create(customer_id:, data: {})
25
+ requests = (data.dig(:data, :requests) || []).first.to_json
26
+
27
+ # # Add the introducer so we can get a login link later
28
+ # data[:data][:introducer] = {
29
+ # entity_to_contact: 'customer',
30
+ # introducer_id: customer_id
31
+ # }
32
+
33
+ JSON::Validator.validate!('lib/iwoca/schemas/requested_product.json', requests)
34
+
35
+ Iwoca.connection.post("customers/#{customer_id}/applications/", data)
36
+ end
37
+
38
+ # Sending across the customer_id in the URL - you will receive back an object with the latest
39
+ # application information that we have.
40
+ #
41
+ # This will include a status field that can be one of the following options:
42
+ # open, deferred, declined, offered, conditional_offer, customer_to_link_open_banking,
43
+ # action_required, awaiting_underwriter, in_underwriting, expired, funded, offer_revoked,
44
+ # talking_to_customer.
45
+ #
46
+ # Check more info in the docs:
47
+ # https://iwoca.stoplight.io/docs/lapi-uk/branches/2.1.0/84660933e0b17-get-user-latest-application
48
+ def self.latest(customer_id:)
49
+ Iwoca.connection.get("customers/#{customer_id}/applications/latest/")
50
+ end
51
+
52
+ # Use this endpoint after creating an application to generate offers that your customer is
53
+ # eligible for.
54
+ # Offers are associated with the Application, so are retrieved using the customer's current
55
+ # application_id that you would have received in the previous request.
56
+ def self.offers(application_id:)
57
+ Iwoca.connection.get("applications/#{application_id}/offers/")
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal
2
+
3
+ module Iwoca
4
+ class ApplicationGenerator
5
+ def self.generate(params: {})
6
+ new(params:).generate
7
+ end
8
+
9
+ def initialize(params: {})
10
+ @params = params
11
+ end
12
+
13
+ def generate
14
+ {
15
+ data: {
16
+ last_12_months_turnover: { amount: 700000, valid_from: '2019-08-24T14:15:22Z' },
17
+ requests: [
18
+ {
19
+ amount: 15000,
20
+ product_type: 'flexi_loan',
21
+ duration: { amount: 12, unit: "months" },
22
+ purpose: 'equipment_purchase',
23
+ urgency: 'asap'
24
+ }
25
+ ]
26
+ }
27
+ }
28
+ end
29
+ end
30
+ end
@@ -8,7 +8,12 @@ require 'iwoca/response'
8
8
 
9
9
  module Iwoca
10
10
  class Connection
11
- BASE_PATH = '/api/lending/v1'
11
+ BASE_PATH = '/api/lending/v2.1'
12
+ BASE_NOTIFICATIONS_PATH = '/api/notifications/v1'
13
+
14
+ def initialize(type = 'base')
15
+ @base_path = type == 'notifications' ? BASE_NOTIFICATIONS_PATH : BASE_PATH
16
+ end
12
17
 
13
18
  def get(path, params = {})
14
19
  log "GET #{path} with #{params}"
@@ -49,14 +54,14 @@ module Iwoca
49
54
  end
50
55
 
51
56
  def base_url
52
- Addressable::URI.join(Iwoca.configuration.api_domain, BASE_PATH).to_s
57
+ Addressable::URI.join(Iwoca.configuration.api_domain, @base_path).to_s
53
58
  end
54
59
 
55
60
  def adapter
56
61
  token = Iwoca.configuration.api_key
57
62
 
58
63
  Faraday.new(url: base_url) do |conn|
59
- conn.headers['Authorization'] = "Token #{token}" unless token.to_s.empty?
64
+ conn.headers['Authorization'] = "Bearer #{token}" unless token.to_s.empty?
60
65
  conn.headers['Content-Type'] = 'application/json'
61
66
  conn.headers['User-Agent'] = "ruby-iwoca-#{VERSION}"
62
67
  conn.response :json, parser_options: { symbolize_names: true }
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Iwoca
4
+ class Customer
5
+ # The POST request should be used to create an iwoca account for the customer. It's always the
6
+ # first endpoint and method you should call when submitting a new customer. It returns a
7
+ # customer_id used to identify the customer in all future requests.
8
+ #
9
+ # Successful request will return a 201 status code and a JSON response containing a customer_id:
10
+ # Example: { data: { customer_id: "fd48781e-3ad3-4a94-b4a6-60fafeebab0b" } }
11
+ def self.create(data: {})
12
+ # Validate the schema first, to avoid making a request with invalid data.
13
+ JSON::Validator.validate!('lib/iwoca/schemas/customer_payload.json', data.to_json)
14
+
15
+ Iwoca.connection.post('customers/', data)
16
+ end
17
+
18
+ # The PUT request should be used to add or update data for a customer. Note that the entire
19
+ # State should be submitted each time you use this endpoint, even if you are just updating a
20
+ # few fields.
21
+ def self.update(customer_id:, data: {})
22
+ Iwoca.connection.put("customers/#{customer_id}/", data)
23
+ end
24
+
25
+ # Get a login link for a customer from a given customer_id
26
+ def self.login_link(customer_id:)
27
+ Iwoca.connection.get("customers/#{customer_id}/login_link/")
28
+ end
29
+ end
30
+ end
@@ -3,7 +3,9 @@
3
3
  require 'faker'
4
4
 
5
5
  module Iwoca
6
- # This class can be used to generate fake customers for test purposes
6
+ # This class can be used to generate fake customers for test purposes.
7
+ # It is based on the minimum data requirements described here:
8
+ # https://iwoca.stoplight.io/docs/lapi-uk/branches/2.1.0/2c44db4bf20fb-meeting-minimum-data-requirements
7
9
  class CustomerGenerator
8
10
  attr_accessor :id, :first_name, :last_name, :email, :phone, :address, :date_of_birth, :city
9
11
  attr_accessor :postcode
@@ -13,7 +15,7 @@ module Iwoca
13
15
  first_name: Faker::Name.first_name,
14
16
  last_name: Faker::Name.last_name,
15
17
  email: Faker::Internet.email,
16
- phone: Faker::PhoneNumber.phone_number,
18
+ phone: Faker::PhoneNumber.cell_phone_in_e164,
17
19
  address: Faker::Address.street_address,
18
20
  date_of_birth: Faker::Date.birthday(min_age: 23, max_age: 65),
19
21
  city: Faker::Address.city,
@@ -21,7 +23,7 @@ module Iwoca
21
23
  }.freeze
22
24
 
23
25
  def self.generate(params = {})
24
- new(params).generate
26
+ new(DEFAULTS.merge(params)).generate
25
27
  end
26
28
 
27
29
  def initialize(params = {})
@@ -35,59 +37,50 @@ module Iwoca
35
37
  def generate
36
38
  {
37
39
  data: {
38
- application: {
39
- company: company_information,
40
- people: [user_information],
41
- requested_products: {
42
- credit_facility: {
43
- approval: {
44
- amount: 123_123,
45
- duration: 12,
46
- detailed_purpose: 'business loan'
47
- }
48
- }
49
- }
50
- }
40
+ company: company_information,
41
+ people: [user_information]
51
42
  }
52
43
  }
53
44
  end
54
45
 
55
46
  def company_information
56
47
  {
48
+ company_number: '09525857',
57
49
  last_12_months_turnover: {
58
- amount: 0.0
50
+ amount: 70_000,
51
+ valid_from: "2019-08-24T14:15:22Z"
59
52
  },
60
53
  registered_company_name: 'HOKO LTD',
61
- industry: 'B | Mining and Quarrying',
62
- company_number: '09525857',
63
- type: 'limited_liability_company',
64
54
  trading_from_date: '2015-05-22',
55
+ type: 'limited_liability_company',
56
+ industry: 'B | Mining and Quarrying',
57
+ vat_status: {
58
+ is_vat_registered: true,
59
+ registered_over_3_months: true,
60
+ },
65
61
  registered_address: {
66
62
  postcode: 'W1T 3NF',
67
63
  street_line_1: 'Berners House',
68
64
  street_line_2: '47-48 Berners Street',
69
65
  town: 'London',
70
66
  country: 'GB'
71
- },
72
- vat_status: {
73
- is_vat_registered: true
74
67
  }
75
68
  }
76
69
  end
77
70
 
78
71
  def user_information
79
72
  {
73
+ date_of_birth: date_of_birth,
74
+ emails: emails,
80
75
  uid: SecureRandom.uuid,
81
76
  first_name: first_name,
82
77
  last_name: last_name,
83
- date_of_birth: date_of_birth,
84
- roles: %w[applicant shareholder guarantor director],
85
78
  phones: phones,
86
- emails: emails,
79
+ roles: %w[applicant shareholder guarantor director],
87
80
  residential_addresses: residential_addresses,
88
81
  privacy_policy: {
89
82
  agreed: true,
90
- datetime: DateTime.now
83
+ valid_from: DateTime.now - 1
91
84
  }
92
85
  }
93
86
  end
@@ -95,7 +88,6 @@ module Iwoca
95
88
  def phones
96
89
  [
97
90
  {
98
- uid: SecureRandom.uuid,
99
91
  number: phone,
100
92
  type: 'primary'
101
93
  }
@@ -105,8 +97,11 @@ module Iwoca
105
97
  def emails
106
98
  [
107
99
  {
108
- uid: SecureRandom.uuid,
109
100
  email: email,
101
+ marketing_opt_in: {
102
+ agreed: true,
103
+ valid_from: DateTime.now
104
+ },
110
105
  type: 'primary'
111
106
  }
112
107
  ]
@@ -115,14 +110,12 @@ module Iwoca
115
110
  def residential_addresses
116
111
  [
117
112
  {
118
- uid: SecureRandom.uuid,
119
- town: city,
113
+ country: 'GB',
114
+ residential_status: 'owner_no_mortgage',
120
115
  street_line_1: address,
121
116
  street_line_2: '',
122
- country: 'GB',
123
- postcode: postcode,
124
- house_number: '10',
125
- residential_status: 'owner_no_mortgage'
117
+ town: city,
118
+ postcode: postcode
126
119
  }
127
120
  ]
128
121
  end