]> git.openstreetmap.org Git - rails.git/blob - app/controllers/segment_controller.rb
various map API rails stuff
[rails.git] / app / controllers / segment_controller.rb
1 class SegmentController < ApplicationController
2   require 'xml/libxml'
3
4   before_filter :authorize
5
6   def create
7     response.headers["Content-Type"] = 'application/xml'
8     if request.put?
9       segment = Segment.from_xml(request.raw_post, true)
10
11       if segment
12         
13         segment.user_id = @user.id
14
15         a = Node.find(segment.node_a.to_i)
16         b = Node.find(segment.node_b.to_i)
17         
18         unless a and a.visible and b and b.visible  
19           render :nothing => true, :status => 400
20         end
21
22         if segment.save_with_history
23           render :text => segment.id
24         else
25           render :nothing => true, :status => 500
26         end
27         return
28
29       else
30         render :nothing => true, :status => 400 # if we got here the doc didnt parse
31         return
32       end
33     end
34
35     render :nothing => true, :status => 500 # something went very wrong
36   end
37
38   def rest
39     response.headers["Content-Type"] = 'application/xml'
40     unless Segment.exists?(params[:id])
41       render :nothing => true, :status => 404
42       return
43     end
44
45     segment = Segment.find(params[:id])
46
47     case request.method
48
49     when :get
50       render :text => segment.to_xml.to_s
51       return
52
53     when :delete
54       if segment.visible
55         segment.visible = 0
56         segment.save_with_history
57         render :nothing => true
58       else
59         render :nothing => true, :status => 410
60       end
61
62     when :put
63       new_segment = Segment.from_xml(request.raw_post)
64
65       segment.timestamp = Time.now
66       segment.user_id = @user.id
67
68       segment.node_a = new_segment.node_a
69       segment.node_b = new_segment.node_b
70       segment.tags = new_segment.tags
71       segment.visible = new_segment.visible
72
73       if segment.id == new_segment.id and segment.save_with_history
74         render :nothing => true, :status => 200
75       else
76         render :nothing => true, :status => 500
77       end
78       return
79     end
80
81   end
82
83   def history
84     response.headers["Content-Type"] = 'application/xml'
85     segment = Segment.find(params[:id])
86
87     unless segment
88       render :nothing => true, :staus => 404
89       return
90     end
91
92     doc = XML::Document.new
93     doc.encoding = 'UTF-8' 
94     root = XML::Node.new 'osm'
95     root['version'] = '0.4'
96     root['generator'] = 'OpenStreetMap server'
97     doc.root = root
98
99     segment.old_segments.each do |old_segment|
100       el1 = XML::Node.new 'segment'
101       el1['id'] = old_segment.id.to_s
102       el1['from'] = old_segment.node_a.to_s
103       el1['to'] = old_segment.node_b.to_s
104       Segment.split_tags(el1, old_segment.tags)
105       el1['visible'] = old_segment.visible.to_s
106       el1['timestamp'] = old_segment.timestamp.xmlschema
107       root << el1
108     end
109
110     render :text => doc.to_s
111   end
112
113
114 end