source: subversion/sites/rails_port/app/controllers/segment_controller.rb @ 2612

Revision 2612, 2.7 KB checked in by steve, 7 years ago (diff)

close #411 segments should not be allowed where node_a == node_b

Line 
1class 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
109end
Note: See TracBrowser for help on using the repository browser.