93 lines
2.4 KiB
Go
93 lines
2.4 KiB
Go
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
|
|
}
|