diff --git a/pkg/models/listeners.go b/pkg/models/listeners.go index 7c7735eb4..1da6bc0d9 100644 --- a/pkg/models/listeners.go +++ b/pkg/models/listeners.go @@ -539,36 +539,6 @@ func (l *AddTaskToTypesense) Handle(msg *message.Message) (err error) { return reindexTasksInTypesense(s, task) } -func getPositionsForTask(s *xorm.Session, event *TaskCreatedEvent) (positionsMap map[int64][]*TaskPositionWithView, err error) { - positions := []*TaskPositionWithView{} - err = s. - Table("project_views"). - Where("project_views.project_id = ?", event.Task.ProjectID). - Join("LEFT", "task_positions", "project_views.id = task_positions.project_view_id AND task_positions.task_id = ?", event.Task.ID). - Find(&positions) - if err != nil { - return - } - - positionsMap = make(map[int64][]*TaskPositionWithView, 1) - positionsMap[event.Task.ID] = positions - return -} - -func getBucketsForTask(s *xorm.Session, event *TaskCreatedEvent) (bucketsMap map[int64][]*TaskBucket, err error) { - buckets := []*TaskBucket{} - err = s. - Where("task_id = ?", event.Task.ID). - Find(&buckets) - if err != nil { - return - } - - bucketsMap = make(map[int64][]*TaskBucket, 1) - bucketsMap[event.Task.ID] = buckets - return -} - // UpdateTaskInTypesense represents a listener type UpdateTaskInTypesense struct { } @@ -757,6 +727,11 @@ func (l *UpdateTaskInSavedFilterViews) Handle(msg *message.Message) (err error) if err != nil { return } + + task := make(map[int64]*Task, 1) + task[event.Task.ID] = event.Task // Will be filled with all data by the Typesense connector + + return reindexTasksInTypesense(s, task) } return nil diff --git a/pkg/models/saved_filters.go b/pkg/models/saved_filters.go index 0222ce260..0ed6bfe0e 100644 --- a/pkg/models/saved_filters.go +++ b/pkg/models/saved_filters.go @@ -19,6 +19,8 @@ package models import ( "time" + "code.vikunja.io/api/pkg/config" + "code.vikunja.io/api/pkg/cron" "code.vikunja.io/api/pkg/db" "code.vikunja.io/api/pkg/log" @@ -396,6 +398,7 @@ func RegisterAddTaskToFilterViewCron() { newTaskBuckets := []*TaskBucket{} newTaskPositions := []*TaskPosition{} deleteCond := []builder.Cond{} + taskIDsToRemove := []int64{} for _, view := range kanbanFilterViews { filterID := getSavedFilterIDFromProjectID(view.ProjectID) filter, exists := filters[filterID] @@ -480,35 +483,64 @@ func RegisterAddTaskToFilterViewCron() { builder.Eq{"task_id": taskID}, builder.Eq{"project_view_id": view.ID}, )) + taskIDsToRemove = append(taskIDsToRemove, taskID) } } } - if len(newTaskBuckets) > 0 { - _, err = s.Insert(newTaskBuckets) - if err != nil { - log.Errorf("%sError inserting task buckets: %s", logPrefix, err) - } - } - if len(newTaskPositions) > 0 { - _, err = s.Insert(newTaskPositions) - if err != nil { - log.Errorf("%sError inserting task positions: %s", logPrefix, err) - } - } - - if len(deleteCond) > 0 { - _, err = s.Where(builder.Or(deleteCond...)).Delete(&TaskBucket{}) - if err != nil { - log.Errorf("%sError deleting task buckets: %s", logPrefix, err) - } - _, err = s.Where(builder.Or(deleteCond...)).Delete(&TaskPosition{}) - if err != nil { - log.Errorf("%sError deleting task positions: %s", logPrefix, err) - } - } + upsertRelatedTaskProperties(s, logPrefix, newTaskBuckets, newTaskPositions, deleteCond, taskIDsToRemove) }) if err != nil { log.Fatalf("Could register add task to filter view cron: %s", err) } } + +func upsertRelatedTaskProperties(s *xorm.Session, logPrefix string, newTaskBuckets []*TaskBucket, newTaskPositions []*TaskPosition, deleteCond []builder.Cond, taskIDsToRemove []int64) { + var err error + if len(newTaskBuckets) > 0 { + _, err = s.Insert(newTaskBuckets) + if err != nil { + log.Errorf("%sError inserting task buckets: %s", logPrefix, err) + } + } + if len(newTaskPositions) > 0 { + _, err = s.Insert(newTaskPositions) + if err != nil { + log.Errorf("%sError inserting task positions: %s", logPrefix, err) + } + } + + if len(deleteCond) > 0 { + _, err = s.Where(builder.Or(deleteCond...)).Delete(&TaskBucket{}) + if err != nil { + log.Errorf("%sError deleting task buckets: %s", logPrefix, err) + } + _, err = s.Where(builder.Or(deleteCond...)).Delete(&TaskPosition{}) + if err != nil { + log.Errorf("%sError deleting task positions: %s", logPrefix, err) + } + } + + if config.TypesenseEnabled.GetBool() && (len(newTaskPositions) > 0 || len(taskIDsToRemove) > 0) { + taskIDs := []int64{} + for _, position := range newTaskPositions { + taskIDs = append(taskIDs, position.TaskID) + } + taskIDs = append(taskIDs, taskIDsToRemove...) + tasks, err := GetTasksSimpleByIDs(s, taskIDs) + if err != nil { + log.Errorf("%sError fetching tasks: %s", logPrefix, err) + return + } + taskMap := make(map[int64]*Task) + for _, t := range tasks { + taskMap[t.ID] = t + } + + err = reindexTasksInTypesense(s, taskMap) + if err != nil { + log.Errorf("%sError reindexing tasks into Typesense: %s", logPrefix, err) + return + } + } +}