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

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
}