From 924eef58d123855de0a36d1890e52c76e9aa7ccb Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 2 Mar 2026 09:18:49 +0100 Subject: [PATCH] fix(events): dispatch pending events in CalDAV handlers after commit CalDAV handlers manage their own database sessions. Now that model methods use DispatchOnCommit, the CalDAV handlers must call DispatchPending after commit and CleanupPending on rollback. Refs #2315 --- pkg/routes/caldav/listStorageProvider.go | 26 +++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/pkg/routes/caldav/listStorageProvider.go b/pkg/routes/caldav/listStorageProvider.go index 6d6984600..b9d97c92b 100644 --- a/pkg/routes/caldav/listStorageProvider.go +++ b/pkg/routes/caldav/listStorageProvider.go @@ -24,6 +24,7 @@ import ( "code.vikunja.io/api/pkg/caldav" "code.vikunja.io/api/pkg/db" + "code.vikunja.io/api/pkg/events" "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/models" user2 "code.vikunja.io/api/pkg/user" @@ -311,6 +312,7 @@ func (vcls *VikunjaCaldavProjectStorage) CreateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Failed to create task in CreateResource: %v, task: %+v", err, vTask) _ = s.Rollback() + events.CleanupPending(s) return nil, err } @@ -319,6 +321,7 @@ func (vcls *VikunjaCaldavProjectStorage) CreateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Failed to persist labels in CreateResource: %v, labels: %+v", err, vTask.Labels) _ = s.Rollback() + events.CleanupPending(s) return nil, err } @@ -327,14 +330,18 @@ func (vcls *VikunjaCaldavProjectStorage) CreateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Failed to persist relations in CreateResource: %v, relations: %+v", err, vTask.RelatedTasks) _ = s.Rollback() + events.CleanupPending(s) return nil, err } if err := s.Commit(); err != nil { log.Errorf("[CALDAV] Failed to commit transaction in CreateResource: %v", err) + events.CleanupPending(s) return nil, err } + events.DispatchPending(s) + // Build up the proper response rr := VikunjaProjectResourceAdapter{ project: vcls.project, @@ -369,11 +376,13 @@ func (vcls *VikunjaCaldavProjectStorage) UpdateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Permission check failed in UpdateResource for user %s, task %d: %v", vcls.user.Username, vcls.task.ID, err) _ = s.Rollback() + events.CleanupPending(s) return nil, err } if !canUpdate { log.Warningf("[CALDAV] User %s does not have permission to update task %d", vcls.user.Username, vcls.task.ID) _ = s.Rollback() + events.CleanupPending(s) return nil, errs.ForbiddenError } @@ -382,6 +391,7 @@ func (vcls *VikunjaCaldavProjectStorage) UpdateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Failed to update task in UpdateResource: %v, task: %+v", err, vTask) _ = s.Rollback() + events.CleanupPending(s) return nil, err } @@ -389,6 +399,7 @@ func (vcls *VikunjaCaldavProjectStorage) UpdateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Failed to persist labels in UpdateResource: %v, labels: %+v", err, vTask.Labels) _ = s.Rollback() + events.CleanupPending(s) return nil, err } @@ -396,14 +407,18 @@ func (vcls *VikunjaCaldavProjectStorage) UpdateResource(rpath, content string) ( if err != nil { log.Errorf("[CALDAV] Failed to persist relations in UpdateResource: %v, relations: %+v", err, vTask.RelatedTasks) _ = s.Rollback() + events.CleanupPending(s) return nil, err } if err := s.Commit(); err != nil { log.Errorf("[CALDAV] Failed to commit transaction in UpdateResource: %v", err) + events.CleanupPending(s) return nil, err } + events.DispatchPending(s) + // Build up the proper response rr := VikunjaProjectResourceAdapter{ project: vcls.project, @@ -423,9 +438,11 @@ func (vcls *VikunjaCaldavProjectStorage) DeleteResource(_ string) error { canDelete, err := vcls.task.CanDelete(s, vcls.user) if err != nil { _ = s.Rollback() + events.CleanupPending(s) return err } if !canDelete { + events.CleanupPending(s) return errs.ForbiddenError } @@ -433,10 +450,17 @@ func (vcls *VikunjaCaldavProjectStorage) DeleteResource(_ string) error { err = vcls.task.Delete(s, vcls.user) if err != nil { _ = s.Rollback() + events.CleanupPending(s) return err } - return s.Commit() + err = s.Commit() + if err != nil { + events.CleanupPending(s) + return err + } + + events.DispatchPending(s) } return nil