123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package auth
- import (
- "context"
- "github.com/suyuan32/simple-admin-common/config"
- "github.com/suyuan32/simple-admin-common/enum/common"
- "github.com/suyuan32/simple-admin-common/i18n"
- "github.com/suyuan32/simple-admin-common/utils/jwt"
- "github.com/suyuan32/simple-admin-common/utils/pointy"
- "github.com/suyuan32/simple-admin-core/rpc/types/core"
- "github.com/zeromicro/go-zero/core/errorx"
- "net/http"
- "strings"
- "time"
- "wechat-api/internal/logic/fastgpt"
- "wechat-api/internal/svc"
- "wechat-api/internal/types"
- "github.com/zeromicro/go-zero/core/logx"
- )
- type LoginByEmailLogic struct {
- logx.Logger
- ctx context.Context
- svcCtx *svc.ServiceContext
- w http.ResponseWriter
- }
- func NewLoginByEmailLogic(ctx context.Context, svcCtx *svc.ServiceContext, w http.ResponseWriter) *LoginByEmailLogic {
- return &LoginByEmailLogic{
- Logger: logx.WithContext(ctx),
- ctx: ctx,
- svcCtx: svcCtx,
- w: w,
- }
- }
- func (l *LoginByEmailLogic) LoginByEmail(req *types.LoginByEmailReq) (resp *types.LoginResp, err error) {
- if l.svcCtx.Config.LoginConf.LoginVerify != "email" && l.svcCtx.Config.LoginConf.LoginVerify != "sms_or_email" &&
- l.svcCtx.Config.LoginConf.LoginVerify != "all" {
- return nil, errorx.NewCodeAbortedError("login.loginTypeForbidden")
- }
- captchaData, err := l.svcCtx.Rds.Get(l.ctx, config.RedisCaptchaPrefix+req.Email).Result()
- if err != nil {
- logx.Errorw("failed to get captcha data in redis for email validation", logx.Field("detail", err),
- logx.Field("data", req))
- return nil, errorx.NewCodeInvalidArgumentError(i18n.Failed)
- }
- if captchaData != req.Captcha {
- return nil, errorx.NewCodeInvalidArgumentError("login.wrongCaptcha")
- }
- userData, err := l.svcCtx.CoreRpc.GetUserList(l.ctx, &core.UserListReq{
- Page: 1,
- PageSize: 1,
- Email: &req.Email,
- })
- if err != nil {
- return nil, err
- }
- if userData.Total == 0 {
- return nil, errorx.NewCodeInvalidArgumentError("login.userNotExist")
- }
- token, err := jwt.NewJwtToken(l.svcCtx.Config.Auth.AccessSecret, time.Now().Unix(),
- l.svcCtx.Config.Auth.AccessExpire, jwt.WithOption("userId", userData.Data[0].Id), jwt.WithOption("roleId",
- strings.Join(userData.Data[0].RoleCodes, ",")), jwt.WithOption("deptId", userData.Data[0].DepartmentId))
- if err != nil {
- return nil, err
- }
- // add token into database
- expiredAt := time.Now().Add(time.Second * time.Duration(l.svcCtx.Config.Auth.AccessExpire)).UnixMilli()
- _, err = l.svcCtx.CoreRpc.CreateToken(l.ctx, &core.TokenInfo{
- Uuid: userData.Data[0].Id,
- Token: pointy.GetPointer(token),
- Source: pointy.GetPointer("core_user"),
- Status: pointy.GetPointer(uint32(common.StatusNormal)),
- Username: userData.Data[0].Username,
- ExpiredAt: pointy.GetPointer(expiredAt),
- })
- if err != nil {
- return nil, err
- }
- err = l.svcCtx.Rds.Del(l.ctx, config.RedisCaptchaPrefix+req.Email).Err()
- if err != nil {
- logx.Errorw("failed to delete captcha in redis", logx.Field("detail", err))
- }
- //注册cookie 到fastgpt
- fastgptLogic := fastgpt.NewSetTokenLogic(l.ctx, l.svcCtx, l.w)
- userId := func(s *string) string {
- if s == nil {
- return ""
- }
- return *s
- }(userData.Data[0].Id)
- _, err = fastgptLogic.SetTokenByUserId(userId)
- if err != nil {
- return nil, err
- }
- resp = &types.LoginResp{
- BaseDataInfo: types.BaseDataInfo{Msg: l.svcCtx.Trans.Trans(l.ctx, "login.loginSuccessTitle")},
- Data: types.LoginInfo{
- UserId: userId,
- Token: token,
- Expire: uint64(expiredAt),
- },
- }
- return resp, nil
- }
|