bindbox-game/scripts/check_points_integrity.go

71 lines
1.8 KiB
Go

package main
import (
"bindbox-game/internal/repository/mysql"
"bindbox-game/internal/repository/mysql/model"
"fmt"
"log"
)
func main() {
// Initialize DB (Implicitly loads configs via init())
db, err := mysql.New()
if err != nil {
log.Fatalf("failed to init db: %v", err)
}
// 1. Get all users
var userIDs []int64
if err := db.GetDbR().Model(&model.Users{}).Pluck("id", &userIDs).Error; err != nil {
log.Fatalf("failed to get users: %v", err)
}
fmt.Printf("Checking points integrity for %d users...\n", len(userIDs))
fmt.Println("UserID | LedgerSum | BalanceSum | Diff")
fmt.Println("-------|-----------|------------|------")
errorCount := 0
for _, uid := range userIDs {
// Sum Ledger
var ledgerSum int64
if err := db.GetDbR().Model(&model.UserPointsLedger{}).
Where("user_id = ?", uid).
Select("COALESCE(SUM(points), 0)").
Scan(&ledgerSum).Error; err != nil {
log.Printf("failed to sum ledger for user %d: %v", uid, err)
continue
}
// Sum Balance
var balanceSum int64
if err := db.GetDbR().Model(&model.UserPoints{}).
Where("user_id = ?", uid).
Select("COALESCE(SUM(points), 0)").
Scan(&balanceSum).Error; err != nil {
log.Printf("failed to sum balance for user %d: %v", uid, err)
continue
}
diff := ledgerSum - balanceSum
if diff != 0 || uid == 9018 {
errorCount++
fmt.Printf("%6d | %9d | %10d | %4d\n", uid, ledgerSum, balanceSum, diff)
// Show ledgers for 9018
if uid == 9018 {
var ledgers []model.UserPointsLedger
db.GetDbR().Where("user_id = ?", uid).Find(&ledgers)
for _, l := range ledgers {
fmt.Printf(" -> Ledger ID: %d, Action: %s, Points: %d\n", l.ID, l.Action, l.Points)
}
}
}
}
if errorCount == 0 {
fmt.Println("\nAll users verified. No discrepancies found.")
} else {
fmt.Printf("\nFound %d users with point discrepancies.\n", errorCount)
}
}