fidor_api 1.0.0 → 2.0.0.alpha1

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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -49
  3. data/Rakefile +6 -3
  4. data/lib/fidor_api/client/authentication.rb +63 -0
  5. data/lib/fidor_api/client/configuration.rb +32 -0
  6. data/lib/fidor_api/client/connection.rb +56 -0
  7. data/lib/fidor_api/client/dsl/confirmable_actions.rb +19 -0
  8. data/lib/fidor_api/client/dsl/core_data.rb +19 -0
  9. data/lib/fidor_api/client/dsl/messages.rb +31 -0
  10. data/lib/fidor_api/client/dsl/transactions.rb +15 -0
  11. data/lib/fidor_api/client/dsl/transfers/classic.rb +29 -0
  12. data/lib/fidor_api/client/dsl/transfers/generic.rb +34 -0
  13. data/lib/fidor_api/client/dsl/transfers.rb +22 -0
  14. data/lib/fidor_api/client/dsl.rb +59 -0
  15. data/lib/fidor_api/client.rb +17 -21
  16. data/lib/fidor_api/collection/kaminari_support.rb +17 -0
  17. data/lib/fidor_api/collection.rb +18 -34
  18. data/lib/fidor_api/environment/base.rb +21 -0
  19. data/lib/fidor_api/environment/fidor_de/production.rb +23 -0
  20. data/lib/fidor_api/environment/fidor_de/sandbox.rb +23 -0
  21. data/lib/fidor_api/environment/fidor_de.rb +8 -0
  22. data/lib/fidor_api/environment/future.rb +21 -0
  23. data/lib/fidor_api/environment.rb +7 -0
  24. data/lib/fidor_api/errors.rb +3 -26
  25. data/lib/fidor_api/model/account.rb +25 -0
  26. data/lib/fidor_api/model/base.rb +44 -0
  27. data/lib/fidor_api/model/confirmable_action.rb +9 -0
  28. data/lib/fidor_api/model/customer.rb +36 -0
  29. data/lib/fidor_api/model/helpers/action_view_support.rb +21 -0
  30. data/lib/fidor_api/model/helpers/attribute_decimal_methods.rb +32 -0
  31. data/lib/fidor_api/model/helpers.rb +8 -0
  32. data/lib/fidor_api/model/message.rb +23 -0
  33. data/lib/fidor_api/model/transaction.rb +21 -0
  34. data/lib/fidor_api/model/transfer/classic/base.rb +15 -0
  35. data/lib/fidor_api/model/transfer/classic/internal.rb +20 -0
  36. data/lib/fidor_api/model/transfer/classic/sepa.rb +11 -0
  37. data/lib/fidor_api/model/transfer/classic.rb +11 -0
  38. data/lib/fidor_api/model/transfer/generic.rb +71 -0
  39. data/lib/fidor_api/model/transfer.rb +8 -0
  40. data/lib/fidor_api/model/user.rb +10 -0
  41. data/lib/fidor_api/model.rb +13 -0
  42. data/lib/fidor_api/token.rb +13 -18
  43. data/lib/fidor_api/version.rb +1 -1
  44. data/lib/fidor_api.rb +14 -58
  45. metadata +152 -89
  46. data/.gitignore +0 -11
  47. data/.rspec +0 -2
  48. data/.ruby-gemset +0 -1
  49. data/.ruby-version +0 -1
  50. data/.travis.yml +0 -20
  51. data/CHANGELOG.md +0 -129
  52. data/Gemfile +0 -15
  53. data/LICENSE.txt +0 -21
  54. data/bin/console +0 -14
  55. data/bin/setup +0 -7
  56. data/fidor_api.gemspec +0 -24
  57. data/lib/fidor_api/account.rb +0 -45
  58. data/lib/fidor_api/amount_attributes.rb +0 -30
  59. data/lib/fidor_api/approval_required.rb +0 -9
  60. data/lib/fidor_api/auth.rb +0 -45
  61. data/lib/fidor_api/beneficiary/ach.rb +0 -39
  62. data/lib/fidor_api/beneficiary/base.rb +0 -118
  63. data/lib/fidor_api/beneficiary/generic.rb +0 -24
  64. data/lib/fidor_api/beneficiary/p2p_account_number.rb +0 -14
  65. data/lib/fidor_api/beneficiary/p2p_phone.rb +0 -14
  66. data/lib/fidor_api/beneficiary/p2p_username.rb +0 -14
  67. data/lib/fidor_api/beneficiary/swift.rb +0 -35
  68. data/lib/fidor_api/beneficiary/unknown.rb +0 -16
  69. data/lib/fidor_api/beneficiary/utility.rb +0 -35
  70. data/lib/fidor_api/beneficiary.rb +0 -27
  71. data/lib/fidor_api/card.rb +0 -77
  72. data/lib/fidor_api/card_limit_attribute.rb +0 -52
  73. data/lib/fidor_api/card_limits.rb +0 -14
  74. data/lib/fidor_api/confirmable_action.rb +0 -45
  75. data/lib/fidor_api/connectivity/connection.rb +0 -113
  76. data/lib/fidor_api/connectivity/endpoint.rb +0 -82
  77. data/lib/fidor_api/connectivity/resource.rb +0 -76
  78. data/lib/fidor_api/connectivity.rb +0 -17
  79. data/lib/fidor_api/constants.rb +0 -3
  80. data/lib/fidor_api/customer.rb +0 -140
  81. data/lib/fidor_api/customers/confirmations.rb +0 -19
  82. data/lib/fidor_api/message.rb +0 -52
  83. data/lib/fidor_api/msisdn.rb +0 -45
  84. data/lib/fidor_api/password.rb +0 -29
  85. data/lib/fidor_api/preauth.rb +0 -33
  86. data/lib/fidor_api/preauth_details.rb +0 -97
  87. data/lib/fidor_api/session_token.rb +0 -20
  88. data/lib/fidor_api/transaction.rb +0 -37
  89. data/lib/fidor_api/transaction_details.rb +0 -119
  90. data/lib/fidor_api/transfer/ach.rb +0 -46
  91. data/lib/fidor_api/transfer/bank_internal.rb +0 -37
  92. data/lib/fidor_api/transfer/base.rb +0 -36
  93. data/lib/fidor_api/transfer/fps.rb +0 -56
  94. data/lib/fidor_api/transfer/generic.rb +0 -134
  95. data/lib/fidor_api/transfer/internal.rb +0 -53
  96. data/lib/fidor_api/transfer/p2p_account_number.rb +0 -45
  97. data/lib/fidor_api/transfer/p2p_phone.rb +0 -45
  98. data/lib/fidor_api/transfer/p2p_username.rb +0 -45
  99. data/lib/fidor_api/transfer/sepa.rb +0 -56
  100. data/lib/fidor_api/transfer/swift.rb +0 -49
  101. data/lib/fidor_api/transfer/utility.rb +0 -50
  102. data/lib/fidor_api/transfer.rb +0 -17
  103. data/lib/fidor_api/user.rb +0 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0b54522075b55638344cfa24ccf0155f1202ace6e02771d106acc7cb2a61fb02
