nquest/pkg/service/game.go

94 lines
1.9 KiB
Go
Raw Permalink Normal View History

2023-11-01 23:21:12 +03:00
package service
import (
"context"
"github.com/google/uuid"
2023-11-01 23:21:12 +03:00
"gitrepo.ru/neonxp/nquest/pkg/models"
"gorm.io/gorm"
2024-04-29 23:31:44 +03:00
"gorm.io/gorm/clause"
2023-11-01 23:21:12 +03:00
)
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 uuid.UUID) (*models.Game, error) {
2023-11-01 23:21:12 +03:00
g := &models.Game{}
return g, gs.DB.
WithContext(ctx).
Preload("Tasks", func(db *gorm.DB) *gorm.DB {
return db.Order("tasks.task_order ASC")
}).
Preload("Tasks.Codes").
2023-11-01 23:21:12 +03:00
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).
2024-01-05 03:50:33 +03:00
Order("created_at DESC").
Preload("Tasks").
Preload("Authors").
Find(&games, "visible = true").
2023-11-01 23:21:12 +03:00
Error
}
func (gs *Game) GetTaskID(ctx context.Context, id uuid.UUID) (*models.Task, error) {
2023-11-01 23:21:12 +03:00
t := &models.Task{}
return t, gs.DB.WithContext(ctx).First(t, id).Error
2023-11-01 23:21:12 +03:00
}
2023-11-19 22:54:54 +03:00
func (gs *Game) ListByAuthor(ctx context.Context, author *models.User) ([]*models.Game, error) {
games := make([]*models.Game, 0)
model := gs.DB.
2023-11-19 22:54:54 +03:00
WithContext(ctx).
Model(&models.Game{})
if author.Role == models.RoleCreator {
model.Preload("Authors", gs.DB.Where("id = ?", author.ID))
}
return games,
model.
Order("created_at DESC").
Find(&games).
Error
2023-11-19 22:54:54 +03:00
}
2024-01-05 03:50:33 +03:00
2024-01-28 22:19:41 +03:00
func (gs *Game) UpsertGame(ctx context.Context, game *models.Game) (*models.Game, error) {
2024-05-05 19:42:33 +03:00
ids := []uuid.UUID{}
for _, t := range game.Tasks {
ids = append(ids, t.ID)
}
gs.DB.Delete([]models.Task{}, `game_id = ? and id not in (?)`, game.ID, ids)
err := gs.DB.
Session(&gorm.Session{FullSaveAssociations: true}).
2024-04-29 23:31:44 +03:00
Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{
"title", "description",
}),
}).
2024-05-05 19:42:33 +03:00
Create(game).
Error
2024-05-05 19:42:33 +03:00
if err != nil {
return nil, err
}
return game, gs.DB.Save(game).Error
}