77 lines
1.5 KiB
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
|
|
})
|
|
}
|