Refactored common functionality from object history controllers
[rails.git] / app / controllers / old_controller.rb
1 # this class pulls together the logic for all the old_* controllers
2 # into one place. as it turns out, the API methods for historical
3 # nodes, ways and relations are basically identical.
4 class OldController < ApplicationController
5   require 'xml/libxml'
6
7   skip_before_filter :verify_authenticity_token
8   before_filter :setup_user_auth, :only => [ :history, :version ]
9   before_filter :authorize, :only => [ :redact ]
10   before_filter :authorize_moderator, :only => [ :redact ]
11   before_filter :require_allow_write_api, :only => [ :redact ]
12   before_filter :check_api_readable
13   before_filter :check_api_writable, :only => [ :redact ]
14   after_filter :compress_output
15   around_filter :api_call_handle_error, :api_call_timeout
16   before_filter :lookup_old_element, :except => [ :history ]
17   before_filter :lookup_old_elements_via_current, :only => [ :history ]
18
19   def history
20     doc = OSM::API.new.get_xml_doc
21     
22     visible_elements = if show_redactions?
23                          @elements
24                        else
25                          @elements.unredacted
26                        end
27
28     visible_elements.each do |element|
29       doc.root << element.to_xml_node
30     end
31     
32     render :text => doc.to_s, :content_type => "text/xml"
33   end
34   
35   def version
36     if @old_element.redacted? and not show_redactions?
37       render :nothing => true, :status => :forbidden
38
39     else
40       response.last_modified = @old_element.timestamp
41       
42       doc = OSM::API.new.get_xml_doc
43       doc.root << @old_element.to_xml_node
44         
45       render :text => doc.to_s, :content_type => "text/xml"
46     end
47   end
48
49   def redact
50     redaction_id = params['redaction']
51     unless redaction_id.nil?
52       # if a redaction ID was specified, then set this element to
53       # be redacted in that redaction. (TODO: check that the
54       # user doing the redaction owns the redaction object too)
55       redaction = Redaction.find(redaction_id.to_i)
56       @old_element.redact!(redaction)
57       
58     else
59       # if no redaction ID was provided, then this is an unredact
60       # operation.
61       @old_element.redact!(nil)
62     end
63     
64     # just return an empty 200 OK for success
65     render :nothing => true
66   end
67
68   private
69   
70   def show_redactions?
71     @user and @user.moderator? and params[:show_redactions] == "true"
72   end
73 end