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.

117 lines
3.0 KiB
Go

package auth
import (
"context"
"git.noahlan.cn/n-admin/n-admin-server/dal/errx"
"git.noahlan.cn/n-admin/n-admin-server/rpc/core/types/core"
"git.noahlan.cn/noahlan/ntool-biz/core/nstatus"
"git.noahlan.cn/noahlan/ntool-biz/core/nstatus/msg"
"git.noahlan.cn/noahlan/ntool/nstd/tea"
"git.noahlan.cn/noahlan/ntool/nstr"
"git.noahlan.cn/n-admin/n-admin-server/api/internal/svc"
"git.noahlan.cn/n-admin/n-admin-server/api/internal/types"
"net/http"
)
type LoginByCodeLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
r *http.Request
}
func NewLoginByCodeLogic(r *http.Request, ctx context.Context, svcCtx *svc.ServiceContext) *LoginByCodeLogic {
return &LoginByCodeLogic{
r: r,
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *LoginByCodeLogic) LoginByCode(req *types.LoginReq) (resp *types.LoginResp, err error) {
if err := l.svcCtx.Captcha.Verify(req.CaptchaId, req.Captcha, true); err != nil {
return nil, err
}
var user *core.UserInfo
if nstr.IsChineseMobile(req.Subject) {
// mobile
user, err = l.getUserByPhone(req.Subject, req.Credentials)
} else if nstr.IsEmpty(req.Subject) {
// email
user, err = l.getUserByEmail(req.Subject, req.Credentials)
} else {
return nil, nstatus.NewBizErrWithCode(errx.NeedPhoneOrEmail)
}
if err != nil {
return nil, err
}
// 登录
resp, err = login(l.ctx, l.svcCtx, l.r, user)
if err != nil {
return nil, err
}
return
}
func (l *LoginByCodeLogic) getUserByPhone(phone, credentials string) (*core.UserInfo, error) {
// 验证
code, _, err := l.svcCtx.CodeCache.GetCachedCode(phone, types.CodeSourceSms, types.SmsCodeTypeLogin)
if err != nil {
return nil, nstatus.NewApiInternalErr(msg.CacheError)
}
if credentials != code {
return nil, nstatus.NewBizErrWithCode(errx.WrongCode)
}
dbData, err := l.svcCtx.CoreRpc.GetUser(l.ctx, &core.UserReq{
PhoneNumber: phone,
})
if err != nil {
if nstatus.IsNotFound(err) {
dbData, err = register(l.ctx, l.svcCtx, &core.UserInfo{
Username: phone,
PhoneNumber: &phone,
Password: l.svcCtx.Config.RegisterConf.DefaultPassword,
Nickname: tea.String("手机用户" + phone),
})
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
return dbData, nil
}
func (l *LoginByCodeLogic) getUserByEmail(subject, credentials string) (*core.UserInfo, error) {
// 验证
code, _, err := l.svcCtx.CodeCache.GetCachedCode(subject, types.CodeSourceEmail, types.SmsCodeTypeLogin)
if err != nil {
return nil, nstatus.NewApiInternalErr(msg.CacheError)
}
if credentials != code {
return nil, nstatus.NewBizErrWithCode(errx.WrongCode)
}
dbData, err := l.svcCtx.CoreRpc.GetUser(l.ctx, &core.UserReq{
Email: subject,
})
if err != nil {
if nstatus.IsNotFound(err) {
dbData, err = register(l.ctx, l.svcCtx, &core.UserInfo{
Username: subject,
Email: &subject,
Password: l.svcCtx.Config.RegisterConf.DefaultPassword,
Nickname: tea.String("邮箱用户" + subject),
})
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
return dbData, nil
}