package service import ( "carrotskin/internal/model" "carrotskin/internal/repository" "errors" "fmt" "gorm.io/gorm" ) // CreateTexture 创建材质 func CreateTexture(db *gorm.DB, uploaderID int64, name, description, textureType, url, hash string, size int, isPublic, isSlim bool) (*model.Texture, error) { // 验证用户存在 if _, err := EnsureUserExists(uploaderID); err != nil { return nil, err } // 检查Hash是否已存在 existingTexture, err := repository.FindTextureByHash(hash) if err != nil { return nil, err } if existingTexture != nil { return nil, errors.New("该材质已存在") } // 转换材质类型 textureTypeEnum, err := parseTextureType(textureType) if err != nil { return nil, err } // 创建材质 texture := &model.Texture{ UploaderID: uploaderID, Name: name, Description: description, Type: textureTypeEnum, URL: url, Hash: hash, Size: size, IsPublic: isPublic, IsSlim: isSlim, Status: 1, DownloadCount: 0, FavoriteCount: 0, } if err := repository.CreateTexture(texture); err != nil { return nil, err } return texture, nil } // GetTextureByID 根据ID获取材质 func GetTextureByID(db *gorm.DB, id int64) (*model.Texture, error) { return EnsureTextureExists(id) } // GetUserTextures 获取用户上传的材质列表 func GetUserTextures(db *gorm.DB, uploaderID int64, page, pageSize int) ([]*model.Texture, int64, error) { page, pageSize = NormalizePagination(page, pageSize) return repository.FindTexturesByUploaderID(uploaderID, page, pageSize) } // SearchTextures 搜索材质 func SearchTextures(db *gorm.DB, keyword string, textureType model.TextureType, publicOnly bool, page, pageSize int) ([]*model.Texture, int64, error) { page, pageSize = NormalizePagination(page, pageSize) return repository.SearchTextures(keyword, textureType, publicOnly, page, pageSize) } // UpdateTexture 更新材质 func UpdateTexture(db *gorm.DB, textureID, uploaderID int64, name, description string, isPublic *bool) (*model.Texture, error) { // 获取材质并验证权限 if _, err := GetTextureWithPermissionCheck(textureID, uploaderID); err != nil { return nil, err } // 更新字段 updates := make(map[string]interface{}) if name != "" { updates["name"] = name } if description != "" { updates["description"] = description } if isPublic != nil { updates["is_public"] = *isPublic } if len(updates) > 0 { if err := repository.UpdateTextureFields(textureID, updates); err != nil { return nil, err } } return repository.FindTextureByID(textureID) } // DeleteTexture 删除材质 func DeleteTexture(db *gorm.DB, textureID, uploaderID int64) error { if _, err := GetTextureWithPermissionCheck(textureID, uploaderID); err != nil { return err } return repository.DeleteTexture(textureID) } // RecordTextureDownload 记录下载 func RecordTextureDownload(db *gorm.DB, textureID int64, userID *int64, ipAddress, userAgent string) error { if _, err := EnsureTextureExists(textureID); err != nil { return err } if err := repository.IncrementTextureDownloadCount(textureID); err != nil { return err } log := &model.TextureDownloadLog{ TextureID: textureID, UserID: userID, IPAddress: ipAddress, UserAgent: userAgent, } return repository.CreateTextureDownloadLog(log) } // ToggleTextureFavorite 切换收藏状态 func ToggleTextureFavorite(db *gorm.DB, userID, textureID int64) (bool, error) { if _, err := EnsureTextureExists(textureID); err != nil { return false, err } isFavorited, err := repository.IsTextureFavorited(userID, textureID) if err != nil { return false, err } if isFavorited { // 已收藏 -> 取消收藏 if err := repository.RemoveTextureFavorite(userID, textureID); err != nil { return false, err } if err := repository.DecrementTextureFavoriteCount(textureID); err != nil { return false, err } return false, nil } else { // 未收藏 -> 添加收藏 if err := repository.AddTextureFavorite(userID, textureID); err != nil { return false, err } if err := repository.IncrementTextureFavoriteCount(textureID); err != nil { return false, err } return true, nil } } // GetUserTextureFavorites 获取用户收藏的材质列表 func GetUserTextureFavorites(db *gorm.DB, userID int64, page, pageSize int) ([]*model.Texture, int64, error) { page, pageSize = NormalizePagination(page, pageSize) return repository.GetUserTextureFavorites(userID, page, pageSize) } // CheckTextureUploadLimit 检查用户上传材质数量限制 func CheckTextureUploadLimit(db *gorm.DB, uploaderID int64, maxTextures int) error { count, err := repository.CountTexturesByUploaderID(uploaderID) if err != nil { return err } if count >= int64(maxTextures) { return fmt.Errorf("已达到最大上传数量限制(%d)", maxTextures) } return nil } // parseTextureType 解析材质类型 func parseTextureType(textureType string) (model.TextureType, error) { switch textureType { case "SKIN": return model.TextureTypeSkin, nil case "CAPE": return model.TextureTypeCape, nil default: return "", errors.New("无效的材质类型") } }