Add internal/repository/game.go

This commit is contained in:
ata
2026-07-10 10:06:14 +00:00
committed by Gitee
parent 7fbaa4239e
commit 7c05bb1e71

View File

@@ -0,0 +1,92 @@
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
}