require 'json' require 'rubygems' module Restcomm module REST class ListResource include Utils def initialize(path, client) custom_names = { 'Activities' => 'Activity', 'Media' => 'MediaInstance', 'IpAddresses' => 'IpAddress', 'Feedback' => 'FeedbackInstance', 'Addresses' => 'Address' } @path, @client = path, client resource_name = self.class.name.split('::')[-1] instance_name = custom_names.fetch(resource_name, resource_name.chop) # The next line grabs the enclosing module. Necessary for resources # contained in their own submodule like /SMS/Messages parent_module = self.class.to_s.split('::')[-2] full_module_path = if parent_module == "REST" Restcomm::REST else Restcomm::REST.const_get(parent_module) end @instance_class = full_module_path.const_get(instance_name) @list_key, @instance_id_key = derestify(resource_name), 'sid' end def inspect # :nodoc: "<#{self.class} @path=#{@path}>" end ## # Grab a list of this kind of resource and return it as an array. The # array includes a special attribute named +total+ which will return the # total number of items in the list on Restcomm's server. This may differ # from the +size+ and +length+ attributes of the returned array since # by default Restcomm will only return 50 resources, and the maximum number # of resources you can request is 1000. # # The optional +params+ hash allows you to filter the list returned. The # filters for each list resource type are defined by Restcomm. def list(params={}, full_path=false) raise "Can't get a resource list without a REST Client" unless @client response = @client.get( @path, params, full_path) if @list_key == "calls" resources = response[@list_key] elsif @list_key == "recordings" resources = response else resources = response end #raise "********#{@instance_class}*******#{resources[0]["FriendlyName"]}***************" path = full_path ? @path.split('.')[0] : @path if @list_key == "available_phone_numbers" resources = response["RestcommResponse"]["AvailablePhoneNumbers"]["AvailablePhoneNumber"] resource_list = resources.map do |resource| @instance_class.new("#{path}/#{resource[@instance_id_key]}", @client, resource) end else resource_list = resources.map do |resource| @instance_class.new("#{path}/#{resource[@instance_id_key]}", @client, resource) end end # set the +total+ and +next_page+ properties on the array client, list_class = @client, self.class resource_list.instance_eval do eigenclass = class << self; self; end eigenclass.send :define_method, :total, &lambda { response['total'] } eigenclass.send :define_method, :next_page, &lambda { if response['next_page_uri'] list_class.new(response['next_page_uri'], client).list({}, true) else [] end } end resource_list end ## # Ask Restcomm for the total number of items in the list. # Calling this method makes an HTTP GET request to @path with a # page size parameter of 1 to minimize data over the wire while still # obtaining the total. Don't use this if you are planning to # call #list anyway, since the array returned from #list will have a # +total+ attribute as well. def total raise "Can't get a resource total without a REST Client" unless @client @client.get(@path, page_size: 1)['total'] end ## # Return an empty instance resource object with the proper path. Note that # this will never raise a Restcomm::REST::RequestError on 404 since no HTTP # request is made. The HTTP request is made when attempting to access an # attribute of the returned instance resource object, such as # its #date_created or #voice_url attributes. def get(sid) @instance_class.new "#{@path}/#{sid}", @client end alias :find :get # for the ActiveRecord lovers ## # Return a newly created resource. Some +params+ may be required. Consult # the Restcomm REST API documentation related to the kind of resource you # are attempting to create for details. Calling this method makes an HTTP # POST request to @path with the given params def create(params={}) raise "Can't create a resource without a REST Client" unless @client response = @client.post @path, params @instance_class.new "#{@path}/#{response[@instance_id_key]}", @client, response end end end end