The search help has now moved to the Search page on the wiki, which
[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
23           if segment.save_with_history
24             render :text => segment.id.to_s, :content_type => "text/plain"
25           else
26             render :nothing => true, :status => :internal_server_error
27           end
28         end
29       else
30         render :nothing => true, :status => :bad_request
31       end
32     else
33       render :nothing => true, :status => :method_not_allowed
34     end
35   end
36
37   def read
38     begin
39       segment = Segment.find(params[:id])
40
41       if segment.visible
42         render :text => segment.to_xml.to_s, :content_type => "text/xml"
43       else
44         render :nothing => true, :status => :gone
45       end
46     rescue ActiveRecord::RecordNotFound
47       render :nothing => true, :status => :not_found
48     rescue
49       render :nothing => true, :status => :internal_server_error
50     end
51   end
52
53   def update
54     begin
55       segment = Segment.find(params[:id])
56
57       if segment.visible
58         new_segment = Segment.from_xml(request.raw_post)
59
60         if new_segment and new_segment.id == segment.id
61           if new_segment.node_a == new_segment.node_b
62             render :nothing => true, :status => :expectation_failed
63           elsif !new_segment.preconditions_ok?
64             render :nothing => true, :status => :precondition_failed
65           else
66             segment.user_id = @user.id
67             segment.node_a = new_segment.node_a
68             segment.node_b = new_segment.node_b
69             segment.tags = new_segment.tags
70             segment.visible = new_segment.visible
71
72             if segment.save_with_history
73               render :nothing => true
74             else
75               render :nothing => true, :status => :internal_server_error
76             end
77           end
78         else
79           render :nothing => true, :status => :bad_request
80         end
81       else
82         render :nothing => true, :status => :gone
83       end
84     rescue ActiveRecord::RecordNotFound
85       render :nothing => true, :status => :not_found
86     rescue
87       render :nothing => true, :status => :internal_server_error
88     end
89   end
90
91   def delete
92     begin
93       segment = Segment.find(params[:id])
94
95       if segment.visible
96         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 ])
97           render :nothing => true, :status => :precondition_failed
98         else
99           segment.user_id = @user.id
100           segment.visible = 0
101
102           if segment.save_with_history
103             render :nothing => true
104           else
105             render :nothing => true, :status => :internal_server_error
106           end
107         end
108       else
109         render :nothing => true, :status => :gone
110       end
111     rescue ActiveRecord::RecordNotFound
112       render :nothing => true, :status => :not_found
113     rescue
114       render :nothing => true, :status => :internal_server_error
115     end
116   end
117
118   def segments
119     ids = params['segments'].split(',').collect { |s| s.to_i }
120
121     if ids.length > 0
122       doc = OSM::API.new.get_xml_doc
123
124       Segment.find(ids).each do |segment|
125         doc.root << segment.to_xml_node
126       end 
127
128       render :text => doc.to_s, :content_type => "text/xml"
129     else
130       render :nothing => true, :status => :bad_request
131     end
132   end
133
134   def segments_for_node
135     segmentids = Segment.find(:all, :conditions => ['node_a = ? OR node_b = ?', params[:id], params[:id]]).collect { |s| s.id }.uniq
136
137     if segmentids.length > 0
138       doc = OSM::API.new.get_xml_doc
139
140       Segment.find(segmentids).each do |segment|
141         doc.root << segment.to_xml_node
142       end
143
144       render :text => doc.to_s, :content_type => "text/xml"
145     else
146       render :nothing => true, :status => :bad_request
147     end
148   end
149 end