From 471d0fcd4a386359962435d8222e42af5760c895 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 11 Jul 2024 12:07:48 +0200 Subject: [PATCH] fix(typesense): reindex tasks when their position changed --- pkg/models/events.go | 10 ++++++++++ pkg/models/listeners.go | 36 ++++++++++++++++++++++++++++++++++++ pkg/models/task_position.go | 7 ++++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/pkg/models/events.go b/pkg/models/events.go index 5fd75bf5d..de0427855 100644 --- a/pkg/models/events.go +++ b/pkg/models/events.go @@ -166,6 +166,16 @@ func (t *TaskRelationDeletedEvent) Name() string { return "task.relation.deleted" } +// TaskPositionsRecalculatedEvent represents a TaskPositionsRecalculatedEvent event +type TaskPositionsRecalculatedEvent struct { + NewTaskPositions []*TaskPosition +} + +// Name defines the name for TaskPositionsRecalculatedEvent +func (t *TaskPositionsRecalculatedEvent) Name() string { + return "task.positions.recalculated" +} + //////////////////// // Project Events // //////////////////// diff --git a/pkg/models/listeners.go b/pkg/models/listeners.go index 00ade1a3a..bb6352e69 100644 --- a/pkg/models/listeners.go +++ b/pkg/models/listeners.go @@ -70,6 +70,7 @@ func RegisterListeners() { events.RegisterListener((&TaskDeletedEvent{}).Name(), &RemoveTaskFromTypesense{}) events.RegisterListener((&TaskCreatedEvent{}).Name(), &AddTaskToTypesense{}) events.RegisterListener((&TaskUpdatedEvent{}).Name(), &UpdateTaskInTypesense{}) + events.RegisterListener((&TaskPositionsRecalculatedEvent{}).Name(), &UpdateTaskPositionsInTypesense{}) } if config.WebhooksEnabled.GetBool() { RegisterEventForWebhook(&TaskCreatedEvent{}) @@ -607,6 +608,41 @@ func (l *UpdateTaskInTypesense) Handle(msg *message.Message) (err error) { return reindexTasksInTypesense(s, task) } +// UpdateTaskPositionsInTypesense represents a listener +type UpdateTaskPositionsInTypesense struct { +} + +// Name defines the name for the UpdateTaskPositionsInTypesense listener +func (l *UpdateTaskPositionsInTypesense) Name() string { + return "typesense.task.position.update" +} + +// Handle is executed when the event UpdateTaskPositionsInTypesense listens on is fired +func (l *UpdateTaskPositionsInTypesense) Handle(msg *message.Message) (err error) { + event := &TaskPositionsRecalculatedEvent{} + err = json.Unmarshal(msg.Payload, event) + if err != nil { + return err + } + + taskIDs := []int64{} + for _, position := range event.NewTaskPositions { + taskIDs = append(taskIDs, position.TaskID) + } + + s := db.NewSession() + defer s.Close() + + tasks, err := GetTasksSimpleByIDs(s, taskIDs) + + taskMap := make(map[int64]*Task, 1) + for _, task := range tasks { + taskMap[task.ID] = task + } + + return reindexTasksInTypesense(s, taskMap) +} + // IncreaseAttachmentCounter represents a listener type IncreaseAttachmentCounter struct { } diff --git a/pkg/models/task_position.go b/pkg/models/task_position.go index 92383cf66..888973f77 100644 --- a/pkg/models/task_position.go +++ b/pkg/models/task_position.go @@ -166,7 +166,12 @@ func RecalculateTaskPositions(s *xorm.Session, view *ProjectView, a web.Auth) (e } _, err = s.Insert(newPositions) - return + if err != nil { + return + } + return events.Dispatch(&TaskPositionsRecalculatedEvent{ + NewTaskPositions: newPositions, + }) } func getPositionsForView(s *xorm.Session, view *ProjectView) (positions []*TaskPosition, err error) {