refactored ConferencesController#calendar: separated calendar event creation into an specific service

This commit is contained in:
Carlos Daniel Pohlod 2022-11-09 17:15:28 -03:00 committed by Henne Vogelsang
parent 6e276b2787
commit 69c06b4229
6 changed files with 249 additions and 34 deletions

View file

@ -68,42 +68,22 @@ class ConferencesController < ApplicationController
end
def calendar
i_calendar = Icalendar::Calendar.new
respond_to do |format|
format.ics do
calendar = Icalendar::Calendar.new
Conference.all.each do |conf|
if params[:full]
event_schedules = conf.program.selected_event_schedules(
includes: [{ event: %i[event_type speakers submitter] }]
)
calendar = icalendar_proposals(calendar, event_schedules.map(&:event), conf)
else
calendar.event do |e|
e.dtstart = conf.start_date
e.dtstart.ical_params = { 'VALUE'=>'DATE' }
e.dtend = conf.end_date
e.dtend.ical_params = { 'VALUE'=>'DATE' }
e.duration = "P#{(conf.end_date - conf.start_date + 1).floor}D"
e.created = conf.created_at
e.last_modified = conf.updated_at
e.summary = conf.title
e.description = conf.description
e.uid = conf.guid
e.url = conference_url(conf.short_title)
v = conf.venue
if v
e.geo = v.latitude, v.longitude if v.latitude && v.longitude
location = ''
location += "#{v.street}, " if v.street
location += "#{v.postalcode} #{v.city}, " if v.postalcode && v.city
location += v.country_name if v.country_name
e.location = location if location
end
end
end
Conference.all.each do |conference|
conference_url = conference_url(conference.short_title)
Conference::Calendar::EventBuilder.call(
conference: conference,
conference_url: conference_url,
calendar: i_calendar,
is_full_calendar: params[:full]
)
end
calendar.publish
render inline: calendar.to_ical
i_calendar.publish
render inline: i_calendar.to_ical
end
end
end

View file

@ -0,0 +1,64 @@
class Conferences::Calendar
private_class_method :new
def self.call(conference:, is_full_calendar:)
new(conference, is_full_calendar).call
end
def initialize(conference:, is_full_calendar:)
@calendar = Icalendar::Calendar.new
@conference = conference
@is_full_calendar = is_full_calendar
end
def not_full_calendar
calendar.event do |e|
default_calendar_params(e)
if @conference.venue
venue_calendar_params(e)
end
end
calendar
end
def full_calendar
icalendar_proposals(@calendar, event_schedules.map(&:event), @conference)
end
private
def default_calendar_params(event)
event.dtstart = @conference.start_date
event.dtstart.ical_params = { 'VALUE'=>'DATE' }
event.dtend = @conference.end_date
event.dtend.ical_params = { 'VALUE'=>'DATE' }
event.duration = "P#{(@conference.end_date - @conference.start_date + 1).floor}D"
event.created = @conference.created_at
event.last_modified = @conference.updated_at
event.summary = @conference.title
event.description = @conference.description
event.uid = @conference.guid
event.url = conference_url(@conference.short_title)
end
def venue_calendar_params(event)
venue = @conference.venue
event.geo = venue.latitude, venue.longitude if venue.latitude && venue.longitude
location = location(venue)
event.location = location if location
end
def location(venue)
location = ''
location += "#{venue.street}, " if venue.street
location += "#{venue.postalcode} #{venue.city}, " if venue.postalcode && venue.city
location += venue.country_name if venue.country_name
location
end
def event_schedules
@conference.program.selected_event_schedules(
includes: [{ event: %i[event_type speakers submitter] }]
)
end
end

View file

@ -0,0 +1,67 @@
class Conference::Calendar::EventBuilder
include ConferenceHelper
def self.call(conference:, is_full_calendar:, calendar:, conference_url:)
new(conference:, is_full_calendar:, calendar:, conference_url:).call
end
def initialize(conference:, is_full_calendar:, calendar:, conference_url:)
@calendar = calendar
@conference_url = conference_url
@conference = conference
@is_full_calendar = is_full_calendar
@venue = conference.venue
end
def call
return build_full_calendar if is_full_calendar
build_not_full_calendar
end
private
attr :conference, :is_full_calendar, :calendar, :conference_url, :venue
def build_full_calendar
event_schedules = conference.program.selected_event_schedules(
includes: [{ event: %i[event_type speakers submitter] }]
)
icalendar_proposals(calendar, event_schedules.map(&:event), conference)
end
def build_not_full_calendar
calendar.event do |event|
build_event_general_informations(event)
build_event_venue(event) if venue
end
calendar
end
def build_event_general_informations(event)
event.dtstart = conference.start_date
event.dtstart.ical_params = { 'VALUE'=>'DATE' }
event.dtend = conference.end_date
event.dtend.ical_params = { 'VALUE'=>'DATE' }
event.duration = "P#{(conference.end_date - conference.start_date + 1).floor}D"
event.created = conference.created_at
event.last_modified = conference.updated_at
event.summary = conference.title
event.description = conference.description
event.uid = conference.guid
event.url = conference_url
end
def build_event_venue(event)
event.geo = venue.latitude, venue.longitude if venue.latitude && venue.longitude
location = build_venue_location
event.location = location if location
end
def build_venue_location
location = ''
location += "#{venue.street}, " if venue.street
location += "#{venue.postalcode} #{venue.city}, " if venue.postalcode && venue.city
location += venue.country_name if venue.country_name
location
end
end