codeword/internal/services/promocode_service.go

104 lines
3.2 KiB
Go
Raw Normal View History

2024-01-11 16:29:53 +00:00
package services
import (
"codeword/internal/models"
2024-01-14 14:18:36 +00:00
"codeword/internal/utils/genID"
2024-01-11 16:29:53 +00:00
"context"
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-12 13:46:36 +00:00
ActivatePromo(ctx context.Context, req *models.ActivateReq) (string, 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
}
type PromoDeps struct {
Logger *zap.Logger
PromoCodeRepo PromoCodeRepository
}
type PromoCodeService struct {
logger *zap.Logger
promoCodeRepo PromoCodeRepository
}
func NewPromoCodeService(deps PromoDeps) *PromoCodeService {
return &PromoCodeService{
logger: deps.Logger,
promoCodeRepo: deps.PromoCodeRepo,
}
}
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
func (s *PromoCodeService) ActivatePromo(ctx context.Context, req *models.ActivateReq) (string, error) {
greetings, err := s.promoCodeRepo.ActivatePromo(ctx, req)
if err != nil {
s.logger.Error("Failed to activate promocode", zap.Error(err))
return "", err
}
return greetings, nil
}
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
}