Merge branch 'master' into 2525-java-sdk
[arvados.git] / services / api / app / controllers / arvados / v1 / links_controller.rb
1 class Arvados::V1::LinksController < ApplicationController
2
3   def check_uuid_kind uuid, kind
4     if kind and ArvadosModel::resource_class_for_uuid(uuid).andand.kind != kind
5       render :json => { errors: ["'#{kind}' does not match uuid '#{uuid}', expected '#{ArvadosModel::resource_class_for_uuid(uuid).andand.kind}'"] }.to_json, status: 422
6       nil
7     else
8       true
9     end
10   end
11
12   def create
13     return if ! check_uuid_kind resource_attrs[:head_uuid], resource_attrs[:head_kind]
14     return if ! check_uuid_kind resource_attrs[:tail_uuid], resource_attrs[:tail_kind]
15
16     resource_attrs.delete :head_kind
17     resource_attrs.delete :tail_kind
18     super
19   end
20
21   protected
22
23   # Overrides ApplicationController load_where_param
24   def load_where_param
25     super
26
27     # head_kind and tail_kind columns are now virtual,
28     # equivilent functionality is now provided by
29     # 'is_a', so fix up any old-style 'where' clauses.
30     if @where
31       @filters ||= []
32       if @where[:head_kind]
33         @filters << ['head_uuid', 'is_a', @where[:head_kind]]
34         @where.delete :head_kind
35       end
36       if @where[:tail_kind]
37         @filters << ['tail_uuid', 'is_a', @where[:tail_kind]]
38         @where.delete :tail_kind
39       end
40     end
41   end
42
43   # Overrides ApplicationController load_filters_param
44   def load_filters_param
45     super
46
47     # head_kind and tail_kind columns are now virtual,
48     # equivilent functionality is now provided by
49     # 'is_a', so fix up any old-style 'filter' clauses.
50     @filters = @filters.map do |k|
51       if k[0] == 'head_kind' and k[1] == '='
52         ['head_uuid', 'is_a', k[2]]
53       elsif k[0] == 'tail_kind' and k[1] == '='
54         ['tail_uuid', 'is_a', k[2]]
55       else
56         k
57       end
58     end
59   end
60
61 end