implement generic resource#update
[arvados.git] / app / controllers / application_controller.rb
1 class ApplicationController < ActionController::Base
2   protect_from_forgery
3   before_filter :uncamelcase_params_hash_keys
4   before_filter :find_object_by_uuid, :except => :index
5
6   def index
7     @objects ||= model_class.all
8     render_list
9   end
10
11   def show
12     render json: @object
13   end
14
15   def create
16     @attrs = params[resource_name]
17     if @attrs.nil?
18       raise "no #{resource_name} (or #{resource_name.camelcase(:lower)}) provided with request #{params.inspect}"
19     end
20     if @attrs.class == String
21       @attrs = uncamelcase_hash_keys(JSON.parse @attrs)
22     end
23     @object = model_class.new @attrs
24     @object.save
25     show
26   end
27
28   def update
29     @attrs = params[resource_name]
30     if @attrs.class == String
31       @attrs = uncamelcase_hash_keys(JSON.parse @attrs)
32     end
33     @object.update_attributes @attrs
34     show
35   end
36
37   protected
38
39   def model_class
40     controller_name.classify.constantize
41   end
42
43   def resource_name             # params[] key used by client
44     controller_name.singularize
45   end
46
47   def find_object_by_uuid
48     logger.info params.inspect
49     if params[:id] and params[:id].match /\D/
50       params[:uuid] = params.delete :id
51     end
52     @object = model_class.where('uuid=?', params[:uuid]).first
53   end
54
55   def uncamelcase_params_hash_keys
56     self.params = uncamelcase_hash_keys(params)
57   end
58
59   def uncamelcase_hash_keys(h)
60     if h.is_a? Hash
61       nh = Hash.new
62       h.each do |k,v|
63         if k.class == String
64           nk = k.underscore
65         elsif k.class == Symbol
66           nk = k.to_s.underscore.to_sym
67         else
68           nk = k
69         end
70         nh[nk] = uncamelcase_hash_keys(v)
71       end
72       h.replace(nh)
73     end
74     h
75   end
76
77   def render_list
78     @object_list = {
79       :kind  => "orvos##{resource_name}List",
80       :etag => "",
81       :self_link => "",
82       :next_page_token => "",
83       :next_link => "",
84       :items => @objects.map { |x| x }
85     }
86     render json: @object_list
87   end
88 end