fix campaign rules

This commit is contained in:
Aditya Siregar
2025-09-18 13:39:37 +07:00
parent c7828a5cad
commit a520d0ed11
17 changed files with 733 additions and 164 deletions
+143 -13
View File
@@ -18,15 +18,24 @@ type CampaignService interface {
DeleteCampaign(ctx context.Context, id string) error
GetActiveCampaigns(ctx context.Context) ([]models.CampaignResponse, error)
GetCampaignsForApp(ctx context.Context) ([]models.CampaignResponse, error)
// Campaign Rules methods
CreateCampaignRule(ctx context.Context, req *contract.CreateCampaignRuleRequest) (*models.CampaignRuleResponse, error)
GetCampaignRule(ctx context.Context, id string) (*models.CampaignRuleResponse, error)
ListCampaignRules(ctx context.Context, req *contract.ListCampaignRulesRequest) (*models.ListCampaignRulesResponse, error)
UpdateCampaignRule(ctx context.Context, req *contract.UpdateCampaignRuleRequest) (*models.CampaignRuleResponse, error)
DeleteCampaignRule(ctx context.Context, id string) error
GetCampaignRulesByCampaignID(ctx context.Context, campaignID string) ([]models.CampaignRuleResponse, error)
}
type campaignService struct {
campaignProcessor processor.CampaignProcessor
campaignProcessor processor.CampaignProcessor
campaignRuleProcessor processor.CampaignRuleProcessor
}
func NewCampaignService(campaignProcessor processor.CampaignProcessor) CampaignService {
func NewCampaignService(campaignProcessor processor.CampaignProcessor, campaignRuleProcessor processor.CampaignRuleProcessor) CampaignService {
return &campaignService{
campaignProcessor: campaignProcessor,
campaignProcessor: campaignProcessor,
campaignRuleProcessor: campaignRuleProcessor,
}
}
@@ -41,11 +50,6 @@ func (s *campaignService) CreateCampaign(ctx context.Context, req *contract.Crea
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate rules
if err := s.validateCampaignRules(req.Rules); err != nil {
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate position
if req.Position < 0 {
return nil, fmt.Errorf("position cannot be negative")
@@ -115,11 +119,6 @@ func (s *campaignService) UpdateCampaign(ctx context.Context, req *contract.Upda
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate rules
if err := s.validateCampaignRules(req.Rules); err != nil {
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate position
if req.Position < 0 {
return nil, fmt.Errorf("position cannot be negative")
@@ -164,6 +163,137 @@ func (s *campaignService) GetCampaignsForApp(ctx context.Context) ([]models.Camp
return campaigns, nil
}
// Campaign Rules methods
func (s *campaignService) CreateCampaignRule(ctx context.Context, req *contract.CreateCampaignRuleRequest) (*models.CampaignRuleResponse, error) {
// Validate rule type
if err := s.validateRuleType(req.RuleType); err != nil {
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate reward type
if err := s.validateRewardType(req.RewardType); err != nil {
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate reward value based on reward type
if req.RewardType == "POINTS" || req.RewardType == "TOKENS" {
if req.RewardValue == nil || *req.RewardValue <= 0 {
return nil, fmt.Errorf("reward value must be positive for %s type", req.RewardType)
}
}
// Validate reward reference ID for REWARD type
if req.RewardType == "REWARD" {
if req.RewardRefID == nil {
return nil, fmt.Errorf("reward reference ID is required for REWARD type")
}
}
response, err := s.campaignRuleProcessor.CreateCampaignRule(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to create campaign rule: %w", err)
}
return response, nil
}
func (s *campaignService) GetCampaignRule(ctx context.Context, id string) (*models.CampaignRuleResponse, error) {
if id == "" {
return nil, fmt.Errorf("campaign rule ID is required")
}
response, err := s.campaignRuleProcessor.GetCampaignRule(ctx, id)
if err != nil {
return nil, fmt.Errorf("failed to get campaign rule: %w", err)
}
return response, nil
}
func (s *campaignService) ListCampaignRules(ctx context.Context, req *contract.ListCampaignRulesRequest) (*models.ListCampaignRulesResponse, error) {
// Set default pagination
if req.Page <= 0 {
req.Page = 1
}
if req.Limit <= 0 {
req.Limit = 10
}
if req.Limit > 100 {
req.Limit = 100
}
response, err := s.campaignRuleProcessor.ListCampaignRules(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to list campaign rules: %w", err)
}
return response, nil
}
func (s *campaignService) UpdateCampaignRule(ctx context.Context, req *contract.UpdateCampaignRuleRequest) (*models.CampaignRuleResponse, error) {
if req.ID.String() == "" {
return nil, fmt.Errorf("campaign rule ID is required")
}
// Validate rule type
if err := s.validateRuleType(req.RuleType); err != nil {
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate reward type
if err := s.validateRewardType(req.RewardType); err != nil {
return nil, fmt.Errorf("validation failed: %w", err)
}
// Validate reward value based on reward type
if req.RewardType == "POINTS" || req.RewardType == "TOKENS" {
if req.RewardValue == nil || *req.RewardValue <= 0 {
return nil, fmt.Errorf("reward value must be positive for %s type", req.RewardType)
}
}
// Validate reward reference ID for REWARD type
if req.RewardType == "REWARD" {
if req.RewardRefID == nil {
return nil, fmt.Errorf("reward reference ID is required for REWARD type")
}
}
response, err := s.campaignRuleProcessor.UpdateCampaignRule(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to update campaign rule: %w", err)
}
return response, nil
}
func (s *campaignService) DeleteCampaignRule(ctx context.Context, id string) error {
if id == "" {
return fmt.Errorf("campaign rule ID is required")
}
err := s.campaignRuleProcessor.DeleteCampaignRule(ctx, id)
if err != nil {
return fmt.Errorf("failed to delete campaign rule: %w", err)
}
return nil
}
func (s *campaignService) GetCampaignRulesByCampaignID(ctx context.Context, campaignID string) ([]models.CampaignRuleResponse, error) {
if campaignID == "" {
return nil, fmt.Errorf("campaign ID is required")
}
rules, err := s.campaignRuleProcessor.GetCampaignRulesByCampaignID(ctx, campaignID)
if err != nil {
return nil, fmt.Errorf("failed to get campaign rules by campaign ID: %w", err)
}
return rules, nil
}
func (s *campaignService) validateCampaignType(campaignType string) error {
validTypes := []string{"REWARD", "POINTS", "TOKENS", "MIXED"}
for _, validType := range validTypes {