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.
92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
![]()
4 weeks ago
|
package user
|
||
|
|
||
|
import (
|
||
|
"cls/internal/domain/purchase"
|
||
|
domainUser "cls/internal/domain/user"
|
||
|
"cls/pkg/logger"
|
||
|
"cls/pkg/xorm_engine"
|
||
|
"errors"
|
||
|
"xorm.io/builder"
|
||
|
)
|
||
|
|
||
|
// UserAggregateRepositoryORM 用户聚合根仓储实现
|
||
|
type UserAggregateRepositoryORM struct {
|
||
|
engine *xorm_engine.Engine
|
||
|
log logger.Logger
|
||
|
}
|
||
|
|
||
|
var _ domainUser.UserAggregateRepository = (*UserAggregateRepositoryORM)(nil)
|
||
|
|
||
|
func NewUserAggregateRepositoryORM(db *xorm_engine.Engine, logger logger.New) domainUser.UserAggregateRepository {
|
||
|
return &UserAggregateRepositoryORM{
|
||
|
engine: db,
|
||
|
log: logger("panoramic:persistence:user_aggregate"),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (u *UserAggregateRepositoryORM) GetUserAggregate(phone string) (*domainUser.UserAggregate, error) {
|
||
|
// 1. 获取用户信息
|
||
|
user := &domainUser.User{}
|
||
|
exist, err := u.engine.Where(builder.Eq{"phone": phone}).Get(user)
|
||
|
if err != nil {
|
||
|
u.log.Error("获取用户信息失败", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
if !exist {
|
||
|
return nil, errors.New("用户不存在")
|
||
|
}
|
||
|
|
||
|
// 2. 获取用户的购买记录
|
||
|
var purchases []*purchase.Purchase
|
||
|
err = u.engine.Where(builder.Eq{"user_id": user.Id}).Find(&purchases)
|
||
|
if err != nil {
|
||
|
u.log.Error("获取用户购买记录失败", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// 3. 构建用户聚合根
|
||
|
aggregate := domainUser.NewUserAggregate(user)
|
||
|
aggregate.SetPurchases(purchases)
|
||
|
|
||
|
return aggregate, nil
|
||
|
}
|
||
|
|
||
|
func (u *UserAggregateRepositoryORM) SaveUserAggregate(aggregate *domainUser.UserAggregate) error {
|
||
|
// 1. 开启事务
|
||
|
session := u.engine.NewSession()
|
||
|
if err := session.Begin(); err != nil {
|
||
|
u.log.Error("开启事务失败", err)
|
||
|
return err
|
||
|
}
|
||
|
defer func() {
|
||
|
if err := recover(); err != nil {
|
||
|
session.Rollback()
|
||
|
panic(err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
// 2. 更新用户信息
|
||
|
if _, err := session.Where(builder.Eq{"id": aggregate.GetUser().Id}).Update(aggregate.GetUser()); err != nil {
|
||
|
session.Rollback()
|
||
|
u.log.Error("更新用户信息失败", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// 3. 保存购买记录
|
||
|
for _, p := range aggregate.GetPurchases() {
|
||
|
if _, err := session.Insert(p); err != nil {
|
||
|
session.Rollback()
|
||
|
u.log.Error("保存购买记录失败", err)
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 4. 提交事务
|
||
|
if err := session.Commit(); err != nil {
|
||
|
u.log.Error("提交事务失败", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|