Merge rails_port as of r4613 & fix tests.
[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           way.save_with_history!
19
20           render :text => way.id.to_s, :content_type => "text/plain"
21         end
22       else
23         render :nothing => true, :status => :bad_request
24       end
25     else
26       render :nothing => true, :status => :method_not_allowed
27     end
28   end
29
30   def read
31     begin
32       way = Way.find(params[:id])
33
34       if way.visible
35         render :text => way.to_xml.to_s, :content_type => "text/xml"
36       else
37         render :nothing => true, :status => :gone
38       end
39     rescue ActiveRecord::RecordNotFound
40       render :nothing => true, :status => :not_found
41     end
42   end
43
44   def update
45     begin
46       way = Way.find(params[:id])
47
48       if way.visible
49         new_way = Way.from_xml(request.raw_post)
50
51         if new_way and new_way.id == way.id
52           if !new_way.preconditions_ok?
53             render :nothing => true, :status => :precondition_failed
54           else
55             way.user_id = @user.id
56             way.tags = new_way.tags
57             way.nds = new_way.nds
58             way.visible = true
59             way.save_with_history!
60
61             render :nothing => true
62           end
63         else
64           render :nothing => true, :status => :bad_request
65         end
66       else
67         render :nothing => true, :status => :gone
68       end
69     rescue ActiveRecord::RecordNotFound
70       render :nothing => true, :status => :not_found
71     end
72   end
73
74   def delete
75     begin
76       way = Way.find(params[:id])
77
78       if way.visible
79         if RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id", :conditions => [ "visible = 1 AND member_type='way' and member_id=?", params[:id]])
80           render :nothing => true, :status => :precondition_failed
81         else
82           way.user_id = @user.id
83           way.tags = []
84           way.nds = []
85           way.visible = false
86           way.save_with_history!
87
88           render :nothing => true
89         end
90       else
91         render :nothing => true, :status => :gone
92       end
93     rescue ActiveRecord::RecordNotFound
94       render :nothing => true, :status => :not_found
95     rescue => ex
96       puts ex
97     end
98   end
99
100   def full
101     begin
102       way = Way.find(params[:id])
103
104       if way.visible
105         nd_ids = way.nds + [-1]
106         nodes = Node.find(:all, :conditions => "visible = 1 AND id IN (#{nd_ids.join(',')})")
107
108         # Render
109         doc = OSM::API.new.get_xml_doc
110         nodes.each do |node|
111           doc.root << node.to_xml_node()
112         end
113         doc.root << way.to_xml_node()
114
115         render :text => doc.to_s, :content_type => "text/xml"
116       else
117         render :nothing => true, :status => :gone
118       end
119     rescue ActiveRecord::RecordNotFound
120       render :nothing => true, :status => :not_found
121     end
122   end
123
124   def ways
125     begin
126       ids = params['ways'].split(',').collect { |w| w.to_i }
127     rescue
128       ids = []
129     end
130
131     if ids.length > 0
132       doc = OSM::API.new.get_xml_doc
133
134       Way.find(ids).each do |way|
135         doc.root << way.to_xml_node
136       end
137
138       render :text => doc.to_s, :content_type => "text/xml"
139     else
140       render :nothing => true, :status => :bad_request
141     end
142   end
143
144   def ways_for_node
145     wayids = WayNode.find(:all, :conditions => ['node_id = ?', params[:id]]).collect { |ws| ws.id }.uniq
146
147     if wayids.length > 0
148       doc = OSM::API.new.get_xml_doc
149
150       Way.find(wayids).each do |way|
151         doc.root << way.to_xml_node
152       end
153
154       render :text => doc.to_s, :content_type => "text/xml"
155     else
156       render :nothing => true, :status => :bad_request
157     end
158   end
159 end