]> git.openstreetmap.org Git - rails.git/blob - app/controllers/way_controller.rb
Merged 17047 from trunk.
[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 :require_allow_write_api, :only => [:create, :update, :delete]
6   before_filter :require_public_data, :only => [:create, :update, :delete]
7   before_filter :check_api_writable, :only => [:create, :update, :delete]
8   before_filter :check_api_readable, :except => [:create, :update, :delete]
9   after_filter :compress_output
10   around_filter :api_call_handle_error, :api_call_timeout
11
12   def create
13     assert_method :put
14
15     way = Way.from_xml(request.raw_post, true)
16     
17     if way
18       way.create_with_history @user
19       render :text => way.id.to_s, :content_type => "text/plain"
20     else
21       render :nothing => true, :status => :bad_request
22     end
23   end
24
25   def read
26     way = Way.find(params[:id])
27     
28     response.headers['Last-Modified'] = way.timestamp.rfc822
29     
30     if way.visible
31       render :text => way.to_xml.to_s, :content_type => "text/xml"
32     else
33       render :text => "", :status => :gone
34     end
35   end
36
37   def update
38     way = Way.find(params[:id])
39     new_way = Way.from_xml(request.raw_post)
40     
41     if new_way and new_way.id == way.id
42       way.update_from(new_way, @user)
43       render :text => way.version.to_s, :content_type => "text/plain"
44     else
45       render :nothing => true, :status => :bad_request
46     end
47   end
48
49   # This is the API call to delete a way
50   def delete
51     way = Way.find(params[:id])
52     new_way = Way.from_xml(request.raw_post)
53     
54     if new_way and new_way.id == way.id
55       way.delete_with_history!(new_way, @user)
56       render :text => way.version.to_s, :content_type => "text/plain"
57     else
58       render :nothing => true, :status => :bad_request
59     end
60   end
61
62   def full
63     way = Way.find(params[:id], :include => {:nodes => :node_tags})
64     
65     if way.visible
66       changeset_cache = {}
67       user_display_name_cache = {}
68
69       doc = OSM::API.new.get_xml_doc
70       way.nodes.uniq.each do |node|
71         if node.visible
72           doc.root << node.to_xml_node(changeset_cache, user_display_name_cache)
73         end
74       end
75       doc.root << way.to_xml_node(nil, changeset_cache, user_display_name_cache)
76       
77       render :text => doc.to_s, :content_type => "text/xml"
78     else
79       render :text => "", :status => :gone
80     end
81   end
82
83   def ways
84     begin
85       ids = params['ways'].split(',').collect { |w| w.to_i }
86     rescue
87       ids = []
88     end
89
90     if ids.length > 0
91       doc = OSM::API.new.get_xml_doc
92
93       Way.find(ids).each do |way|
94         doc.root << way.to_xml_node
95       end
96
97       render :text => doc.to_s, :content_type => "text/xml"
98     else
99       render :nothing => true, :status => :bad_request
100     end
101   end
102
103   ##
104   # returns all the ways which are currently using the node given in the 
105   # :id parameter. note that this used to return deleted ways as well, but
106   # this seemed not to be the expected behaviour, so it was removed.
107   def ways_for_node
108     wayids = WayNode.find(:all, 
109                           :conditions => ['node_id = ?', params[:id]]
110                           ).collect { |ws| ws.id[0] }.uniq
111
112     doc = OSM::API.new.get_xml_doc
113
114     Way.find(wayids).each do |way|
115       doc.root << way.to_xml_node if way.visible
116     end
117
118     render :text => doc.to_s, :content_type => "text/xml"
119   end
120 end