Skip to content

Commit d2ad1d9

Browse files
corypridecarddev81
authored andcommitted
fix: adjusted syncClassDateBoundaries function logic
1 parent b763bec commit d2ad1d9

File tree

2 files changed

+33
-27
lines changed

2 files changed

+33
-27
lines changed

backend/src/database/class_events.go

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -249,53 +249,53 @@ func (db *DB) syncClassDateBoundaries(trans *gorm.DB, classID uint) error {
249249
return err
250250
}
251251

252+
originalBaseStart := rRule.OrigOptions.Dtstart.In(time.UTC)
253+
ruleUntil := rRule.GetUntil()
254+
252255
startBoundary := class.StartDt
253-
var endBoundary time.Time
256+
endBoundary := startBoundary.AddDate(5, 0, 0)
254257
if class.EndDt != nil {
255-
endBoundary = *class.EndDt
256-
endBoundary = endBoundary.AddDate(0, 3, 0)
257-
} else {
258-
endBoundary = startBoundary.AddDate(5, 0, 0)
258+
endBoundary = class.EndDt.AddDate(0, 3, 0)
259259
}
260260

261-
ruleUntil := rRule.GetUntil()
262-
263-
baseEventOccurrences := rRule.Between(startBoundary, endBoundary, true)
264-
265-
if len(baseEventOccurrences) == 0 {
261+
baseOccurrences := rRule.Between(startBoundary, endBoundary, true)
262+
if len(baseOccurrences) == 0 {
266263
return nil
267264
}
268265

269266
cancelledDates := make(map[string]bool)
270267
rescheduledDates := make([]time.Time, 0)
268+
var earliestReschedule time.Time
271269

272270
for _, override := range event.Overrides {
273271
overrideRule, err := rrule.StrToRRule(override.OverrideRrule)
274272
if err != nil {
275273
logrus.Warnf("unable to parse override rule: %s", override.OverrideRrule)
276274
continue
277275
}
278-
if len(overrideRule.All()) == 0 {
276+
occurrences := overrideRule.All()
277+
if len(occurrences) == 0 {
279278
continue
280279
}
281280

282-
overrideDate := overrideRule.All()[0]
283-
281+
overrideDate := occurrences[0].In(time.UTC)
284282
if override.IsCancelled {
285283
cancelledDates[overrideDate.Format("2006-01-02")] = true
286-
} else {
287-
rescheduledDates = append(rescheduledDates, overrideDate)
284+
continue
288285
}
289-
}
290286

291-
allDates := make([]time.Time, 0)
287+
rescheduledDates = append(rescheduledDates, overrideDate)
288+
if earliestReschedule.IsZero() || overrideDate.Before(earliestReschedule) {
289+
earliestReschedule = overrideDate
290+
}
291+
}
292292

293-
for _, occurrence := range baseEventOccurrences {
293+
allDates := make([]time.Time, 0, len(baseOccurrences)+len(rescheduledDates))
294+
for _, occurrence := range baseOccurrences {
294295
if !cancelledDates[occurrence.Format("2006-01-02")] {
295296
allDates = append(allDates, occurrence)
296297
}
297298
}
298-
299299
allDates = append(allDates, rescheduledDates...)
300300

301301
if len(allDates) == 0 {
@@ -306,13 +306,16 @@ func (db *DB) syncClassDateBoundaries(trans *gorm.DB, classID uint) error {
306306
return allDates[i].Before(allDates[j])
307307
})
308308

309-
computedStart := allDates[0]
310309
computedEnd := allDates[len(allDates)-1]
311310

312311
updates := make(map[string]interface{})
313312

314-
if computedStart.Before(class.StartDt) {
315-
updates["start_dt"] = computedStart
313+
targetStart := originalBaseStart
314+
if !earliestReschedule.IsZero() && earliestReschedule.Before(originalBaseStart) {
315+
targetStart = earliestReschedule
316+
}
317+
if !targetStart.Equal(class.StartDt) {
318+
updates["start_dt"] = targetStart
316319
}
317320

318321
hasOverrides := len(event.Overrides) > 0
@@ -327,10 +330,12 @@ func (db *DB) syncClassDateBoundaries(trans *gorm.DB, classID uint) error {
327330
updates["end_dt"] = ruleUntil
328331
}
329332

330-
if len(updates) > 0 {
331-
if err := trans.Model(&models.ProgramClass{}).Where("id = ?", classID).Updates(updates).Error; err != nil {
332-
return newUpdateDBError(err, "program_classes")
333-
}
333+
if len(updates) == 0 {
334+
return nil
335+
}
336+
337+
if err := trans.Model(&models.ProgramClass{}).Where("id = ?", classID).Updates(updates).Error; err != nil {
338+
return newUpdateDBError(err, "program_classes")
334339
}
335340

336341
return nil

backend/tests/integration/class_date_synchronization_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,8 @@ func runTestStartDateUpdatesWhenEventMovedEarlier(t *testing.T, env *TestEnv, fa
427427
ExpectStatus(http.StatusOK)
428428

429429
updatedClass := updatedClassResp.GetData()
430-
require.Equal(t, classStartDate, updatedClass.StartDt, "Class start date should remain at the original kickoff when earlier sessions are only cancelled")
430+
expectedStartDate := time.Date(2025, 12, 20, 18, 0, 0, 0, time.UTC) // Original RRULE start date
431+
require.Equal(t, expectedStartDate, updatedClass.StartDt, "Class start date should sync with original RRULE start date when rescheduled events exist")
431432
}
432433

433434
func runTestEventCancellationAffectsBoundaries(t *testing.T, env *TestEnv, facility *models.Facility, facilityAdmin *models.User, program *models.Program) {

0 commit comments

Comments
 (0)