· 4 years ago · Aug 17, 2021, 01:00 PM
1module Github
2 module V3
3 class Client
4 include HttpStatusCodes
5 include ApiExceptions
6
7 API_ENDPOINT = 'https://api.github.com'
8
9 def initialize(oauth_token = nil)
10 @oauth_token = oauth_token
11 end
12
13 def user_repos(username)
14 request(
15 http_method: :get,
16 endpoint: "users/#{username}/repos"
17 )
18 end
19
20 def my_repo
21 request(
22 http_method: :get,
23 endpoint: "user"
24 )
25 end
26
27 private
28
29 def request(http_method:, endpoint:, params: {})
30 @response = connection.public_send(http_method, endpoint, params)
31 parsed_response = JSON.parse(@response.body)
32
33 return parsed_response if response_successful?
34
35 raise error_class, "Code: #{@response.status}, response: #{@response.body}"
36 end
37
38 def connection
39 @connection ||= Faraday.new(API_ENDPOINT) do |f|
40 f.request :url_encoded
41 f.adapter Faraday.default_adapter
42 f.headers['Authorization'] = "token #{@oauth_token}" if @oauth_token.present?
43 end
44 end
45
46 def response_successful?
47 @response.status == HTTP_OK_CODE
48 end
49
50 def error_class
51 case @response.status
52 when HTTP_NOT_FOUND_CODE
53 NotFoundError
54 when HTTP_UNPROCESSABLE_ENTITY_CODE
55 UnprocessableEntityError
56 else
57 ApiError
58 end
59 end
60 end
61 end
62end
63