Files
admin e6956aa001 Initial commit: TaskPool React panel
- React frontend with route-level code splitting
- Backend rebranded from Baihu to TaskPool
- DB brand migration script and local compatibility
2026-07-26 08:43:52 +08:00

142 lines
3.9 KiB
Go

package relation
import (
"strings"
"github.com/engigu/taskpool/internal/database"
"github.com/engigu/taskpool/internal/models"
"github.com/rs/xid"
)
type DataRelationService struct{}
var DataRelation = &DataRelationService{}
// SaveTags 保存带有 Storage (文本标签) 的关系映射
func (s *DataRelationService) SaveTags(dataID string, relType string, tagsStr string) {
database.DB.Where("data_id = ? AND type = ?", dataID, relType).Delete(&models.DataRelation{})
if tagsStr == "" {
return
}
tags := strings.Split(tagsStr, ",")
for _, tag := range tags {
tag = strings.TrimSpace(tag)
if tag == "" {
continue
}
var storage models.DataStorage
res := database.DB.Where("type = ? AND name = ?", relType, tag).Limit(1).Find(&storage)
if res.RowsAffected == 0 {
storage = models.DataStorage{
ID: xid.New().String(),
Type: relType,
Name: tag,
CreatedAt: models.Now(),
UpdatedAt: models.Now(),
}
database.DB.Create(&storage)
}
relation := models.DataRelation{
ID: xid.New().String(),
DataID: dataID,
RelateID: storage.ID,
Type: relType,
CreatedAt: models.Now(),
UpdatedAt: models.Now(),
}
database.DB.Create(&relation)
}
}
// LoadTags 加载带有 Storage (文本标签) 的映射,返回 map[DataID][]TagName
func (s *DataRelationService) LoadTags(dataIDs []string, relType string) map[string][]string {
if len(dataIDs) == 0 {
return nil
}
var relations []models.DataRelation
database.DB.Where("data_id IN ? AND type = ?", dataIDs, relType).Find(&relations)
if len(relations) == 0 {
return nil
}
var relateIDs []string
for _, r := range relations {
relateIDs = append(relateIDs, r.RelateID)
}
var storages []models.DataStorage
database.DB.Where("id IN ?", relateIDs).Find(&storages)
storageMap := make(map[string]string)
for _, storage := range storages {
storageMap[storage.ID] = storage.Name
}
resultMap := make(map[string][]string)
for _, r := range relations {
if name, ok := storageMap[r.RelateID]; ok {
resultMap[r.DataID] = append(resultMap[r.DataID], name)
}
}
return resultMap
}
// SaveRelations 保存单纯的关系映射 (例如 ID关联)
func (s *DataRelationService) SaveRelations(dataID string, relType string, relateIDsStr string) {
database.DB.Where("data_id = ? AND type = ?", dataID, relType).Delete(&models.DataRelation{})
if relateIDsStr == "" {
return
}
ids := strings.Split(relateIDsStr, ",")
for _, relateID := range ids {
relateID = strings.TrimSpace(relateID)
if relateID == "" {
continue
}
relation := models.DataRelation{
ID: xid.New().String(),
DataID: dataID,
RelateID: relateID,
Type: relType,
CreatedAt: models.Now(),
UpdatedAt: models.Now(),
}
database.DB.Create(&relation)
}
}
// LoadRelations 加载单纯的关系映射,返回 map[DataID][]RelateID
func (s *DataRelationService) LoadRelations(dataIDs []string, relType string) map[string][]string {
if len(dataIDs) == 0 {
return nil
}
var relations []models.DataRelation
database.DB.Where("data_id IN ? AND type = ?", dataIDs, relType).Find(&relations)
resultMap := make(map[string][]string)
for _, r := range relations {
resultMap[r.DataID] = append(resultMap[r.DataID], r.RelateID)
}
return resultMap
}
// CleanRelations 删除某种类型的所有关联映射
func (s *DataRelationService) CleanRelations(dataID string, relType string) {
database.DB.Where("data_id = ? AND type = ?", dataID, relType).Delete(&models.DataRelation{})
}
// GetAllTags 获取全局范围内某种类型的所有的 Tag Name
func (s *DataRelationService) GetAllTags(relType string) ([]string, error) {
var storages []models.DataStorage
err := database.DB.Where("type = ?", relType).Find(&storages).Error
if err != nil {
return nil, err
}
var tags []string
for _, s := range storages {
tags = append(tags, s.Name)
}
return tags, nil
}