fidor_api 1.0.0 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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