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