Correctly record which user deleted an object.
[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       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         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 ])
61           render :nothing => true, :status => HTTP_PRECONDITION_FAILED
62         else
63           segment.user_id = @user.id
64           segment.visible = 0
65           segment.save_with_history
66           render :nothing => true
67         end
68       else
69         render :nothing => true, :status => 410
70       end
71
72     when :put
73       new_segment = Segment.from_xml(request.raw_post)
74
75       if new_segment
76         if new_segment.node_a == new_segment.node_b
77           render :nothing => true, :status => HTTP_EXPECTATION_FAILED
78           return
79         end
80         
81         unless new_segment.preconditions_ok? # are the nodes visible?
82           render :nothing => true, :status => HTTP_PRECONDITION_FAILED
83           return
84         end
85
86         segment.timestamp = Time.now
87         segment.user_id = @user.id
88         segment.node_a = new_segment.node_a
89         segment.node_b = new_segment.node_b
90         segment.tags = new_segment.tags
91         segment.visible = new_segment.visible
92
93         if segment.id == new_segment.id and segment.save_with_history
94           render :nothing => true
95         else
96           render :nothing => true, :status => 500
97         end
98       else
99         render :nothing => true, :status => 400 # if we got here the doc didnt parse
100       end
101     end
102
103   end
104
105   def segments
106     response.headers["Content-Type"] = 'text/xml'
107     ids = params['segments'].split(',').collect {|s| s.to_i }
108     if ids.length > 0
109       segmentlist = Segment.find(ids)
110       doc = OSM::API.new.get_xml_doc
111       segmentlist.each do |segment|
112         doc.root << segment.to_xml_node
113       end 
114       render :text => doc.to_s
115     else
116       render :nothing => true, :status => 400
117     end
118   end
119
120   def segments_for_node
121     response.headers["Content-Type"] = 'text/xml'
122     segmentids = Segment.find(:all, :conditions => ['node_a = ? OR node_b = ?', params[:id], params[:id]]).collect { |s| s.id }.uniq
123     if segmentids.length > 0
124       segmentlist = Segment.find(segmentids)
125       doc = OSM::API.new.get_xml_doc
126       segmentlist.each do |segment|
127         doc.root << segment.to_xml_node
128       end 
129       render :text => doc.to_s
130     else
131       render :nothing => true, :status => 400
132     end
133   end
134
135 end