X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/19d0b4c509ec720f9ffc1ea13f758c5825308834..9e3bb9b984ff700fc3455f87437a8f1ac5841f0e:/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 918d499521..294e092f6c 100644 --- a/services/api/app/controllers/arvados/v1/collections_controller.rb +++ b/services/api/app/controllers/arvados/v1/collections_controller.rb @@ -12,6 +12,7 @@ class Arvados::V1::CollectionsController < ApplicationController 'arvados#group' end unless current_user.can? write: owner_uuid + logger.warn "User #{current_user.andand.uuid} tried to set collection owner_uuid to #{owner_uuid}" raise ArvadosModel::PermissionDeniedError end act_as_system_user do @@ -77,60 +78,65 @@ class Arvados::V1::CollectionsController < ApplicationController end end end - gr end def generate_provenance_edges(visited, uuid) m = collection_uuid(uuid) + uuid = m if m - if not uuid or uuid.empty? or visited[uuid] or visited[m] + if not uuid or uuid.empty? or visited[uuid] return "" end - #puts "visiting #{uuid}" + logger.debug "visiting #{uuid}" if m # uuid is a collection - uuid = m - Collection.where(uuid:"uuid").each do |c| - visited[uuid] = c + Collection.readable_by(current_user).where(uuid: uuid).each do |c| + visited[uuid] = c.as_api_response + visited[uuid][:files] = [] + c.files.each do |f| + visited[uuid][:files] << f + end end - Job.where(output: uuid).each do |job| + Job.readable_by(current_user).where(output: uuid).each do |job| generate_provenance_edges(visited, job.uuid) end - Job.where(log: uuid).each do |job| + Job.readable_by(current_user).where(log: uuid).each do |job| generate_provenance_edges(visited, job.uuid) end else - visited[uuid] = true - # uuid is something else - rsc = ArvadosBase::resource_class_for_uuid uuid - + rsc = ArvadosModel::resource_class_for_uuid uuid if rsc == Job - Job.where(uuid: uuid).each do |job| - visited[uuid] = job - script_param_edges(visited, job, "", job.script_parameters) + Job.readable_by(current_user).where(uuid: uuid).each do |job| + visited[uuid] = job.as_api_response + script_param_edges(visited, job.script_parameters) + end + elsif rsc != nil + rsc.where(uuid: uuid).each do |r| + visited[uuid] = r.as_api_response end end end - Link.where(head_uuid: uuid, link_class: "provenance").each do |link| + Link.readable_by(current_user). + where(head_uuid: uuid, link_class: "provenance"). + each do |link| + visited[link.uuid] = link.as_api_response generate_provenance_edges(visited, link.tail_uuid) end #puts "finished #{uuid}" - - gr end - def provenance(id) + def provenance visited = {} - generate_provenance_edges(visited, id[:uuid]) - visited + generate_provenance_edges(visited, @object[:uuid]) + render json: visited end