Class: FreshdeskAPI::Collection

Inherits:
Object
  • Object
show all
Defined in:
lib/freshdesk_api/collection.rb

Overview

Represents a collection of resources

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, resource, options = {}) ⇒ Collection

Creates a new Collection instance. Does not fetch resources.

Parameters:

  • client (Client)

    The FreshdeskAPI::Client to use.

  • resource (String)

    The resource being collected.

  • options (Hash) (defaults to: {})

    Any additional options to be passed in.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/freshdesk_api/collection.rb', line 13

def initialize(client, resource, options = {})
  @client = client
  @resource_class = resource
  @resource = resource.resource_name
  @options = options

  methods = %w[create find update destroy]
  methods += methods.map { |method| method + '!' }
  methods.each do |deferrable|
    # Passes arguments and the proper path to the resource class method.
    # @param [Hash] options Options or attributes to pass
    define_singleton_method deferrable do |*args|
      unless @resource_class.respond_to?(deferrable)
        raise NoMethodError.new("undefined method \"#{deferrable}\" for #{@resource_class}", deferrable, args)
      end

      opts = args.last.is_a?(Hash) ? args.pop : {}
      @resource_class.send(deferrable, @client, opts)
    end
  end
end

Instance Attribute Details

#resource_classObject (readonly)

Returns the value of attribute resource_class.



7
8
9
# File 'lib/freshdesk_api/collection.rb', line 7

def resource_class
  @resource_class
end

#resourcesObject (readonly)

Returns the value of attribute resources.



6
7
8
# File 'lib/freshdesk_api/collection.rb', line 6

def resources
  @resources
end

Instance Method Details

#all!(options = {}) ⇒ Object

Execute actual GET from API and load resources into proper class. # @return [Array] All resource



42
43
44
45
46
47
48
49
# File 'lib/freshdesk_api/collection.rb', line 42

def all!(options = {})
  @options.merge!(options)

  response = get_response(path)
  handle_response(response.body)

  @resources
end

#get_response(path) ⇒ Object



51
52
53
# File 'lib/freshdesk_api/collection.rb', line 51

def get_response(path)
  @client.connection[path].send(:get, @options)
end

#handle_response(response_body) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/freshdesk_api/collection.rb', line 55

def handle_response(response_body)
  results = MultiJson.load(response_body, symbolize_keys: true)

  if results.is_a?(Hash)
    results = FreshdeskAPI::Helpers.deep_hash_access(results, @resource_class.collection_namespace)
  elsif results.is_a?(Array)
    results = results.map { |r| r[@resource_class.collection_namespace.to_sym] }
  else
    raise "Expected a Hash or Array for response body, got #{result.inspect}"
  end

  @resources = results.map do |res|
    wrap_resource(res)
  end
end

#pathObject

The API path to this collection



36
37
38
# File 'lib/freshdesk_api/collection.rb', line 36

def path
  @resource_class.api_url(@options)
end

#to_sObject Also known as: inspect



76
77
78
79
80
81
82
83
84
# File 'lib/freshdesk_api/collection.rb', line 76

def to_s
  if @resources
    @resources.inspect
  else
    inspect = []
    inspect << "options=#{@options.inspect}" if @options.any?
    "#{@resource.singularize} collection [#{inspect.join(',')}]"
  end
end

#wrap_resource(res) ⇒ Object



71
72
73
# File 'lib/freshdesk_api/collection.rb', line 71

def wrap_resource(res)
  @resource_class.new(@client, res)
end