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