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