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