2ee0195eba
Added new observer for billing chore to check user's balance and upgrade their account if balance is more than or equal to needed amount for upgrade. Added new config value which stands for needed amount of base units of US micro dollars needed to upgrade user. Issue: https://github.com/storj/storj/issues/5978 Change-Id: Ic3992cd3114397bfdd9e231ca090ff21ca66648b
90 lines
2.5 KiB
Go
90 lines
2.5 KiB
Go
// Copyright (C) 2023 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package console
|
|
|
|
import (
|
|
"context"
|
|
|
|
"storj.io/common/memory"
|
|
"storj.io/storj/satellite/payments/billing"
|
|
)
|
|
|
|
var _ billing.Observer = (*UpgradeUserObserver)(nil)
|
|
|
|
// UpgradeUserObserver used to upgrade user if their balance is more than $10 after confirmed token transaction.
|
|
type UpgradeUserObserver struct {
|
|
consoleDB DB
|
|
transactionsDB billing.TransactionsDB
|
|
usageLimitsConfig UsageLimitsConfig
|
|
userBalanceForUpgrade int64
|
|
}
|
|
|
|
// NewUpgradeUserObserver creates new observer instance.
|
|
func NewUpgradeUserObserver(consoleDB DB, transactionsDB billing.TransactionsDB, usageLimitsConfig UsageLimitsConfig, userBalanceForUpgrade int64) *UpgradeUserObserver {
|
|
return &UpgradeUserObserver{
|
|
consoleDB: consoleDB,
|
|
transactionsDB: transactionsDB,
|
|
usageLimitsConfig: usageLimitsConfig,
|
|
userBalanceForUpgrade: userBalanceForUpgrade,
|
|
}
|
|
}
|
|
|
|
// Process puts user into the paid tier and converts projects to upgraded limits.
|
|
func (o *UpgradeUserObserver) Process(ctx context.Context, transaction billing.Transaction) (err error) {
|
|
defer mon.Task()(&ctx)(&err)
|
|
|
|
user, err := o.consoleDB.Users().Get(ctx, transaction.UserID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if user.PaidTier {
|
|
return nil
|
|
}
|
|
|
|
balance, err := o.transactionsDB.GetBalance(ctx, user.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// check if user's balance is less than needed amount for upgrade.
|
|
if balance.BaseUnits() < o.userBalanceForUpgrade {
|
|
return nil
|
|
}
|
|
|
|
err = o.consoleDB.Users().UpdatePaidTier(ctx, user.ID, true,
|
|
o.usageLimitsConfig.Bandwidth.Paid,
|
|
o.usageLimitsConfig.Storage.Paid,
|
|
o.usageLimitsConfig.Segment.Paid,
|
|
o.usageLimitsConfig.Project.Paid,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
projects, err := o.consoleDB.Projects().GetOwn(ctx, user.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, project := range projects {
|
|
if project.StorageLimit == nil || *project.StorageLimit < o.usageLimitsConfig.Storage.Paid {
|
|
project.StorageLimit = new(memory.Size)
|
|
*project.StorageLimit = o.usageLimitsConfig.Storage.Paid
|
|
}
|
|
if project.BandwidthLimit == nil || *project.BandwidthLimit < o.usageLimitsConfig.Bandwidth.Paid {
|
|
project.BandwidthLimit = new(memory.Size)
|
|
*project.BandwidthLimit = o.usageLimitsConfig.Bandwidth.Paid
|
|
}
|
|
if project.SegmentLimit == nil || *project.SegmentLimit < o.usageLimitsConfig.Segment.Paid {
|
|
*project.SegmentLimit = o.usageLimitsConfig.Segment.Paid
|
|
}
|
|
err = o.consoleDB.Projects().Update(ctx, &project)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|