Files
kra-new/internal/service/business/password_reset.go
T

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)
}