feat: add task assignment sharing
This commit is contained in:
84
backend/internal/tasks/service.go
Normal file
84
backend/internal/tasks/service.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package tasks
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"senlinai-agent/backend/internal/domain"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
type LinkedObject struct {
|
||||
ObjectType string `json:"object_type"`
|
||||
ObjectID uint `json:"object_id"`
|
||||
}
|
||||
|
||||
func NewService(database *gorm.DB) *Service {
|
||||
return &Service{db: database}
|
||||
}
|
||||
|
||||
func (s *Service) Assign(taskID uint, assigneeID uint) error {
|
||||
return s.db.Transaction(func(tx *gorm.DB) error {
|
||||
var task domain.Task
|
||||
if err := tx.First(&task, taskID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if err := tx.Model(&task).Update("assignee_id", assigneeID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Create(&domain.ProjectEvent{
|
||||
ProjectID: task.ProjectID,
|
||||
ActorID: task.CreatedBy,
|
||||
EventType: "task_assigned",
|
||||
EntityType: "task",
|
||||
EntityID: task.ID,
|
||||
Summary: fmt.Sprintf("Task assigned to user %d", assigneeID),
|
||||
}).Error
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Service) ShareObject(taskID uint, objectType string, objectID uint) error {
|
||||
if objectType != "note" && objectType != "source" {
|
||||
return errors.New("unsupported shared object type")
|
||||
}
|
||||
return s.db.Transaction(func(tx *gorm.DB) error {
|
||||
var task domain.Task
|
||||
if err := tx.First(&task, taskID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if err := tx.Create(&domain.TaskShare{TaskID: taskID, ObjectType: objectType, ObjectID: objectID}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Create(&domain.ProjectEvent{
|
||||
ProjectID: task.ProjectID,
|
||||
ActorID: task.CreatedBy,
|
||||
EventType: "task_object_shared",
|
||||
EntityType: "task",
|
||||
EntityID: task.ID,
|
||||
Summary: fmt.Sprintf("Shared %s %d with task", objectType, objectID),
|
||||
}).Error
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Service) VisibleLinkedObjects(taskID uint, viewerID uint) ([]LinkedObject, error) {
|
||||
var task domain.Task
|
||||
if err := s.db.First(&task, taskID).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if task.AssigneeID == nil || *task.AssigneeID != viewerID {
|
||||
return []LinkedObject{}, nil
|
||||
}
|
||||
var shares []domain.TaskShare
|
||||
if err := s.db.Where("task_id = ?", taskID).Find(&shares).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
objects := make([]LinkedObject, 0, len(shares))
|
||||
for _, share := range shares {
|
||||
objects = append(objects, LinkedObject{ObjectType: share.ObjectType, ObjectID: share.ObjectID})
|
||||
}
|
||||
return objects, nil
|
||||
}
|
||||
Reference in New Issue
Block a user