1
0

fix(typesense): make sure task positions are recreated properly when updating them

Related https://community.vikunja.io/t/version-0-24-0-internal-server-error-breaking-change/2558
Related https://github.com/go-vikunja/vikunja/issues/317

(cherry picked from commit edf206aba61678ecc15db981ae6caf99d80c8010)
This commit is contained in:
kolaente 2024-09-19 15:57:18 +02:00
parent 15cde08db6
commit 25c8476883
No known key found for this signature in database
GPG Key ID: F40E70337AB24C9B
2 changed files with 60 additions and 53 deletions

View File

@ -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

View File

@ -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,10 +483,20 @@ func RegisterAddTaskToFilterViewCron() {
builder.Eq{"task_id": taskID},
builder.Eq{"project_view_id": view.ID},
))
taskIDsToRemove = append(taskIDsToRemove, taskID)
}
}
}
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 {
@ -507,8 +520,27 @@ func RegisterAddTaskToFilterViewCron() {
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.Fatalf("Could register add task to filter view cron: %s", err)
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
}
}
}