e61988d78f
Co-authored-by: multica-agent <github@multica.ai>
85 lines
2.8 KiB
Go
85 lines
2.8 KiB
Go
package subscribe_promo
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/perfect-panel/server/internal/model/promo_rule"
|
|
"github.com/redis/go-redis/v9"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type RulePromo struct {
|
|
Id int64
|
|
SubscribeId int64
|
|
PromoRuleId int64
|
|
PromoPrice int64
|
|
RuleName string
|
|
RuleType string
|
|
Params promo_rule.JSONRawMessage
|
|
Priority int64
|
|
StartTime *time.Time
|
|
EndTime *time.Time
|
|
}
|
|
|
|
type customSubscribePromoLogicModel interface {
|
|
FindOneBySubscribeAndRule(ctx context.Context, subscribeId, promoRuleId int64) (*SubscribePromo, error)
|
|
FindBySubscribeId(ctx context.Context, subscribeId int64) ([]*SubscribePromo, error)
|
|
FindByPromoRuleId(ctx context.Context, promoRuleId int64) ([]*SubscribePromo, error)
|
|
QueryEnabledBySubscribeId(ctx context.Context, subscribeId int64) ([]*RulePromo, error)
|
|
}
|
|
|
|
func NewModel(conn *gorm.DB, c *redis.Client) Model {
|
|
return &customSubscribePromoModel{
|
|
defaultSubscribePromoModel: newSubscribePromoModel(conn, c),
|
|
}
|
|
}
|
|
|
|
func (m *customSubscribePromoModel) FindOneBySubscribeAndRule(ctx context.Context, subscribeId, promoRuleId int64) (*SubscribePromo, error) {
|
|
var resp SubscribePromo
|
|
err := m.QueryNoCacheCtx(ctx, &resp, func(conn *gorm.DB, v interface{}) error {
|
|
return conn.Model(&SubscribePromo{}).
|
|
Where("subscribe_id = ? AND promo_rule_id = ?", subscribeId, promoRuleId).
|
|
First(v).Error
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &resp, nil
|
|
}
|
|
|
|
func (m *customSubscribePromoModel) FindBySubscribeId(ctx context.Context, subscribeId int64) ([]*SubscribePromo, error) {
|
|
var list []*SubscribePromo
|
|
err := m.QueryNoCacheCtx(ctx, &list, func(conn *gorm.DB, v interface{}) error {
|
|
return conn.Model(&SubscribePromo{}).
|
|
Where("subscribe_id = ?", subscribeId).
|
|
Order("id DESC").
|
|
Find(v).Error
|
|
})
|
|
return list, err
|
|
}
|
|
|
|
func (m *customSubscribePromoModel) FindByPromoRuleId(ctx context.Context, promoRuleId int64) ([]*SubscribePromo, error) {
|
|
var list []*SubscribePromo
|
|
err := m.QueryNoCacheCtx(ctx, &list, func(conn *gorm.DB, v interface{}) error {
|
|
return conn.Model(&SubscribePromo{}).
|
|
Where("promo_rule_id = ?", promoRuleId).
|
|
Order("id DESC").
|
|
Find(v).Error
|
|
})
|
|
return list, err
|
|
}
|
|
|
|
func (m *customSubscribePromoModel) QueryEnabledBySubscribeId(ctx context.Context, subscribeId int64) ([]*RulePromo, error) {
|
|
var list []*RulePromo
|
|
err := m.QueryNoCacheCtx(ctx, &list, func(conn *gorm.DB, v interface{}) error {
|
|
return conn.Table("subscribe_promo AS sp").
|
|
Select("sp.id, sp.subscribe_id, sp.promo_rule_id, sp.promo_price, pr.name AS rule_name, pr.type AS rule_type, pr.params, pr.priority, pr.start_time, pr.end_time").
|
|
Joins("JOIN promo_rule AS pr ON pr.id = sp.promo_rule_id AND pr.deleted_at IS NULL").
|
|
Where("sp.subscribe_id = ? AND pr.enabled = ?", subscribeId, true).
|
|
Order("pr.priority DESC, pr.id DESC").
|
|
Scan(v).Error
|
|
})
|
|
return list, err
|
|
}
|