package repository import ( "carrotskin/internal/model" "gorm.io/gorm" ) // CreateTexture 创建材质 func CreateTexture(texture *model.Texture) error { return getDB().Create(texture).Error } // FindTextureByID 根据ID查找材质 func FindTextureByID(id int64) (*model.Texture, error) { var texture model.Texture err := getDB().Preload("Uploader").First(&texture, id).Error return HandleNotFound(&texture, err) } // FindTextureByHash 根据Hash查找材质 func FindTextureByHash(hash string) (*model.Texture, error) { var texture model.Texture err := getDB().Where("hash = ?", hash).First(&texture).Error return HandleNotFound(&texture, err) } // FindTexturesByUploaderID 根据上传者ID查找材质列表 func FindTexturesByUploaderID(uploaderID int64, page, pageSize int) ([]*model.Texture, int64, error) { db := getDB() var textures []*model.Texture var total int64 query := db.Model(&model.Texture{}).Where("uploader_id = ? AND status != -1", uploaderID) if err := query.Count(&total).Error; err != nil { return nil, 0, err } err := query.Scopes(Paginate(page, pageSize)). Preload("Uploader"). Order("created_at DESC"). Find(&textures).Error if err != nil { return nil, 0, err } return textures, total, nil } // SearchTextures 搜索材质 func SearchTextures(keyword string, textureType model.TextureType, publicOnly bool, page, pageSize int) ([]*model.Texture, int64, error) { db := getDB() var textures []*model.Texture var total int64 query := db.Model(&model.Texture{}).Where("status = 1") if publicOnly { query = query.Where("is_public = ?", true) } if textureType != "" { query = query.Where("type = ?", textureType) } if keyword != "" { query = query.Where("name LIKE ? OR description LIKE ?", "%"+keyword+"%", "%"+keyword+"%") } if err := query.Count(&total).Error; err != nil { return nil, 0, err } err := query.Scopes(Paginate(page, pageSize)). Preload("Uploader"). Order("created_at DESC"). Find(&textures).Error if err != nil { return nil, 0, err } return textures, total, nil } // UpdateTexture 更新材质 func UpdateTexture(texture *model.Texture) error { return getDB().Save(texture).Error } // UpdateTextureFields 更新材质指定字段 func UpdateTextureFields(id int64, fields map[string]interface{}) error { return getDB().Model(&model.Texture{}).Where("id = ?", id).Updates(fields).Error } // DeleteTexture 删除材质(软删除) func DeleteTexture(id int64) error { return getDB().Model(&model.Texture{}).Where("id = ?", id).Update("status", -1).Error } // IncrementTextureDownloadCount 增加下载次数 func IncrementTextureDownloadCount(id int64) error { return getDB().Model(&model.Texture{}).Where("id = ?", id). UpdateColumn("download_count", gorm.Expr("download_count + ?", 1)).Error } // IncrementTextureFavoriteCount 增加收藏次数 func IncrementTextureFavoriteCount(id int64) error { return getDB().Model(&model.Texture{}).Where("id = ?", id). UpdateColumn("favorite_count", gorm.Expr("favorite_count + ?", 1)).Error } // DecrementTextureFavoriteCount 减少收藏次数 func DecrementTextureFavoriteCount(id int64) error { return getDB().Model(&model.Texture{}).Where("id = ?", id). UpdateColumn("favorite_count", gorm.Expr("favorite_count - ?", 1)).Error } // CreateTextureDownloadLog 创建下载日志 func CreateTextureDownloadLog(log *model.TextureDownloadLog) error { return getDB().Create(log).Error } // IsTextureFavorited 检查是否已收藏 func IsTextureFavorited(userID, textureID int64) (bool, error) { var count int64 err := getDB().Model(&model.UserTextureFavorite{}). Where("user_id = ? AND texture_id = ?", userID, textureID). Count(&count).Error return count > 0, err } // AddTextureFavorite 添加收藏 func AddTextureFavorite(userID, textureID int64) error { favorite := &model.UserTextureFavorite{ UserID: userID, TextureID: textureID, } return getDB().Create(favorite).Error } // RemoveTextureFavorite 取消收藏 func RemoveTextureFavorite(userID, textureID int64) error { return getDB().Where("user_id = ? AND texture_id = ?", userID, textureID). Delete(&model.UserTextureFavorite{}).Error } // GetUserTextureFavorites 获取用户收藏的材质列表 func GetUserTextureFavorites(userID int64, page, pageSize int) ([]*model.Texture, int64, error) { db := getDB() var textures []*model.Texture var total int64 subQuery := db.Model(&model.UserTextureFavorite{}). Select("texture_id"). Where("user_id = ?", userID) query := db.Model(&model.Texture{}). Where("id IN (?) AND status = 1", subQuery) if err := query.Count(&total).Error; err != nil { return nil, 0, err } err := query.Scopes(Paginate(page, pageSize)). Preload("Uploader"). Order("created_at DESC"). Find(&textures).Error if err != nil { return nil, 0, err } return textures, total, nil } // CountTexturesByUploaderID 统计用户上传的材质数量 func CountTexturesByUploaderID(uploaderID int64) (int64, error) { var count int64 err := getDB().Model(&model.Texture{}). Where("uploader_id = ? AND status != -1", uploaderID). Count(&count).Error return count, err }