@@ -43,23 +43,45 @@ class ICalService
43
43
def initialize ( series :, user :)
44
44
@user = user
45
45
@series = series
46
+ @schedule = series . schedule
46
47
@url_helpers = OpenProject ::StaticRouting ::StaticUrlHelpers . new
47
48
end
48
49
49
- def call # rubocop:disable Metrics/AbcSize
50
- User . execute_as ( user ) do
51
- @timezone = Time . zone || Time . zone_default
52
- @calendar = build_icalendar ( series . start_time )
53
- @schedule = series . schedule
54
- ServiceResult . success ( result : generate_ical )
50
+ def generate_series
51
+ ical_result ( series ) do
52
+ series_event
53
+ occurrences_events
55
54
end
56
55
rescue StandardError => e
57
- Rails . logger . error ( "Failed to generate ICS for meeting series #{ @series . id } : #{ e . message } " )
56
+ Rails . logger . error ( "Failed to generate ICS for meeting series #{ series . id } : #{ e . message } " )
57
+ ServiceResult . failure ( message : e . message )
58
+ end
59
+
60
+ def generate_occurrence ( meeting )
61
+ # Get the time the meeting was scheduled to take place
62
+ scheduled_meeting = meeting . scheduled_meeting
63
+ ical_result ( scheduled_meeting ) do
64
+ occurrence_event ( scheduled_meeting . start_time , meeting )
65
+ end
66
+ rescue StandardError => e
67
+ Rails . logger . error ( "Failed to generate ICS for meeting #{ meeting . id } : #{ e . message } " )
58
68
ServiceResult . failure ( message : e . message )
59
69
end
60
70
61
71
private
62
72
73
+ def ical_result ( meeting )
74
+ User . execute_as ( user ) do
75
+ @timezone = Time . zone || Time . zone_default
76
+ @calendar = build_icalendar ( meeting . start_time )
77
+
78
+ yield
79
+
80
+ calendar . publish
81
+ ServiceResult . success ( result : calendar . to_ical )
82
+ end
83
+ end
84
+
63
85
def tzinfo
64
86
timezone . tzinfo
65
87
end
@@ -68,18 +90,11 @@ def tzid
68
90
tzinfo . canonical_identifier
69
91
end
70
92
71
- def generate_ical
72
- series_event
73
- occurrences_events
74
-
75
- calendar . publish
76
- calendar . to_ical
77
- end
78
-
79
93
def series_event # rubocop:disable Metrics/AbcSize
80
94
calendar . event do |e |
81
95
base_series_attributes ( e )
82
96
97
+ e . rrule = schedule . rrules . first . to_ical # We currently only have one recurrence rule
83
98
e . dtstart = ical_datetime template . start_time , tzid
84
99
e . dtend = ical_datetime template . end_time , tzid
85
100
e . url = url_helpers . project_recurring_meeting_url ( series . project , series )
@@ -105,6 +120,7 @@ def occurrence_event(schedule_start_time, meeting) # rubocop:disable Metrics/Abc
105
120
e . dtend = ical_datetime meeting . end_time , tzid
106
121
e . url = url_helpers . project_meeting_url ( meeting . project , meeting )
107
122
e . location = meeting . location . presence
123
+ e . sequence = meeting . lock_version
108
124
109
125
add_attendees ( e , meeting )
110
126
end
@@ -120,7 +136,6 @@ def upcoming_instantiated_schedules
120
136
121
137
def base_series_attributes ( event ) # rubocop:disable Metrics/AbcSize
122
138
event . uid = ical_uid ( "meeting-series-#{ series . id } " )
123
- event . rrule = schedule . rrules . first . to_ical # We currently only have one recurrence rule
124
139
event . summary = "[#{ series . project . name } ] #{ series . title } "
125
140
event . description = "[#{ series . project . name } ] #{ I18n . t ( :label_meeting_series ) } : #{ series . title } "
126
141
event . organizer = ical_organizer ( series )
0 commit comments