diff --git a/app/controllers/conferences_controller.rb b/app/controllers/conferences_controller.rb index 43809551..0accb4ae 100644 --- a/app/controllers/conferences_controller.rb +++ b/app/controllers/conferences_controller.rb @@ -3,7 +3,8 @@ class ConferencesController < ApplicationController protect_from_forgery with: :null_session before_action :respond_to_options - load_and_authorize_resource find_by: :short_title, except: :show + load_and_authorize_resource find_by: :short_title, except: [:show, :feed] + skip_authorization_check only: :feed def index @current = Conference.upcoming.reorder(start_date: :asc) @@ -108,6 +109,13 @@ class ConferencesController < ApplicationController end end + def feed + @conferences = Conference.order(created_at: :desc) + respond_to do |format| + format.rss { render layout: false } + end + end + def code_of_conduct; end private diff --git a/app/views/conferences/feed.rss.builder b/app/views/conferences/feed.rss.builder new file mode 100644 index 00000000..7b7e7d3c --- /dev/null +++ b/app/views/conferences/feed.rss.builder @@ -0,0 +1,18 @@ +xml.instruct! :xml, version: "1.0" +xml.rss version: "2.0" do + xml.channel do + xml.title "#{ENV.fetch('OSEM_NAME', 'OSEM')} - Conferences" + xml.description "Conferences from #{ENV.fetch('OSEM_NAME', 'OSEM')}" + xml.link conferences_url + + @conferences.each do |conference| + xml.item do + xml.title conference.title + xml.description conference.description + xml.pubDate conference.created_at.to_fs(:rfc822) + xml.link conference_url(conference.short_title) + xml.guid conference_url(conference.short_title) + end + end + end +end diff --git a/app/views/conferences/index.html.haml b/app/views/conferences/index.html.haml index 720e1cdf..2cfeb6d3 100644 --- a/app/views/conferences/index.html.haml +++ b/app/views/conferences/index.html.haml @@ -23,6 +23,9 @@ %span.btn-group = link_to("Days only", calendar_url(protocol: 'webcal', format: 'ics'), class: 'btn btn-default') = link_to("Detailed", calendar_url(protocol: 'webcal', format: 'ics', full: true), class: 'btn btn-default') + %p + Subscribe to the RSS feed: + = link_to("RSS Feed", feed_url(format: :rss), class: 'btn btn-default') -content_for :script_body do :javascript diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 95fb77f1..d6ad6ae6 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -7,6 +7,7 @@ %meta{content: '', name: 'author'} = stylesheet_link_tag "application", media: 'all' = javascript_include_tag "application" + = auto_discovery_link_tag(:rss, feed_url(format: :rss), title: "#{ENV.fetch('OSEM_NAME', 'OSEM')} Conferences RSS Feed") = csrf_meta_tags = content_for(:script_head) diff --git a/config/routes.rb b/config/routes.rb index 730d43cf..2bc55e48 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -216,6 +216,7 @@ Osem::Application.routes.draw do get '/admin' => redirect('/admin/conferences') get '/calendar' => 'conferences#calendar' + get '/feed' => 'conferences#feed' if ENV.fetch('OSEM_ROOT_CONFERENCE', nil) root to: redirect("/conferences/#{ENV.fetch('OSEM_ROOT_CONFERENCE')}") diff --git a/spec/controllers/conferences_controller_spec.rb b/spec/controllers/conferences_controller_spec.rb index c9a17d14..f83da98b 100644 --- a/spec/controllers/conferences_controller_spec.rb +++ b/spec/controllers/conferences_controller_spec.rb @@ -49,4 +49,20 @@ describe ConferencesController do end end + describe 'GET #feed' do + render_views + + it 'returns RSS feed successfully' do + get :feed, format: :rss + expect(response.response_code).to eq(200) + expect(response.content_type).to include('application/rss+xml') + end + + it 'includes conference data in the feed' do + conference # trigger let + get :feed, format: :rss + expect(response.body).to include(conference.title) + end + end + end