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