use an after_update hook to keep DNS updated
[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} 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   protected
29
30   def model_class
31     controller_name.classify.constantize
32   end
33
34   def resource_name             # params[] key used by client
35     controller_name.classify.camelcase(:lower)
36   end
37
38   def find_object_by_uuid
39     logger.info params.inspect
40     @object = model_class.where('uuid=?', params[:uuid]).first
41   end
42
43   def uncamelcase_params_hash_keys
44     self.params = uncamelcase_hash_keys(params)
45   end
46
47   def uncamelcase_hash_keys(h)
48     if h.is_a? Hash
49       nh = Hash.new
50       h.each do |k,v|
51         if k.class == String
52           nk = k.underscore
53         elsif k.class == Symbol
54           nk = k.to_s.underscore.to_sym
55         else
56           nk = k
57         end
58         nh[nk] = uncamelcase_hash_keys(v)
59       end
60       h.replace(nh)
61     end
62     h
63   end
64
65   def render_list
66     @object_list = {
67       :kind  => "orvos##{resource_name}List",
68       :etag => "",
69       :self_link => "",
70       :next_page_token => "",
71       :next_link => "",
72       :items => @objects.map { |x| x }
73     }
74     render json: @object_list
75   end
76 end