1 class NodeController < ApplicationController
4 before_filter :authorize
8 doc = XML::Document.new(request.raw_post) #THIS IS BROKEN, libxml docus dont talk about creating a doc from a string
9 doc.find('//osm/node').each do |pt|
10 render :text => 'arghsd.rkugt;dsrt'
12 lat = pt.attributes['lat'].to_f
13 lon = pt.attributes['lon'].to_f
14 node_id = pt.attributes['id'].to_i
16 if lat > 90 or lat < -90 or lon > 180 or lon < -180 or node_id != 0
17 render :nothing => true, :status => 400 # BAD REQUEST
23 pt.elements.each('tag') do |tag|
24 tags << [tag.attributes['k'],tag.attributes['v']]
26 tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';')
27 tags = '' if tags.nil?
37 node.user_id = @user.id
39 #FIXME add a node to the old nodes table too
42 render :text => node.id
44 render :nothing => true, :status => 500
49 render :text => 'WRONG! '
55 unless Node.exists?(params[:id])
56 render :nothing => true, :status => 400
60 node = Node.find(params[:id])
65 doc = XML::Document.new
67 # this needs a new libxml:
68 # doc.encoding = "UTF-8"
70 root = XML::Node.new 'osm'
71 root['version'] = '0.4'
72 root['generator'] = 'OpenStreetMap server'
74 el1 = XML::Node.new 'node'
75 el1['id'] = node.id.to_s
76 el1['lat'] = node.latitude.to_s
77 el1['lon'] = node.longitude.to_s
78 split_tags(el1, node.tags)
79 el1['visible'] = node.visible.to_s
80 el1['timestamp'] = node.timestamp.xmlschema
83 render :text => doc.to_s
94 render :nothing => true, :status => 410
102 doc = XML::Document.new(request.raw_post)
103 doc.elements.each('osm/node') do |pt|
104 lat = pt.attributes['lat'].to_f
105 lon = pt.attributes['lon'].to_f
106 node_id = pt.attributes['id'].to_i
108 if lat > 90 or lat < -90 or lon > 180 or lon < -180 or node_id != params[:id]
109 render :nothing => true, :status => 400 # BAD REQUEST
115 pt.elements.each('tag') do |tag|
116 tags << [tag.attributes['k'],tag.attributes['v']]
118 tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';')
119 tags = '' if tags.nil?
128 node.user_id = @user.id
130 #FIXME add a node to the old nodes table too
133 render :text => node.id
135 render :nothing => true, :status => 500
144 userid = dao.useridfromcreds(r.user, r.get_basic_auth_pw)
145 doc = Document.new $stdin.read
147 doc.elements.each('osm/node') do |pt|
148 lat = pt.attributes['lat'].to_f
149 lon = pt.attributes['lon'].to_f
150 xmlnodeid = pt.attributes['id'].to_i
153 pt.elements.each('tag') do |tag|
154 tags << [tag.attributes['k'],tag.attributes['v']]
157 tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';')
159 tags = '' unless tags
160 if xmlnodeid == nodeid && userid != 0
162 new_node_id = dao.create_node(lat, lon, userid, tags)
167 exit HTTP_INTERNAL_SERVER_ERROR
170 node = dao.getnode(nodeid)
172 #FIXME: need to check the node hasn't moved too much
173 if dao.update_node?(nodeid, userid, lat, lon, tags)
176 exit HTTP_INTERNAL_SERVER_ERROR
187 exit HTTP_INTERNAL_SERVER_ERROR
201 nodeid = r.args.match(/nodeid=([0-9]+)/).captures.first.to_i
202 userid = dao.useridfromcreds(r.user, r.get_basic_auth_pw)
203 doc = Document.new $stdin.read
205 doc.elements.each('osm/node') do |pt|
206 lat = pt.attributes['lat'].to_f
207 lon = pt.attributes['lon'].to_f
208 xmlnodeid = pt.attributes['id'].to_i
211 pt.elements.each('tag') do |tag|
212 tags << [tag.attributes['k'],tag.attributes['v']]
215 tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';')
217 tags = '' unless tags
218 if xmlnodeid == nodeid && userid != 0
220 new_node_id = dao.create_node(lat, lon, userid, tags)
225 exit HTTP_INTERNAL_SERVER_ERROR
228 node = dao.getnode(nodeid)
230 #FIXME: need to check the node hasn't moved too much
231 if dao.update_node?(nodeid, userid, lat, lon, tags)
234 exit HTTP_INTERNAL_SERVER_ERROR
245 exit HTTP_INTERNAL_SERVER_ERROR
254 node = node.find(params[:id])
256 doc.encoding = "utf-8"
257 root = node.new 'osm'
258 root['version'] = '0.4'
259 root['generator'] = 'openstreetmap server'
261 el1 = node.new 'node'
262 el1['id'] = node.id.to_s
263 el1['lat'] = node.latitude.to_s
264 el1['lon'] = node.longitude.to_s
265 split_tags(el1, node.tags)
266 el1['visible'] = node.visible.to_s
267 el1['timestamp'] = node.timestamp
270 render :text => doc.to_s, :template => false
278 userid = dao.useridfromcreds(r.user, r.get_basic_auth_pw)
279 #cgi doesnt work with DELETE so extract manually:
280 nodeid = r.args.match(/nodeid=([0-9]+)/).captures.first.to_i
282 if userid > 0 && nodeid != 0
283 node = dao.getnode(nodeid)
286 if dao.delete_node?(nodeid, userid)
289 exit HTTP_INTERNAL_SERVER_ERROR
309 def split_tags(el, tags)
310 tags.split(';').each do |tag|
311 parts = tag.split('=')
314 key = parts[0].strip unless parts[0].nil?
315 val = parts[1].strip unless parts[1].nil?
316 if key != '' && val != ''
317 el2 = Node.new('tag')