mirror of
https://github.com/go-vikunja/vikunja.git
synced 2026-03-09 07:13:35 -05:00
fix: decouple webhook dispatch from email/mailer config
The reminder and overdue crons now always run and dispatch webhook events. Email notifications are only sent when both ServiceEnableEmailReminders and MailerEnabled are true. Webhook dispatch errors are logged but no longer abort the cron run.
This commit is contained in:
@@ -93,10 +93,8 @@ func RegisterListeners() {
|
||||
RegisterEventForWebhook(&ProjectDeletedEvent{})
|
||||
RegisterEventForWebhook(&ProjectSharedWithUserEvent{})
|
||||
RegisterEventForWebhook(&ProjectSharedWithTeamEvent{})
|
||||
if config.ServiceEnableEmailReminders.GetBool() {
|
||||
RegisterEventForWebhook(&TaskReminderFiredEvent{})
|
||||
RegisterEventForWebhook(&TaskOverdueEvent{})
|
||||
}
|
||||
RegisterEventForWebhook(&TaskReminderFiredEvent{})
|
||||
RegisterEventForWebhook(&TaskOverdueEvent{})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -111,15 +111,6 @@ type userWithTasks struct {
|
||||
|
||||
// RegisterOverdueReminderCron registers a function which checks once a day for tasks that are overdue and not done.
|
||||
func RegisterOverdueReminderCron() {
|
||||
if !config.ServiceEnableEmailReminders.GetBool() {
|
||||
return
|
||||
}
|
||||
|
||||
if !config.MailerEnabled.GetBool() {
|
||||
log.Info("Mailer is disabled, not sending overdue per mail")
|
||||
return
|
||||
}
|
||||
|
||||
err := cron.Schedule("* * * * *", func() {
|
||||
s := db.NewSession()
|
||||
defer s.Close()
|
||||
@@ -146,6 +137,28 @@ func RegisterOverdueReminderCron() {
|
||||
return
|
||||
}
|
||||
|
||||
// Dispatch webhook events, deduplicated by task ID across all users
|
||||
dispatchedTasks := make(map[int64]bool)
|
||||
for _, ut := range uts {
|
||||
for _, t := range ut.tasks {
|
||||
if dispatchedTasks[t.ID] {
|
||||
continue
|
||||
}
|
||||
dispatchedTasks[t.ID] = true
|
||||
err = events.Dispatch(&TaskOverdueEvent{
|
||||
Task: t,
|
||||
Project: projects[t.ProjectID],
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorf("[Undone Overdue Tasks Reminder] Could not dispatch overdue event for task %d: %s", t.ID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !config.ServiceEnableEmailReminders.GetBool() || !config.MailerEnabled.GetBool() {
|
||||
return
|
||||
}
|
||||
|
||||
for _, ut := range uts {
|
||||
var n notifications.Notification = &UndoneTasksOverdueNotification{
|
||||
User: ut.user,
|
||||
@@ -173,25 +186,6 @@ func RegisterOverdueReminderCron() {
|
||||
|
||||
log.Debugf("[Undone Overdue Tasks Reminder] Sent reminder email for %d tasks to user %d", len(ut.tasks), ut.user.ID)
|
||||
}
|
||||
|
||||
// Dispatch webhook events, deduplicated by task ID across all users
|
||||
dispatchedTasks := make(map[int64]bool)
|
||||
for _, ut := range uts {
|
||||
for _, t := range ut.tasks {
|
||||
if dispatchedTasks[t.ID] {
|
||||
continue
|
||||
}
|
||||
dispatchedTasks[t.ID] = true
|
||||
err = events.Dispatch(&TaskOverdueEvent{
|
||||
Task: t,
|
||||
Project: projects[t.ProjectID],
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorf("[Undone Overdue Tasks Reminder] Could not dispatch overdue event for task %d: %s", t.ID, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("Could not register undone overdue tasks reminder cron: %s", err)
|
||||
|
||||
@@ -341,15 +341,6 @@ func getTasksWithRemindersDueAndTheirUsers(s *xorm.Session, now time.Time) (remi
|
||||
// RegisterReminderCron registers a cron function which runs every minute to check if any reminders are due the
|
||||
// next minute to send emails.
|
||||
func RegisterReminderCron() {
|
||||
if !config.ServiceEnableEmailReminders.GetBool() {
|
||||
return
|
||||
}
|
||||
|
||||
if !config.MailerEnabled.GetBool() {
|
||||
log.Info("Mailer is disabled, not sending reminders per mail")
|
||||
return
|
||||
}
|
||||
|
||||
tz := config.GetTimeZone()
|
||||
|
||||
log.Debugf("[Task Reminder Cron] Timezone is %s", tz)
|
||||
@@ -371,16 +362,6 @@ func RegisterReminderCron() {
|
||||
|
||||
log.Debugf("[Task Reminder Cron] Sending %d reminders", len(reminders))
|
||||
|
||||
for _, n := range reminders {
|
||||
err = notifications.Notify(n.User, n)
|
||||
if err != nil {
|
||||
log.Errorf("[Task Reminder Cron] Could not notify user %d: %s", n.User.ID, err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Debugf("[Task Reminder Cron] Sent reminder email for task %d to user %d", n.Task.ID, n.User.ID)
|
||||
}
|
||||
|
||||
// Dispatch webhook events, deduplicated by task ID
|
||||
dispatchedTasks := make(map[int64]bool)
|
||||
for _, n := range reminders {
|
||||
@@ -394,8 +375,21 @@ func RegisterReminderCron() {
|
||||
})
|
||||
if err != nil {
|
||||
log.Errorf("[Task Reminder Cron] Could not dispatch reminder event for task %d: %s", n.Task.ID, err)
|
||||
}
|
||||
}
|
||||
|
||||
if !config.ServiceEnableEmailReminders.GetBool() || !config.MailerEnabled.GetBool() {
|
||||
return
|
||||
}
|
||||
|
||||
for _, n := range reminders {
|
||||
err = notifications.Notify(n.User, n)
|
||||
if err != nil {
|
||||
log.Errorf("[Task Reminder Cron] Could not notify user %d: %s", n.User.ID, err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Debugf("[Task Reminder Cron] Sent reminder email for task %d to user %d", n.Task.ID, n.User.ID)
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user