package repository import ( "gotest/internal/model" "gorm.io/gorm" ) // GameRepository 游戏数据访问层 type GameRepository struct { db *gorm.DB } // NewGameRepository 创建游戏仓库实例 func NewGameRepository(db *gorm.DB) *GameRepository { return &GameRepository{db: db} } // ListCategories 获取游戏分类列表 func (r *GameRepository) ListCategories() ([]model.GameCategory, error) { var categories []model.GameCategory if err := r.db.Order("sort ASC, id ASC").Find(&categories).Error; err != nil { return nil, err } return categories, nil } // ListGames 获取游戏列表,支持分类过滤、关键词搜索和排序 func (r *GameRepository) ListGames(categoryID uint, keyword string, sort string, page, pageSize int) ([]model.Game, int64, error) { var games []model.Game var total int64 query := r.db.Where("status = 1") if categoryID > 0 { query = query.Where("category_id = ?", categoryID) } if keyword != "" { query = query.Where("name LIKE ? OR tags LIKE ? OR developer LIKE ?", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") } if err := query.Model(&model.Game{}).Count(&total).Error; err != nil { return nil, 0, err } switch sort { case "rating": query = query.Order("rating DESC") case "plays": query = query.Order("plays DESC") case "newest": query = query.Order("release_date DESC") default: query = query.Order("sort ASC, id DESC") } if page > 0 && pageSize > 0 { offset := (page - 1) * pageSize query = query.Offset(offset).Limit(pageSize) } if err := query.Find(&games).Error; err != nil { return nil, 0, err } return games, total, nil } // GetGame 根据 ID 获取游戏详情 func (r *GameRepository) GetGame(id uint) (*model.Game, error) { var game model.Game if err := r.db.First(&game, id).Error; err != nil { return nil, err } return &game, nil } // ListHotGames 获取热门游戏 func (r *GameRepository) ListHotGames(limit int) ([]model.Game, error) { var games []model.Game if err := r.db.Where("status = 1 AND is_hot = true").Order("plays DESC").Limit(limit).Find(&games).Error; err != nil { return nil, err } return games, nil } // ListNewGames 获取新游 func (r *GameRepository) ListNewGames(limit int) ([]model.Game, error) { var games []model.Game if err := r.db.Where("status = 1 AND is_new = true").Order("release_date DESC").Limit(limit).Find(&games).Error; err != nil { return nil, err } return games, nil }