110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net/http"
|
|
"schisandra-album-cloud-microservices/app/auth/model/mysql/model"
|
|
constant2 "schisandra-album-cloud-microservices/common/constant"
|
|
errors2 "schisandra-album-cloud-microservices/common/errors"
|
|
"schisandra-album-cloud-microservices/common/i18n"
|
|
"schisandra-album-cloud-microservices/common/random_name"
|
|
utils2 "schisandra-album-cloud-microservices/common/utils"
|
|
"strconv"
|
|
|
|
"github.com/yitter/idgenerator-go/idgen"
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
"gorm.io/gorm"
|
|
|
|
"schisandra-album-cloud-microservices/app/auth/api/internal/svc"
|
|
"schisandra-album-cloud-microservices/app/auth/api/internal/types"
|
|
)
|
|
|
|
type PhoneLoginLogic struct {
|
|
logx.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
func NewPhoneLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PhoneLoginLogic {
|
|
return &PhoneLoginLogic{
|
|
Logger: logx.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
func (l *PhoneLoginLogic) PhoneLogin(r *http.Request, req *types.PhoneLoginRequest) (resp *types.LoginResponse, err error) {
|
|
if !utils2.IsPhone(req.Phone) {
|
|
return nil, errors2.New(http.StatusInternalServerError, i18n.FormatText(l.ctx, "captcha.verificationFailure"))
|
|
}
|
|
code := l.svcCtx.RedisClient.Get(l.ctx, constant2.UserSmsRedisPrefix+req.Phone).Val()
|
|
if code == "" {
|
|
return nil, errors2.New(http.StatusInternalServerError, i18n.FormatText(l.ctx, "login.captchaExpired"))
|
|
}
|
|
if req.Captcha != code {
|
|
return nil, errors2.New(http.StatusInternalServerError, i18n.FormatText(l.ctx, "login.captchaError"))
|
|
}
|
|
authUser := l.svcCtx.DB.ScaAuthUser
|
|
userInfo, err := authUser.Where(authUser.Phone.Eq(req.Phone)).First()
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, err
|
|
}
|
|
tx := l.svcCtx.DB.Begin()
|
|
defer func() {
|
|
if recover() != nil || err != nil {
|
|
_ = tx.Rollback()
|
|
}
|
|
}()
|
|
|
|
if userInfo == nil {
|
|
uid := idgen.NextId()
|
|
uidStr := strconv.FormatInt(uid, 10)
|
|
avatar, err := l.svcCtx.PN.Generate(uidStr, false).ToBase64()
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return nil, err
|
|
}
|
|
name := randomname.GenerateName()
|
|
male := constant2.Male
|
|
user := &model.ScaAuthUser{
|
|
UID: uidStr,
|
|
Phone: req.Phone,
|
|
Avatar: avatar,
|
|
Nickname: name,
|
|
Gender: male,
|
|
}
|
|
err = tx.ScaAuthUser.Create(user)
|
|
if err != nil {
|
|
_ = tx.Rollback()
|
|
return nil, err
|
|
}
|
|
_, err = l.svcCtx.CasbinEnforcer.AddRoleForUser(uidStr, constant2.User)
|
|
if err != nil {
|
|
_ = tx.Rollback()
|
|
return nil, err
|
|
}
|
|
data, err := HandleLoginJWT(user, l.svcCtx, req.AutoLogin, r, l.ctx)
|
|
if err != nil {
|
|
_ = tx.Rollback()
|
|
return nil, err
|
|
}
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return data, nil
|
|
} else {
|
|
data, err := HandleLoginJWT(userInfo, l.svcCtx, req.AutoLogin, r, l.ctx)
|
|
if err != nil {
|
|
_ = tx.Rollback()
|
|
return nil, err
|
|
}
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return data, nil
|
|
}
|
|
}
|