1
1
# frozen_string_literal: true
2
2
3
3
require 'faraday'
4
+ require 'faraday/multipart'
4
5
require 'json'
5
6
require_relative 'errors/wrong_data_error'
7
+ require_relative 'request_body'
6
8
7
9
module Yarh
8
10
# Сlass builds a request from hash parameters and executes the request
@@ -15,17 +17,29 @@ def initialize(data)
15
17
end
16
18
17
19
def request
18
- raise Errors :: WrongDataError if method . nil? || url . nil?
20
+ validate_before_request
19
21
20
- conn = Faraday . new ( url : url )
21
-
22
- @response = send_request ( conn )
22
+ @response = send_request ( build_conncetion )
23
23
end
24
24
25
25
private
26
26
27
27
attr_reader :data
28
28
29
+ def validate_before_request
30
+ raise Errors ::WrongDataError if method . nil? or url . nil?
31
+ end
32
+
33
+ def build_conncetion
34
+ if multipart?
35
+ Faraday . new ( url : url ) do |request |
36
+ request . request :multipart
37
+ end
38
+ else
39
+ Faraday . new ( url : url )
40
+ end
41
+ end
42
+
29
43
def send_request ( faraday_connection )
30
44
faraday_connection . send ( method ) do |req |
31
45
build_headers ( req , data [ 'headers' ] )
@@ -35,33 +49,25 @@ def send_request(faraday_connection)
35
49
end
36
50
end
37
51
38
- def method
39
- return unless data [ 'method' ]
40
-
41
- data [ 'method' ] . downcase . to_sym
42
- end
43
-
44
- def url
45
- data [ 'url' ]
46
- end
52
+ # TODO: optimize this method in the future
53
+ def body
54
+ return @body unless @body . nil?
55
+ return unless data [ 'body' ]
47
56
48
- def params
49
- data [ 'params' ]
50
- end
57
+ body = RequestBody . new ( data [ 'body' ] ) . create
51
58
52
- def timeout
53
- data [ 'timeout' ]
59
+ @body = if application_json?
60
+ body . to_json
61
+ else
62
+ body
63
+ end
54
64
end
55
65
56
- # TODO: optimize this method in the future
57
- def body
58
- return unless data [ 'body ' ]
66
+ def multipart?
67
+ return false unless data [ 'headers' ]
68
+ return false unless data [ 'headers' ] [ 'Content-Type ']
59
69
60
- if application_json?
61
- data [ 'body' ] . to_json
62
- else
63
- data [ 'body' ]
64
- end
70
+ data [ 'headers' ] [ 'Content-Type' ] == 'multipart/form-data'
65
71
end
66
72
67
73
def application_json?
@@ -82,5 +88,23 @@ def build_headers(req, headers)
82
88
def stringify_keys ( data )
83
89
data . is_a? ( Hash ) ? data . to_h { |k , v | [ k . to_s , stringify_keys ( v ) ] } : data
84
90
end
91
+
92
+ def method
93
+ return unless data [ 'method' ]
94
+
95
+ data [ 'method' ] . downcase . to_sym
96
+ end
97
+
98
+ def url
99
+ data [ 'url' ]
100
+ end
101
+
102
+ def params
103
+ data [ 'params' ]
104
+ end
105
+
106
+ def timeout
107
+ data [ 'timeout' ]
108
+ end
85
109
end
86
110
end
0 commit comments