codeword/internal/services/promocode_service.go

185 lines
6.0 KiB
Go
Raw Normal View History

2024-01-11 16:29:53 +00:00
package services
import (
2024-01-17 13:51:42 +00:00
"codeword/internal/kafka/tariff"
2024-01-11 16:29:53 +00:00
"codeword/internal/models"
2024-01-17 18:50:50 +00:00
"codeword/internal/proto/discount"
2024-01-14 14:18:36 +00:00
"codeword/internal/utils/genID"
2024-01-11 16:29:53 +00:00
"context"
2024-01-25 17:18:00 +00:00
"fmt"
2024-01-14 14:18:36 +00:00
"go.mongodb.org/mongo-driver/bson/primitive"
2024-01-11 16:29:53 +00:00
"go.uber.org/zap"
)
type PromoCodeRepository interface {
2024-01-12 11:28:22 +00:00
CreatePromoCode(ctx context.Context, req *models.PromoCode) (*models.PromoCode, error)
EditPromoCode(ctx context.Context, req *models.ReqEditPromoCode) (*models.PromoCode, error)
GetPromoCodesList(ctx context.Context, req *models.GetPromoCodesListReq) ([]models.PromoCode, int64, error)
2024-01-17 13:51:42 +00:00
ActivatePromo(ctx context.Context, req *models.ActivateReq) (*models.PromoCode, error)
2024-01-12 14:50:53 +00:00
DeletePromoCode(ctx context.Context, promoCodeID string) error
2024-01-14 14:18:36 +00:00
GetPromoCodeByID(ctx context.Context, promoCodeID primitive.ObjectID) (*models.PromoCode, error)
AddFastLink(ctx context.Context, promoCodeID primitive.ObjectID, xid string) error
2024-01-11 16:29:53 +00:00
}
2024-01-27 12:51:32 +00:00
type PromoStatsRepository interface {
UpdateStatistics(ctx context.Context, key, userID string) error
GetAllStatistics(ctx context.Context) ([]models.PromoCodeStats, error)
}
2024-01-11 16:29:53 +00:00
type PromoDeps struct {
2024-01-17 18:50:50 +00:00
Logger *zap.Logger
PromoCodeRepo PromoCodeRepository
2024-01-27 12:51:32 +00:00
StatsRepo PromoStatsRepository
2024-01-17 18:50:50 +00:00
Kafka *tariff.Producer
DiscountClient discount.DiscountServiceClient
2024-01-11 16:29:53 +00:00
}
type PromoCodeService struct {
2024-01-17 18:50:50 +00:00
logger *zap.Logger
promoCodeRepo PromoCodeRepository
2024-01-27 12:51:32 +00:00
statsRepo PromoStatsRepository
2024-01-17 18:50:50 +00:00
kafka *tariff.Producer
discountClient discount.DiscountServiceClient
2024-01-11 16:29:53 +00:00
}
func NewPromoCodeService(deps PromoDeps) *PromoCodeService {
return &PromoCodeService{
2024-01-17 18:50:50 +00:00
logger: deps.Logger,
promoCodeRepo: deps.PromoCodeRepo,
2024-01-27 12:51:32 +00:00
statsRepo: deps.StatsRepo,
2024-01-17 18:50:50 +00:00
kafka: deps.Kafka,
discountClient: deps.DiscountClient,
2024-01-11 16:29:53 +00:00
}
}
func (s *PromoCodeService) CreatePromoCode(ctx context.Context, req *models.PromoCode) (*models.PromoCode, error) {
2024-01-11 18:23:15 +00:00
promoCode, err := s.promoCodeRepo.CreatePromoCode(ctx, req)
2024-01-11 18:20:33 +00:00
if err != nil {
s.logger.Error("Failed to add promocode in database", zap.Error(err))
return nil, err
}
return promoCode, nil
2024-01-11 16:29:53 +00:00
}
2024-01-11 19:47:54 +00:00
func (s *PromoCodeService) EditPromoCode(ctx context.Context, req *models.ReqEditPromoCode) (*models.PromoCode, error) {
editedPromoCode, err := s.promoCodeRepo.EditPromoCode(ctx, req)
if err != nil {
s.logger.Error("Failed to edit promocode in database", zap.Error(err))
return nil, err
}
return editedPromoCode, nil
}
2024-01-12 11:28:22 +00:00
func (s *PromoCodeService) GetPromoCodesList(ctx context.Context, req *models.GetPromoCodesListReq) ([]models.PromoCode, int64, error) {
promoCodes, count, err := s.promoCodeRepo.GetPromoCodesList(ctx, req)
if err != nil {
s.logger.Error("Failed to get list promocodes from database", zap.Error(err))
return nil, 0, err
}
return promoCodes, count, nil
}
2024-01-12 13:46:36 +00:00
2024-01-17 18:50:50 +00:00
// todo одумать еще реализацию этого дела, надо уточнить как разделяется ответственность в бонусе между привилегией и скидкой
// разделяется ли она или они всегда вместе, если разделяются то что-то из этого может быть пустым либо все заполеннное,
2024-01-27 12:51:32 +00:00
// соответсвенно надо сделать соответствующие проверки до записи в кафку и до отправки в дискаунт сервис
2024-01-17 18:50:50 +00:00
2024-01-12 13:46:36 +00:00
func (s *PromoCodeService) ActivatePromo(ctx context.Context, req *models.ActivateReq) (string, error) {
2024-01-17 13:51:42 +00:00
promoCode, err := s.promoCodeRepo.ActivatePromo(ctx, req)
2024-01-12 13:46:36 +00:00
if err != nil {
s.logger.Error("Failed to activate promocode", zap.Error(err))
return "", err
}
2024-01-27 12:51:32 +00:00
err = s.statsRepo.UpdateStatistics(ctx, promoCode.ID.Hex(), req.UserID)
if err != nil {
s.logger.Error("Failed add in stats", zap.Error(err))
return "", err
}
2024-01-25 17:18:00 +00:00
var postfix string
if req.FastLink != "" {
postfix = fmt.Sprintf(":(%s)", req.FastLink)
}
2024-01-17 13:51:42 +00:00
var privileges []models.Privilege
privilege := models.Privilege{
PrivilegeID: promoCode.Bonus.Privilege.PrivilegeID,
Amount: promoCode.Bonus.Privilege.Amount,
}
privileges = append(privileges, privilege)
fakeTariff := &models.Tariff{
2024-01-25 17:18:00 +00:00
Name: promoCode.Codeword + postfix,
2024-01-17 13:51:42 +00:00
Privileges: privileges,
Deleted: promoCode.Delete,
CreatedAt: promoCode.CreatedAt,
}
if err := s.kafka.Send(ctx, req.UserID, fakeTariff); err != nil {
s.logger.Error("Failed to send fake tariff to Kafka", zap.Error(err))
return "", err
}
2024-01-17 18:50:50 +00:00
disOverHelm := true
discountRequest := &discount.CreateDiscountRequest{
2024-01-25 17:18:00 +00:00
Name: promoCode.Codeword + postfix,
2024-01-17 18:50:50 +00:00
Layer: promoCode.Bonus.Discount.Layer,
Description: "",
Condition: &discount.DiscountCondition{
Coupon: &promoCode.Codeword,
User: &req.UserID,
},
Target: &discount.DiscountCalculationTarget{
Factor: promoCode.Bonus.Discount.Factor,
Overhelm: &disOverHelm,
},
}
_, err = s.discountClient.CreateDiscount(ctx, discountRequest)
if err != nil {
s.logger.Error("Failed to create discount", zap.Error(err))
return "", err
}
2024-01-17 13:51:42 +00:00
return promoCode.Greetings, nil
2024-01-12 13:46:36 +00:00
}
2024-01-12 14:50:53 +00:00
func (s *PromoCodeService) DeletePromoCode(ctx context.Context, promoCodeID string) error {
err := s.promoCodeRepo.DeletePromoCode(ctx, promoCodeID)
if err != nil {
s.logger.Error("Failed simple delete promocode from database", zap.Error(err))
return err
}
return nil
}
2024-01-14 14:18:36 +00:00
func (s *PromoCodeService) CreateFastLink(ctx context.Context, promoCodeID string) (string, error) {
xid := genID.GenerateXID()
promoID, err := primitive.ObjectIDFromHex(promoCodeID)
if err != nil {
s.logger.Error("Failed conversion promoCodeID to ObjectID", zap.Error(err))
return "", err
}
err = s.promoCodeRepo.AddFastLink(ctx, promoID, xid)
if err != nil {
s.logger.Error("Failed to add fastlink for promocode by promocode id", zap.Error(err))
return "", err
}
return xid, nil
}
2024-01-27 12:51:32 +00:00
func (s *PromoCodeService) GetAllStats(ctx context.Context) ([]models.PromoCodeStats, error) {
promoStats, err := s.statsRepo.GetAllStatistics(ctx)
if err != nil {
s.logger.Error("Failed getting promo stats", zap.Error(err))
return nil, err
}
return promoStats, nil
}