You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
package user
|
|
|
|
import (
|
|
"cls/internal/domain/purchase"
|
|
"errors"
|
|
)
|
|
|
|
// UserAggregate 用户聚合根
|
|
type UserAggregate struct {
|
|
user *User
|
|
purchases []*purchase.Purchase
|
|
}
|
|
|
|
// GetUser 获取用户实体
|
|
func (a *UserAggregate) GetUser() *User {
|
|
return a.user
|
|
}
|
|
|
|
// GetPurchases 获取购买记录列表
|
|
func (a *UserAggregate) GetPurchases() []*purchase.Purchase {
|
|
return a.purchases
|
|
}
|
|
|
|
// SetPurchases 设置购买记录列表
|
|
func (a *UserAggregate) SetPurchases(purchases []*purchase.Purchase) {
|
|
a.purchases = purchases
|
|
}
|
|
|
|
// NewUserAggregate 创建用户聚合根
|
|
func NewUserAggregate(user *User) *UserAggregate {
|
|
return &UserAggregate{
|
|
user: user,
|
|
purchases: make([]*purchase.Purchase, 0),
|
|
}
|
|
}
|
|
|
|
// UnlockArticle 解锁文章
|
|
func (a *UserAggregate) UnlockArticle(articleId uint64) error {
|
|
// 1. 验证赠送次数
|
|
if a.user.GiftCount <= 0 {
|
|
return errors.New("赠送次数不足")
|
|
}
|
|
|
|
// 2. 检查是否已解锁
|
|
if a.HasUnlocked(articleId) {
|
|
return errors.New("文章已解锁")
|
|
}
|
|
|
|
// 3. 创建购买记录
|
|
newPurchase := purchase.NewPurchase(
|
|
a.user.Id,
|
|
articleId,
|
|
purchase.ContentTypeArticle,
|
|
0, // 赠送价格为0,
|
|
0, //表示永久
|
|
)
|
|
newPurchase.ContentSource = purchase.ContentSourceGift
|
|
|
|
// 4. 更新状态
|
|
a.purchases = append(a.purchases, newPurchase)
|
|
a.user.GiftCount--
|
|
|
|
return nil
|
|
}
|
|
|
|
// HasUnlocked 检查是否已解锁
|
|
func (a *UserAggregate) HasUnlocked(articleId uint64) bool {
|
|
for _, p := range a.purchases {
|
|
if p.ContentId == articleId {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|