|
6 | 6 | module JSONAPI
|
7 | 7 | class Client
|
8 | 8 | class Request
|
9 |
| - METHOD_CLASS = { |
10 |
| - get: Net::HTTP::Get, |
11 |
| - post: Net::HTTP::Post, |
12 |
| - patch: Net::HTTP::Patch, |
13 |
| - delete: Net::HTTP::Delete |
14 |
| - }.freeze |
15 |
| - |
16 |
| - def initialize(base_url, endpoint, headers) |
| 9 | + def initialize(base_url, endpoint = nil) |
17 | 10 | @base_url = base_url
|
18 | 11 | @endpoint = endpoint
|
19 |
| - @params = [] |
20 |
| - @headers = headers |
| 12 | + @params = {} |
| 13 | + @headers = {} |
21 | 14 | end
|
22 | 15 |
|
23 | 16 | def list
|
24 |
| - request(:get, uri) |
25 |
| - end |
26 |
| - |
27 |
| - def request(method, uri, data = {}) |
28 |
| - uri = URI(uri) |
29 |
| - req = METHOD_CLASS[method].new(uri, @headers) |
30 |
| - req.body = data if data |
31 |
| - |
32 |
| - http_res = Net::HTTP.start(uri.host, uri.port) do |http| |
33 |
| - http.request(req) |
34 |
| - end |
35 |
| - |
36 |
| - Response.new(http_res) |
| 17 | + @method = :get |
| 18 | + @uri = uri |
| 19 | + self |
37 | 20 | end
|
38 | 21 |
|
39 | 22 | def find(id)
|
40 |
| - request(:get, uri(id)) |
| 23 | + @method = :get |
| 24 | + @uri = uri(id) |
| 25 | + self |
41 | 26 | end
|
42 | 27 |
|
43 | 28 | def create(hash)
|
44 | 29 | hash[:type] ||= @endpoint
|
45 |
| - request(:post, uri, hash) |
| 30 | + @method = :post |
| 31 | + @uri = uri |
| 32 | + @data = hash |
| 33 | + self |
46 | 34 | end
|
47 | 35 |
|
48 | 36 | def update(id, hash)
|
49 | 37 | hash[:type] ||= @endpoint
|
50 |
| - request(:patch, uri(id), hash) |
| 38 | + @method = :patch |
| 39 | + @uri = uri(id) |
| 40 | + @data = hash |
| 41 | + self |
51 | 42 | end
|
52 | 43 |
|
53 | 44 | def delete(id)
|
54 |
| - request(:delete, uri(id)) |
| 45 | + @method = :delete |
| 46 | + @uri = uri(id) |
| 47 | + self |
55 | 48 | end
|
56 | 49 |
|
57 |
| - def headers(hash) |
58 |
| - @params.merge!(hash) |
| 50 | + def include(hash) |
| 51 | + include = JSONAPI::IncludeDirective.new(hash).to_string |
| 52 | + @params[:include] = include |
59 | 53 | self
|
60 | 54 | end
|
61 | 55 |
|
62 |
| - def params(hash) |
63 |
| - @params << |
64 |
| - if hash.is_a?(String) |
65 |
| - hash |
66 |
| - elsif hash.is_a?(Hash) |
67 |
| - hash.map { |k, v| "#{k}=#{v}" } |
68 |
| - end |
| 56 | + def fields(hash) |
| 57 | + hash = { @endpoint => hash } if hash.is_a?(Array) |
| 58 | + hash.each do |k, v| |
| 59 | + @params["fields[#{k}]".to_sym] = v.join(',') |
| 60 | + end |
69 | 61 | self
|
70 | 62 | end
|
71 | 63 |
|
72 |
| - def include(hash) |
73 |
| - include = JSONAPI::IncludeDirective.new(hash).to_string |
74 |
| - @params << "include=#{include}" |
| 64 | + def params(hash) |
| 65 | + @params.merge!(hash) |
75 | 66 | self
|
76 | 67 | end
|
77 | 68 |
|
78 |
| - def fields(hash) |
79 |
| - hash = { @endpoint => hash } if hash.is_a?(Array) |
80 |
| - @params += hash.map { |k, v| "fields[#{k}]=#{v.join(',')}" } |
| 69 | + def headers(hash) |
| 70 | + @headers.merge!(hash) |
81 | 71 | self
|
82 | 72 | end
|
83 | 73 |
|
| 74 | + def to_h |
| 75 | + { |
| 76 | + method: @method, |
| 77 | + uri: full_uri, |
| 78 | + base_uri: @uri, |
| 79 | + data: @data, |
| 80 | + params: @params, |
| 81 | + headers: @headers |
| 82 | + } |
| 83 | + end |
| 84 | + |
84 | 85 | private
|
85 | 86 |
|
| 87 | + def query |
| 88 | + @params.map { |k, v| "#{k}=#{v}" }.join('&') |
| 89 | + end |
| 90 | + |
86 | 91 | def uri(id = nil)
|
87 |
| - uri = "#{@base_url}/#{@endpoint}" |
| 92 | + uri = @base_url |
| 93 | + uri += "/#{@endpoint}" unless @endpoint.nil? |
88 | 94 | uri += "/#{id}" if id
|
89 |
| - uri += "?#{@params.join('&')}" if @params.any? |
90 | 95 |
|
91 | 96 | uri
|
92 | 97 | end
|
| 98 | + |
| 99 | + def full_uri |
| 100 | + full_uri = @uri |
| 101 | + query.tap do |q| |
| 102 | + full_uri += "?#{q}" unless q.empty? |
| 103 | + end |
| 104 | + |
| 105 | + full_uri |
| 106 | + end |
93 | 107 | end
|
94 | 108 | end
|
95 | 109 | end
|
0 commit comments