X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2c0b0226983d13084e77fe059efb85d5ce2c33f5..a1c4ece152e1e992c18f0cb368528cd2ac843b07:/services/api/app/controllers/arvados/v1/collections_controller.rb diff --git a/services/api/app/controllers/arvados/v1/collections_controller.rb b/services/api/app/controllers/arvados/v1/collections_controller.rb index 3803d37691..c771fcea79 100644 --- a/services/api/app/controllers/arvados/v1/collections_controller.rb +++ b/services/api/app/controllers/arvados/v1/collections_controller.rb @@ -15,6 +15,21 @@ class Arvados::V1::CollectionsController < ApplicationController include_trash: { type: 'boolean', required: false, description: "Include collections whose is_trashed attribute is true." }, + include_old_versions: { + type: 'boolean', required: false, description: "Include past collection versions." + }, + }) + end + + def self._show_requires_parameters + (super rescue {}). + merge({ + include_trash: { + type: 'boolean', required: false, description: "Show collection even if its is_trashed attribute is true." + }, + include_old_versions: { + type: 'boolean', required: false, description: "Include past collection versions." + }, }) end @@ -23,20 +38,41 @@ class Arvados::V1::CollectionsController < ApplicationController resource_attrs[:portable_data_hash] = loc.to_s resource_attrs.delete :uuid end + resource_attrs.delete :version + resource_attrs.delete :current_version_uuid super end def find_objects_for_index + opts = {} if params[:include_trash] || ['destroy', 'trash', 'untrash'].include?(action_name) - @objects = Collection.readable_by(*@read_users, {include_trash: true, query_on: Collection.unscoped}) + opts.update({include_trash: true}) end + if params[:include_old_versions] || @include_old_versions + opts.update({include_old_versions: true}) + end + @objects = Collection.readable_by(*@read_users, opts) if !opts.empty? super end def find_object_by_uuid + @include_old_versions = true + if loc = Keep::Locator.parse(params[:id]) loc.strip_hints! - if c = Collection.readable_by(*@read_users).where({ portable_data_hash: loc.to_s }).limit(1).first + + # It matters which Collection object we pick because we use it to get signed_manifest_text, + # the value of which is affected by the value of trash_at. + # + # From postgres doc: "By default, null values sort as if larger than any non-null + # value; that is, NULLS FIRST is the default for DESC order, and + # NULLS LAST otherwise." + # + # "trash_at desc" sorts null first, then latest to earliest, so + # it will select the Collection object with the longest + # available lifetime. + + if c = Collection.readable_by(*@read_users).where({ portable_data_hash: loc.to_s }).order("trash_at desc").limit(1).first @object = { uuid: c.portable_data_hash, portable_data_hash: c.portable_data_hash,