new-api/model/promo_code_usage.go
zizi 1de1cdb14f feat: add promo code bonus flow
Add promo code models and APIs, persist selected promo codes on top-up orders, and apply bonus quota idempotently when payments complete.
2026-05-20 12:57:54 +08:00

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
}