nearly there on the node controller
[rails.git] / app / controllers / node_controller.rb
1 class NodeController < ApplicationController
2   require 'xml/libxml'
3
4   before_filter :authorize
5
6   def create
7     if request.put?
8       p = XML::Parser.new
9       p.string = request.raw_post
10       doc = p.parse
11
12       doc.find('//osm/node').each do |pt|
13         lat = pt['lat'].to_f
14         lon = pt['lon'].to_f
15         node_id = pt['id'].to_i
16
17         if lat > 90 or lat < -90 or lon > 180 or lon < -180  or node_id != 0
18           render :nothing => true, :status => 400 # BAD REQUEST
19           return
20         end
21
22         tags = []
23
24         pt.find('tag').each do |tag|
25           tags << [tag['k'],tag['v']]
26         end
27         tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';')
28         tags = '' if tags.nil?
29
30         now = Time.now
31
32         node = Node.new
33         node.latitude = lat
34         node.longitude = lon
35         node.visible = 1
36         node.tags = tags
37         node.timestamp = now
38         node.user_id = @user.id
39
40         #FIXME add a node to the old nodes table too
41
42         if node.save
43           render :text => node.id
44         else
45           render :nothing => true, :status => 500
46         end
47
48         return
49       end
50     end
51
52     render :nothing => true, :status => 400 # if we got here the doc didnt parse
53   end
54
55   def rest
56     unless Node.exists?(params[:id])
57       render :nothing => true, :status => 400
58       return
59     end
60
61     node = Node.find(params[:id])
62
63
64     case request.method
65     when :get
66       doc = XML::Document.new
67
68       doc.encoding = "UTF-8"  
69       root = XML::Node.new 'osm'
70       root['version'] = '0.4'
71       root['generator'] = 'OpenStreetMap server'
72       doc.root = root
73       el1 = XML::Node.new 'node'
74       el1['id'] = node.id.to_s
75       el1['lat'] = node.latitude.to_s
76       el1['lon'] = node.longitude.to_s
77       split_tags(el1, node.tags)
78       el1['visible'] = node.visible.to_s
79       el1['timestamp'] = node.timestamp.xmlschema
80       root << el1
81
82       render :text => doc.to_s
83
84     when :delete
85       #
86       # DELETE
87       #
88
89       if node.visible
90         node.visible = 0
91         node.save
92         render :nothing => true
93       else
94         render :nothing => true, :status => 410
95       end
96
97     when :put
98       #
99       # PUT
100       #
101
102       p = XML::Parser.new
103       p.string = request.raw_post
104       doc = p.parse
105
106       doc.find('//osm/node').each do |pt|
107         lat = pt['lat'].to_f
108         lon = pt['lon'].to_f
109         node_id = pt['id'].to_i
110
111         if lat > 90 or lat < -90 or lon > 180 or lon < -180  or node_id != params[:id]
112           render :nothing => true, :status => 400
113           return
114         end
115
116         tags = []
117
118         pt.find('tag').each do |tag|
119           tags << [tag['k'],tag['v']]
120         end
121         tags = tags.collect { |k,v| "#{k}=#{v}" }.join(';')
122         tags = '' if tags.nil?
123
124         now = Time.now
125
126         node.latitude = lat
127         node.longitude = lon
128         node.visible = 1
129         node.tags = tags
130         node.timestamp = now
131         node.user_id = @user.id
132
133         #FIXME add a node to the old nodes table too
134
135         if node.save
136           render :text => node.id
137         else
138           render :nothing => true, :status => 500
139         end
140       end
141     end
142   end
143
144   private
145   def split_tags(el, tags)
146     tags.split(';').each do |tag|
147       parts = tag.split('=')
148       key = ''
149       val = ''
150       key = parts[0].strip unless parts[0].nil?
151       val = parts[1].strip unless parts[1].nil?
152       if key != '' && val != ''
153         el2 = Node.new('tag')
154         el2['k'] = key.to_s
155         el2['v'] = val.to_s
156         el << el2
157       end
158     end
159   end
160
161
162 end