package repository import ( "carrotskin/internal/model" "carrotskin/pkg/database" "gorm.io/gorm" ) // CreateTexture 创建材质 func CreateTexture(texture *model.Texture) error { db := database.MustGetDB() return db.Create(texture).Error } // FindTextureByID 根据ID查找材质 func FindTextureByID(id int64) (*model.Texture, error) { db := database.MustGetDB() var texture model.Texture err := db.Preload("Uploader").First(&texture, id).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } return nil, err } return &texture, nil } // FindTextureByHash 根据Hash查找材质 func FindTextureByHash(hash string) (*model.Texture, error) { db := database.MustGetDB() var texture model.Texture err := db.Where("hash = ?", hash).First(&texture).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } return nil, err } return &texture, nil } // FindTexturesByUploaderID 根据上传者ID查找材质列表 func FindTexturesByUploaderID(uploaderID int64, page, pageSize int) ([]*model.Texture, int64, error) { db := database.MustGetDB() 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 } // 分页查询 offset := (page - 1) * pageSize err := query.Preload("Uploader"). Order("created_at DESC"). Offset(offset). Limit(pageSize). 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 := database.MustGetDB() 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 } // 分页查询 offset := (page - 1) * pageSize err := query.Preload("Uploader"). Order("created_at DESC"). Offset(offset). Limit(pageSize). Find(&textures).Error if err != nil { return nil, 0, err } return textures, total, nil } // UpdateTexture 更新材质 func UpdateTexture(texture *model.Texture) error { db := database.MustGetDB() return db.Save(texture).Error } // UpdateTextureFields 更新材质指定字段 func UpdateTextureFields(id int64, fields map[string]interface{}) error { db := database.MustGetDB() return db.Model(&model.Texture{}).Where("id = ?", id).Updates(fields).Error } // DeleteTexture 删除材质(软删除) func DeleteTexture(id int64) error { db := database.MustGetDB() return db.Model(&model.Texture{}).Where("id = ?", id).Update("status", -1).Error } // IncrementTextureDownloadCount 增加下载次数 func IncrementTextureDownloadCount(id int64) error { db := database.MustGetDB() return db.Model(&model.Texture{}).Where("id = ?", id). UpdateColumn("download_count", gorm.Expr("download_count + ?", 1)).Error } // IncrementTextureFavoriteCount 增加收藏次数 func IncrementTextureFavoriteCount(id int64) error { db := database.MustGetDB() return db.Model(&model.Texture{}).Where("id = ?", id). UpdateColumn("favorite_count", gorm.Expr("favorite_count + ?", 1)).Error } // DecrementTextureFavoriteCount 减少收藏次数 func DecrementTextureFavoriteCount(id int64) error { db := database.MustGetDB() return db.Model(&model.Texture{}).Where("id = ?", id). UpdateColumn("favorite_count", gorm.Expr("favorite_count - ?", 1)).Error } // CreateTextureDownloadLog 创建下载日志 func CreateTextureDownloadLog(log *model.TextureDownloadLog) error { db := database.MustGetDB() return db.Create(log).Error } // IsTextureFavorited 检查是否已收藏 func IsTextureFavorited(userID, textureID int64) (bool, error) { db := database.MustGetDB() var count int64 err := db.Model(&model.UserTextureFavorite{}). Where("user_id = ? AND texture_id = ?", userID, textureID). Count(&count).Error if err != nil { return false, err } return count > 0, nil } // AddTextureFavorite 添加收藏 func AddTextureFavorite(userID, textureID int64) error { db := database.MustGetDB() favorite := &model.UserTextureFavorite{ UserID: userID, TextureID: textureID, } return db.Create(favorite).Error } // RemoveTextureFavorite 取消收藏 func RemoveTextureFavorite(userID, textureID int64) error { db := database.MustGetDB() return db.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 := database.MustGetDB() var textures []*model.Texture var total int64 // 子查询获取收藏的材质ID 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 } // 分页查询 offset := (page - 1) * pageSize err := query.Preload("Uploader"). Order("created_at DESC"). Offset(offset). Limit(pageSize). Find(&textures).Error if err != nil { return nil, 0, err } return textures, total, nil } // CountTexturesByUploaderID 统计用户上传的材质数量 func CountTexturesByUploaderID(uploaderID int64) (int64, error) { db := database.MustGetDB() var count int64 err := db.Model(&model.Texture{}). Where("uploader_id = ? AND status != -1", uploaderID). Count(&count).Error return count, err }