This commit is contained in:
2026-10-03 13:07:50 +07:00
parent 7a7808b4d1
commit 3aeaa09ea8
14 changed files with 98 additions and 28 deletions
+16 -4
View File
@@ -18,18 +18,25 @@ import (
const maxTicketsPerRequest = 100
var (
// ErrInvalidTicketCount indicates that the requested ticket count is invalid.
ErrInvalidTicketCount = errors.New("количество билетов должно быть от 1 до 100")
ErrInvalidBaseURL = errors.New("необходимо настроить APP_BASE_URL — публичный адрес приложения")
ErrTicketNotFound = errors.New("Билет не найден")
ErrTicketUsed = errors.New("Билет уже использован")
ErrGameFinished = errors.New("Игра уже завершена")
// ErrInvalidBaseURL indicates that the public application URL is missing.
ErrInvalidBaseURL = errors.New("необходимо настроить APP_BASE_URL — публичный адрес приложения")
// ErrTicketNotFound indicates that a ticket was not found.
ErrTicketNotFound = errors.New("Билет не найден")
// ErrTicketUsed indicates that a ticket was already used.
ErrTicketUsed = errors.New("Билет уже использован")
// ErrGameFinished indicates that the game has finished.
ErrGameFinished = errors.New("Игра уже завершена")
)
// Ticket describes an issued support ticket.
type Ticket struct {
ID int
URL string
}
// Page contains tickets returned for a user.
type Page struct {
ID int
Status string
@@ -41,15 +48,18 @@ type Page struct {
UsedBy *string
}
// TicketService handles support tickets.
type TicketService struct {
repo *tickets_repo.Repo
appBaseURL string
}
// NewTicketService creates a ticket service.
func NewTicketService(repo *tickets_repo.Repo, appBaseURL string) *TicketService {
return &TicketService{repo: repo, appBaseURL: appBaseURL}
}
// Issue creates tickets for a game.
func (s *TicketService) Issue(ctx context.Context, gameID, count int) ([]*Ticket, error) {
if count < 1 || count > maxTicketsPerRequest {
return nil, ErrInvalidTicketCount
@@ -87,6 +97,7 @@ func (s *TicketService) Issue(ctx context.Context, gameID, count int) ([]*Ticket
return tickets, nil
}
// Get returns tickets associated with a token.
func (s *TicketService) Get(ctx context.Context, token string) (*Page, error) {
hash, err := tokenHash(token)
if err != nil {
@@ -108,6 +119,7 @@ func (s *TicketService) Get(ctx context.Context, token string) (*Page, error) {
}, nil
}
// Accept assigns a ticket to a user.
func (s *TicketService) Accept(ctx context.Context, token string, userID int) (*Page, error) {
hash, err := tokenHash(token)
if err != nil {