]> git.openstreetmap.org Git - rails.git/blob - app/controllers/segment_controller.rb
Extra check that nodes/segments in ways are visible
[rails.git] / app / controllers / segment_controller.rb
1 class SegmentController < ApplicationController
2   require 'xml/libxml'
3
4   before_filter :authorize
5   after_filter :compress_output
6
7   def create
8     response.headers["Content-Type"] = 'text/xml'
9     if request.put?
10       segment = Segment.from_xml(request.raw_post, true)
11
12       if segment
13         segment.user_id = @user.id
14
15         segment.from_node = Node.find(segment.node_a.to_i)
16         segment.to_node = Node.find(segment.node_b.to_i)
17           
18         if segment.from_node == segment.to_node
19           render :nothing => true, :status => HTTP_EXPECTATION_FAILED
20           return
21         end
22         
23         unless segment.preconditions_ok? # are the nodes visible?
24           render :nothing => true, :status => HTTP_PRECONDITION_FAILED
25           return
26         end
27
28         if segment.save_with_history
29           render :text => segment.id.to_s
30         else
31           render :nothing => true, :status => 500
32         end
33         return
34
35       else
36         render :nothing => true, :status => 400 # if we got here the doc didnt parse
37         return
38       end
39     end
40
41     render :nothing => true, :status => 500 # something went very wrong
42   end
43
44   def rest
45     response.headers["Content-Type"] = 'text/xml'
46     unless Segment.exists?(params[:id])
47       render :nothing => true, :status => 404
48       return
49     end
50
51     segment = Segment.find(params[:id])
52
53     case request.method
54
55     when :get
56       render :text => segment.to_xml.to_s
57       return
58
59     when :delete
60       if segment.visible
61         segment.visible = 0
62         segment.save_with_history
63         render :nothing => true
64       else
65         render :nothing => true, :status => 410
66       end
67
68     when :put
69       new_segment = Segment.from_xml(request.raw_post)
70
71       segment.timestamp = Time.now
72       segment.user_id = @user.id
73
74       if new_segment.node_a == new_segment.node_b
75         render :nothing => true, :status => HTTP_EXPECTATION_FAILED
76         return
77       end
78
79       segment.node_a = new_segment.node_a
80       segment.node_b = new_segment.node_b
81       
82       segment.tags = new_segment.tags
83       segment.visible = new_segment.visible
84
85       if segment.id == new_segment.id and segment.save_with_history
86         render :nothing => true, :status => HTTP_OK
87       else
88         render :nothing => true, :status => 500
89       end
90       return
91     end
92
93   end
94
95   def segments
96     response.headers["Content-Type"] = 'text/xml'
97     ids = params['segments'].split(',').collect {|s| s.to_i }
98     if ids.length > 0
99       segmentlist = Segment.find(ids)
100       doc = OSM::API.get_xml_doc
101       segmentlist.each do |segment|
102         doc.root << segment.to_xml_node
103       end 
104       render :text => doc.to_s
105     else
106       render :nothing => true, :status => 400
107     end
108   end
109
110 end