]> git.openstreetmap.org Git - rails.git/blob - app/controllers/node_controller.rb
use render proc to write out results, see if that makes things faster
[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.user_id = @user.id
62           node.visible = 0
63           node.save_with_history
64           render :nothing => true
65         end
66       else
67         render :nothing => true, :status => 410
68       end
69
70     when :put
71       new_node = Node.from_xml(request.raw_post)
72
73       if new_node
74         node.timestamp = Time.now
75         node.user_id = @user.id
76
77         node.latitude = new_node.latitude 
78         node.longitude = new_node.longitude
79         node.tags = new_node.tags
80
81         if node.id == new_node.id and node.save_with_history
82           render :nothing => true
83         else
84           render :nothing => true, :status => 500
85         end
86       else
87         render :nothing => true, :status => 400 # if we got here the doc didnt parse
88       end
89       return
90     end
91
92   end
93
94   def nodes
95     response.headers["Content-Type"] = 'text/xml'
96     ids = params['nodes'].split(',').collect {|n| n.to_i }
97     if ids.length > 0
98       nodelist = Node.find(ids)
99       doc = get_xml_doc
100       nodelist.each do |node|
101         doc.root << node.to_xml_node
102       end 
103       render :text => doc.to_s
104     else
105       render :nothing => true, :status => 400
106     end
107   end
108 end