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