57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package user
|
|
|
|
import (
|
|
"Yimaru-Backend/internal/domain"
|
|
"context"
|
|
|
|
"time"
|
|
)
|
|
|
|
func (s *Service) SendResetCode(ctx context.Context, medium domain.OtpMedium, sentTo string, provider domain.SMSProvider) error {
|
|
|
|
var err error
|
|
// check if user exists
|
|
switch medium {
|
|
case domain.OtpMediumEmail:
|
|
_, err = s.userStore.GetUserByEmailPhone(ctx, sentTo, "")
|
|
case domain.OtpMediumSms:
|
|
_, err = s.userStore.GetUserByEmailPhone(ctx, "", sentTo)
|
|
}
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return s.SendOtp(ctx, sentTo, domain.OtpReset, medium, provider)
|
|
|
|
}
|
|
|
|
func (s *Service) ResetPassword(ctx context.Context, resetReq domain.ResetPasswordReq) error {
|
|
|
|
otp, err := s.otpStore.GetOtp(ctx, resetReq.UserName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
user, err := s.userStore.GetUserByUserName(ctx, resetReq.UserName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if otp.Used {
|
|
return domain.ErrOtpAlreadyUsed
|
|
}
|
|
if time.Now().After(otp.ExpiresAt) {
|
|
return domain.ErrOtpExpired
|
|
}
|
|
if otp.Otp != resetReq.OtpCode {
|
|
return domain.ErrInvalidOtp
|
|
}
|
|
|
|
err = s.userStore.UpdatePassword(ctx, resetReq.Password, user.Email, user.PhoneNumber, time.Now())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|