90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package auth
|
|
|
|
import (
|
|
"backend/internal/domain"
|
|
"backend/pkg/library/errs"
|
|
"backend/pkg/library/errs/code"
|
|
"backend/pkg/member/domain/member"
|
|
"backend/pkg/member/domain/usecase"
|
|
"backend/pkg/permission/domain/entity"
|
|
|
|
"context"
|
|
"fmt"
|
|
|
|
"backend/internal/svc"
|
|
"backend/internal/types"
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
)
|
|
|
|
type ResetPasswordLogic struct {
|
|
logx.Logger
|
|
ctx context.Context
|
|
svcCtx *svc.ServiceContext
|
|
}
|
|
|
|
// NewResetPasswordLogic 執行密碼重設
|
|
func NewResetPasswordLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ResetPasswordLogic {
|
|
return &ResetPasswordLogic{
|
|
Logger: logx.WithContext(ctx),
|
|
ctx: ctx,
|
|
svcCtx: svcCtx,
|
|
}
|
|
}
|
|
|
|
func (l *ResetPasswordLogic) ResetPassword(req *types.ResetPasswordReq) (*types.RespOK, error) {
|
|
// 驗證密碼,兩次密碼要一致
|
|
if req.Password != req.PasswordConfirm {
|
|
return nil, errs.InvalidFormatWithScope(code.CloudEPMember, "password confirmation does not match")
|
|
}
|
|
|
|
// 驗證碼
|
|
err := l.svcCtx.AccountUC.VerifyRefreshCode(l.ctx, usecase.VerifyRefreshCodeRequest{
|
|
LoginID: req.Identifier,
|
|
CodeType: member.GenerateCodeTypeForgetPassword,
|
|
VerifyCode: req.VerifyCode,
|
|
})
|
|
if err != nil {
|
|
// 表使沒有這驗證碼
|
|
return nil, errs.ForbiddenWithScope(code.CloudEPMember, 0, "failed to get verify code")
|
|
}
|
|
|
|
info, err := l.svcCtx.AccountUC.GetUserAccountInfo(l.ctx, usecase.GetUIDByAccountRequest{Account: req.Identifier})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if info.Data.Platform != member.Digimon {
|
|
return nil, errs.ForbiddenWithScope(code.CloudEPMember, 0, "invalid platform")
|
|
}
|
|
|
|
// 更新
|
|
err = l.svcCtx.AccountUC.UpdateUserToken(l.ctx, usecase.UpdateTokenRequest{
|
|
Account: req.Identifier,
|
|
Token: req.Password,
|
|
Platform: member.Digimon.ToInt64(),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rk := domain.GenerateVerifyCodeRedisKey.With(
|
|
fmt.Sprintf("%s-%d", req.Identifier, member.GenerateCodeTypeForgetPassword),
|
|
).ToString()
|
|
|
|
_, _ = l.svcCtx.Redis.Del(rk)
|
|
|
|
ac, err := l.svcCtx.AccountUC.GetUIDByAccount(l.ctx, usecase.GetUIDByAccountRequest{Account: req.Identifier})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = l.svcCtx.TokenUC.CancelTokens(l.ctx, entity.DoTokenByUIDReq{UID: ac.UID})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 返回成功響應
|
|
return &types.RespOK{}, nil
|
|
}
|