Make sure we clear the tags and segments for a way when it is deleted.
[rails.git] / app / controllers / way_controller.rb
1 class WayController < ApplicationController
2   require 'xml/libxml'
3
4   before_filter :authorize, :only => [:create, :update, :delete]
5   after_filter :compress_output
6
7   def create
8     if request.put?
9       way = Way.from_xml(request.raw_post, true)
10
11       if way
12         if !way.preconditions_ok?
13           render :nothing => true, :status => :precondition_failed
14         else
15           way.user_id = @user.id
16
17           if way.save_with_history
18             render :text => way.id.to_s, :content_type => "text/plain"
19           else
20             render :nothing => true, :status => :internal_server_error
21           end
22         end
23       else
24         render :nothing => true, :status => :bad_request
25       end
26     else
27       render :nothing => true, :status => :method_not_allowed
28     end
29   end
30
31   def read
32     begin
33       way = Way.find(params[:id])
34
35       if way.visible
36         render :text => way.to_xml.to_s, :content_type => "text/xml"
37       else
38         render :nothing => true, :status => :gone
39       end
40     rescue ActiveRecord::RecordNotFound
41       render :nothing => true, :status => :not_found
42     rescue
43       render :nothing => true, :status => :internal_server_error
44     end
45   end
46
47   def update
48     begin
49       way = Way.find(params[:id])
50
51       if way.visible
52         new_way = Way.from_xml(request.raw_post)
53
54         if new_way and new_way.id == way.id
55           if !new_way.preconditions_ok?
56             render :nothing => true, :status => :precondition_failed
57           else
58             way.user_id = @user.id
59             way.tags = new_way.tags
60             way.segs = new_way.segs
61             way.visible = true
62
63             if way.save_with_history
64               render :nothing => true
65             else
66               render :nothing => true, :status => :internal_server_error
67             end
68           end
69         else
70           render :nothing => true, :status => :bad_request
71         end
72       else
73         render :nothing => true, :status => :gone
74       end
75     rescue ActiveRecord::RecordNotFound
76       render :nothing => true, :status => :not_found
77     rescue
78       render :nothing => true, :status => :internal_server_error
79     end
80   end
81
82   def delete
83     begin
84       way = Way.find(params[:id])
85
86       if way.visible
87         way.user_id = @user.id
88         way.tags = []
89         way.segs = []
90         way.visible = false
91
92         if way.save_with_history
93           render :nothing => true
94         else
95           render :nothing => true, :status => :internal_server_error
96         end
97       else
98         render :nothing => true, :status => :gone
99       end
100     rescue ActiveRecord::RecordNotFound
101       render :nothing => true, :status => :not_found
102     rescue
103       render :nothing => true, :status => :internal_server_error
104     end
105   end
106
107   def full
108     begin
109       way = Way.find(params[:id])
110
111       if way.visible
112         # In future, we might want to do all the data fetch in one step
113         seg_ids = way.segs + [-1]
114         segments = Segment.find_by_sql "select * from current_segments where visible = 1 and id IN (#{seg_ids.join(',')})"
115
116         node_ids = segments.collect {|segment| segment.node_a }
117         node_ids += segments.collect {|segment| segment.node_b }
118         node_ids += [-1]
119         nodes = Node.find(:all, :conditions => "visible = 1 AND id IN (#{node_ids.join(',')})")
120
121         # Render
122         doc = OSM::API.new.get_xml_doc
123         nodes.each do |node|
124           doc.root << node.to_xml_node()
125         end
126         segments.each do |segment|
127           doc.root << segment.to_xml_node()
128         end
129         doc.root << way.to_xml_node()
130
131         render :text => doc.to_s, :content_type => "text/xml"
132       else
133         render :nothing => true, :status => :gone
134       end
135     rescue ActiveRecord::RecordNotFound
136       render :nothing => true, :status => :not_found
137     rescue
138       render :nothing => true, :status => :internal_server_error
139     end
140   end
141
142   def ways
143     ids = params['ways'].split(',').collect { |w| w.to_i }
144
145     if ids.length > 0
146       doc = OSM::API.new.get_xml_doc
147
148       Way.find(ids).each do |way|
149         doc.root << way.to_xml_node
150       end
151
152       render :text => doc.to_s, :content_type => "text/xml"
153     else
154       render :nothing => true, :status => :bad_request
155     end
156   end
157
158   def ways_for_segment
159     wayids = WaySegment.find(:all, :conditions => ['segment_id = ?', params[:id]]).collect { |ws| ws.id }.uniq
160
161     if wayids.length > 0
162       doc = OSM::API.new.get_xml_doc
163
164       Way.find(wayids).each do |way|
165         doc.root << way.to_xml_node
166       end
167
168       render :text => doc.to_s, :content_type => "text/xml"
169     else
170       render :nothing => true, :status => :bad_request
171     end
172   end
173 end