+++ /dev/null
-class SegmentController < ApplicationController
- require 'xml/libxml'
-
- session :off
- before_filter :authorize, :only => [:create, :update, :delete]
- before_filter :check_availability, :only => [:create, :update, :delete]
- after_filter :compress_output
-
- def create
- if request.put?
- segment = Segment.from_xml(request.raw_post, true)
-
- if segment
- if segment.node_a == segment.node_b
- render :nothing => true, :status => :expectation_failed
- elsif !segment.preconditions_ok?
- render :nothing => true, :status => :precondition_failed
- else
- segment.user_id = @user.id
- segment.from_node = Node.find(segment.node_a.to_i)
- segment.to_node = Node.find(segment.node_b.to_i)
-
- if segment.save_with_history
- render :text => segment.id.to_s, :content_type => "text/plain"
- else
- render :nothing => true, :status => :internal_server_error
- end
- end
- else
- render :nothing => true, :status => :bad_request
- end
- else
- render :nothing => true, :status => :method_not_allowed
- end
- end
-
- def read
- begin
- segment = Segment.find(params[:id])
-
- if segment.visible
- render :text => segment.to_xml.to_s, :content_type => "text/xml"
- else
- render :nothing => true, :status => :gone
- end
- rescue ActiveRecord::RecordNotFound
- render :nothing => true, :status => :not_found
- rescue
- render :nothing => true, :status => :internal_server_error
- end
- end
-
- def update
- begin
- segment = Segment.find(params[:id])
-
- if segment.visible
- new_segment = Segment.from_xml(request.raw_post)
-
- if new_segment and new_segment.id == segment.id
- if new_segment.node_a == new_segment.node_b
- render :nothing => true, :status => :expectation_failed
- elsif !new_segment.preconditions_ok?
- render :nothing => true, :status => :precondition_failed
- else
- segment.user_id = @user.id
- segment.node_a = new_segment.node_a
- segment.node_b = new_segment.node_b
- segment.tags = new_segment.tags
- segment.visible = new_segment.visible
-
- if segment.save_with_history
- render :nothing => true
- else
- render :nothing => true, :status => :internal_server_error
- end
- end
- else
- render :nothing => true, :status => :bad_request
- end
- else
- render :nothing => true, :status => :gone
- end
- rescue ActiveRecord::RecordNotFound
- render :nothing => true, :status => :not_found
- rescue
- render :nothing => true, :status => :internal_server_error
- end
- end
-
- def delete
- begin
- segment = Segment.find(params[:id])
-
- if segment.visible
- 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 ])
- render :nothing => true, :status => :precondition_failed
- else
- segment.user_id = @user.id
- segment.visible = 0
-
- if segment.save_with_history
- render :nothing => true
- else
- render :nothing => true, :status => :internal_server_error
- end
- end
- else
- render :nothing => true, :status => :gone
- end
- rescue ActiveRecord::RecordNotFound
- render :nothing => true, :status => :not_found
- rescue
- render :nothing => true, :status => :internal_server_error
- end
- end
-
- def segments
- ids = params['segments'].split(',').collect { |s| s.to_i }
-
- if ids.length > 0
- doc = OSM::API.new.get_xml_doc
-
- Segment.find(ids).each do |segment|
- doc.root << segment.to_xml_node
- end
-
- render :text => doc.to_s, :content_type => "text/xml"
- else
- render :nothing => true, :status => :bad_request
- end
- end
-
- def segments_for_node
- segmentids = Segment.find(:all, :conditions => ['node_a = ? OR node_b = ?', params[:id], params[:id]]).collect { |s| s.id }.uniq
-
- if segmentids.length > 0
- doc = OSM::API.new.get_xml_doc
-
- Segment.find(segmentids).each do |segment|
- doc.root << segment.to_xml_node
- end
-
- render :text => doc.to_s, :content_type => "text/xml"
- else
- render :nothing => true, :status => :bad_request
- end
- end
-end