diff options
-rw-r--r-- | app/controllers/api_controller.rb | 20 | ||||
-rwxr-xr-x | app/helpers/link_to_helper.rb | 6 | ||||
-rw-r--r-- | app/views/api/new_requests.atom.builder | 22 | ||||
-rw-r--r-- | app/views/api/request_events.atom.builder | 25 | ||||
-rw-r--r-- | config/routes.rb | 2 | ||||
-rw-r--r-- | spec/controllers/api_controller_spec.rb | 16 |
6 files changed, 57 insertions, 34 deletions
diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index a8c9b5fef..3001ca3cb 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -155,17 +155,27 @@ class ApiController < ApplicationController head :no_content end - def body_new_requests + def body_request_events feed_type = params[:feed_type] raise PermissionDenied.new("#{@public_body.id} != #{params[:id]}") if @public_body.id != params[:id].to_i - @requests = @public_body.info_requests + @events = InfoRequestEvent.find_by_sql([ + %(select info_request_events.* + from info_requests + join info_request_events on info_requests.id = info_request_events.info_request_id + where info_requests.public_body_id = ? + and info_request_events.event_type in ( + 'sent', 'followup_sent', 'resent', 'followup_resent' + ) + order by info_request_events.created_at desc + ), @public_body.id + ]) if feed_type == "atom" - render :template => "api/new_requests.atom", :layout => false + render :template => "api/request_events.atom", :layout => false elsif feed_type == "json" - render :json => @requests + render :json => @events else - raise ActiveRecord::RecordNotFound.new("Unrecognised feed type: " + feed_type) + raise ActiveRecord::RecordNotFound.new("Unrecognised feed type: #{feed_type}") end end diff --git a/app/helpers/link_to_helper.rb b/app/helpers/link_to_helper.rb index efa20b723..1a86333b6 100755 --- a/app/helpers/link_to_helper.rb +++ b/app/helpers/link_to_helper.rb @@ -16,12 +16,6 @@ module LinkToHelper params = {:url_title => info_request.url_title, :only_path => true} return show_request_url(params.merge(extra_params)) end - - def info_request_url(info_request) - # This method is called implicitly by the builder view views/api/new_requests.atom.builder - # to construct the URLs for the feed entries. Therefore we return fully-qualified URLs here. - return main_url(request_url(info_request)) - end def request_link(info_request, cls=nil ) link_to h(info_request.title), request_url(info_request), :class => cls diff --git a/app/views/api/new_requests.atom.builder b/app/views/api/new_requests.atom.builder deleted file mode 100644 index bd5c2f90e..000000000 --- a/app/views/api/new_requests.atom.builder +++ /dev/null @@ -1,22 +0,0 @@ -atom_feed do |feed| - feed.title("New requests made to #{@public_body.name}") - feed.updated(@requests.first.updated_at) - - puts @requests.inspect - for request in @requests - feed.entry(request) do |entry| - entry.updated(request.updated_at) - entry.published(request.created_at) - entry.title(request.title) - entry.content(request.last_event_forming_initial_request.outgoing_message.body, :type => 'text') - entry.author do |author| - author.name(request.user_name) - if !request.user.nil? - author.uri(main_url(user_url(request.user))) - end - author.email(request.incoming_email) - end - end - end -end - diff --git a/app/views/api/request_events.atom.builder b/app/views/api/request_events.atom.builder new file mode 100644 index 000000000..4f0133051 --- /dev/null +++ b/app/views/api/request_events.atom.builder @@ -0,0 +1,25 @@ +atom_feed("xmlns:alaveteli" => "http://www.alaveteli.org/API/v2/RequestEvents/Atom") do |feed| + feed.title("Events relating to #{@public_body.name}") + feed.updated(@events.first.created_at) + + for event in @events + feed.entry(event) do |entry| + request = event.info_request + + entry.published(event.created_at) + entry.tag!("alaveteli:event_type", event.event_type) + entry.tag!("alaveteli:request_url", main_url(request_url(request))) + entry.title(request.title) + + entry.content(event.outgoing_message.body, :type => 'text') + + entry.author do |author| + author.name(request.user_name) + if !request.user.nil? + author.uri(main_url(user_url(request.user))) + end + author.email(request.incoming_email) + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index e76d86816..a9c2c889a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -247,7 +247,7 @@ ActionController::Routing::Routes.draw do |map| api.api_show_request '/api/v2/request/:id.json', :action => 'show_request', :conditions => { :method => :get } api.api_add_correspondence '/api/v2/request/:id.json', :action => 'add_correspondence', :conditions => { :method => :post } - api.api_body_new_requests '/api/v2/body/:id/new_requests.:feed_type', :action => 'body_new_requests', :feed_type => '^(json|atom)$' + api.api_body_request_events '/api/v2/body/:id/request_events.:feed_type', :action => 'body_request_events', :feed_type => '^(json|atom)$' end map.filter('conditionallyprependlocale') diff --git a/spec/controllers/api_controller_spec.rb b/spec/controllers/api_controller_spec.rb index 1f65576b6..39ffae7fc 100644 --- a/spec/controllers/api_controller_spec.rb +++ b/spec/controllers/api_controller_spec.rb @@ -260,4 +260,20 @@ describe ApiController, "when using the API" do # assigns them and changing assignment to an equality # check, which does not really test anything at all. end + + it "should show a feed of new request events" do + get :body_request_events, + :id => public_bodies(:geraldine_public_body).id, + :k => public_bodies(:geraldine_public_body).api_key, + :feed_type => "atom" + + response.should be_success + response.should render_template("api/request_events.atom") + assigns[:events].size.should > 0 + assigns[:events].each do |event| + event.info_request.public_body.should == public_bodies(:geraldine_public_body) + event.outgoing_message.should_not be_nil + event.event_type.should satisfy {|x| ['sent', 'followup_sent', 'resent', 'followup_resent'].include?(x)} + end + end end |