class Mangadex::Internal::Request

Constants

ALLOWED_METHODS

Attributes

headers[RW]
method[RW]
path[RW]
payload[RW]
raw[RW]
response[R]

Public Class Methods

delete(path, headers: nil, auth: false, payload: nil, raw: false) click to toggle source
# File lib/mangadex/internal/request.rb, line 30
def self.delete(path, headers: nil, auth: false, payload: nil, raw: false)
  new(path, method: :delete, headers: headers, payload: payload).run!(raw: raw, auth: auth)
end
get(path, params={}, auth: false, headers: nil, raw: false, content_rating: false) click to toggle source
# File lib/mangadex/internal/request.rb, line 13
def self.get(path, params={}, auth: false, headers: nil, raw: false, content_rating: false)
  new(
    path_with_params(path, params, content_rating),
    method: :get,
    headers: headers,
    payload: nil,
  ).run!(raw: raw, auth: auth)
end
new(path, method:, headers: nil, payload: nil) click to toggle source
# File lib/mangadex/internal/request.rb, line 34
def initialize(path, method:, headers: nil, payload: nil)
  @path = path
  @headers = Hash(headers)
  @payload = payload
  @method = ensure_method!(method)
end
post(path, headers: nil, auth: false, payload: nil, raw: false) click to toggle source
# File lib/mangadex/internal/request.rb, line 22
def self.post(path, headers: nil, auth: false, payload: nil, raw: false)
  new(path, method: :post, headers: headers, payload: payload).run!(raw: raw, auth: auth)
end
put(path, headers: nil, auth: false, payload: nil, raw: false) click to toggle source
# File lib/mangadex/internal/request.rb, line 26
def self.put(path, headers: nil, auth: false, payload: nil, raw: false)
  new(path, method: :put, headers: headers, payload: payload).run!(raw: raw, auth: auth)
end

Private Class Methods

path_with_params(path, params, content_rating) click to toggle source
# File lib/mangadex/internal/request.rb, line 80
def self.path_with_params(path, params, content_rating)
  params = content_rating ? self.with_content_rating(params) : params
  return path if params.blank?

  params = params.deep_transform_keys do |key|
    Mangadex::Utils.camelize(key.to_s)
  end
  "#{path}?#{params.to_query}"
end
with_content_rating(data) click to toggle source
# File lib/mangadex/internal/request.rb, line 90
def self.with_content_rating(data)
  content_rating = data.has_key?(:content_rating) ? data[:content_rating] : []
  Mangadex.context.allow_content_ratings(*content_rating) do
    data[:content_rating] = Mangadex.context.allowed_content_ratings
  end
  data
end

Public Instance Methods

request() click to toggle source
# File lib/mangadex/internal/request.rb, line 41
def request
  RestClient::Request.new(
    method: method,
    url: request_url,
    headers: request_headers,
    payload: request_payload,
  )
end
run!(raw: false, auth: false) click to toggle source
# File lib/mangadex/internal/request.rb, line 50
def run!(raw: false, auth: false)
  payload_details = request_payload ? "Payload: #{sensitive_request_payload}" : "{no-payload}"
  puts("[#{self.class.name}] #{method.to_s.upcase} #{request_url} #{payload_details}")

  raise Mangadex::Errors::UserNotLoggedIn.new if auth && Mangadex.context.user.nil?

  start_time = Time.now

  @response = request.execute
  end_time = Time.now
  elapsed_time = ((end_time - start_time) * 1000).to_i
  puts("[#{self.class.name}] took #{elapsed_time} ms")
  
  raw_request = raw || Mangadex.context.force_raw_requests

  if (body = @response.body)
    raw_request ? try_json(body) : Mangadex::Api::Response.coerce(try_json(body))
  end
rescue RestClient::Unauthorized => error
  raise Errors::UnauthorizedError.new(Mangadex::Api::Response.coerce(try_json(error.response.body)))
rescue RestClient::Exception => error
  if (body = error.response.body)
    raw_request ? try_json(body) : Mangadex::Api::Response.coerce(JSON.parse(body)) rescue raise error
  else
    raise error
  end
end

Private Instance Methods

ensure_method!(method) click to toggle source
# File lib/mangadex/internal/request.rb, line 129
def ensure_method!(method)
  raise 'Method must be present' if missing_method?(method)

  clean_method = method.to_s.downcase.to_sym
  return clean_method if ALLOWED_METHODS.include?(clean_method)

  raise "Invalid method: #{method}. Must be one of: #{ALLOWED_METHODS}"
end
missing_method?(method) click to toggle source
# File lib/mangadex/internal/request.rb, line 125
def missing_method?(method)
  method.nil? || method.to_s.strip.empty?
end
request_headers() click to toggle source
# File lib/mangadex/internal/request.rb, line 117
def request_headers
  return headers if Mangadex.context.user.nil?

  headers.merge({
    Authorization: Mangadex.context.user.session,
  })
end
request_payload() click to toggle source
# File lib/mangadex/internal/request.rb, line 103
def request_payload
  return if payload.nil? || payload.empty?

  JSON.generate(payload)
end
request_url() click to toggle source
# File lib/mangadex/internal/request.rb, line 98
def request_url
  request_path = path.start_with?('/') ? path : "/#{path}"
  "#{Mangadex.configuration.mangadex_url}#{request_path}"
end
sensitive_request_payload(sensitive_fields: %w(password token)) click to toggle source
# File lib/mangadex/internal/request.rb, line 109
def sensitive_request_payload(sensitive_fields: %w(password token))
  payload = JSON.parse(request_payload)
  sensitive_fields.map(&:to_s).each do |field|
    payload[field] = '[REDACTED]' if payload.key?(field)
  end
  JSON.generate(payload)
end
try_json(body) click to toggle source
# File lib/mangadex/internal/request.rb, line 138
def try_json(body)
  JSON.parse(body)
rescue JSON::ParserError
  body
end