Add Campaign
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
package entities
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type CampaignType string
|
||||
|
||||
const (
|
||||
CampaignTypeReward CampaignType = "REWARD"
|
||||
CampaignTypePoints CampaignType = "POINTS"
|
||||
CampaignTypeTokens CampaignType = "TOKENS"
|
||||
CampaignTypeMixed CampaignType = "MIXED"
|
||||
)
|
||||
|
||||
type RuleType string
|
||||
|
||||
const (
|
||||
RuleTypeTier RuleType = "TIER"
|
||||
RuleTypeSpend RuleType = "SPEND"
|
||||
RuleTypeProduct RuleType = "PRODUCT"
|
||||
RuleTypeCategory RuleType = "CATEGORY"
|
||||
RuleTypeDay RuleType = "DAY"
|
||||
RuleTypeLocation RuleType = "LOCATION"
|
||||
)
|
||||
|
||||
type CampaignRewardType string
|
||||
|
||||
const (
|
||||
CampaignRewardTypePoints CampaignRewardType = "POINTS"
|
||||
CampaignRewardTypeTokens CampaignRewardType = "TOKENS"
|
||||
CampaignRewardTypeReward CampaignRewardType = "REWARD"
|
||||
)
|
||||
|
||||
type RewardSubtype string
|
||||
|
||||
const (
|
||||
RewardSubtypeMultiplier RewardSubtype = "MULTIPLIER"
|
||||
RewardSubtypeSpin RewardSubtype = "SPIN"
|
||||
RewardSubtypeBonus RewardSubtype = "BONUS"
|
||||
RewardSubtypePhysical RewardSubtype = "PHYSICAL"
|
||||
)
|
||||
|
||||
type Campaign struct {
|
||||
ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"`
|
||||
Name string `gorm:"type:varchar(150);not null" json:"name"`
|
||||
Description *string `gorm:"type:text" json:"description,omitempty"`
|
||||
Type CampaignType `gorm:"type:varchar(50);not null" json:"type"`
|
||||
StartDate time.Time `gorm:"type:timestamp;not null" json:"start_date"`
|
||||
EndDate time.Time `gorm:"type:timestamp;not null" json:"end_date"`
|
||||
IsActive bool `gorm:"type:boolean;default:true" json:"is_active"`
|
||||
ShowOnApp bool `gorm:"type:boolean;default:true" json:"show_on_app"`
|
||||
Position int `gorm:"type:int;default:0" json:"position"`
|
||||
Metadata *map[string]interface{} `gorm:"type:jsonb" json:"metadata,omitempty"`
|
||||
CreatedAt time.Time `gorm:"type:timestamp;default:now()" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"type:timestamp;default:now()" json:"updated_at"`
|
||||
|
||||
// Relations
|
||||
Rules []CampaignRule `gorm:"foreignKey:CampaignID;constraint:OnDelete:CASCADE" json:"rules,omitempty"`
|
||||
}
|
||||
|
||||
func (Campaign) TableName() string {
|
||||
return "campaigns"
|
||||
}
|
||||
|
||||
func (c *Campaign) BeforeCreate(tx *gorm.DB) error {
|
||||
if c.ID == uuid.Nil {
|
||||
c.ID = uuid.New()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Campaign) BeforeUpdate(tx *gorm.DB) error {
|
||||
c.UpdatedAt = time.Now()
|
||||
return nil
|
||||
}
|
||||
|
||||
type CampaignRule struct {
|
||||
ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"`
|
||||
CampaignID uuid.UUID `gorm:"type:uuid;not null" json:"campaign_id"`
|
||||
RuleType RuleType `gorm:"type:varchar(50);not null" json:"rule_type"`
|
||||
ConditionValue *string `gorm:"type:varchar(255)" json:"condition_value,omitempty"`
|
||||
RewardType CampaignRewardType `gorm:"type:varchar(50);not null" json:"reward_type"`
|
||||
RewardValue *int64 `gorm:"type:bigint" json:"reward_value,omitempty"`
|
||||
RewardSubtype *RewardSubtype `gorm:"type:varchar(50)" json:"reward_subtype,omitempty"`
|
||||
RewardRefID *uuid.UUID `gorm:"type:uuid" json:"reward_ref_id,omitempty"`
|
||||
Metadata *map[string]interface{} `gorm:"type:jsonb" json:"metadata,omitempty"`
|
||||
CreatedAt time.Time `gorm:"type:timestamp;default:now()" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"type:timestamp;default:now()" json:"updated_at"`
|
||||
|
||||
// Relations
|
||||
Campaign Campaign `gorm:"foreignKey:CampaignID" json:"campaign,omitempty"`
|
||||
}
|
||||
|
||||
func (CampaignRule) TableName() string {
|
||||
return "campaign_rules"
|
||||
}
|
||||
|
||||
func (cr *CampaignRule) BeforeCreate(tx *gorm.DB) error {
|
||||
if cr.ID == uuid.Nil {
|
||||
cr.ID = uuid.New()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cr *CampaignRule) BeforeUpdate(tx *gorm.DB) error {
|
||||
cr.UpdatedAt = time.Now()
|
||||
return nil
|
||||
}
|
||||
|
||||
type ListCampaignsRequest struct {
|
||||
Page int `form:"page" binding:"min=1"`
|
||||
Limit int `form:"limit" binding:"min=1,max=100"`
|
||||
Search string `form:"search"`
|
||||
Type string `form:"type"`
|
||||
IsActive *bool `form:"is_active"`
|
||||
ShowOnApp *bool `form:"show_on_app"`
|
||||
StartDate *time.Time `form:"start_date"`
|
||||
EndDate *time.Time `form:"end_date"`
|
||||
}
|
||||
|
||||
type ListCampaignRulesRequest struct {
|
||||
Page int `form:"page" binding:"min=1"`
|
||||
Limit int `form:"limit" binding:"min=1,max=100"`
|
||||
CampaignID string `form:"campaign_id"`
|
||||
RuleType string `form:"rule_type"`
|
||||
RewardType string `form:"reward_type"`
|
||||
}
|
||||
Reference in New Issue
Block a user