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:
parent
15cde08db6
commit
25c8476883
@ -539,36 +539,6 @@ func (l *AddTaskToTypesense) Handle(msg *message.Message) (err error) {
|
|||||||
return reindexTasksInTypesense(s, task)
|
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
|
// UpdateTaskInTypesense represents a listener
|
||||||
type UpdateTaskInTypesense struct {
|
type UpdateTaskInTypesense struct {
|
||||||
}
|
}
|
||||||
@ -757,6 +727,11 @@ func (l *UpdateTaskInSavedFilterViews) Handle(msg *message.Message) (err error)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
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
|
return nil
|
||||||
|
@ -19,6 +19,8 @@ package models
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"code.vikunja.io/api/pkg/config"
|
||||||
|
|
||||||
"code.vikunja.io/api/pkg/cron"
|
"code.vikunja.io/api/pkg/cron"
|
||||||
"code.vikunja.io/api/pkg/db"
|
"code.vikunja.io/api/pkg/db"
|
||||||
"code.vikunja.io/api/pkg/log"
|
"code.vikunja.io/api/pkg/log"
|
||||||
@ -396,6 +398,7 @@ func RegisterAddTaskToFilterViewCron() {
|
|||||||
newTaskBuckets := []*TaskBucket{}
|
newTaskBuckets := []*TaskBucket{}
|
||||||
newTaskPositions := []*TaskPosition{}
|
newTaskPositions := []*TaskPosition{}
|
||||||
deleteCond := []builder.Cond{}
|
deleteCond := []builder.Cond{}
|
||||||
|
taskIDsToRemove := []int64{}
|
||||||
for _, view := range kanbanFilterViews {
|
for _, view := range kanbanFilterViews {
|
||||||
filterID := getSavedFilterIDFromProjectID(view.ProjectID)
|
filterID := getSavedFilterIDFromProjectID(view.ProjectID)
|
||||||
filter, exists := filters[filterID]
|
filter, exists := filters[filterID]
|
||||||
@ -480,35 +483,64 @@ func RegisterAddTaskToFilterViewCron() {
|
|||||||
builder.Eq{"task_id": taskID},
|
builder.Eq{"task_id": taskID},
|
||||||
builder.Eq{"project_view_id": view.ID},
|
builder.Eq{"project_view_id": view.ID},
|
||||||
))
|
))
|
||||||
|
taskIDsToRemove = append(taskIDsToRemove, taskID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(newTaskBuckets) > 0 {
|
upsertRelatedTaskProperties(s, logPrefix, newTaskBuckets, newTaskPositions, deleteCond, taskIDsToRemove)
|
||||||
_, 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 err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Could register add task to filter view cron: %s", err)
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user