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

56 lines
1.6 KiB
Go

package main
import (
"database/sql"
"time"
)
func SeedSlotsAndExhibits(db *sql.DB) error {
ts := time.Now().UnixMilli()
expire := ts + 4*3600*1000 // 4 小时
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
// 1. booth_slots: 每 user 3 个, is_enabled=true
slotStmt, err := tx.Prepare(`
INSERT INTO booth_slots (host_profile_id, user_id, star_id, slot_index, is_enabled, created_at, updated_at)
SELECT fp.id, fp.user_id, fp.star_id, idx, true, $1, $1
FROM fan_profiles fp
CROSS JOIN (VALUES (1),(2),(3)) AS s(idx)
WHERE fp.star_id = $2
ON CONFLICT DO NOTHING
`)
if err != nil {
return err
}
defer slotStmt.Close()
if _, err := slotStmt.Exec(ts, LoadtestStarID); err != nil {
return err
}
// 2. exhibitions: 把每个 user 的前 2 个 asset 上架到 slot 1, 2
exStmt, err := tx.Prepare(`
INSERT INTO exhibitions (asset_id, slot_id, host_profile_id, occupier_uid, occupier_star_id, start_time, expire_at, created_at, updated_at)
SELECT a.id, bs.slot_id, fp.id, a.owner_uid, $1, $2, $3, $2, $2
FROM assets a
JOIN fan_profiles fp ON a.owner_uid = fp.user_id AND fp.star_id = $1
JOIN booth_slots bs ON bs.host_profile_id = fp.id AND (bs.slot_index = $4 OR bs.slot_index = $5)
WHERE a.star_id = $1 AND (a.name LIKE '%_1' OR a.name LIKE '%_2')
ON CONFLICT DO NOTHING
`)
if err != nil {
return err
}
defer exStmt.Close()
// asset 1 → slot 1
if _, err := exStmt.Exec(LoadtestStarID, ts, expire, 1, 2); err != nil {
return err
}
return tx.Commit()
}