cc4f1fa38d6c8279b3a1f2a39ef0e6abaa87ab81
[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 :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])
64     
65     if way.visible
66       nd_ids = way.nds + [-1]
67       nodes = Node.find(:all, :conditions => ["visible = ? AND id IN (#{nd_ids.join(',')})", true])
68       
69       # Render
70       doc = OSM::API.new.get_xml_doc
71       nodes.each do |node|
72         doc.root << node.to_xml_node()
73       end
74       doc.root << way.to_xml_node()
75       
76       render :text => doc.to_s, :content_type => "text/xml"
77     else
78       render :text => "", :status => :gone
79     end
80   end
81
82   def ways
83     begin
84       ids = params['ways'].split(',').collect { |w| w.to_i }
85     rescue
86       ids = []
87     end
88
89     if ids.length > 0
90       doc = OSM::API.new.get_xml_doc
91
92       Way.find(ids).each do |way|
93         doc.root << way.to_xml_node
94       end
95
96       render :text => doc.to_s, :content_type => "text/xml"
97     else
98       render :nothing => true, :status => :bad_request
99     end
100   end
101
102   ##
103   # returns all the ways which are currently using the node given in the 
104   # :id parameter. note that this used to return deleted ways as well, but
105   # this seemed not to be the expected behaviour, so it was removed.
106   def ways_for_node
107     wayids = WayNode.find(:all, 
108                           :conditions => ['node_id = ?', params[:id]]
109                           ).collect { |ws| ws.id[0] }.uniq
110
111     doc = OSM::API.new.get_xml_doc
112
113     Way.find(wayids).each do |way|
114       doc.root << way.to_xml_node if way.visible
115     end
116
117     render :text => doc.to_s, :content_type => "text/xml"
118   end
119 end