Backend/internal/workers/worker_schedules.go
2024-12-06 21:53:09 +01:00

63 lines
1.7 KiB
Go
Executable file

package workers
import (
"fmt"
"gorm.io/gorm"
db "git.zervo.org/scheduletogether/backend/internal/database"
)
func workerSchedules_PurgeAbandonedData() {
reporter := NewReporter("Schedules", "PurgeAbandonedData")
// Start a transaction
tx := db.Db.Begin()
// Get all schedule entries
reporter.Status("1/2: Get all schedule entries")
var schedules []db.Schedule
err := tx.Model(&db.Schedule{}).Find(&schedules).Error
if err != nil {
tx.Rollback()
reporter.Fail("Failed to retrieve schedule entries from the database: " + err.Error())
return
}
reporter.Status(fmt.Sprintf("Found %d schedule entries", len(schedules)))
// Loop over schedule entries
reporter.Status("2/2: Purge abandoned schedule entries")
var purged int
for _, schedule := range schedules {
// Get source user
var sourceUser db.User
err = tx.Where("uuid = ?", schedule.Uuid).First(&sourceUser).Error
// If error, check if error is user not found
if err != nil {
if err == gorm.ErrRecordNotFound { // If error is "not found", delete schedule data entry
reporter.Status("Deleting abandoned schedule data for source user " + sourceUser.Username + " (" + schedule.Uuid + ")")
purged += 1
err := tx.Model(&db.Schedule{}).Delete(&schedule).Error
if err != nil {
tx.Rollback()
reporter.Fail("Failed to delete schedule data from the database: " + err.Error())
return
}
continue
}
}
reporter.Status(fmt.Sprintf("Purged %d abandoned schedule entries", purged))
}
// Commit the transaction if everything is successful
err = tx.Commit().Error
if err != nil {
tx.Rollback()
reporter.Fail("Failed to commit transaction: " + err.Error())
return
}
// Finish job
reporter.Finish()
}