sparkapi/spark_api

View on GitHub
lib/spark_api/models/account.rb

Summary

Maintainability
A
1 hr
Test Coverage
module SparkApi
  module Models
    class Account < Base
      extend Finders
      self.element_name="accounts"
      
      SUBELEMENTS = [:emails, :phones, :websites, :addresses, :images]
      attr_accessor :my_account, *SUBELEMENTS 
      
      def initialize(attributes={})
        @emails = subresource(Email, "Emails", attributes)
        @phones = subresource(Phone, "Phones", attributes)
        @websites = subresource(Website, "Websites", attributes)
        @addresses = subresource(Address, "Addresses", attributes)
        if attributes["Images"]
          @images = [] 
          attributes["Images"].each { |i| @images << Image.new(i) }
        else
          @images = nil
        end
        @my_account = false
        super(attributes)
      end

      def self.my(arguments={})
        account  = collect(connection.get("/my/account", arguments)).first
        account.my_account = true
        account
      end
      
      def my_account?
        @my_account
      end
      
      def self.by_office(office_id, arguments={})
        collect(connection.get("#{self.path()}/by/office/#{office_id}", arguments))
      end

      def primary_img(typ)
        if @images.is_a?(Array)
          matches = @images.select {|i| i.Type == typ}
          matches.sort do |a,b| 
            if a.Name.nil? && !b.Name.nil?
              1
            elsif b.Name.nil? && !a.Name.nil?
              -1
            else
              a.Name.to_s <=> b.Name.to_s
            end 
          end.first
        else
          nil
        end
      end

      def logo
        if images.kind_of? Array
          images.find { |image| image.Type == "Logo" }
        end
      end
            
      def save(arguments={})
        self.errors = [] # clear the errors hash
        begin
          return save!(arguments)
        rescue BadResourceRequest => e
          self.errors << { :code => e.code, :message => e.message }
          SparkApi.logger.warn("Failed to save resource #{self}: #{e.message}")
        rescue NotFound => e
          self.errors << {:code => e.code, :message => e.message}
          SparkApi.logger.error("Failed to save resource #{self}: #{e.message}")
        end
        false
      end
      def save!(arguments={})
        # The long-term idea is that any setting in the user's account could be updated by including
        # an attribute and calling PUT /my/account, but for now only the GetEmailUpdates attribute 
        # is supported
        
        save_path = "/accounts/"+self.Id
        
        ojbsome = {}
        if attributes['GetEmailUpdates']
          save_path = my_account? ? "/my/account" : self.class.path
          ojbsome["GetEmailUpdates"] = attributes['GetEmailUpdates']
        end
        if attributes['PasswordValidation']
          ojbsome["PasswordValidation"] = attributes['PasswordValidation']
        end
        if attributes['Password']
          ojbsome["Password"] = attributes['Password']
        end    
          
        results = connection.put save_path, ojbsome, arguments
        true
      end


      private

      def subresource(klass, key, attributes)
        return nil unless attributes.key?(key)
        array = attributes[key]
        result = PrimaryArray.new()
        array.each do |i|
          result << klass.new(i)
        end
        result
      end

      class Email < Base
        include Primary
      end

      class Phone < Base
        include Primary
      end

      class Website < Base
        include Primary
      end

      class Address < Base
        include Primary
      end

      class Image < Base
      end
    end
  end

end