package handler import ( "encoding/json" "errors" "net/http" "soul-api/internal/database" "soul-api/internal/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) const mbtiAvatarsConfigKey = "mbti_avatars" const mbtiAvatarsDescription = "MBTI 16型人格头像映射" // AdminMbtiAvatarsGet GET /api/admin/mbti-avatars 读取 MBTI 头像映射(system_config.mbti_avatars) func AdminMbtiAvatarsGet(c *gin.Context) { db := database.DB() var row model.SystemConfig err := db.Where("config_key = ?", mbtiAvatarsConfigKey).First(&row).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.JSON(http.StatusOK, gin.H{"success": true, "avatars": map[string]string{}}) return } c.JSON(http.StatusOK, gin.H{"success": false, "error": "读取配置失败: " + err.Error()}) return } out := make(map[string]string) if len(row.ConfigValue) > 0 { if uerr := json.Unmarshal(row.ConfigValue, &out); uerr != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": "配置 JSON 无效: " + uerr.Error()}) return } } c.JSON(http.StatusOK, gin.H{"success": true, "avatars": out}) } // AdminMbtiAvatarsPost POST /api/admin/mbti-avatars 保存 MBTI 头像映射(upsert) func AdminMbtiAvatarsPost(c *gin.Context) { var body struct { Avatars map[string]string `json:"avatars"` } if err := c.ShouldBindJSON(&body); err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": "请求体无效"}) return } avatars := body.Avatars if avatars == nil { avatars = map[string]string{} } valBytes, err := json.Marshal(avatars) if err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": "序列化失败: " + err.Error()}) return } db := database.DB() desc := mbtiAvatarsDescription var row model.SystemConfig err = db.Where("config_key = ?", mbtiAvatarsConfigKey).First(&row).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { row = model.SystemConfig{ ConfigKey: mbtiAvatarsConfigKey, ConfigValue: valBytes, Description: &desc, } if cerr := db.Create(&row).Error; cerr != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": "保存失败: " + cerr.Error()}) return } } else { c.JSON(http.StatusOK, gin.H{"success": false, "error": "查询配置失败: " + err.Error()}) return } } else { row.ConfigValue = valBytes row.Description = &desc if serr := db.Save(&row).Error; serr != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": "保存失败: " + serr.Error()}) return } } _mbtiAvatarCacheTs = 0 c.JSON(http.StatusOK, gin.H{"success": true, "message": "MBTI 头像映射已保存"}) }