From 2188c7a79dd3ecb454a10e33042ee2dd6fc24cc7 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 24 Feb 2026 15:33:11 +0100 Subject: [PATCH] fix: add missing Commit() to event listeners and cron jobs With db.NewSession() now starting real transactions, all sessions that do writes must explicitly commit. These listeners and cron jobs were previously relying on auto-commit mode where each SQL statement was committed immediately. Without explicit Commit(), the writes are silently rolled back on Close(), and the held write locks cause "database is locked" errors for subsequent requests on SQLite. --- pkg/models/listeners.go | 23 ++++++++++++++++------- pkg/models/task_overdue_reminder.go | 4 ++++ pkg/models/task_reminder.go | 4 ++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/pkg/models/listeners.go b/pkg/models/listeners.go index 7aea8b152..a3674b36e 100644 --- a/pkg/models/listeners.go +++ b/pkg/models/listeners.go @@ -232,7 +232,7 @@ func (s *SendTaskCommentNotification) Handle(msg *message.Message) (err error) { } } - return + return sess.Commit() } // HandleTaskCommentEditMentions represents a listener @@ -262,7 +262,10 @@ func (s *HandleTaskCommentEditMentions) Handle(msg *message.Message) (err error) Mentioned: true, } _, err = notifyMentionedUsers(sess, event.Task, event.Comment.Comment, n) - return err + if err != nil { + return err + } + return sess.Commit() } // SendTaskAssignedNotification represents a listener @@ -323,7 +326,7 @@ func (s *SendTaskAssignedNotification) Handle(msg *message.Message) (err error) notifiedUsers[subscriber.UserID] = true } - return nil + return sess.Commit() } // SendTaskDeletedNotification represents a listener @@ -374,7 +377,7 @@ func (s *SendTaskDeletedNotification) Handle(msg *message.Message) (err error) { } } - return nil + return sess.Commit() } // HandleTaskCreateMentions represents a listener @@ -403,7 +406,10 @@ func (s *HandleTaskCreateMentions) Handle(msg *message.Message) (err error) { IsNew: true, } _, err = notifyMentionedUsers(sess, event.Task, event.Task.Description, n) - return err + if err != nil { + return err + } + return sess.Commit() } // HandleTaskUpdatedMentions represents a listener @@ -433,7 +439,10 @@ func (s *HandleTaskUpdatedMentions) Handle(msg *message.Message) (err error) { } _, err = notifyMentionedUsers(sess, event.Task, event.Task.Description, n) - return err + if err != nil { + return err + } + return sess.Commit() } // HandleTaskUpdateLastUpdated represents a listener @@ -832,7 +841,7 @@ func (s *SendProjectCreatedNotification) Handle(msg *message.Message) (err error } } - return nil + return sess.Commit() } // WebhookListener represents a listener diff --git a/pkg/models/task_overdue_reminder.go b/pkg/models/task_overdue_reminder.go index 96399cb30..2b91f1741 100644 --- a/pkg/models/task_overdue_reminder.go +++ b/pkg/models/task_overdue_reminder.go @@ -186,6 +186,10 @@ func RegisterOverdueReminderCron() { log.Debugf("[Undone Overdue Tasks Reminder] Sent reminder email for %d tasks to user %d", len(ut.tasks), ut.user.ID) } + + if err := s.Commit(); err != nil { + log.Errorf("[Undone Overdue Tasks Reminder] Could not commit: %s", err) + } }) if err != nil { log.Fatalf("Could not register undone overdue tasks reminder cron: %s", err) diff --git a/pkg/models/task_reminder.go b/pkg/models/task_reminder.go index def29d04f..2257600ea 100644 --- a/pkg/models/task_reminder.go +++ b/pkg/models/task_reminder.go @@ -391,6 +391,10 @@ func RegisterReminderCron() { log.Debugf("[Task Reminder Cron] Sent reminder email for task %d to user %d", n.Task.ID, n.User.ID) } + + if err := s.Commit(); err != nil { + log.Errorf("[Task Reminder Cron] Could not commit: %s", err) + } }) if err != nil { log.Fatalf("Could not register reminder cron: %s", err)