]> git.openstreetmap.org Git - rails.git/blob - app/controllers/node_controller.rb
various bits
[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       node = nil
9       begin
10         node = Node.from_xml(request.raw_post, true)
11       rescue
12         render :text => "XML didn't parse", :status => 400 # if we got here the doc didnt parse
13         return
14       end
15
16       if node
17         node.user_id = @user.id
18         node.visible = 1
19         if node.save_with_history
20           render :text => node.id
21         else
22           render :nothing => true, :status => 500
23         end
24         return
25
26       else
27         render :nothing => true, :status => 400 # if we got here the doc didnt parse
28         return
29       end
30     end
31
32     render :nothing => true, :status => 500 # something went very wrong
33   end
34
35   def rest
36     unless Node.exists?(params[:id])
37       render :nothing => true, :status => 404
38       return
39     end
40
41     node = Node.find(params[:id])
42
43     case request.method
44
45     when :get
46       unless node
47         render :nothing => true, :status => 500
48         return
49       end
50
51       unless node.visible
52         render :nothing => true, :status => 410
53         return
54       end
55
56       render :text => node.to_xml.to_s
57       return
58
59     when :delete
60       if node.visible
61         node.visible = 0
62         node.save_with_history
63         render :nothing => true
64       else
65         render :nothing => true, :status => 410
66       end
67
68     when :put
69       new_node = Node.from_xml(request.raw_post)
70
71       node.timestamp = Time.now
72       node.user_id = @user.id
73
74       node.latitude = new_node.latitude 
75       node.longitude = new_node.longitude
76       node.tags = new_node.tags
77
78       if node.id == new_node.id and node.save_with_history
79         render :nothing => true, :status => 200
80       else
81         render :nothing => true, :status => 500
82       end
83       return
84     end
85
86   end
87
88   def history
89     node = Node.find(params[:id])
90
91     unless node
92       render :nothing => true, :staus => 404
93       return
94     end
95
96     doc = XML::Document.new
97     doc.encoding = 'UTF-8' 
98     root = XML::Node.new 'osm'
99     root['version'] = '0.4'
100     root['generator'] = 'OpenStreetMap server'
101     doc.root = root
102
103     node.old_nodes.each do |old_node|
104       el1 = XML::Node.new 'node'
105       el1['id'] = old_node.id.to_s
106       el1['lat'] = old_node.latitude.to_s
107       el1['lon'] = old_node.longitude.to_s
108       Node.split_tags(el1, old_node.tags)
109       el1['visible'] = old_node.visible.to_s
110       el1['timestamp'] = old_node.timestamp.xmlschema
111       root << el1
112     end
113
114     render :text => doc.to_s
115   end
116 end