diff --git a/internal/contract/campaign_contract.go b/internal/contract/campaign_contract.go index d64bbb5..bb5e479 100644 --- a/internal/contract/campaign_contract.go +++ b/internal/contract/campaign_contract.go @@ -3,33 +3,35 @@ package contract import ( "time" + "apskel-pos-be/internal/entities" + "github.com/google/uuid" ) // Request Contracts type CreateCampaignRequest struct { - Name string `json:"name" binding:"required,min=1,max=150"` - Description *string `json:"description,omitempty"` - Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` - StartDate time.Time `json:"start_date" binding:"required"` - EndDate time.Time `json:"end_date" binding:"required"` - IsActive bool `json:"is_active"` - ShowOnApp bool `json:"show_on_app"` - Position int `json:"position" binding:"min=0"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + Name string `json:"name" binding:"required,min=1,max=150"` + Description *string `json:"description,omitempty"` + Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` + StartDate time.Time `json:"start_date" binding:"required"` + EndDate time.Time `json:"end_date" binding:"required"` + IsActive bool `json:"is_active"` + ShowOnApp bool `json:"show_on_app"` + Position int `json:"position" binding:"min=0"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } type UpdateCampaignRequest struct { - ID uuid.UUID `json:"id" binding:"required"` - Name string `json:"name" binding:"required,min=1,max=150"` - Description *string `json:"description,omitempty"` - Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` - StartDate time.Time `json:"start_date" binding:"required"` - EndDate time.Time `json:"end_date" binding:"required"` - IsActive bool `json:"is_active"` - ShowOnApp bool `json:"show_on_app"` - Position int `json:"position" binding:"min=0"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + ID uuid.UUID `json:"id" binding:"required"` + Name string `json:"name" binding:"required,min=1,max=150"` + Description *string `json:"description,omitempty"` + Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` + StartDate time.Time `json:"start_date" binding:"required"` + EndDate time.Time `json:"end_date" binding:"required"` + IsActive bool `json:"is_active"` + ShowOnApp bool `json:"show_on_app"` + Position int `json:"position" binding:"min=0"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } type ListCampaignsRequest struct { @@ -53,26 +55,26 @@ type DeleteCampaignRequest struct { // Campaign Rule Request Contracts type CreateCampaignRuleRequest struct { - CampaignID uuid.UUID `json:"campaign_id" binding:"required"` - RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + CampaignID uuid.UUID `json:"campaign_id" binding:"required"` + RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } type UpdateCampaignRuleRequest struct { - ID uuid.UUID `json:"id" binding:"required"` - CampaignID uuid.UUID `json:"campaign_id" binding:"required"` - RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + ID uuid.UUID `json:"id" binding:"required"` + CampaignID uuid.UUID `json:"campaign_id" binding:"required"` + RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } type ListCampaignRulesRequest struct { @@ -93,33 +95,33 @@ type DeleteCampaignRuleRequest struct { // Response Contracts type CampaignResponse struct { - ID uuid.UUID `json:"id"` - Name string `json:"name"` - Description *string `json:"description,omitempty"` - Type string `json:"type"` - StartDate time.Time `json:"start_date"` - EndDate time.Time `json:"end_date"` - IsActive bool `json:"is_active"` - ShowOnApp bool `json:"show_on_app"` - Position int `json:"position"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - Rules []CampaignRuleResponse `json:"rules,omitempty"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uuid.UUID `json:"id"` + Name string `json:"name"` + Description *string `json:"description,omitempty"` + Type string `json:"type"` + StartDate time.Time `json:"start_date"` + EndDate time.Time `json:"end_date"` + IsActive bool `json:"is_active"` + ShowOnApp bool `json:"show_on_app"` + Position int `json:"position"` + Metadata *entities.Metadata `json:"metadata,omitempty"` + Rules []CampaignRuleResponse `json:"rules,omitempty"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` } type CampaignRuleResponse struct { - ID uuid.UUID `json:"id"` - CampaignID uuid.UUID `json:"campaign_id"` - RuleType string `json:"rule_type"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uuid.UUID `json:"id"` + CampaignID uuid.UUID `json:"campaign_id"` + RuleType string `json:"rule_type"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` } type ListCampaignsResponse struct { @@ -138,11 +140,11 @@ type ListCampaignRulesResponse struct { // Helper structs type CampaignRuleStruct struct { - RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } diff --git a/internal/entities/campaign.go b/internal/entities/campaign.go index ea4c703..bf76ac5 100644 --- a/internal/entities/campaign.go +++ b/internal/entities/campaign.go @@ -45,18 +45,18 @@ const ( ) 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"` + 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 *Metadata `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"` @@ -79,17 +79,17 @@ func (c *Campaign) BeforeUpdate(tx *gorm.DB) error { } 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"` + 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 *Metadata `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"` diff --git a/internal/models/campaign.go b/internal/models/campaign.go index da9a018..9c65dc6 100644 --- a/internal/models/campaign.go +++ b/internal/models/campaign.go @@ -3,34 +3,36 @@ package models import ( "time" + "apskel-pos-be/internal/entities" + "github.com/google/uuid" ) type CreateCampaignRequest struct { - Name string `json:"name" binding:"required,min=1,max=150"` - Description *string `json:"description,omitempty"` - Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` - StartDate time.Time `json:"start_date" binding:"required"` - EndDate time.Time `json:"end_date" binding:"required"` - IsActive bool `json:"is_active"` - ShowOnApp bool `json:"show_on_app"` - Position int `json:"position" binding:"min=0"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - Rules []CampaignRuleStruct `json:"rules" binding:"required,min=1"` + Name string `json:"name" binding:"required,min=1,max=150"` + Description *string `json:"description,omitempty"` + Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` + StartDate time.Time `json:"start_date" binding:"required"` + EndDate time.Time `json:"end_date" binding:"required"` + IsActive bool `json:"is_active"` + ShowOnApp bool `json:"show_on_app"` + Position int `json:"position" binding:"min=0"` + Metadata *entities.Metadata `json:"metadata,omitempty"` + Rules []CampaignRuleStruct `json:"rules" binding:"required,min=1"` } type UpdateCampaignRequest struct { - ID uuid.UUID `json:"id" binding:"required"` - Name string `json:"name" binding:"required,min=1,max=150"` - Description *string `json:"description,omitempty"` - Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` - StartDate time.Time `json:"start_date" binding:"required"` - EndDate time.Time `json:"end_date" binding:"required"` - IsActive bool `json:"is_active"` - ShowOnApp bool `json:"show_on_app"` - Position int `json:"position" binding:"min=0"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - Rules []CampaignRuleStruct `json:"rules" binding:"required,min=1"` + ID uuid.UUID `json:"id" binding:"required"` + Name string `json:"name" binding:"required,min=1,max=150"` + Description *string `json:"description,omitempty"` + Type string `json:"type" binding:"required,oneof=REWARD POINTS TOKENS MIXED"` + StartDate time.Time `json:"start_date" binding:"required"` + EndDate time.Time `json:"end_date" binding:"required"` + IsActive bool `json:"is_active"` + ShowOnApp bool `json:"show_on_app"` + Position int `json:"position" binding:"min=0"` + Metadata *entities.Metadata `json:"metadata,omitempty"` + Rules []CampaignRuleStruct `json:"rules" binding:"required,min=1"` } type ListCampaignsRequest struct { @@ -45,33 +47,33 @@ type ListCampaignsRequest struct { } type CampaignResponse struct { - ID uuid.UUID `json:"id"` - Name string `json:"name"` - Description *string `json:"description,omitempty"` - Type string `json:"type"` - StartDate time.Time `json:"start_date"` - EndDate time.Time `json:"end_date"` - IsActive bool `json:"is_active"` - ShowOnApp bool `json:"show_on_app"` - Position int `json:"position"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - Rules []CampaignRuleResponse `json:"rules,omitempty"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uuid.UUID `json:"id"` + Name string `json:"name"` + Description *string `json:"description,omitempty"` + Type string `json:"type"` + StartDate time.Time `json:"start_date"` + EndDate time.Time `json:"end_date"` + IsActive bool `json:"is_active"` + ShowOnApp bool `json:"show_on_app"` + Position int `json:"position"` + Metadata *entities.Metadata `json:"metadata,omitempty"` + Rules []CampaignRuleResponse `json:"rules,omitempty"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` } type CampaignRuleResponse struct { - ID uuid.UUID `json:"id"` - CampaignID uuid.UUID `json:"campaign_id"` - RuleType string `json:"rule_type"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ID uuid.UUID `json:"id"` + CampaignID uuid.UUID `json:"campaign_id"` + RuleType string `json:"rule_type"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` } type ListCampaignsResponse struct { @@ -83,26 +85,26 @@ type ListCampaignsResponse struct { // Campaign Rule Models type CreateCampaignRuleRequest struct { - CampaignID uuid.UUID `json:"campaign_id" binding:"required"` - RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + CampaignID uuid.UUID `json:"campaign_id" binding:"required"` + RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } type UpdateCampaignRuleRequest struct { - ID uuid.UUID `json:"id" binding:"required"` - CampaignID uuid.UUID `json:"campaign_id" binding:"required"` - RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + ID uuid.UUID `json:"id" binding:"required"` + CampaignID uuid.UUID `json:"campaign_id" binding:"required"` + RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` } type ListCampaignRulesRequest struct { @@ -122,11 +124,11 @@ type ListCampaignRulesResponse struct { // Helper structs type CampaignRuleStruct struct { - RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` - ConditionValue *string `json:"condition_value,omitempty"` - RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` - RewardValue *int64 `json:"reward_value,omitempty"` - RewardSubtype *string `json:"reward_subtype,omitempty"` - RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` + RuleType string `json:"rule_type" binding:"required,oneof=TIER SPEND PRODUCT CATEGORY DAY LOCATION"` + ConditionValue *string `json:"condition_value,omitempty"` + RewardType string `json:"reward_type" binding:"required,oneof=POINTS TOKENS REWARD"` + RewardValue *int64 `json:"reward_value,omitempty"` + RewardSubtype *string `json:"reward_subtype,omitempty"` + RewardRefID *uuid.UUID `json:"reward_ref_id,omitempty"` + Metadata *entities.Metadata `json:"metadata,omitempty"` }