Merge branch 'master' into 9998-unsigned_manifest
[arvados.git] / services / api / app / controllers / arvados / v1 / collections_controller.rb
index 54f09828f5ea29d9d17c09dc6ef7f8c85831ceaa..2beb1e714d7c3fd1af64731c9023b989caa9ed14 100644 (file)
@@ -1,6 +1,12 @@
 require "arvados/keep"
 
 class Arvados::V1::CollectionsController < ApplicationController
+  include DbCurrentTime
+
+  def self.limit_index_columns_read
+    ["manifest_text"]
+  end
+
   def create
     if resource_attrs[:uuid] and (loc = Keep::Locator.parse(resource_attrs[:uuid]))
       resource_attrs[:portable_data_hash] = loc.to_s
@@ -9,6 +15,13 @@ class Arvados::V1::CollectionsController < ApplicationController
     super
   end
 
+  def find_objects_for_index
+    if params[:include_trash] || ['destroy', 'trash'].include?(action_name)
+      @objects = Collection.unscoped.readable_by(*@read_users)
+    end
+    super
+  end
+
   def find_object_by_uuid
     if loc = Keep::Locator.parse(params[:id])
       loc.strip_hints!
@@ -19,22 +32,39 @@ class Arvados::V1::CollectionsController < ApplicationController
           manifest_text: c.signed_manifest_text,
         }
       end
+      true
     else
       super
     end
-    true
   end
 
   def show
     if @object.is_a? Collection
+      # Omit unsigned_manifest_text
+      @select ||= model_class.selectable_attributes - ["unsigned_manifest_text"]
       super
     else
-      render json: @object
+      send_json @object
     end
   end
 
-  def index
-    super
+  def destroy
+    if !@object.is_trashed
+      @object.update_attributes!(trash_at: db_current_time)
+    end
+    earliest_delete = (@object.trash_at +
+                       Rails.configuration.blob_signature_ttl.seconds)
+    if @object.delete_at > earliest_delete
+      @object.update_attributes!(delete_at: earliest_delete)
+    end
+    show
+  end
+
+  def trash
+    if !@object.is_trashed
+      @object.update_attributes!(trash_at: db_current_time)
+    end
+    show
   end
 
   def find_collections(visited, sp, &b)
@@ -125,9 +155,9 @@ class Arvados::V1::CollectionsController < ApplicationController
           visited[uuid] = job.as_api_response
           if direction == :search_up
             # Follow upstream collections referenced in the script parameters
-            find_collections(visited, job) do |hash, uuid|
+            find_collections(visited, job) do |hash, col_uuid|
               search_edges(visited, hash, :search_up) if hash
-              search_edges(visited, uuid, :search_up) if uuid
+              search_edges(visited, col_uuid, :search_up) if col_uuid
             end
           elsif direction == :search_down
             # Follow downstream job output
@@ -169,24 +199,23 @@ class Arvados::V1::CollectionsController < ApplicationController
     visited = {}
     search_edges(visited, @object[:portable_data_hash], :search_up)
     search_edges(visited, @object[:uuid], :search_up)
-    render json: visited
+    send_json visited
   end
 
   def used_by
     visited = {}
     search_edges(visited, @object[:uuid], :search_down)
     search_edges(visited, @object[:portable_data_hash], :search_down)
-    render json: visited
+    send_json visited
   end
 
   protected
 
   def load_limit_offset_order_params *args
+    super
     if action_name == 'index'
-      # Omit manifest_text from index results unless expressly selected.
-      @select ||= model_class.api_accessible_attributes(:user).
-        map { |attr_spec| attr_spec.first.to_s } - ["manifest_text"]
+      # Omit manifest_text and unsigned_manifest_text from index results unless expressly selected.
+      @select ||= model_class.selectable_attributes - ["manifest_text", "unsigned_manifest_text"]
     end
-    super
   end
 end