Fixed error handling in the name search and tidied things up a bit.
[rails.git] / app / controllers / segment_controller.rb
1 class SegmentController < ApplicationController
2   require 'xml/libxml'
3
4   before_filter :authorize, :only => [:create, :update, :delete]
5   after_filter :compress_output
6
7   def create
8     if request.put?
9       segment = Segment.from_xml(request.raw_post, true)
10
11       if segment
12         if segment.node_a == segment.node_b
13           render :nothing => true, :status => :expectation_failed
14         elsif !segment.preconditions_ok?
15           render :nothing => true, :status => :precondition_failed
16         else
17           segment.user_id = @user.id
18           segment.from_node = Node.find(segment.node_a.to_i)
19           segment.to_node = Node.find(segment.node_b.to_i)
20
21           if segment.save_with_history
22             render :text => segment.id.to_s, :content_type => "text/plain"
23           else
24             render :nothing => true, :status => :internal_server_error
25           end
26         end
27       else
28         render :nothing => true, :status => :bad_request
29       end
30     else
31       render :nothing => true, :status => :method_not_allowed
32     end
33   end
34
35   def read
36     begin
37       segment = Segment.find(params[:id])
38
39       if segment.visible
40         render :text => segment.to_xml.to_s, :content_type => "text/xml"
41       else
42         render :nothing => true, :status => :gone
43       end
44     rescue ActiveRecord::RecordNotFound
45       render :nothing => true, :status => :not_found
46     rescue
47       render :nothing => true, :status => :internal_server_error
48     end
49   end
50
51   def update
52     begin
53       segment = Segment.find(params[:id])
54
55       if segment.visible
56         new_segment = Segment.from_xml(request.raw_post)
57
58         if new_segment and new_segment.id == segment.id
59           if new_segment.node_a == new_segment.node_b
60             render :nothing => true, :status => :expectation_failed
61           elsif !new_segment.preconditions_ok?
62             render :nothing => true, :status => :precondition_failed
63           else
64             segment.user_id = @user.id
65             segment.node_a = new_segment.node_a
66             segment.node_b = new_segment.node_b
67             segment.tags = new_segment.tags
68             segment.visible = new_segment.visible
69
70             if segment.save_with_history
71               render :nothing => true
72             else
73               render :nothing => true, :status => :internal_server_error
74             end
75           end
76         else
77           render :nothing => true, :status => :bad_request
78         end
79       else
80         render :nothing => true, :status => :gone
81       end
82     rescue ActiveRecord::RecordNotFound
83       render :nothing => true, :status => :not_found
84     rescue
85       render :nothing => true, :status => :internal_server_error
86     end
87   end
88
89   def delete
90     begin
91       segment = Segment.find(params[:id])
92
93       if segment.visible
94         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 ])
95           render :nothing => true, :status => :precondition_failed
96         else
97           segment.user_id = @user.id
98           segment.visible = 0
99
100           if segment.save_with_history
101             render :nothing => true
102           else
103             render :nothing => true, :status => :internal_server_error
104           end
105         end
106       else
107         render :nothing => true, :status => :gone
108       end
109     rescue ActiveRecord::RecordNotFound
110       render :nothing => true, :status => :not_found
111     rescue
112       render :nothing => true, :status => :internal_server_error
113     end
114   end
115
116   def segments
117     ids = params['segments'].split(',').collect { |s| s.to_i }
118
119     if ids.length > 0
120       doc = OSM::API.new.get_xml_doc
121
122       Segment.find(ids).each do |segment|
123         doc.root << segment.to_xml_node
124       end 
125
126       render :text => doc.to_s, :content_type => "text/xml"
127     else
128       render :nothing => true, :status => :bad_request
129     end
130   end
131
132   def segments_for_node
133     segmentids = Segment.find(:all, :conditions => ['node_a = ? OR node_b = ?', params[:id], params[:id]]).collect { |s| s.id }.uniq
134
135     if segmentids.length > 0
136       doc = OSM::API.new.get_xml_doc
137
138       Segment.find(segmentids).each do |segment|
139         doc.root << segment.to_xml_node
140       end
141
142       render :text => doc.to_s, :content_type => "text/xml"
143     else
144       render :nothing => true, :status => :bad_request
145     end
146   end
147 end