2025-01-04 17:05:07 +05:30

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
}