88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
package qualityowner
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
ConfigKey = "quality_owner.rules"
|
|
StatusNone = "none"
|
|
StatusActive = "active"
|
|
DepositSourcePaid = "paid"
|
|
DepositSourceManual = "manual"
|
|
defaultDepositCent = int64(20_000)
|
|
defaultInsuranceBps = 800
|
|
defaultPremiumRateBps = 400
|
|
)
|
|
|
|
var ErrInvalidRules = errors.New("invalid quality owner rules")
|
|
|
|
type Rules struct {
|
|
DepositAmountCent int64 `json:"deposit_amount_cent"`
|
|
InsuranceFeeBps int `json:"insurance_fee_bps"`
|
|
PremiumInsuranceFeeBps int `json:"premium_insurance_fee_bps"`
|
|
}
|
|
|
|
func DefaultRules() Rules {
|
|
return Rules{
|
|
DepositAmountCent: defaultDepositCent,
|
|
InsuranceFeeBps: defaultInsuranceBps,
|
|
PremiumInsuranceFeeBps: defaultPremiumRateBps,
|
|
}
|
|
}
|
|
|
|
func DefaultConfigValue() string {
|
|
raw, _ := json.Marshal(DefaultRules())
|
|
return string(raw)
|
|
}
|
|
|
|
func ParseConfigValue(value string) (Rules, error) {
|
|
rules := DefaultRules()
|
|
if value == "" {
|
|
return rules, nil
|
|
}
|
|
if err := json.Unmarshal([]byte(value), &rules); err != nil {
|
|
return Rules{}, ErrInvalidRules
|
|
}
|
|
if rules.DepositAmountCent <= 0 || rules.DepositAmountCent > 10_000_000 {
|
|
return Rules{}, ErrInvalidRules
|
|
}
|
|
if rules.InsuranceFeeBps < 0 || rules.InsuranceFeeBps > 10_000 {
|
|
return Rules{}, ErrInvalidRules
|
|
}
|
|
if rules.PremiumInsuranceFeeBps < 0 || rules.PremiumInsuranceFeeBps > rules.InsuranceFeeBps {
|
|
return Rules{}, ErrInvalidRules
|
|
}
|
|
return rules, nil
|
|
}
|
|
|
|
func MarshalConfig(rules Rules) (string, error) {
|
|
raw, err := json.Marshal(rules)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(raw), nil
|
|
}
|
|
|
|
type StatusDTO struct {
|
|
UserID uint64 `json:"user_id"`
|
|
Active bool `json:"active"`
|
|
Status string `json:"status"`
|
|
CanCancel bool `json:"can_cancel"`
|
|
ActivePremiumListings int64 `json:"active_premium_listing_count"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent"`
|
|
DepositSource string `json:"deposit_source"`
|
|
ActivatedAt *time.Time `json:"activated_at"`
|
|
AvailableBalanceCent int64 `json:"available_balance_cent"`
|
|
RequiredDepositCent int64 `json:"required_deposit_cent"`
|
|
InsuranceFeeBps int `json:"insurance_fee_bps"`
|
|
PremiumInsuranceFeeBps int `json:"premium_insurance_fee_bps"`
|
|
}
|
|
|
|
type AdminSetRequest struct {
|
|
Enabled bool `json:"enabled"`
|
|
Reason string `json:"reason" binding:"required"`
|
|
}
|