package repository import ( "context" "github.com/go-nunu/nunu-layout-advanced/internal/model" "gorm.io/gorm/clause" ) type GameShieldPublicIpRepository interface { GetGameShieldPublicIp(ctx context.Context, id int64) (*model.GameShieldPublicIp, error) GetGameShieldPublicUserIp(ctx context.Context, uid int) (string, error) AddGameShieldPublicUserIp(ctx context.Context) (string, error) UpdateGameShieldPublicUserIp(ctx context.Context, uid int, ip string) error } func NewGameShieldPublicIpRepository( repository *Repository, ) GameShieldPublicIpRepository { return &gameShieldPublicIpRepository{ Repository: repository, } } type gameShieldPublicIpRepository struct { *Repository } func (r *gameShieldPublicIpRepository) GetGameShieldPublicIp(ctx context.Context, id int64) (*model.GameShieldPublicIp, error) { var gameShieldPublicIp model.GameShieldPublicIp return &gameShieldPublicIp, nil } func (r *gameShieldPublicIpRepository) GetGameShieldPublicUserIp(ctx context.Context, uid int) (string, error) { var ip string if err := r.DB(ctx).Model(&model.GameShieldPublicIp{}).Select("ip").Where("uid = ?", uid).Scan(&ip).Error; err != nil { return "", err } return ip, nil } func (r *gameShieldPublicIpRepository) AddGameShieldPublicUserIp(ctx context.Context) (string, error) { var ip string if err := r.DB(ctx).Model(&model.GameShieldPublicIp{}).Select("ip"). Where("uid IS NULL"). Order("RAND()"). Clauses(clause.Locking{Strength: "UPDATE"}). Limit(1). Scan(&ip).Error; err != nil { return "", err } return ip, nil } func (r *gameShieldPublicIpRepository) UpdateGameShieldPublicUserIp(ctx context.Context, uid int, ip string) error { if err := r.DB(ctx).Model(&model.GameShieldPublicIp{}). Where("uid IS NULL"). Where("ip = ?", ip). Update("uid", uid).Error; err != nil { return err } return nil }