bindbox-game/internal/service/user/expiration_task.go
2025-12-26 12:22:32 +08:00

52 lines
1.5 KiB
Go

package user
import (
"bindbox-game/internal/pkg/logger"
"bindbox-game/internal/repository/mysql"
"bindbox-game/internal/repository/mysql/dao"
"context"
"fmt"
"time"
)
// StartExpirationCheck starts a background task to check and expire items and coupons
func StartExpirationCheck(l logger.CustomLogger, repo mysql.Repo) {
go func() {
// Check every minute
t := time.NewTicker(1 * time.Minute)
defer t.Stop()
for range t.C {
ctx := context.Background()
db := dao.Use(repo.GetDbW())
now := time.Now()
// 1. Expire Item Cards
// Status: 1 (Unused) -> 3 (Expired)
result, err := db.UserItemCards.WithContext(ctx).
Where(db.UserItemCards.Status.Eq(1), db.UserItemCards.ValidEnd.Lt(now)).
Updates(map[string]interface{}{"status": 3})
if err != nil {
l.Error("Failed to expire item cards: " + err.Error())
} else if result.RowsAffected > 0 {
l.Info(fmt.Sprintf("[Scheduled] Expired %d item cards", result.RowsAffected))
}
// 2. Expire Coupons
// Status: 1 (Unused) -> 3 (Expired)
// Based on frontend logic and DB comment, 1 is Unused, 2 is Used, 3 is Expired.
// Assuming DB stores 1 for Unused initially.
resultC, errC := db.UserCoupons.WithContext(ctx).
Where(db.UserCoupons.Status.Eq(1), db.UserCoupons.ValidEnd.Lt(now)).
Updates(map[string]interface{}{"status": 3})
if errC != nil {
l.Error("Failed to expire coupons: " + errC.Error())
} else if resultC.RowsAffected > 0 {
l.Info(fmt.Sprintf("[Scheduled] Expired %d coupons", resultC.RowsAffected))
}
}
}()
}