From 85f197b6df81cef19fe6a2a1cfc0429ea50051c7 Mon Sep 17 00:00:00 2001 From: Steve Coast Date: Sat, 19 Aug 2006 08:11:33 +0000 Subject: [PATCH 1/1] bit nicer --- app/controllers/node_controller.rb | 135 +++++-------------------- app/controllers/old_node_controller.rb | 2 + app/helpers/old_node_helper.rb | 2 + app/models/node.rb | 103 +++++++++++++++++++ app/models/old_node.rb | 20 ++++ db/migrate/005_create_old_nodes.rb | 11 ++ 6 files changed, 162 insertions(+), 111 deletions(-) create mode 100644 app/controllers/old_node_controller.rb create mode 100644 app/helpers/old_node_helper.rb create mode 100644 app/models/old_node.rb create mode 100644 db/migrate/005_create_old_nodes.rb diff --git a/app/controllers/node_controller.rb b/app/controllers/node_controller.rb index a5f20acea..97d551776 100644 --- a/app/controllers/node_controller.rb +++ b/app/controllers/node_controller.rb @@ -5,51 +5,27 @@ class NodeController < ApplicationController def create if request.put? - p = XML::Parser.new - p.string = request.raw_post - doc = p.parse - - doc.find('//osm/node').each do |pt| - lat = pt['lat'].to_f - lon = pt['lon'].to_f - node_id = pt['id'].to_i - - if lat > 90 or lat < -90 or lon > 180 or lon < -180 or node_id != 0 - render :nothing => true, :status => 400 # BAD REQUEST - return - end - - tags = [] - - pt.find('tag').each do |tag| - tags << [tag['k'],tag['v']] - end - tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';') - tags = '' if tags.nil? + node = Node.from_xml(request.raw_post, true) - now = Time.now - - node = Node.new - node.latitude = lat - node.longitude = lon - node.visible = 1 - node.tags = tags - node.timestamp = now + if node node.user_id = @user.id + if node.save_with_history - #FIXME add a node to the old nodes table too - - if node.save render :text => node.id else - render :nothing => true, :status => 500 + render :text => 'truesrgtsrtfgsar', :status => 500 +# render :nothing => true, :status => 500 end + return + else + render :nothing => true, :status => 400 # if we got here the doc didnt parse return end end - render :nothing => true, :status => 400 # if we got here the doc didnt parse + render :text => 'FFFFFFFFFF ', :status => 500 +# render :nothing => true, :status => 500 # something went very wrong end def rest @@ -60,102 +36,39 @@ class NodeController < ApplicationController node = Node.find(params[:id]) - case request.method + when :get - doc = XML::Document.new - - doc.encoding = "UTF-8" - root = XML::Node.new 'osm' - root['version'] = '0.4' - root['generator'] = 'OpenStreetMap server' - doc.root = root - el1 = XML::Node.new 'node' - el1['id'] = node.id.to_s - el1['lat'] = node.latitude.to_s - el1['lon'] = node.longitude.to_s - split_tags(el1, node.tags) - el1['visible'] = node.visible.to_s - el1['timestamp'] = node.timestamp.xmlschema - root << el1 - - render :text => doc.to_s + render :text => node.to_xml.to_s + return when :delete - # - # DELETE - # if node.visible node.visible = 0 - node.save + + node.save_with_history + render :nothing => true else render :nothing => true, :status => 410 end when :put - # - # PUT - # - - p = XML::Parser.new - p.string = request.raw_post - doc = p.parse - - doc.find('//osm/node').each do |pt| - lat = pt['lat'].to_f - lon = pt['lon'].to_f - node_id = pt['id'].to_i - - if lat > 90 or lat < -90 or lon > 180 or lon < -180 or node_id != params[:id] - render :nothing => true, :status => 400 - return - end - tags = [] + new_node = Node.from_xml(request.raw_post) - pt.find('tag').each do |tag| - tags << [tag['k'],tag['v']] - end - tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';') - tags = '' if tags.nil? - - now = Time.now - - node.latitude = lat - node.longitude = lon - node.visible = 1 - node.tags = tags - node.timestamp = now - node.user_id = @user.id + new_node.timestamp = Time.now + new_node.user_id = @user.id - #FIXME add a node to the old nodes table too - - if node.save - render :text => node.id - else - render :nothing => true, :status => 500 - end + if node.id == new_node.id and new_node.save_with_history + render :text => node.id + else + render :nothing => true, :status => 500 end + return end - end - private - def split_tags(el, tags) - tags.split(';').each do |tag| - parts = tag.split('=') - key = '' - val = '' - key = parts[0].strip unless parts[0].nil? - val = parts[1].strip unless parts[1].nil? - if key != '' && val != '' - el2 = Node.new('tag') - el2['k'] = key.to_s - el2['v'] = val.to_s - el << el2 - end - end end diff --git a/app/controllers/old_node_controller.rb b/app/controllers/old_node_controller.rb new file mode 100644 index 000000000..0b6a0ee29 --- /dev/null +++ b/app/controllers/old_node_controller.rb @@ -0,0 +1,2 @@ +class OldNodeController < ApplicationController +end diff --git a/app/helpers/old_node_helper.rb b/app/helpers/old_node_helper.rb new file mode 100644 index 000000000..c39bc621f --- /dev/null +++ b/app/helpers/old_node_helper.rb @@ -0,0 +1,2 @@ +module OldNodeHelper +end diff --git a/app/models/node.rb b/app/models/node.rb index d1bedd03c..b83d934a2 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -1,6 +1,109 @@ class Node < ActiveRecord::Base + require 'xml/libxml' set_table_name 'current_nodes' + has_many :old_nodes, :foreign_key => :id belongs_to :user + + + def self.from_xml(xml, create=false) + p = XML::Parser.new + p.string = xml + doc = p.parse + + node = Node.new + + doc.find('//osm/node').each do |pt| + + + node.latitude = pt['lat'].to_f + node.longitude = pt['lon'].to_f + + if node.latitude > 90 or node.latitude < -90 or node.longitude > 180 or node.longitude < -180 + return nil + end + + if pt['id'] != '0' + node.id = pt['id'].to_i + end + + node.visible = pt['visible'] == '1' + + if create + node.timestamp = Time.now + else + node.timestamp = Time.parse(pt['timestamp']) + end + + tags = [] + + pt.find('tag').each do |tag| + tags << [tag['k'],tag['v']] + end + + tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';') + tags = '' if tags.nil? + + node.tags = tags + + end + return node + end + + def save_with_history + begin + Node.transaction do + old_node = OldNode.from_node(this) + this.save + old_node.save + end + return true + rescue Exception => ex + return nil + + end + end + + def self.to_xml + doc = XML::Document.new + + doc.encoding = "UTF-8" + root = XML::Node.new 'osm' + root['version'] = '0.4' + root['generator'] = 'OpenStreetMap server' + doc.root = root + el1 = XML::Node.new 'node' + el1['id'] = this.id.to_s + el1['lat'] = this.latitude.to_s + el1['lon'] = this.longitude.to_s + split_tags(el1, this.tags) + el1['visible'] = thiss.visible.to_s + el1['timestamp'] = this.timestamp.xmlschema + root << el1 + + return root + + end + + + private + def split_tags(el, tags) + tags.split(';').each do |tag| + parts = tag.split('=') + key = '' + val = '' + key = parts[0].strip unless parts[0].nil? + val = parts[1].strip unless parts[1].nil? + if key != '' && val != '' + el2 = Node.new('tag') + el2['k'] = key.to_s + el2['v'] = val.to_s + el << el2 + end + end + end + + + end diff --git a/app/models/old_node.rb b/app/models/old_node.rb new file mode 100644 index 000000000..339db9d08 --- /dev/null +++ b/app/models/old_node.rb @@ -0,0 +1,20 @@ +class OldNode < ActiveRecord::Base + set_table_name 'nodes' + + belongs_to :user + + def self.from_node(node) + old_node = OldNode.new + old_node.latitude = node.latitude + old_node.longitude = node.longitude + old_node.visible = 1 + old_node.tags = node.tags + old_node.timestamp = node.timestamp + old_node.user_id = node.user_id + old_node.id = node.id + return old_node + end + + + +end diff --git a/db/migrate/005_create_old_nodes.rb b/db/migrate/005_create_old_nodes.rb new file mode 100644 index 000000000..4e99ab31e --- /dev/null +++ b/db/migrate/005_create_old_nodes.rb @@ -0,0 +1,11 @@ +class CreateOldNodes < ActiveRecord::Migration + def self.up + create_table :old_nodes do |t| + # t.column :name, :string + end + end + + def self.down + drop_table :old_nodes + end +end -- 2.39.5