Files
back-hokm/internal/economy/tables.go
T

45 lines
1.5 KiB
Go

package economy
import (
"context"
"errors"
)
// FreePrivateTables سقفِ میزهای خصوصیِ رایگان برای کاربرِ غیر VIP.
const FreePrivateTables = 5
// ErrTableLimit وقتی کاربرِ غیر VIP به سقفِ میزهای رایگان رسیده باشد.
var ErrTableLimit = errors.New("free private table limit reached")
// PrivateTableInfo باقیمانده‌ی میزهای رایگان و نامحدود بودن (VIP) را برمی‌گرداند.
func (s *Service) PrivateTableInfo(ctx context.Context, userID int64) (remaining int, unlimited bool) {
if s.isVIP(ctx, userID) {
return 0, true
}
var used int
_ = s.db.QueryRowContext(ctx, `SELECT free_tables_used FROM users WHERE id = ?`, userID).Scan(&used)
rem := FreePrivateTables - used
if rem < 0 {
rem = 0
}
return rem, false
}
// ConsumePrivateTable در صورت مجاز بودن، یک میز خصوصی را برای کاربر مصرف می‌کند.
// برای VIP بدون محدودیت است؛ برای غیر VIP در صورت اتمامِ سقف خطا می‌دهد.
func (s *Service) ConsumePrivateTable(ctx context.Context, userID int64) error {
if s.isVIP(ctx, userID) {
return nil
}
res, err := s.db.ExecContext(ctx,
`UPDATE users SET free_tables_used = free_tables_used + 1
WHERE id = ? AND free_tables_used < ?`, userID, FreePrivateTables)
if err != nil {
return err
}
if n, _ := res.RowsAffected(); n == 0 {
return ErrTableLimit
}
return nil
}