Files
sundynix-micro-be/app/user/rpc/internal/logic/createUserLogic.go
T
2026-04-27 00:02:18 +08:00

82 lines
2.0 KiB
Go

package logic
import (
"context"
"errors"
"sundynix-micro-go/app/user/model"
"sundynix-micro-go/app/user/rpc/internal/svc"
"sundynix-micro-go/app/user/rpc/user"
"sundynix-micro-go/common/utils/hash"
"sundynix-micro-go/common/utils/uniqueid"
"github.com/zeromicro/go-zero/core/logx"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"gorm.io/gorm"
)
type CreateUserLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewCreateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateUserLogic {
return &CreateUserLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// 创建用户
func (l *CreateUserLogic) CreateUser(in *user.CreateUserReq) (*user.CreateUserResp, error) {
// 如果有OpenID,先检查是否存在
if in.OpenId != "" {
var existing model.SundynixUser
err := l.svcCtx.DB.Where("open_id = ?", in.OpenId).First(&existing).Error
if err == nil {
// 用户已存在,更新session_key
if in.SessionKey != "" {
l.svcCtx.DB.Model(&existing).UpdateColumn("session_key", in.SessionKey)
}
return &user.CreateUserResp{
User: convertUserToProto(&existing),
}, nil
}
if !errors.Is(err, gorm.ErrRecordNotFound) {
l.Errorf("查询用户失败: %v", err)
return nil, status.Error(codes.Internal, "查询用户失败")
}
}
// 创建新用户
name := in.Name
if name == "" {
name = uniqueid.GenerateName("用户")
}
newUser := model.SundynixUser{
Name: name,
OpenID: in.OpenId,
SessionKey: in.SessionKey,
ClientID: in.ClientId,
Phone: in.Phone,
}
// 如果有密码则加密
if in.Phone != "" {
newUser.Password = hash.BcryptHash(in.Phone) // 默认密码为手机号
}
if err := l.svcCtx.DB.Create(&newUser).Error; err != nil {
l.Errorf("创建用户失败: %v", err)
return nil, status.Error(codes.Internal, "创建用户失败")
}
return &user.CreateUserResp{
User: convertUserToProto(&newUser),
}, nil
}