backend/internal/logic/auth/reset_password_logic.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
}