76cb5cebb44e6fbea5e97c64135b92282b25b108
[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"] = 'application/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         unless segment.preconditions_ok? # are the nodes visible?
19           render :nothing => true, :status => 412
20         end
21
22         if segment.save_with_history
23           render :text => segment.id.to_s
24         else
25           render :nothing => true, :status => 500
26         end
27         return
28
29       else
30         render :nothing => true, :status => 400 # if we got here the doc didnt parse
31         return
32       end
33     end
34
35     render :nothing => true, :status => 500 # something went very wrong
36   end
37
38   def rest
39     response.headers["Content-Type"] = 'application/xml'
40     unless Segment.exists?(params[:id])
41       render :nothing => true, :status => 404
42       return
43     end
44
45     segment = Segment.find(params[:id])
46
47     case request.method
48
49     when :get
50       render :text => segment.to_xml.to_s
51       return
52
53     when :delete
54       if segment.visible
55         segment.visible = 0
56         segment.save_with_history
57         render :nothing => true
58       else
59         render :nothing => true, :status => 410
60       end
61
62     when :put
63       new_segment = Segment.from_xml(request.raw_post)
64
65       segment.timestamp = Time.now
66       segment.user_id = @user.id
67
68       segment.node_a = new_segment.node_a
69       segment.node_b = new_segment.node_b
70       segment.tags = new_segment.tags
71       segment.visible = new_segment.visible
72
73       if segment.id == new_segment.id and segment.save_with_history
74         render :nothing => true, :status => 200
75       else
76         render :nothing => true, :status => 500
77       end
78       return
79     end
80
81   end
82
83   def segments
84     response.headers["Content-Type"] = 'application/xml'
85     ids = params['segments'].split(',').collect {|s| s.to_i }
86     if ids.length > 0
87       segmentlist = Segment.find(ids)
88       doc = OSM::API.get_xml_doc
89       segmentlist.each do |segment|
90         doc.root << segment.to_xml_node
91       end 
92       render :text => doc.to_s
93     else
94       render :nothing => true, :status => 400
95     end
96   end
97
98 end