lib/osm/api.rb in osm-1.2.22 vs lib/osm/api.rb in osm-1.2.23

- old
+ new

@@ -167,10 +167,48 @@ 'userid' => @user_id, 'secret' => @user_secret, })) end + # Get API user's roles in OSM + # @!macro options_get + # @return [Array<Hash>] data returned by OSM + def get_user_roles(*args) + begin + get_user_roles!(*args) + rescue Osm::NoActiveRoles + return [] + end + end + + + # Get API user's roles in OSM + # @!macro options_get + # @return [Array<Hash>] data returned by OSM + # @raises Osm::NoActiveRoles + def get_user_roles!(options={}) + cache_key = ['user_roles', @user_id] + + if !options[:no_cache] && Osm::Model.cache_exist?(self, cache_key) + return Osm::Model.cache_read(self, cache_key) + end + + begin + data = perform_query('api.php?action=getUserRoles') + Osm::Model.cache_write(self, cache_key, data) + return data + + rescue Osm::Error => e + if e.message.eql?('false') + fail Osm::NoActiveRoles, "You do not have any active roles in OSM." + else + raise e + end + end + + end + # Get API user's permissions # @!macro options_get # @return nil if an error occured or the user does not have access to that section # @return [Hash] {section_id => permissions_hash} def get_user_permissions(options={}) @@ -178,14 +216,12 @@ if !options[:no_cache] && Osm::Model.cache_exist?(self, cache_key) return Osm::Model.cache_read(self, cache_key) end - data = perform_query('api.php?action=getUserRoles') - all_permissions = Hash.new - data.each do |item| + get_user_roles(options).each do |item| unless item['section'].eql?('discount') # It's not an actual section all_permissions.merge!(Osm::to_i_or_nil(item['sectionid']) => Osm.make_permissions_hash(item['permissions'])) end end Osm::Model.cache_write(self, cache_key, all_permissions) @@ -240,26 +276,23 @@ end return nil if result.response.body.empty? case result.response.content_type when 'application/json', 'text/html' - raise Osm::Error, result.response.body unless looks_like_json?(result.response.body) - decoded = ActiveSupport::JSON.decode(result.response.body) - osm_error = get_osm_error(decoded) - raise Osm::Error, osm_error if osm_error - return decoded + begin + decoded = ActiveSupport::JSON.decode(result.response.body) + if osm_error = get_osm_error(decoded) + fail Osm::Error, osm_error if osm_error + end + return decoded + rescue ActiveModel::VERSION::MAJOR.eql?(4) ? JSON::ParserError : MultiJson::ParseError + fail Osm::Error, result.response.body + end when 'image/jpeg' return result.response.body else - raise Osm::Error, "Unhandled content-type: #{result.response.content_type}" + fail Osm::Error, "Unhandled content-type: #{result.response.content_type}" end - end - - # Check if text looks like it's JSON - # @param [String] text What to look at - # @return [Boolean] - def self.looks_like_json?(text) - (['[', '{'].include?(text[0])) end # Get the error returned by OSM # @param data what OSM gave us # @return false if no error message was found