topfans/backend/scripts/loadgen/seed/tokens.go

99 lines
2.2 KiB
Go

package main
import (
"encoding/csv"
"fmt"
"os"
"strconv"
"strings"
"time"
"github.com/topfans/backend/pkg/jwt"
)
type TestUser struct {
UserID int64
Mobile string
AssetIDs []int64
ExhibitionIDs []int64
}
func GenerateTokensForLoadtest(cfg *Config) error {
jwt.SetSecret(cfg.JWTSecret)
db, err := openDB(cfg)
if err != nil {
return err
}
defer db.Close()
rows, err := db.Query(`
SELECT u.id, u.mobile,
COALESCE(array_agg(DISTINCT a.id) FILTER (WHERE a.id IS NOT NULL), '{}'),
COALESCE(array_agg(DISTINCT e.id) FILTER (WHERE e.id IS NOT NULL), '{}')
FROM users u
LEFT JOIN assets a ON a.owner_uid = u.id AND a.star_id = $1
LEFT JOIN fan_profiles fp ON fp.user_id = u.id AND fp.star_id = $1
LEFT JOIN booth_slots bs ON bs.host_profile_id = fp.id AND bs.slot_index IN (1, 2)
LEFT JOIN exhibitions e ON e.slot_id = bs.slot_id AND e.occupier_star_id = $1
WHERE u.id BETWEEN $2 AND $3
GROUP BY u.id, u.mobile
ORDER BY u.id
`, LoadtestStarID, LoadtestUserMin, LoadtestUserMax)
if err != nil {
return err
}
defer rows.Close()
var users []TestUser
for rows.Next() {
var u TestUser
if err := rows.Scan(&u.UserID, &u.Mobile, &u.AssetIDs, &u.ExhibitionIDs); err != nil {
return err
}
users = append(users, u)
}
if err := rows.Err(); err != nil {
return err
}
f, err := os.Create("users.csv")
if err != nil {
return err
}
defer f.Close()
w := csv.NewWriter(f)
defer w.Flush()
if err := w.Write([]string{"phone", "password", "user_id", "star_id", "jwt_token", "asset_ids", "exhibition_ids"}); err != nil {
return err
}
now := time.Now().UnixMilli()
for _, u := range users {
token, err := jwt.GenerateToken(u.UserID, LoadtestStarID, now)
if err != nil {
return err
}
if err := w.Write([]string{
u.Mobile, "Test@123",
strconv.FormatInt(u.UserID, 10),
"999900", token,
joinInt64(u.AssetIDs),
joinInt64(u.ExhibitionIDs),
}); err != nil {
return err
}
}
fmt.Printf("✅ users.csv written: %d rows\n", len(users))
return nil
}
func joinInt64(s []int64) string {
parts := make([]string, len(s))
for i, v := range s {
parts[i] = strconv.FormatInt(v, 10)
}
return strings.Join(parts, ";")
}