package services import ( "codeword/internal/kafka/tariff" "codeword/internal/models" "codeword/internal/utils/genID" "context" "go.mongodb.org/mongo-driver/bson/primitive" "go.uber.org/zap" ) type PromoCodeRepository interface { 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) ActivatePromo(ctx context.Context, req *models.ActivateReq) (*models.PromoCode, error) DeletePromoCode(ctx context.Context, promoCodeID string) error GetPromoCodeByID(ctx context.Context, promoCodeID primitive.ObjectID) (*models.PromoCode, error) AddFastLink(ctx context.Context, promoCodeID primitive.ObjectID, xid string) error } type PromoDeps struct { Logger *zap.Logger PromoCodeRepo PromoCodeRepository Kafka *tariff.Producer } type PromoCodeService struct { logger *zap.Logger promoCodeRepo PromoCodeRepository kafka *tariff.Producer } func NewPromoCodeService(deps PromoDeps) *PromoCodeService { return &PromoCodeService{ logger: deps.Logger, promoCodeRepo: deps.PromoCodeRepo, kafka: deps.Kafka, } } func (s *PromoCodeService) CreatePromoCode(ctx context.Context, req *models.PromoCode) (*models.PromoCode, error) { promoCode, err := s.promoCodeRepo.CreatePromoCode(ctx, req) if err != nil { s.logger.Error("Failed to add promocode in database", zap.Error(err)) return nil, err } return promoCode, nil } 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 } 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 } func (s *PromoCodeService) ActivatePromo(ctx context.Context, req *models.ActivateReq) (string, error) { promoCode, err := s.promoCodeRepo.ActivatePromo(ctx, req) if err != nil { s.logger.Error("Failed to activate promocode", zap.Error(err)) return "", err } var privileges []models.Privilege privilege := models.Privilege{ PrivilegeID: promoCode.Bonus.Privilege.PrivilegeID, Amount: promoCode.Bonus.Privilege.Amount, } privileges = append(privileges, privilege) // создание fake tariff fakeTariff := &models.Tariff{ Name: promoCode.Codeword, // используем codeword как имя тарифа 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 } // код для вызова gRPC service для создания скидки... return promoCode.Greetings, nil } 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 } 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 }