package store import ( "context" "gorm.io/gorm" ) // Prompt 是一条受管系统提示词的某个版本。表名 sundynix_prompt,(key,version) 唯一。 // 平台级配置(非按 owner),由管理端维护:建版本 → 激活某版 → 控制面热下发各服务。 type Prompt struct { BaseModel Key string `gorm:"size:64;uniqueIndex:idx_prompt_kv;index"` // 受管 prompt 键,如 graph.extract Version int `gorm:"uniqueIndex:idx_prompt_kv"` // 该 key 下递增版本号 Content string `gorm:"type:text"` // 提示词正文 Active bool `gorm:"index"` // 是否为该 key 当前激活版(每 key 至多一条) Note string `gorm:"size:200"` // 版本说明 } func (Prompt) TableName() string { return "sundynix_prompt" } // ActivePrompts 返回全部激活版的 key→content(控制面下发用)。 func (p *Postgres) ActivePrompts(ctx context.Context) map[string]string { out := map[string]string{} if p.db == nil { return out } var rows []Prompt if err := p.db.WithContext(ctx).Where("active = ?", true).Find(&rows).Error; err != nil { return out } for _, r := range rows { out[r.Key] = r.Content } return out } // ListPrompts 返回全部 prompt 版本(按 key、version 排序,供管理端浏览/对比/回滚)。 func (p *Postgres) ListPrompts(ctx context.Context) ([]Prompt, error) { if p.db == nil { return nil, nil } var rows []Prompt err := p.db.WithContext(ctx).Order("key asc, version asc").Find(&rows).Error return rows, err } // CreatePromptVersion 为某 key 新建一个版本(version=该 key 现有最大+1,默认不激活),返回新版本号。 func (p *Postgres) CreatePromptVersion(ctx context.Context, key, content, note string) (int, error) { if p.db == nil { return 0, nil } var maxV struct{ V int } p.db.WithContext(ctx).Model(&Prompt{}).Select("coalesce(max(version),0) as v").Where("key = ?", key).Scan(&maxV) v := maxV.V + 1 row := Prompt{Key: key, Version: v, Content: content, Note: note, Active: false} if err := p.db.WithContext(ctx).Create(&row).Error; err != nil { return 0, err } return v, nil } // DeactivatePrompt 撤销某 key 的全部激活(控制面下发后该 key 回退到代码内置默认)。 func (p *Postgres) DeactivatePrompt(ctx context.Context, key string) error { if p.db == nil { return nil } return p.db.WithContext(ctx).Model(&Prompt{}).Where("key = ?", key).Update("active", false).Error } // ActivatePrompt 激活某 key 的指定版本(同 key 其它版本置非激活)。事务保证每 key 至多一个激活版。 func (p *Postgres) ActivatePrompt(ctx context.Context, key string, version int) error { if p.db == nil { return nil } return p.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { if err := tx.Model(&Prompt{}).Where("key = ?", key).Update("active", false).Error; err != nil { return err } return tx.Model(&Prompt{}).Where("key = ? AND version = ?", key, version).Update("active", true).Error }) }