X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d7b51d23da327117fd94ad32d6be791cf50cbc11..402461a12dbff7d0ec00c8446b925b021aabc2ed:/services/api/app/controllers/application_controller.rb?ds=sidebyside diff --git a/services/api/app/controllers/application_controller.rb b/services/api/app/controllers/application_controller.rb index d8c4d4c84c..fa189aa80d 100644 --- a/services/api/app/controllers/application_controller.rb +++ b/services/api/app/controllers/application_controller.rb @@ -39,7 +39,7 @@ class ApplicationController < ActionController::Base if @object.save show else - render_error "Save failed" + raise "Save failed" end end @@ -50,7 +50,7 @@ class ApplicationController < ActionController::Base if @object.update_attributes attrs_to_update show else - render_error "Update failed" + raise "Update failed" end end @@ -88,7 +88,9 @@ class ApplicationController < ActionController::Base def render_error(e) logger.error e.inspect - logger.error e.backtrace.collect { |x| x + "\n" }.join('') if e.backtrace + if e.respond_to? :backtrace and e.backtrace + logger.error e.backtrace.collect { |x| x + "\n" }.join('') + end if @object and @object.errors and @object.errors.full_messages and not @object.errors.full_messages.empty? errors = @object.errors.full_messages else @@ -124,7 +126,7 @@ class ApplicationController < ActionController::Base def load_filters_param if params[:filters].is_a? Array @filters = params[:filters] - elsif params[:filters].is_a? String + elsif params[:filters].is_a? String and !params[:filters].empty? begin @filters = Oj.load params[:filters] raise unless @filters.is_a? Array @@ -151,8 +153,10 @@ class ApplicationController < ActionController::Base when '=', '<', '<=', '>', '>=', 'like' if operand.is_a? String cond_out << "#{table_name}.#{attr} #{operator} ?" - if operator.match(/[<=>]/) and - model_class.attribute_column(attr).type == :datetime + if (# any operator that operates on value rather than + # representation: + operator.match(/[<=>]/) and + model_class.attribute_column(attr).type == :datetime) operand = Time.parse operand end param_out << operand @@ -218,15 +222,31 @@ class ApplicationController < ActionController::Base where(*conditions) end end + if params[:limit] begin - @objects = @objects.limit(params[:limit].to_i) + @limit = params[:limit].to_i rescue raise ArgumentError.new("Invalid value for limit parameter") end else - @objects = @objects.limit(100) + @limit = 100 end + @objects = @objects.limit(@limit) + + orders = [] + + if params[:offset] + begin + @objects = @objects.offset(params[:offset].to_i) + @offset = params[:offset].to_i + rescue + raise ArgumentError.new("Invalid value for limit parameter") + end + else + @offset = 0 + end + orders = [] if params[:order] params[:order].split(',').each do |order| @@ -313,7 +333,7 @@ class ApplicationController < ActionController::Base if supplied_token api_client_auth = ApiClientAuthorization. includes(:api_client, :user). - where('api_token=? and (expires_at is null or expires_at > now())', supplied_token). + where('api_token=? and (expires_at is null or expires_at > CURRENT_TIMESTAMP)', supplied_token). first if api_client_auth.andand.user session[:user_id] = api_client_auth.user.id @@ -409,12 +429,12 @@ class ApplicationController < ActionController::Base :kind => "arvados##{(@response_resource_name || resource_name).camelize(:lower)}List", :etag => "", :self_link => "", - :next_page_token => "", - :next_link => "", + :offset => @offset, + :limit => @limit, :items => @objects.as_api_response(nil) } if @objects.respond_to? :except - @object_list[:items_available] = @objects.except(:limit).count + @object_list[:items_available] = @objects.except(:limit).except(:offset).count end render json: @object_list end @@ -432,6 +452,7 @@ class ApplicationController < ActionController::Base def self._index_requires_parameters { + filters: { type: 'array', required: false }, where: { type: 'object', required: false }, order: { type: 'string', required: false } } @@ -443,13 +464,15 @@ class ApplicationController < ActionController::Base end def render *opts - response = opts.first[:json] - if response.is_a?(Hash) && - params[:_profile] && - Thread.current[:request_starttime] - response[:_profile] = { - request_time: Time.now - Thread.current[:request_starttime] - } + if opts.first + response = opts.first[:json] + if response.is_a?(Hash) && + params[:_profile] && + Thread.current[:request_starttime] + response[:_profile] = { + request_time: Time.now - Thread.current[:request_starttime] + } + end end super *opts end