Files
agent/backend/internal/tasks/service.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
}