Close a number of holes in the API by making it validate changes
[rails.git] / app / controllers / node_controller.rb
1 class NodeController < ApplicationController
2   require 'xml/libxml'
3
4   before_filter :authorize
5   after_filter :compress_output
6
7   def create
8     response.headers["Content-Type"] = 'text/xml'
9     if request.put?
10       node = Node.from_xml(request.raw_post, true)
11
12       if node
13         node.user_id = @user.id
14         node.visible = 1
15         if node.save_with_history
16           render :text => node.id.to_s
17         else
18           render :nothing => true, :status => 500
19         end
20         return
21
22       else
23         render :nothing => true, :status => 400 # if we got here the doc didnt parse
24         return
25       end
26     end
27
28     render :nothing => true, :status => 500 # something went very wrong
29   end
30
31   def rest
32     response.headers["Content-Type"] = 'text/xml'
33     unless Node.exists?(params[:id])
34       render :nothing => true, :status => 404
35       return
36     end
37
38     node = Node.find(params[:id])
39
40     case request.method
41
42     when :get
43       unless node
44         render :nothing => true, :status => 500
45         return
46       end
47
48       unless node.visible
49         render :nothing => true, :status => 410
50         return
51       end
52
53       render :text => node.to_xml.to_s
54       return
55
56     when :delete
57       if node.visible
58         if Segment.find(:first, :conditions => [ "visible = 1 and (node_a = ? or node_b = ?)", node.id, node.id])
59           render :nothing => true, :status => HTTP_PRECONDITION_FAILED
60         else
61           node.visible = 0
62           node.save_with_history
63           render :nothing => true
64         end
65       else
66         render :nothing => true, :status => 410
67       end
68
69     when :put
70       new_node = Node.from_xml(request.raw_post)
71
72       if new_node
73         node.timestamp = Time.now
74         node.user_id = @user.id
75
76         node.latitude = new_node.latitude 
77         node.longitude = new_node.longitude
78         node.tags = new_node.tags
79
80         if node.id == new_node.id and node.save_with_history
81           render :nothing => true
82         else
83           render :nothing => true, :status => 500
84         end
85       else
86         render :nothing => true, :status => 400 # if we got here the doc didnt parse
87       end
88       return
89     end
90
91   end
92
93   def nodes
94     response.headers["Content-Type"] = 'text/xml'
95     ids = params['nodes'].split(',').collect {|n| n.to_i }
96     if ids.length > 0
97       nodelist = Node.find(ids)
98       doc = get_xml_doc
99       nodelist.each do |node|
100         doc.root << node.to_xml_node
101       end 
102       render :text => doc.to_s
103     else
104       render :nothing => true, :status => 400
105     end
106   end
107 end