feat(documents): rebuild project document workbench

This commit is contained in:
2026-07-24 12:16:02 +08:00
parent 366136cee9
commit 77beaebb30
73 changed files with 5867 additions and 1264 deletions

View File

@@ -63,9 +63,9 @@ func (s *Service) Assign(taskID uint, assigneeIdentity string) error {
})
}
// ShareObject 只允许显式分享 note/source并在同一事务中验证关联对象属于任务所在项目。
// ShareObject only allows an explicitly shared document from the task project.
func (s *Service) ShareObject(taskID uint, objectType string, objectID uint) error {
if objectType != "note" && objectType != "source" {
if objectType != "document" {
return errors.New("unsupported shared object type")
}
return s.database().Transaction(func(tx *gorm.DB) error {
@@ -73,7 +73,7 @@ func (s *Service) ShareObject(taskID uint, objectType string, objectID uint) err
if err != nil {
return err
}
if err := ensureSharedObjectInProject(tx, task.ProjectID, objectType, objectID); err != nil {
if err := ensureSharedObjectInProject(tx, task.ProjectID, objectID); err != nil {
return err
}
if err := tx.Create(&models.SaTaskShare{TaskID: taskID, ObjectType: objectType, ObjectID: objectID}).Error; err != nil {
@@ -193,7 +193,7 @@ func (s *Service) Update(ownerID uint, projectIdentity, taskIdentity string, inp
task.TagID = tagID
task.TagIdentity = tagIdentity
if targetProject.ID != currentProject.ID {
// 现有分享都在原项目边界内;移动后必须清空,避免旧项目 note/source 继续对被指派人可见。
// 现有分享都在原项目边界内;移动后必须清空,避免旧项目 document 继续对被指派人可见。
if err := tx.Where("task_id = ?", task.ID).Delete(&models.SaTaskShare{}).Error; err != nil {
return err
}
@@ -267,24 +267,13 @@ func utcOptionalTime(value *time.Time) *time.Time {
return &result
}
func ensureSharedObjectInProject(tx *gorm.DB, projectID uint, objectType string, objectID uint) error {
switch objectType {
case "note":
var count int64
if err := tx.Model(&models.SaNote{}).Where("id = ? AND project_id = ?", objectID, projectID).Count(&count).Error; err != nil {
return err
}
if count == 0 {
return errors.New("shared object not found in task project")
}
case "source":
var count int64
if err := tx.Model(&models.SaSource{}).Where("id = ? AND project_id = ?", objectID, projectID).Count(&count).Error; err != nil {
return err
}
if count == 0 {
return errors.New("shared object not found in task project")
}
func ensureSharedObjectInProject(tx *gorm.DB, projectID uint, objectID uint) error {
var count int64
if err := tx.Model(&models.SaDocument{}).Where("id = ? AND project_id = ?", objectID, projectID).Count(&count).Error; err != nil {
return err
}
if count == 0 {
return errors.New("shared object not found in task project")
}
return nil
}