feat: Add public RSS feed for conferences

Users currently have no way to be notified when new conferences are
published on an OSEM instance. This adds an RSS 2.0 feed endpoint at
/feed.rss that lists all conferences ordered by creation date.

The feed action is excluded from CanCanCan authorization so it remains
publicly accessible without authentication, similar to the existing
calendar endpoint.

Also adds an RSS subscribe link to the conferences index page and an
auto-discovery <link> tag in the application layout so RSS readers can
detect the feed automatically.

Fixes #3543
This commit is contained in:
Kushal SM 2026-02-15 22:39:07 +05:30 committed by Henne Vogelsang
parent 9ff37fe106
commit 1958ac2b10
5 changed files with 32 additions and 1 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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')}")