]> git.openstreetmap.org Git - rails.git/blob - app/controllers/segment_controller.rb
Made nearest method work with nil home lat/lon.
[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         end
26
27         if segment.save_with_history
28           render :text => segment.id.to_s
29         else
30           render :nothing => true, :status => 500
31         end
32         return
33
34       else
35         render :nothing => true, :status => 400 # if we got here the doc didnt parse
36         return
37       end
38     end
39
40     render :nothing => true, :status => 500 # something went very wrong
41   end
42
43   def rest
44     response.headers["Content-Type"] = 'text/xml'
45     unless Segment.exists?(params[:id])
46       render :nothing => true, :status => 404
47       return
48     end
49
50     segment = Segment.find(params[:id])
51
52     case request.method
53
54     when :get
55       render :text => segment.to_xml.to_s
56       return
57
58     when :delete
59       if segment.visible
60         segment.visible = 0
61         segment.save_with_history
62         render :nothing => true
63       else
64         render :nothing => true, :status => 410
65       end
66
67     when :put
68       new_segment = Segment.from_xml(request.raw_post)
69
70       segment.timestamp = Time.now
71       segment.user_id = @user.id
72
73       if new_segment.node_a == new_segment.node_b
74         render :nothing => true, :status => HTTP_EXPECTATION_FAILED
75         return
76       end
77
78       segment.node_a = new_segment.node_a
79       segment.node_b = new_segment.node_b
80       
81       segment.tags = new_segment.tags
82       segment.visible = new_segment.visible
83
84       if segment.id == new_segment.id and segment.save_with_history
85         render :nothing => true, :status => HTTP_OK
86       else
87         render :nothing => true, :status => 500
88       end
89       return
90     end
91
92   end
93
94   def segments
95     response.headers["Content-Type"] = 'text/xml'
96     ids = params['segments'].split(',').collect {|s| s.to_i }
97     if ids.length > 0
98       segmentlist = Segment.find(ids)
99       doc = OSM::API.get_xml_doc
100       segmentlist.each do |segment|
101         doc.root << segment.to_xml_node
102       end 
103       render :text => doc.to_s
104     else
105       render :nothing => true, :status => 400
106     end
107   end
108
109 end