feat: add private and profile
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user