Class: McCracken::Query

Inherits:
Object show all
Defined in:
lib/mccracken/query.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client = nil) ⇒ Query

Description of method



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/mccracken/query.rb', line 8

def initialize(client = nil)
  @client   = client
  @headers  = {}
  @values    = {
    include: [],
    fields:  [],
    filter:  [],
    sort:    [],
    page:    {}
  }
end

Instance Attribute Details

#valuesObject (readonly)

Returns the value of attribute values.



3
4
5
# File 'lib/mccracken/query.rb', line 3

def values
  @values
end

Instance Method Details

#fetchObject



20
21
22
23
24
25
26
27
# File 'lib/mccracken/query.rb', line 20

def fetch
  if @client
    response = @client.agent.get(params: to_params, headers: @headers)
    ResponseMapper.new(response.body).collection
  else
    raise McCracken::ClientNotSet, "Client was not set. Query#new(client)"
  end
end

#fetch_from(endpoint, collection: true) ⇒ Object

Allow fetching from a custom endpoint



33
34
35
36
37
38
39
40
41
# File 'lib/mccracken/query.rb', line 33

def fetch_from(endpoint, collection: true)
  if @client
    path = [@client.agent.negotiate_path, endpoint.gsub(/^\//, '')].join('/')
    response = @client.agent.get(path: path, params: to_params, headers: @headers)
    ResponseMapper.new(response.body).send(collection ? :collection : :resource)
  else
    raise McCracken::ClientNotSet, "Client was not set. Query#new(client)"
  end
end

#fields(*args) ⇒ Object

Hash resouce_name: [array of attribs]



145
146
147
148
# File 'lib/mccracken/query.rb', line 145

def fields(*args)
  @values[:fields] += args
  self
end

#filter(*args) ⇒ Object



150
151
152
153
# File 'lib/mccracken/query.rb', line 150

def filter(*args)
  @values[:filter] += args
  self
end

#find(id) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/mccracken/query.rb', line 43

def find(id)
  if @client
    response = @client.agent.get(id: id, params: to_params, headers: @headers)
    ResponseMapper.new(response.body).resource
  else
    raise McCracken::ClientNotSet, "Client was not set. Query#new(client)"
  end
end

#headers(opts = {}) ⇒ McCracken::Query

Chainably set headers

Examples:

set a header

McCracken::Query.new.headers("X-API-TOKEN" => "banana")

set headers

McCracken::Query.new.headers("X-API-TOKEN" => "banana", "X-API-VERSION" => "1.3")


94
95
96
97
# File 'lib/mccracken/query.rb', line 94

def headers(opts={})
  @headers.merge!(opts)
  self
end

#include(*args) ⇒ McCracken::Query

Chainably include related resources.

Examples:

including a resource

McCracken::Query.new.include(:user)

including a related resource

McCracken::Query.new.include("user.addresses")

including multiple resources

McCracken::Query.new.include("user.addresses", "user.images")

See Also:



114
115
116
117
# File 'lib/mccracken/query.rb', line 114

def include(*args)
  @values[:include] += args
  self
end

#page(opts = {}) ⇒ McCracken::Query

Chainably set page options

Examples:

set a limit and offset

McCracken::Query.new.page(limit: 10, offset: 5)

set a size and number

McCracken::Query.new.page(size: 10, number: 5)


80
81
82
83
# File 'lib/mccracken/query.rb', line 80

def page(opts={})
  @values[:page].merge!(opts)
  self
end

#sort(*args) ⇒ McCracken::Query

Note:

Default order is ascending

Chainably sort results

Examples:

sorting by a single field

Munsun::Query.new.sort(:created_at)

sorting by a multiple fields

Munsun::Query.new.sort(:created_at, :age)

specifying sort direction

Munsun::Query.new.sort(:created_at, age: :desc)

specifying sort direction

Munsun::Query.new.sort(score: :desc, :created_at)

See Also:



138
139
140
141
142
# File 'lib/mccracken/query.rb', line 138

def sort(*args)
  validate_sort_args(args.select{|arg| arg.is_a?(Hash)})
  @values[:sort] += args
  self
end

#to_paramsObject



61
62
63
64
65
66
67
68
69
# File 'lib/mccracken/query.rb', line 61

def to_params
  str = {}
  str[:filter]  = filter_to_query_value unless @values[:filter].empty?
  str[:fields]  = fields_to_query_value unless @values[:fields].empty?
  str[:include] = include_to_query_value unless @values[:include].empty?
  str[:sort]    = sort_to_query_value unless @values[:sort].empty?
  str[:page]    = @values[:page] unless @values[:page].empty?
  str
end

#to_query_stringString



53
54
55
# File 'lib/mccracken/query.rb', line 53

def to_query_string
  Faraday::Utils.build_nested_query(to_params)
end

#to_sObject



57
58
59
# File 'lib/mccracken/query.rb', line 57

def to_s
  to_query_string
end