storj/satellite/payments/paymentsconfig/config.go
Moby von Briesen c334fd090e satellite/payments: Convert coupon duration to be nullable
* Add a nullable billing_periods column in the coupons table
* Add nullable billing_periods column to the currently unused
coupon_codes table
* Drop the duration column from the coupon_codes table
* Replace duration config type so that the default promotional coupon
can be configured to never expire

Zero downtime migration plan:
* Add billing_periods column to coupons and coupon_codes tables (this change)
* After one release, remove all references to the old duration column,
replacing with references to billing_periods. At this point, we can also
change the defult promotional coupon to never expire and migrate over
values from the old duration column.
* After another release, drop the duration column.

Change-Id: I374e8dc9fab9f81b4a5bc681771955662d4c007a
2021-04-01 16:28:23 +02:00

78 lines
2.9 KiB
Go

// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package paymentsconfig
import (
"strconv"
"storj.io/common/memory"
"storj.io/storj/satellite/payments/stripecoinpayments"
)
// Config defines global payments config.
type Config struct {
Provider string `help:"payments provider to use" default:""`
StripeCoinPayments stripecoinpayments.Config
StorageTBPrice string `help:"price user should pay for storing TB per month" default:"10"`
EgressTBPrice string `help:"price user should pay for each TB of egress" default:"45"`
ObjectPrice string `help:"price user should pay for each object stored in network per month" default:"0.0000022"`
BonusRate int64 `help:"amount of percents that user will earn as bonus credits by depositing in STORJ tokens" default:"10"`
CouponValue int64 `help:"coupon value in cents" default:"275"`
CouponDuration CouponDuration `help:"duration a new coupon is valid in months/billing cycles" default:"2"`
CouponProjectLimit memory.Size `help:"project limit to which increase to after applying the coupon, 0 B means not changing it from the default" default:"0 B"`
MinCoinPayment int64 `help:"minimum value of coin payments in cents before coupon is applied" default:"1000"`
NodeEgressBandwidthPrice int64 `help:"price node receive for storing TB of egress in cents" default:"2000"`
NodeRepairBandwidthPrice int64 `help:"price node receive for storing TB of repair in cents" default:"1000"`
NodeAuditBandwidthPrice int64 `help:"price node receive for storing TB of audit in cents" default:"1000"`
NodeDiskSpacePrice int64 `help:"price node receive for storing disk space in cents/TB" default:"150"`
PaywallProportion float64 `help:"proportion of users which require a balance to create projects [0-1]" default:"0"`
}
// CouponDuration is a configuration struct that keeps details about default
// promotional coupon duration.
//
// Can be used as a flag.
type CouponDuration struct {
Enabled bool
BillingPeriods int64
}
// Type implements pflag.Value.
func (CouponDuration) Type() string { return "paymentsconfig.CouponDuration" }
// String is required for pflag.Value.
func (cd *CouponDuration) String() string {
if !cd.Enabled {
return ""
}
return strconv.FormatInt(cd.BillingPeriods, 10)
}
// Set sets the value from a string.
func (cd *CouponDuration) Set(s string) error {
if s == "" {
cd.Enabled = false
return nil
}
cd.Enabled = true
billingPeriods, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return err
}
cd.BillingPeriods = billingPeriods
return nil
}
// IntPointer returns an int64 pointer representation of the config value.
func (cd *CouponDuration) IntPointer() *int64 {
if !cd.Enabled {
return nil
}
return &cd.BillingPeriods
}