mirror of
https://github.com/ente-io/ente.git
synced 2025-05-01 20:03:07 +00:00
83 lines
2.7 KiB
Go
83 lines
2.7 KiB
Go
package commonbilling
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/ente-io/museum/pkg/controller/email"
|
|
"github.com/ente-io/museum/pkg/repo"
|
|
"github.com/ente-io/museum/pkg/repo/storagebonus"
|
|
"github.com/ente-io/stacktrace"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type Controller struct {
|
|
EmailNotificationController *email.EmailNotificationController
|
|
StorageBonusRepo *storagebonus.Repository
|
|
UserRepo *repo.UserRepository
|
|
UsageRepo *repo.UsageRepository
|
|
BillingRepo *repo.BillingRepository
|
|
}
|
|
|
|
func NewController(
|
|
emailNotificationController *email.EmailNotificationController,
|
|
storageBonusRepo *storagebonus.Repository,
|
|
userRepo *repo.UserRepository,
|
|
usageRepo *repo.UsageRepository,
|
|
billingRepo *repo.BillingRepository,
|
|
) *Controller {
|
|
return &Controller{
|
|
EmailNotificationController: emailNotificationController,
|
|
StorageBonusRepo: storageBonusRepo,
|
|
UserRepo: userRepo,
|
|
UsageRepo: usageRepo,
|
|
BillingRepo: billingRepo,
|
|
}
|
|
}
|
|
|
|
func (c *Controller) CanDowngradeToGivenStorage(newStorage int64, userID int64) (bool, error) {
|
|
adminID, adminErr := c.UserRepo.GetFamilyAdminID(userID)
|
|
if adminErr != nil {
|
|
return false, stacktrace.Propagate(adminErr, "")
|
|
}
|
|
|
|
if adminID == nil {
|
|
bonusStorage, bonErr := c.StorageBonusRepo.GetActiveStorageBonuses(context.Background(), userID)
|
|
if bonErr != nil {
|
|
return false, stacktrace.Propagate(bonErr, "")
|
|
}
|
|
usage, err := c.UsageRepo.GetUsage(userID)
|
|
if err != nil {
|
|
return false, stacktrace.Propagate(err, "")
|
|
}
|
|
// newStore + addOnStorage + referralStorage should not be greater than usage.
|
|
|
|
if usage > (newStorage + bonusStorage.GetUsableBonus(newStorage)) {
|
|
logrus.Infof("user with %d usage and %d bonus, can not downgrade to %d", usage, bonusStorage.GetUsableBonus(newStorage), newStorage)
|
|
return false, nil
|
|
}
|
|
} else {
|
|
bonusStorage, bonErr := c.StorageBonusRepo.GetActiveStorageBonuses(context.Background(), *adminID)
|
|
if bonErr != nil {
|
|
return false, stacktrace.Propagate(bonErr, "")
|
|
}
|
|
usage, err := c.UsageRepo.StorageForFamilyAdmin(*adminID)
|
|
if err != nil {
|
|
return false, stacktrace.Propagate(err, "")
|
|
}
|
|
if usage > (newStorage + bonusStorage.GetUsableBonus(newStorage)) {
|
|
logrus.Infof("user with %d usage and %d bonus, can not downgrade to %d", usage, bonusStorage.GetUsableBonus(newStorage), newStorage)
|
|
return false, nil
|
|
}
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (c *Controller) OnSubscriptionCancelled(userID int64) error {
|
|
err := c.BillingRepo.UpdateSubscriptionCancellationStatus(userID, true)
|
|
if err != nil {
|
|
return stacktrace.Propagate(err, "")
|
|
}
|
|
go c.EmailNotificationController.OnSubscriptionCancelled(userID)
|
|
return nil
|
|
}
|