X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/9003633889b26bdd19c1376c69981aaaa21ee819..71774e0e8890a77cfc08871fa30351409ec7f91c:/services/api/app/controllers/arvados/v1/groups_controller.rb?ds=sidebyside diff --git a/services/api/app/controllers/arvados/v1/groups_controller.rb b/services/api/app/controllers/arvados/v1/groups_controller.rb index 8d15bb1c50..e9bc006a36 100644 --- a/services/api/app/controllers/arvados/v1/groups_controller.rb +++ b/services/api/app/controllers/arvados/v1/groups_controller.rb @@ -10,6 +10,8 @@ class Arvados::V1::GroupsController < ApplicationController skip_before_action :find_object_by_uuid, only: :shared skip_before_action :render_404_if_no_object, only: :shared + TRASHABLE_CLASSES = ['project'] + def self._index_requires_parameters (super rescue {}). merge({ @@ -32,7 +34,7 @@ class Arvados::V1::GroupsController < ApplicationController params = _index_requires_parameters. merge({ uuid: { - type: 'string', required: false, default: nil, + type: 'string', required: false, default: '', }, recursive: { type: 'boolean', required: false, default: false, description: 'Include contents from child groups recursively.', @@ -99,6 +101,15 @@ class Arvados::V1::GroupsController < ApplicationController end end + def destroy + if !TRASHABLE_CLASSES.include?(@object.group_class) + @object.destroy + show + else + super # Calls destroy from TrashableController module + end + end + def render_404_if_no_object if params[:action] == 'contents' if !params[:uuid] @@ -252,6 +263,9 @@ class Arvados::V1::GroupsController < ApplicationController included_by_uuid = {} seen_last_class = false + error_by_class = {} + any_success = false + klasses.each do |klass| # check if current klass is same as params['last_object_class'] seen_last_class = true if((params['count'].andand.==('none')) and @@ -307,7 +321,19 @@ class Arvados::V1::GroupsController < ApplicationController # Adjust the limit based on number of objects fetched so far klass_limit = limit_all - all_objects.count @limit = klass_limit - apply_where_limit_order_params klass + + begin + apply_where_limit_order_params klass + rescue ArgumentError => e + if e.inspect =~ /Invalid attribute '.+' for operator '.+' in filter/ or + e.inspect =~ /Invalid attribute '.+' for subproperty filter/ + error_by_class[klass.name] = e + next + end + raise + else + any_success = true + end # This actually fetches the objects klass_object_list = object_list(model_class: klass) @@ -338,6 +364,14 @@ class Arvados::V1::GroupsController < ApplicationController end end + # Only error out when every searchable object type errored out + if !any_success && error_by_class.size > 0 + error_msg = error_by_class.collect do |klass, err| + "#{err} on object type #{klass}" + end.join("\n") + raise ArgumentError.new(error_msg) + end + if params["include"] @extra_included = included_by_uuid.values end @@ -351,8 +385,6 @@ class Arvados::V1::GroupsController < ApplicationController @offset = offset_all end - protected - def exclude_home objectlist, klass # select records that are readable by current user AND # the owner_uuid is a user (but not the current user) OR