194 lines
5.9 KiB
Go
194 lines
5.9 KiB
Go
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))
|
||
}
|
||
}
|
||
}
|
||
}
|