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