45 lines
1.5 KiB
Go
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
|
|
}
|