+
+ if trace.inserted?
+ if trace.public? or (@user and @user == trace.user)
+ expires_in 7.days, :private => !trace.public?, :public => trace.public?
+ send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => 'image/gif', :disposition => 'inline')
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ else
+ render :nothing => true, :status => :not_found
+ end
+ rescue ActiveRecord::RecordNotFound
+ render :nothing => true, :status => :not_found
+ end
+
+ def api_read
+ trace = Trace.visible.find(params[:id])
+
+ if trace.public? or trace.user == @user
+ render :text => trace.to_xml.to_s, :content_type => "text/xml"
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ end
+
+ def api_update
+ trace = Trace.visible.find(params[:id])
+
+ if trace.user == @user
+ new_trace = Trace.from_xml(request.raw_post)
+
+ unless new_trace and new_trace.id == trace.id
+ raise OSM::APIBadUserInput.new("The id in the url (#{trace.id}) is not the same as provided in the xml (#{new_trace.id})")
+ end
+
+ trace.description = new_trace.description
+ trace.tags = new_trace.tags
+ trace.visibility = new_trace.visibility
+ trace.save!
+
+ render :nothing => true, :status => :ok
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ end
+
+ def api_delete
+ trace = Trace.visible.find(params[:id])
+
+ if trace.user == @user
+ trace.visible = false
+ trace.save!
+
+ render :nothing => true, :status => :ok
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ end
+
+ def api_data
+ trace = Trace.find(params[:id])
+
+ if trace.public? or trace.user == @user
+ if request.format == Mime::XML
+ send_file(trace.xml_file, :filename => "#{trace.id}.xml", :type => Mime::XML.to_s, :disposition => 'attachment')
+ else
+ send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => 'attachment')
+ end
+ else
+ render :nothing => true, :status => :forbidden
+ end
+ end
+
+ def api_create
+ if request.post?
+ tags = params[:tags] || ""
+ description = params[:description] || ""
+ visibility = params[:visibility]
+
+ if visibility.nil?
+ if params[:public] && params[:public].to_i.nonzero?
+ visibility = "public"
+ else
+ visibility = "private"
+ end
+ end
+
+ if params[:file].respond_to?(:read)
+ do_create(params[:file], tags, description, visibility)
+
+ if @trace.id
+ render :text => @trace.id.to_s, :content_type => "text/plain"
+ elsif @trace.valid?
+ render :nothing => true, :status => :internal_server_error
+ else
+ render :nothing => true, :status => :bad_request
+ end
+ else
+ render :nothing => true, :status => :bad_request
+ end
+ else
+ render :nothing => true, :status => :method_not_allowed
+ end