Files
ttstd-infinite-canvas/backend/internal/repository/workbench.go
2026-10-13 22:44:31 +08:00

139 lines
4.3 KiB
Go

package repository
import (
"yingce/backend/internal/model"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
func (r *Repository) WorkbenchTools(kind string, enabledOnly bool) ([]model.WorkbenchTool, error) {
var items []model.WorkbenchTool
query := r.db.Model(&model.WorkbenchTool{})
if kind != "" {
query = query.Where("kind = ?", kind)
}
if enabledOnly {
query = query.Where("enabled = ?", true)
}
err := query.Order("kind asc, sort_order asc, name asc, id asc").Find(&items).Error
return items, err
}
func (r *Repository) WorkbenchTool(id string) (*model.WorkbenchTool, error) {
var item model.WorkbenchTool
if err := r.db.First(&item, "id = ?", id).Error; err != nil {
return nil, err
}
return &item, nil
}
func (r *Repository) CreateWorkbenchTool(item *model.WorkbenchTool) error {
return r.db.Create(item).Error
}
func (r *Repository) SaveWorkbenchTool(item *model.WorkbenchTool) error { return r.db.Save(item).Error }
func (r *Repository) CreateWorkbenchToolIfMissing(item *model.WorkbenchTool) error {
return r.db.Clauses(clause.OnConflict{DoNothing: true}).Create(item).Error
}
func (r *Repository) CreateWorkbenchPresetIfMissing(item *model.WorkbenchPreset) error {
return r.db.Clauses(clause.OnConflict{DoNothing: true}).Create(item).Error
}
func (r *Repository) SaveWorkbenchToolWithPresets(item *model.WorkbenchTool, presets *[]model.WorkbenchPreset, create bool) error {
return r.db.Transaction(func(tx *gorm.DB) error {
var err error
if create {
err = tx.Create(item).Error
} else {
err = tx.Save(item).Error
}
if err != nil || presets == nil {
return err
}
ids := make([]string, 0, len(*presets))
for index := range *presets {
preset := &(*presets)[index]
ids = append(ids, preset.ID)
if err := tx.Save(preset).Error; err != nil {
return err
}
}
// Omitted presets remain available to task history but leave the public catalog.
query := tx.Model(&model.WorkbenchPreset{}).Where("tool_id = ? AND enabled = ?", item.ID, true)
if len(ids) > 0 {
query = query.Where("id NOT IN ?", ids)
}
return query.Updates(map[string]any{"enabled": false, "updated_by": item.UpdatedBy, "updated_at": item.UpdatedAt, "version": gorm.Expr("version + 1")}).Error
})
}
func (r *Repository) WorkbenchPresets(toolID string, enabledOnly bool) ([]model.WorkbenchPreset, error) {
var items []model.WorkbenchPreset
query := r.db.Model(&model.WorkbenchPreset{})
if toolID != "" {
query = query.Where("tool_id = ?", toolID)
}
if enabledOnly {
query = query.Where("enabled = ?", true)
}
err := query.Order("sort_order asc, name asc, id asc").Find(&items).Error
return items, err
}
func (r *Repository) WorkbenchPreset(id string) (*model.WorkbenchPreset, error) {
var item model.WorkbenchPreset
if err := r.db.First(&item, "id = ?", id).Error; err != nil {
return nil, err
}
return &item, nil
}
func (r *Repository) CreateWorkbenchPreset(item *model.WorkbenchPreset) error {
return r.db.Create(item).Error
}
func (r *Repository) SaveWorkbenchPreset(item *model.WorkbenchPreset) error {
return r.db.Save(item).Error
}
func (r *Repository) WorkbenchToolAndPreset(toolID, presetID string, publishedOnly bool) (*model.WorkbenchTool, *model.WorkbenchPreset, error) {
var tool model.WorkbenchTool
query := r.db.Where("id = ?", toolID)
if publishedOnly {
query = query.Where("enabled = ?", true)
}
if err := query.First(&tool).Error; err != nil {
return nil, nil, err
}
if presetID == "" {
return &tool, nil, nil
}
var preset model.WorkbenchPreset
query = r.db.Where("id = ? AND tool_id = ?", presetID, toolID)
if publishedOnly {
query = query.Where("enabled = ?", true)
}
if err := query.First(&preset).Error; err != nil {
return nil, nil, err
}
return &tool, &preset, nil
}
func (r *Repository) WorkbenchEnabledPresetsForTools(toolIDs []string) (map[string][]model.WorkbenchPreset, error) {
result := make(map[string][]model.WorkbenchPreset, len(toolIDs))
if len(toolIDs) == 0 {
return result, nil
}
var presets []model.WorkbenchPreset
if err := r.db.Where("tool_id IN ? AND enabled = ?", toolIDs, true).Order("sort_order asc, name asc, id asc").Find(&presets).Error; err != nil {
return nil, err
}
for _, preset := range presets {
result[preset.ToolID] = append(result[preset.ToolID], preset)
}
return result, nil
}
var _ = gorm.ErrRecordNotFound