85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
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
|
|
}
|