Allow exceptions processing node and segment requests to propagate and
[rails.git] / app / controllers / segment_controller.rb
1 class SegmentController < 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       segment = Segment.from_xml(request.raw_post, true)
12
13       if segment
14         if segment.node_a == segment.node_b
15           render :nothing => true, :status => :expectation_failed
16         elsif !segment.preconditions_ok?
17           render :nothing => true, :status => :precondition_failed
18         else
19           segment.user_id = @user.id
20           segment.from_node = Node.find(segment.node_a.to_i)
21           segment.to_node = Node.find(segment.node_b.to_i)
22           segment.save_with_history!
23
24           render :text => segment.id.to_s, :content_type => "text/plain"
25         end
26       else
27         render :nothing => true, :status => :bad_request
28       end
29     else
30       render :nothing => true, :status => :method_not_allowed
31     end
32   end
33
34   def read
35     begin
36       segment = Segment.find(params[:id])
37
38       if segment.visible
39         render :text => segment.to_xml.to_s, :content_type => "text/xml"
40       else
41         render :nothing => true, :status => :gone
42       end
43     rescue ActiveRecord::RecordNotFound
44       render :nothing => true, :status => :not_found
45     end
46   end
47
48   def update
49     begin
50       segment = Segment.find(params[:id])
51
52       if segment.visible
53         new_segment = Segment.from_xml(request.raw_post)
54
55         if new_segment and new_segment.id == segment.id
56           if new_segment.node_a == new_segment.node_b
57             render :nothing => true, :status => :expectation_failed
58           elsif !new_segment.preconditions_ok?
59             render :nothing => true, :status => :precondition_failed
60           else
61             segment.user_id = @user.id
62             segment.node_a = new_segment.node_a
63             segment.node_b = new_segment.node_b
64             segment.tags = new_segment.tags
65             segment.visible = new_segment.visible
66             segment.save_with_history!
67
68             render :nothing => true
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     end
79   end
80
81   def delete
82     begin
83       segment = Segment.find(params[:id])
84
85       if segment.visible
86         if WaySegment.find(:first, :joins => "INNER JOIN current_ways ON current_ways.id = current_way_segments.id", :conditions => [ "current_ways.visible = 1 AND current_way_segments.segment_id = ?", segment.id ])
87           render :nothing => true, :status => :precondition_failed
88         else
89           segment.user_id = @user.id
90           segment.visible = 0
91           segment.save_with_history!
92
93           render :nothing => true
94         end
95       else
96         render :nothing => true, :status => :gone
97       end
98     rescue ActiveRecord::RecordNotFound
99       render :nothing => true, :status => :not_found
100     end
101   end
102
103   def segments
104     ids = params['segments'].split(',').collect { |s| s.to_i }
105
106     if ids.length > 0
107       doc = OSM::API.new.get_xml_doc
108
109       Segment.find(ids).each do |segment|
110         doc.root << segment.to_xml_node
111       end 
112
113       render :text => doc.to_s, :content_type => "text/xml"
114     else
115       render :nothing => true, :status => :bad_request
116     end
117   end
118
119   def segments_for_node
120     segmentids = Segment.find(:all, :conditions => ['node_a = ? OR node_b = ?', params[:id], params[:id]]).collect { |s| s.id }.uniq
121
122     if segmentids.length > 0
123       doc = OSM::API.new.get_xml_doc
124
125       Segment.find(segmentids).each do |segment|
126         doc.root << segment.to_xml_node
127       end
128
129       render :text => doc.to_s, :content_type => "text/xml"
130     else
131       render :nothing => true, :status => :bad_request
132     end
133   end
134 end