112 lines
3.0 KiB
Go
112 lines
3.0 KiB
Go
|
|
package repository
|
||
|
|
|
||
|
|
import (
|
||
|
|
"apskel-pos-be/internal/entities"
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"github.com/google/uuid"
|
||
|
|
"gorm.io/gorm"
|
||
|
|
)
|
||
|
|
|
||
|
|
type GamePlayRepository struct {
|
||
|
|
db *gorm.DB
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewGamePlayRepository(db *gorm.DB) *GamePlayRepository {
|
||
|
|
return &GamePlayRepository{db: db}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) Create(ctx context.Context, gamePlay *entities.GamePlay) error {
|
||
|
|
return r.db.WithContext(ctx).Create(gamePlay).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) GetByID(ctx context.Context, id uuid.UUID) (*entities.GamePlay, error) {
|
||
|
|
var gamePlay entities.GamePlay
|
||
|
|
err := r.db.WithContext(ctx).Preload("Game").Preload("Customer").Preload("Prize").Where("id = ?", id).First(&gamePlay).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return &gamePlay, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) List(ctx context.Context, offset, limit int, search string, gameID, customerID, prizeID *uuid.UUID, sortBy, sortOrder string) ([]entities.GamePlay, int64, error) {
|
||
|
|
var gamePlays []entities.GamePlay
|
||
|
|
var total int64
|
||
|
|
|
||
|
|
query := r.db.WithContext(ctx).Preload("Game").Preload("Customer").Preload("Prize")
|
||
|
|
|
||
|
|
if search != "" {
|
||
|
|
searchTerm := "%" + search + "%"
|
||
|
|
query = query.Joins("JOIN customers ON game_plays.customer_id = customers.id").
|
||
|
|
Where("customers.name ILIKE ? OR customers.email ILIKE ?", searchTerm, searchTerm)
|
||
|
|
}
|
||
|
|
|
||
|
|
if gameID != nil {
|
||
|
|
query = query.Where("game_id = ?", *gameID)
|
||
|
|
}
|
||
|
|
|
||
|
|
if customerID != nil {
|
||
|
|
query = query.Where("customer_id = ?", *customerID)
|
||
|
|
}
|
||
|
|
|
||
|
|
if prizeID != nil {
|
||
|
|
query = query.Where("prize_id = ?", *prizeID)
|
||
|
|
}
|
||
|
|
|
||
|
|
if err := query.Model(&entities.GamePlay{}).Count(&total).Error; err != nil {
|
||
|
|
return nil, 0, err
|
||
|
|
}
|
||
|
|
|
||
|
|
if sortBy != "" {
|
||
|
|
if sortOrder == "" {
|
||
|
|
sortOrder = "asc"
|
||
|
|
}
|
||
|
|
query = query.Order(fmt.Sprintf("game_plays.%s %s", sortBy, sortOrder))
|
||
|
|
} else {
|
||
|
|
query = query.Order("game_plays.created_at DESC")
|
||
|
|
}
|
||
|
|
|
||
|
|
err := query.Offset(offset).Limit(limit).Find(&gamePlays).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, 0, err
|
||
|
|
}
|
||
|
|
|
||
|
|
return gamePlays, total, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) Update(ctx context.Context, gamePlay *entities.GamePlay) error {
|
||
|
|
return r.db.WithContext(ctx).Save(gamePlay).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) Delete(ctx context.Context, id uuid.UUID) error {
|
||
|
|
return r.db.WithContext(ctx).Delete(&entities.GamePlay{}, id).Error
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) GetCustomerPlays(ctx context.Context, customerID uuid.UUID, limit int) ([]entities.GamePlay, error) {
|
||
|
|
var gamePlays []entities.GamePlay
|
||
|
|
err := r.db.WithContext(ctx).Preload("Game").Preload("Prize").
|
||
|
|
Where("customer_id = ?", customerID).
|
||
|
|
Order("created_at DESC").
|
||
|
|
Limit(limit).
|
||
|
|
Find(&gamePlays).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return gamePlays, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *GamePlayRepository) GetGameStats(ctx context.Context, gameID uuid.UUID) (map[string]interface{}, error) {
|
||
|
|
var stats map[string]interface{}
|
||
|
|
|
||
|
|
err := r.db.WithContext(ctx).Model(&entities.GamePlay{}).
|
||
|
|
Select("COUNT(*) as total_plays, SUM(token_used) as total_tokens_used").
|
||
|
|
Where("game_id = ?", gameID).
|
||
|
|
Scan(&stats).Error
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
|
||
|
|
return stats, nil
|
||
|
|
}
|