73 lines
2.3 KiB
Go
73 lines
2.3 KiB
Go
package business
|
|
|
|
import (
|
|
"context"
|
|
"kra/internal/biz/business"
|
|
"kra/internal/service/dto"
|
|
"strings"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
type PasswordResetUsecase interface {
|
|
Check(context.Context, string) (string, error)
|
|
SendCode(context.Context, string) (string, error)
|
|
VerifyCode(context.Context, string, string) (string, error)
|
|
Reset(context.Context, string, string, string) error
|
|
}
|
|
type PasswordResetService struct{ uc PasswordResetUsecase }
|
|
|
|
func NewPasswordResetService(uc *business.PasswordResetUsecase) *PasswordResetService {
|
|
return &PasswordResetService{uc: uc}
|
|
}
|
|
func resetUsername(req *dto.PasswordResetRequest) (string, error) {
|
|
if req == nil || strings.TrimSpace(req.Username) == "" || utf8.RuneCountInString(req.Username) > 30 {
|
|
return "", business.ErrAccountInput
|
|
}
|
|
return strings.TrimSpace(req.Username), nil
|
|
}
|
|
func (s *PasswordResetService) Check(ctx context.Context, req *dto.PasswordResetRequest) (*dto.PasswordResetPhoneResponse, error) {
|
|
name, err := resetUsername(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
phone, err := s.uc.Check(ctx, name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.PasswordResetPhoneResponse{MaskedPhone: phone}, nil
|
|
}
|
|
func (s *PasswordResetService) SendCode(ctx context.Context, req *dto.PasswordResetRequest) (*dto.PasswordResetPhoneResponse, error) {
|
|
name, err := resetUsername(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
phone, err := s.uc.SendCode(ctx, name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.PasswordResetPhoneResponse{MaskedPhone: phone}, nil
|
|
}
|
|
func (s *PasswordResetService) VerifyCode(ctx context.Context, req *dto.PasswordResetRequest) (*dto.PasswordResetTokenResponse, error) {
|
|
name, err := resetUsername(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(req.SMSCode) != 6 {
|
|
return nil, business.ErrResetCode
|
|
}
|
|
token, err := s.uc.VerifyCode(ctx, name, req.SMSCode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.PasswordResetTokenResponse{ResetToken: token}, nil
|
|
}
|
|
func (s *PasswordResetService) Reset(ctx context.Context, req *dto.PasswordResetRequest) error {
|
|
if req == nil || strings.TrimSpace(req.ResetToken) == "" || strings.TrimSpace(req.NewPassword) == "" || strings.TrimSpace(req.ConfirmPassword) == "" {
|
|
return business.ErrAccountInput
|
|
}
|
|
if len(req.ResetToken) != 64 {
|
|
return business.ErrResetToken
|
|
}
|
|
return s.uc.Reset(ctx, req.ResetToken, req.NewPassword, req.ConfirmPassword)
|
|
}
|