docxTemplater/worker/tariff.go

194 lines
5.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package worker
import (
"context"
"time"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff"
"penahub.gitlab.yandexcloud.net/backend/templategen/broker/tariff/models"
"penahub.gitlab.yandexcloud.net/backend/templategen/dal"
"penahub.gitlab.yandexcloud.net/backend/templategen/penadisk"
"penahub.gitlab.yandexcloud.net/backend/templategen/privileges"
)
/* TODO: Сделать рефакторинг кода!
Какой то колхоз с привилегиями получился.
Сейчас у меня 3 разных модели привилегий из разных пакетов: boker\tariff\models, proto, privileges.
*/
type TariffWorkerDeps struct {
Logger *zap.Logger
Dal *dal.MongoDAL
TariffConsumer *tariff.Consumer
PrivilegesDomain string
}
type TariffWorker struct {
logger *zap.Logger
dal *dal.MongoDAL
tariffConsumer *tariff.Consumer
privilegesDomain string
}
func NewTariffWorker(deps TariffWorkerDeps) *TariffWorker {
return &TariffWorker{
logger: deps.Logger,
dal: deps.Dal,
tariffConsumer: deps.TariffConsumer,
privilegesDomain: deps.PrivilegesDomain,
}
}
func (w *TariffWorker) Run(ctx context.Context) {
ticker := time.NewTicker(5 * time.Minute)
for {
select {
case <-ctx.Done():
w.logger.Info("tariff worker done")
return
case <-ticker.C:
w.Do(ctx)
}
}
}
func (w *TariffWorker) Do(ctx context.Context) {
// получаем актуальные привилегии
getActualPrivileges, err := privileges.GetActualPrivileges(ctx, w.privilegesDomain)
if err != nil {
w.logger.Error("cannot get actual privileges")
return
}
actualPrivileges := make(map[string]models.Privilege)
for _, privilege := range getActualPrivileges {
actualPrivileges[privilege.ID] = models.Privilege{
ID: privilege.ID,
Amount: 0,
PrivilegeID: privilege.PrivilegeID,
Name: privilege.Name,
ServiceKey: privilege.ServiceKey,
Description: privilege.Description,
Type: privilege.Type,
Value: privilege.Value,
Price: privilege.Price,
IsDeleted: privilege.IsDeleted,
CreatedAt: privilege.CreatedAt,
UpdatedAt: privilege.UpdatedAt,
DeletedAt: privilege.DeletedAt,
}
}
// проверяем новые тарифы
tariffs := w.tariffConsumer.FetchTariffs(ctx)
for _, tariff := range tariffs {
penadisk := penadisk.NewClient(tariff.UserID)
for _, newPrivilege := range tariff.Privileges {
if newPrivilege.ServiceKey != models.ServiceKey {
continue
}
privilege := actualPrivileges[newPrivilege.ID]
privilege.Amount = newPrivilege.Amount
if err = w.dal.Amo.AddPrivilege(ctx,
tariff.UserID,
privilege.PrivilegeID,
privilege.Amount); err != nil {
w.logger.Error("cannot add privilege",
zap.Error(err),
zap.String("user_id", tariff.UserID),
zap.String("privilege_id", privilege.PrivilegeID))
}
// передаем в penahub disk запрос на изменение размера диска пользователя
if privilege.PrivilegeID == models.PrivilegeTemplateStorage {
if err = penadisk.SetBucketQuota(ctx, uint64(privilege.Amount)<<20); err != nil {
w.logger.Error("cannot set bucket quota",
zap.Error(err),
zap.String("user_id", tariff.UserID),
zap.String("privilege_id", privilege.PrivilegeID))
}
}
}
}
// получаем пользователей
amos, err := w.dal.Amo.GetAll(ctx)
if err != nil {
w.logger.Error("cannot get all amos", zap.Error(err))
return
}
for _, amo := range amos {
penadisk := penadisk.NewClient(amo.PenaID)
for privilegeID, privilege := range amo.Privileges {
// проверяем истекшие привилегии
if privilegeID == models.PrivilegeTemplateUnlimTime &&
privilege.CreatedAt.AddDate(0, 0, int(privilege.Amount)).After(time.Now()) {
if err = w.dal.Amo.DeletePrivilege(ctx, amo.ID, privilegeID); err != nil {
w.logger.Error("cannot delete privilege",
zap.Error(err),
zap.String("amo_id", amo.ID),
zap.String("privilege_id", privilegeID))
}
}
// обновляем базовую привилегию на количество, если она закончилась и прошел месяц
if privilegeID == models.PrivilegeTemplateCount &&
privilege.Amount == 0 &&
privilege.CreatedAt.AddDate(0, 1, 0).Before(time.Now()) {
if err = w.dal.Amo.AddPrivilege(ctx,
amo.ID,
privilegeID,
models.BasicAmountPrivilegeTemplateCount); err != nil {
w.logger.Error("cannot add privilege",
zap.Error(err),
zap.String("amo_ID", amo.ID),
zap.String("privilege_id", privilegeID))
}
}
}
// добавляем базовые привилегии если у пользователя нет никаких
if len(amo.Privileges) == 0 {
// привилегия на количество генераций
if err = w.dal.Amo.AddPrivilege(ctx,
amo.ID,
models.PrivilegeTemplateCount,
models.BasicAmountPrivilegeTemplateCount); err != nil {
w.logger.Error("cannot add privilege",
zap.Error(err),
zap.String("amo_ID", amo.ID),
zap.String("privilege_id", models.PrivilegeTemplateCount))
}
// привилегия на объем диска
if err = w.dal.Amo.AddPrivilege(ctx,
amo.ID,
models.PrivilegeTemplateStorage,
models.BasicAmountPrivilegeTemplateStorage); err != nil {
w.logger.Error("cannot add privilege",
zap.Error(err),
zap.String("amo_ID", amo.ID),
zap.String("privilege_id", models.PrivilegeTemplateStorage))
}
if err := penadisk.SetBucketQuota(ctx, 100<<20); err != nil {
w.logger.Error("cannot set bucket quota",
zap.Error(err),
zap.String("user_id", amo.PenaID),
zap.String("privilege_id", models.PrivilegeTemplateStorage))
}
}
}
}