feat: add cooldown for request otp
This commit is contained in:
parent
298b0de725
commit
ba4645fef9
|
@ -29,16 +29,35 @@ func NewAuthService(userRepo repositories.UserRepository, roleRepo repositories.
|
||||||
return &authService{userRepo, roleRepo}
|
return &authService{userRepo, roleRepo}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const otpCooldown = 30
|
||||||
|
|
||||||
func (s *authService) RegisterUser(req *dto.RegisterRequest) error {
|
func (s *authService) RegisterUser(req *dto.RegisterRequest) error {
|
||||||
|
|
||||||
|
user, err := s.userRepo.GetUserByPhone(req.Phone)
|
||||||
|
if err == nil && user != nil {
|
||||||
|
return errors.New("phone number already registered")
|
||||||
|
}
|
||||||
|
|
||||||
|
lastOtpSent, err := utils.GetStringData("otp_sent:" + req.Phone)
|
||||||
|
if err == nil && lastOtpSent != "" {
|
||||||
|
lastSentTime, err := time.Parse(time.RFC3339, lastOtpSent)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New("invalid OTP sent timestamp")
|
||||||
|
}
|
||||||
|
|
||||||
|
if time.Since(lastSentTime).Seconds() < otpCooldown {
|
||||||
|
return errors.New("please wait before requesting another OTP")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
userID := uuid.New().String()
|
userID := uuid.New().String()
|
||||||
|
|
||||||
user := &model.User{
|
user = &model.User{
|
||||||
Phone: req.Phone,
|
Phone: req.Phone,
|
||||||
RoleID: req.RoleID,
|
RoleID: req.RoleID,
|
||||||
}
|
}
|
||||||
|
|
||||||
err := utils.SetJSONData("user:"+userID, user, 10*time.Minute)
|
err = utils.SetJSONData("user:"+userID, user, 10*time.Minute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -60,10 +79,21 @@ func (s *authService) RegisterUser(req *dto.RegisterRequest) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = utils.SetStringData("otp_sent:"+req.Phone, time.Now().Format(time.RFC3339), 10*time.Minute)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *authService) VerifyOTP(req *dto.VerifyOTPRequest) (*dto.UserDataResponse, error) {
|
func (s *authService) VerifyOTP(req *dto.VerifyOTPRequest) (*dto.UserDataResponse, error) {
|
||||||
|
|
||||||
|
isLoggedIn, err := utils.GetStringData("user_logged_in:" + req.Phone)
|
||||||
|
if err == nil && isLoggedIn == "true" {
|
||||||
|
return nil, errors.New("you are already logged in")
|
||||||
|
}
|
||||||
|
|
||||||
storedOTP, err := utils.GetStringData("otp:" + req.Phone)
|
storedOTP, err := utils.GetStringData("otp:" + req.Phone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -107,6 +137,11 @@ func (s *authService) VerifyOTP(req *dto.VerifyOTPRequest) (*dto.UserDataRespons
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = utils.SetStringData("user_logged_in:"+req.Phone, "true", 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &dto.UserDataResponse{
|
return &dto.UserDataResponse{
|
||||||
UserID: createdUser.ID,
|
UserID: createdUser.ID,
|
||||||
UserRole: role.RoleName,
|
UserRole: role.RoleName,
|
||||||
|
|
Loading…
Reference in New Issue