nquest/pkg/service/game.go

77 lines
1.5 KiB
Go

package service
import (
"context"
"gitrepo.ru/neonxp/nquest/pkg/models"
"gorm.io/gorm"
)
type Game struct {
DB *gorm.DB
}
// NewGame returns new Game.
func NewGame(db *gorm.DB) *Game {
return &Game{
DB: db,
}
}
func (gs *Game) GetByID(ctx context.Context, id uint) (*models.Game, error) {
g := &models.Game{}
return g, gs.DB.
WithContext(ctx).
Preload("Tasks").
First(g, id).
Error
}
func (gs *Game) List(ctx context.Context) ([]*models.Game, error) {
games := make([]*models.Game, 0)
return games, gs.DB.
WithContext(ctx).
Order("created_at DESC").
Find(&games, "visible = true").
Limit(20).
Error
}
func (gs *Game) GetTaskID(ctx context.Context, id uint) (*models.Task, error) {
t := &models.Task{}
return t, gs.DB.WithContext(ctx).Preload("Next").First(t, id).Error
}
func (gs *Game) ListByAuthor(ctx context.Context, author *models.User) ([]*models.Game, error) {
games := make([]*models.Game, 0)
return games, gs.DB.
WithContext(ctx).
Model(&models.Game{}).
Preload("Authors", gs.DB.Where("id = ?", author.ID)).
Order("created_at DESC").
Find(&games).
Limit(20).
Error
}
func (gs *Game) CreateGame(ctx context.Context, game *models.Game) (*models.Game, error) {
return game, gs.DB.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(game).Error; err != nil {
return err
}
for i, t := range game.Tasks {
if i < len(game.Tasks)-1 {
t.Next = game.Tasks[i+1]
if err := tx.Save(t).Error; err != nil {
return err
}
}
}
return nil
})
}