4
- data.tar.gz: 79576683345190411723a279ca082da11b31e0b3a9e4e27673a629400b62a7b7
3
+ metadata.gz: de8a8afe76c2e2584facd1439e52c087e6d9457119ffd8365ea3bcb2ef418640
4
+ data.tar.gz: 38d944042a2442defe90265299ec4d14327fa183fa7a2e22e9b5596ca92ecc24
5
5
  SHA512:
6
- metadata.gz: e1aedf0a0f6639acc507412c32c8cf5f6be1a8f41db492cce017110723fd784e52ce930cbb9be522d3fe8edd932ad811d384a3bc3eab0e42a9d0b7c86d07e0af
7
- data.tar.gz: f032507b9ea3508d25be09ec12160bdf420b2eda9df4c5306e0eb62073cca27ee5545649a1572d5f06b248335110f64403ac92bacd8ab66c90e89ebb7af45fd3
6
+ metadata.gz: 4de4c0de79dfad96ede97a5a15f579459efe9c0a9ef88613a8679728abb69d8fb6b6b1ebe1b0a0f67eb9674369c8d062e9d4d0dee4a64b791aca2a5fb0c272f9
7
+ data.tar.gz: 927502fe292869143510d492eecfdc013a6955d0d2a4414c8aedff620dba6fd5cfdeb378eb86c8b37c895806f58a146afb2ec9c463e2aec02024451e68bd550b
data/README.md CHANGED
@@ -1,20 +1,18 @@
1
1
  # FidorApi
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/fidor_api.svg)](https://badge.fury.io/rb/fidor_api)
4
- [![Build Status](https://travis-ci.org/fidor/fidor_api.svg?branch=master)](https://travis-ci.org/fidor/fidor_api)
5
- [![Test Coverage](https://codeclimate.com/github/fidor/fidor_api/badges/coverage.svg)](https://codeclimate.com/github/fidor/fidor_api/coverage)
6
- [![Code Climate](https://codeclimate.com/github/fidor/fidor_api/badges/gpa.svg)](https://codeclimate.com/github/fidor/fidor_api)
4
+ [![Build Status](https://travis-ci.org/fidor/fidor_api.svg?branch=v2)](https://travis-ci.org/fidor/fidor_api)
7
5
 
8
- Simple ruby client for the Fidor Bank REST-API: http://docs.fidor.de
6
+ Ruby client library to work with Fidor APIs.
9
7
 
10
- 💡 This branch contains the 0.x.x / 1.x.x versions. For 2.x.x versions see master branch.
8
+ 💡 This branch contains the `2.x.x` version. For previous versions see `v1` branch.
11
9
 
12
10
  ## Installation
13
11
 
14
12
  Add this line to your application's Gemfile:
15
13
 
16
14
  ```ruby
17
- gem 'fidor_api'
15
+ gem 'fidor_api', '>= 2'
18
16
  ```
19
17
 
20
18
  And then execute:
@@ -30,15 +28,10 @@ Or install it yourself as:
30
28
  ### 0. Configure
31
29
 
32
30
  ```ruby
33
- FidorApi.configure do |config|
34
- config.oauth_url = ENV["FIDOR_OAUTH_URL"]
35
- config.api_url = ENV["FIDOR_API_URL"]
36
- config.callback_url = ENV["FIDOR_API_CALLBACK"]
37
- config.client_id = ENV["FIDOR_API_CLIENT_ID"]
38
- config.client_secret = ENV["FIDOR_API_CLIENT_SECRET"]
39
- config.htauth_user = ENV["FIDOR_API_HTAUTH_USER"]
40
- config.htauth_password = ENV["FIDOR_API_HTAUTH_PASSWORD"]
41
- config.affiliate_uid = ENV["FIDOR_API_AFFILIATE_UID"]
31
+ client = FidorApi::Client.new do |config|
32
+ config.environment = FidorApi::Environment::FidorDE::Sandbox
33
+ config.client_id = 'your-client-id'
34
+ config.client_secret = 'your-client-secret'
42
35
  end
43
36
  ```
44
37
 
@@ -47,60 +40,48 @@ end
47
40
  Redirect the user to the authorize URL:
48
41
 
49
42
  ```ruby
50
- redirect_to FidorApi::Auth.authorize_url
43
+ redirect_to client.authorize_start(
44
+ redirect_uri: 'https://localhost:3000/callback'
45
+ )
51
46
  ```
52
47
 
53
48
  Use code passed to the callback URL and fetch the access token:
54
49
 
55
50
  ```ruby
56
- session[:api_token] = FidorApi::Auth.fetch_token(params[:code]).to_hash
57
- ```
58
-
59
- Renew token after it has expired:
60
-
61
- ```ruby
62
- def api_token
63
- FidorApi::Token.new session[:api_token] if session[:api_token]
64
- end
65
-
66
- if api_token && !api_token.valid?
67
- session[:api_token] = FidorApi::Auth.refresh_token(api_token).to_hash
68
- end
51
+ session[:api_token] = client.authorize_complete(
52
+ redirect_uri: 'https://localhost:3000/callback',
53
+ code: params[:code]
54
+ )
69
55
  ```
70
56
 
71
57
  ### 2. Fetching data
72
58
 
73
59
  ```ruby
74
- FidorApi::Connectivity.access_token = "f859032a6ca0a4abb2be0583b8347937"
60
+ client.token = FidorApi::Token.new(session[:api_token])
75
61
 
76
- user = FidorApi::User.current
77
- # => FidorApi::User
62
+ user = client.user
63
+ # => FidorApi::Model::User
78
64
 
79
- transactions = FidorApi::Transaction.all
65
+ user = client.transactions
80
66
  # => FidorApi::Collection
81
67
 
82
68
  transaction = transactions.first
83
- # => FidorApi::Transaction
69
+ # => FidorApi::Model::Transaction
84
70
  ```
85
71
 
86
72
  ### 3. Creating transfers
87
73
 
88
74
  ```ruby
89
- FidorApi::Connectivity.access_token = "f859032a6ca0a4abb2be0583b8347937"
75
+ client.token = FidorApi::Token.new(session[:api_token])
90
76
 
91
- transfer = FidorApi::Transfer::Internal.new(
77
+ transfer = client.create_internal_transfer(
92
78
  account_id: 875,
93
- receiver: "kycfull@fidor.de",
94
- external_uid: "4279762F5",
95
- subject: "Money for you",
79
+ receiver: 'kycfull@fidor.de',
80
+ external_uid: '4279762F5',
81
+ subject: 'Money for you',
96
82
  amount: 1000
97
83
  )
98
- # => FidorApi::Transfer::Internal
99
-
100
- transfer.save
101
- # => true
102
- # or
103
- # => false and `transfer.errors` containing details
84
+ # => FidorApi::Model::Transfer::Classic::Internal
104
85
  ```
105
86
 
106
87
  ## Development
@@ -113,10 +94,6 @@ To install this gem onto your local machine, run `bundle exec rake install`.
113
94
 
114
95
  Bug reports and pull requests are welcome on GitHub at https://github.com/fidor/fidor_api.
115
96
 
116
- ## Changelog
117
-
118
- Have a look at the [CHANGELOG](CHANGELOG.md) for details.
119
-
120
97
  ## License
121
98
 
122
99
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,6 +1,9 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task :default do
7
+ system('bundle exec rspec')
8
+ system('bundle exec rubocop')
9
+ end
@@ -0,0 +1,63 @@
1
+ module FidorApi
2
+ class Client
3
+ module Authentication
4
+ attr_accessor :token
5
+
6
+ # oAuth2 - Resource Owner Password Grant Flow
7
+ def login(username:, password:, grant_type: 'password')
8
+ check_flow_support! :resource_owner_password_credentials
9
+
10
+ self.token = oauth_token(
11
+ grant_type: grant_type,
12
+ username: username,
13
+ password: password
14
+ )
15
+ end
16
+
17
+ # oAuth2 - Client Credentials Flow
18
+ def client_login
19
+ check_flow_support! :client_credentials
20
+
21
+ self.token = oauth_token(grant_type: 'client_credentials')
22
+ end
23
+
24
+ # oAuth2 - Authorization Code Grant Flow - Start
25
+ def authorize_start(redirect_uri:, state: SecureRandom.hex(8))
26
+ check_flow_support! :authorization_code
27
+
28
+ "#{config.environment.auth_host}/oauth/authorize" \
29
+ + "?client_id=#{config.client_id}" \
30
+ + "&redirect_uri=#{CGI.escape(redirect_uri)}" \
31
+ + "&state=#{state}" \
32
+ + '&response_type=code'
33
+ end
34
+
35
+ # oAuth2 - Authorization Code Grant Flow - Complete
36
+ def authorize_complete(redirect_uri:, code:)
37
+ self.token = oauth_token(
38
+ grant_type: 'authorization_code',
39
+ client_id: config.client_id,
40
+ redirect_uri: redirect_uri,
41
+ code: code
42
+ )
43
+ end
44
+
45
+ private
46
+
47
+ def check_flow_support!(symbol)
48
+ raise Errors::NotSupported \
49
+ unless config.environment.auth_methods.include? symbol
50
+ end
51
+
52
+ def oauth_token(**body)
53
+ response = connection(host: config.environment.auth_host).post(
54
+ '/oauth/token',
55
+ body: body,
56
+ auth: [config.client_id, config.client_secret]
57
+ )
58
+
59
+ Token.new(response.body)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,32 @@
1
+ require 'logger'
2
+
3
+ module FidorApi
4
+ class Client
5
+ class Configuration
6
+ ATTRIBUTES = %i[
7
+ environment
8
+ client_id
9
+ client_secret
10
+ logger
11
+ log_bodies
12
+ verify_ssl
13
+ ].freeze
14
+
15
+ attr_accessor(*ATTRIBUTES)
16
+
17
+ def initialize
18
+ self.environment = Environment::FidorDE::Sandbox.new
19
+ self.logger = Logger.new(STDOUT)
20
+ self.log_bodies = true
21
+ self.verify_ssl = true
22
+ end
23
+
24
+ def validate!
25
+ ATTRIBUTES.each do |key|
26
+ raise "Missing config value for `#{key}`!" \
27
+ if instance_variable_get("@#{key}").nil?
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,56 @@
1
+ module FidorApi
2
+ class Client
3
+ class Connection
4
+ DEFAULT_HEADERS = {
5
+ 'Accept' => 'application/vnd.fidor.de; version=1,text/json',
6
+ 'Content-Type' => 'application/json'
7
+ }.freeze
8
+
9
+ def initialize(client:, host:)
10
+ @client = client
11
+ @host = host
12
+ end
13
+
14
+ %i[get post put patch delete].each do |method|
15
+ define_method method do |path, query: nil, body: nil, headers: {}, auth: nil|
16
+ request(
17
+ path: path,
18
+ method: method,
19
+ query: query,
20
+ body: body,
21
+ headers: DEFAULT_HEADERS.merge(headers),
22
+ auth: auth
23
+ )
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ attr_accessor :client, :host
30
+
31
+ def request(path:, method: :get, query: {}, body: {}, headers: {}, auth: nil) # rubocop:disable Metrics/ParameterLists
32
+ payload = method == :get ? query : body&.to_json
33
+
34
+ response = faraday(auth: auth).public_send(method, path, payload) do |request|
35
+ request.headers = headers
36
+ end
37
+
38
+ response
39
+ rescue Faraday::ClientError => e
40
+ client.config.logger.error e.inspect
41
+ raise
42
+ end
43
+
44
+ def faraday(auth:) # rubocop:disable Metrics/AbcSize
45
+ Faraday.new(url: host, ssl: { verify: client.config.verify_ssl }) do |config|
46
+ config.use Faraday::Request::BasicAuthentication, *auth if auth.is_a? Array
47
+ config.request :oauth2, client.token.access_token, token_type: :bearer if client.token
48
+ config.response :logger, client.config.logger, bodies: client.config.log_bodies if client.config.logger
49
+ config.response :raise_error
50
+ config.response :json, content_type: /json/
51
+ config.adapter Faraday.default_adapter
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module ConfirmableActions
5
+ def confirmable_action(id, options = {})
6
+ fetch(:single, Model::ConfirmableAction, "/confirmable/actions/#{id}", options)
7
+ end
8
+
9
+ def refresh_confirmable_action(id, options = {})
10
+ update(Model::ConfirmableAction, "/confirmable/actions/#{id}/refresh", id, options)
11
+ end
12
+
13
+ def update_confirmable_action(id, attributes = {})
14
+ update(Model::ConfirmableAction, "/confirmable/actions/#{id}", id, attributes)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module CoreData
5
+ def user(options = {})
6
+ fetch(:single, Model::User, '/users/current', options)
7
+ end
8
+
9
+ def customers(options = {})
10
+ fetch(:collection, Model::Customer, '/customers', options)
11
+ end
12
+
13
+ def accounts(options = {})
14
+ fetch(:collection, Model::Account, '/accounts', options)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module Messages
5
+ def messages(options = {})
6
+ fetch(:collection, Model::Message, '/messages', options)
7
+ end
8
+
9
+ def message(id, options = {})
10
+ fetch(:single, Model::Message, "/messages/#{id}", options)
11
+ end
12
+
13
+ def message_attachment(id)
14
+ response = connection.get("/messages/#{id}/attachment")
15
+
16
+ Model::Message::Attachment.new(
17
+ type: response.headers['content-type'],
18
+ filename: response.headers['content-disposition'][/filename="([^"]+)"/, 1],
19
+ content: response.body
20
+ )
21
+ end
22
+
23
+ def message_content(id)
24
+ response = connection.get("/messages/#{id}/content")
25
+
26
+ Model::Message::Content.new(raw: response.body)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module Transactions
5
+ def transactions(options = {})
6
+ fetch(:collection, Model::Transaction, '/transactions', options)
7
+ end
8
+
9
+ def transaction(id, options = {})
10
+ fetch(:single, Model::Transaction, "/transactions/#{id}", options)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module Transfers
5
+ module Classic
6
+ def internal_transfers(options = {})
7
+ check_transfer_support! :classic
8
+ fetch(:collection, FidorApi::Model::Transfer::Classic::Internal, '/internal_transfers', options)
9
+ end
10
+
11
+ def internal_transfer(id, options = {})
12
+ check_transfer_support! :classic
13
+ fetch(:single, FidorApi::Model::Transfer::Classic::Internal, "/internal_transfers/#{id}", options)
14
+ end
15
+
16
+ def new_internal_transfer(attributes = {})
17
+ check_transfer_support! :classic
18
+ Model::Transfer::Classic::Internal.new(attributes)
19
+ end
20
+
21
+ def create_internal_transfer(attributes = {})
22
+ check_transfer_support! :classic
23
+ create(FidorApi::Model::Transfer::Classic::Internal, '/internal_transfers', attributes)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module Transfers
5
+ module Generic
6
+ def transfers(options = {})
7
+ check_transfer_support! :generic
8
+ fetch(:collection, FidorApi::Model::Transfer::Generic, '/transfers', options)
9
+ end
10
+
11
+ def transfer(id, options = {})
12
+ check_transfer_support! :generic
13
+ fetch(:single, FidorApi::Model::Transfer::Generic, "/transfers/#{id}", options)
14
+ end
15
+
16
+ def new_transfer(attributes = {})
17
+ check_transfer_support! :generic
18
+ Model::Transfer::Generic.new(attributes)
19
+ end
20
+
21
+ def create_transfer(attributes = {})
22
+ check_transfer_support! :generic
23
+ create(FidorApi::Model::Transfer::Generic, '/transfers', attributes)
24
+ end
25
+
26
+ def update_transfer(id, attributes = {})
27
+ check_transfer_support! :generic
28
+ update(FidorApi::Model::Transfer::Generic, "/transfers/#{id}", id, attributes)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ module Transfers
5
+ autoload :Classic, 'fidor_api/client/dsl/transfers/classic'
6
+ autoload :Generic, 'fidor_api/client/dsl/transfers/generic'
7
+
8
+ def self.included(klass)
9
+ klass.include Transfers::Classic
10
+ klass.include Transfers::Generic
11
+ end
12
+
13
+ private
14
+
15
+ def check_transfer_support!(type)
16
+ raise Errors::NotSupported \
17
+ unless config.environment.transfers_api == type
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,59 @@
1
+ module FidorApi
2
+ class Client
3
+ module DSL
4
+ autoload :ConfirmableActions, 'fidor_api/client/dsl/confirmable_actions'
5
+ autoload :CoreData, 'fidor_api/client/dsl/core_data'
6
+ autoload :Messages, 'fidor_api/client/dsl/messages'
7
+ autoload :Transfers, 'fidor_api/client/dsl/transfers'
8
+ autoload :Transactions, 'fidor_api/client/dsl/transactions'
9
+
10
+ def self.included(klass)
11
+ klass.include ConfirmableActions
12
+ klass.include CoreData
13
+ klass.include Messages
14
+ klass.include Transfers
15
+ klass.include Transactions
16
+ end
17
+
18
+ private
19
+
20
+ def fetch(type, klass, endpoint, options)
21
+ case type
22
+ when :single
23
+ klass.new(connection.get(endpoint, query: options).body)
24
+ when :collection
25
+ Collection.new(klass: klass, raw: connection.get(endpoint, query: options).body)
26
+ else
27
+ raise ArgumentError
28
+ end
29
+ end
30
+
31
+ def create(klass, endpoint, attributes)
32
+ request(klass, endpoint, :post, attributes)
33
+ end
34
+
35
+ def update(klass, endpoint, id, attributes)
36
+ request(klass, endpoint, :put, attributes.merge(id: id))
37
+ end
38
+
39
+ def request(klass, endpoint, method, attributes) # rubocop:disable Metrics/AbcSize
40
+ model = klass.new(attributes)
41
+ model.tap do |m|
42
+ response = connection.public_send(method, endpoint, body: m.as_json)
43
+ m.set_attributes(response.body) if response.body.is_a?(Hash)
44
+ m.confirmable_action_id = extract_confirmable_id(response.headers)
45
+ end
46
+ rescue Faraday::ClientError => e
47
+ raise if e.response[:status] != 422
48
+ model.tap { |m| m.parse_errors(e.response[:body]) }
49
+ end
50
+
51
+ POSSIBLE_CONFIRMABLE_HEADERS = %w[x-fidor-confirmation-path location].freeze
52
+
53
+ def extract_confirmable_id(headers)
54
+ return if (tuple = headers.detect { |key, _| POSSIBLE_CONFIRMABLE_HEADERS.include? key }).nil?
55
+ tuple.last.split('/').last
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,27 +1,23 @@
1
1
  module FidorApi
2
-
3
2
  class Client
4
- include ActiveModel::Model
3
+ autoload :Authentication, 'fidor_api/client/authentication'
4
+ autoload :Configuration, 'fidor_api/client/configuration'
5
+ autoload :Connection, 'fidor_api/client/connection'
6
+ autoload :DSL, 'fidor_api/client/dsl'
5
7
 
6
- attr_accessor :token
8
+ include Authentication
9
+ include DSL
7
10
 
8
- include Account::ClientSupport
9
- include Beneficiary::ClientSupport
10
- include Beneficiary::ACH::ClientSupport
11
- include ConfirmableAction::ClientSupport
12
- include Customer::ClientSupport
13
- include Message::ClientSupport
14
- include Preauth::ClientSupport
15
- include SessionToken::ClientSupport
16
- include Transaction::ClientSupport
17
- include Transfer::ACH::ClientSupport
18
- include Transfer::Internal::ClientSupport
19
- include Transfer::SEPA::ClientSupport
20
- include Transfer::FPS::ClientSupport
21
- include Transfer::P2pAccountNumber::ClientSupport
22
- include Transfer::P2pPhone::ClientSupport
23
- include Transfer::P2pUsername::ClientSupport
24
- include User::ClientSupport
25
- end
11
+ attr_accessor :config
26
12
 
13
+ def initialize
14
+ self.config = Configuration.new
15
+ yield(config) if block_given?
16
+ config.validate!
17
+ end
18
+
19
+ def connection(host: config.environment.api_host)
20
+ Connection.new(client: self, host: host)
21
+ end
22
+ end
27
23
  end
@@ -0,0 +1,17 @@
1
+ module FidorApi
2
+ class Collection
3
+ module KaminariSupport
4
+ def last_page?
5
+ current_page == total_pages
6
+ end
7
+
8
+ def next_page
9
+ current_page + 1
10
+ end
11
+
12
+ def limit_value
13
+ per_page
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,46 +1,30 @@
1
1
  module FidorApi
2
-
3
2
  class Collection
4
- include ActiveModel::Model
5
- include Enumerable
6
-
7
- attr_accessor :records
8
- attr_accessor :total_pages, :current_page, :limit_value, :total_entries
9
-
10
- def self.build(klass, response)
11
- new.tap do |object|
12
- data = response["data"]
13
- collection = response["collection"]
14
-
15
- object.records = data.map do |record|
16
- class_to_instantiate = if block_given?
17
- yield(record)
18
- else
19
- klass
20
- end
3
+ autoload :KaminariSupport, 'fidor_api/collection/kaminari_support'
21
4
 
22
- class_to_instantiate.new(record)
23
- end
24
-
25
- object.total_pages = collection["total_pages"]
26
- object.current_page = collection["current_page"]
27
- object.limit_value = collection["per_page"]
28
- object.total_entries = collection["total_entries"]
29
- end
5
+ include Enumerable
6
+ include KaminariSupport
7
+
8
+ attr_reader \
9
+ :current_page,
10
+ :per_page,
11
+ :total_entries,
12
+ :total_pages
13
+
14
+ def initialize(klass:, raw:)
15
+ @current_page = raw.fetch('collection').fetch('current_page')
16
+ @per_page = raw.fetch('collection').fetch('per_page')
17
+ @total_entries = raw.fetch('collection').fetch('total_entries')
18
+ @total_pages = raw.fetch('collection').fetch('total_pages')
19
+ @records = raw.fetch('data').map { |attributes| klass.new(attributes) }
30
20
  end
31
21
 
32
22
  def each(&block)
33
23
  records.each(&block)
34
24
  end
35
25
 
36
- # --- kaminari stuff -- maybe move somewhere else
37
- def last_page?
38
- current_page == total_pages
39
- end
26
+ private
40
27
 
41
- def next_page
42
- current_page + 1
43
- end
28
+ attr_reader :records
44
29
  end
45
-
46
30
  end