Add promo code models and APIs, persist selected promo codes on top-up orders, and apply bonus quota idempotently when payments complete.
42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
type PromoCodeUsage struct {
|
|
Id int `json:"id" gorm:"primaryKey;autoIncrement"`
|
|
PromoCodeId int `json:"promo_code_id" gorm:"not null;index:idx_promo_code_user,unique"`
|
|
UserId int `json:"user_id" gorm:"not null;index:idx_promo_code_user,unique"`
|
|
UsedAt time.Time `json:"used_at" gorm:"not null"`
|
|
}
|
|
|
|
func (PromoCodeUsage) TableName() string {
|
|
return "promo_code_usages"
|
|
}
|
|
|
|
func (u *PromoCodeUsage) Insert() error {
|
|
return DB.Create(u).Error
|
|
}
|
|
|
|
func GetPromoCodeUsageByCodeAndUser(promoCodeId int, userId int) (*PromoCodeUsage, error) {
|
|
var usage PromoCodeUsage
|
|
err := DB.Where("promo_code_id = ? AND user_id = ?", promoCodeId, userId).First(&usage).Error
|
|
return &usage, err
|
|
}
|
|
|
|
func GetPromoCodeUsages(page int, pageSize int, promoCodeId int) ([]PromoCodeUsage, int64, error) {
|
|
var usages []PromoCodeUsage
|
|
var total int64
|
|
query := DB.Model(&PromoCodeUsage{}).Where("promo_code_id = ?", promoCodeId)
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
if page < 1 {
|
|
page = 1
|
|
}
|
|
if pageSize < 1 {
|
|
pageSize = 20
|
|
}
|
|
err := query.Order("id DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&usages).Error
|
|
return usages, total, err
|
|
}
|