From ecba78e8ccdd25ad41a816233dc3dd04e6695b0e Mon Sep 17 00:00:00 2001 From: kemvl Date: Thu, 28 Mar 2024 00:28:21 +0500 Subject: [PATCH] otp validation is added --- .../delivery/handlers/smpp-otp-handlers.go | 21 +++++++++++++ internal/delivery/routers/smpp-otp-routers.go | 1 + .../interfaces/otp-smpp-repository.go | 4 +++ internal/repository/smpp-otp-repository.go | 31 +++++++++++++------ .../service/interfaces/smpp-otp-service.go | 1 + internal/service/smpp-otp-service.go | 17 ++++++++++ logs/Error.log | 3 ++ logs/Info.log | 5 +++ 8 files changed, 74 insertions(+), 9 deletions(-) diff --git a/internal/delivery/handlers/smpp-otp-handlers.go b/internal/delivery/handlers/smpp-otp-handlers.go index 52199c5..c2359f1 100644 --- a/internal/delivery/handlers/smpp-otp-handlers.go +++ b/internal/delivery/handlers/smpp-otp-handlers.go @@ -39,3 +39,24 @@ func (h *OTPHandler) GenerateAndSaveOTPHandler(w http.ResponseWriter, r *http.Re w.WriteHeader(http.StatusOK) } + +func (h *OTPHandler) ValidateOTPHandler(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + var request struct { + PhoneNumber string `json:"phone_number"` + OTP string `json:"otp"` + } + err := decoder.Decode(&request) + if err != nil { + utils.RespondWithErrorJSON(w, http.StatusBadRequest, "Invalid request payload") + return + } + + err = h.Service.ValidateOTP(request.PhoneNumber, request.OTP) + if err != nil { + utils.RespondWithErrorJSON(w, http.StatusBadRequest, err.Error()) + return + } + + utils.RespondWithJSON(w, http.StatusOK, "OTP validated successfully") +} diff --git a/internal/delivery/routers/smpp-otp-routers.go b/internal/delivery/routers/smpp-otp-routers.go index 53bca4f..d8f44aa 100644 --- a/internal/delivery/routers/smpp-otp-routers.go +++ b/internal/delivery/routers/smpp-otp-routers.go @@ -14,6 +14,7 @@ func SetupOTPRoutes(otpService service.OTPService, logger *logger.Loggers) http. otpHandler := handlers.NewOTPHandler(otpService) otpRouter.Post("/sendOTP", otpHandler.GenerateAndSaveOTPHandler) + otpRouter.Post("/validateOTP", otpHandler.ValidateOTPHandler) return otpRouter } diff --git a/internal/repository/interfaces/otp-smpp-repository.go b/internal/repository/interfaces/otp-smpp-repository.go index 1bea2f7..d8bca4e 100644 --- a/internal/repository/interfaces/otp-smpp-repository.go +++ b/internal/repository/interfaces/otp-smpp-repository.go @@ -1,5 +1,9 @@ package repository +import "time" + type OTPRepository interface { SaveOTP(phoneNumber string, otp string) error + GetOTP(phoneNumber string) (string, error) + GetOTPTimestamp(phoneNumber string) (time.Time, error) } diff --git a/internal/repository/smpp-otp-repository.go b/internal/repository/smpp-otp-repository.go index 0dab0a7..3ff80c7 100644 --- a/internal/repository/smpp-otp-repository.go +++ b/internal/repository/smpp-otp-repository.go @@ -28,17 +28,30 @@ func GenerateOTP() string { } func (r *OTPRepository) SaveOTP(phoneNumber string, otp string) error { - err := r.Client.Watch(func(tx *redis.Tx) error { - err := tx.Set(phoneNumber, otp, 0).Err() - if err != nil { - r.logger.ErrorLogger.Error("Error setting up values into redis: %v", err) - return err - } - return nil - }, phoneNumber) - + err := r.Client.Set(phoneNumber, otp, 5*time.Minute).Err() if err != nil { + r.logger.ErrorLogger.Error("Error setting up values into redis: %v", err) return err } return nil } + +func (r *OTPRepository) GetOTP(phoneNumber string) (string, error) { + otp, err := r.Client.Get(phoneNumber).Result() + if err != nil { + return "", err + } + return otp, nil +} + +func (r *OTPRepository) GetOTPTimestamp(phoneNumber string) (time.Time, error) { + timestamp, err := r.Client.Get(phoneNumber + ":timestamp").Result() + if err != nil { + return time.Time{}, err + } + t, err := time.Parse(time.RFC3339, timestamp) + if err != nil { + return time.Time{}, err + } + return t, nil +} diff --git a/internal/service/interfaces/smpp-otp-service.go b/internal/service/interfaces/smpp-otp-service.go index bbc3b41..6c220fc 100644 --- a/internal/service/interfaces/smpp-otp-service.go +++ b/internal/service/interfaces/smpp-otp-service.go @@ -6,4 +6,5 @@ import ( type OTPService interface { GenerateAndSendOTP(cfg config.Config, phoneNumber string) error + ValidateOTP(phoneNumber string, otp string) error } diff --git a/internal/service/smpp-otp-service.go b/internal/service/smpp-otp-service.go index f0684d7..18e356d 100644 --- a/internal/service/smpp-otp-service.go +++ b/internal/service/smpp-otp-service.go @@ -32,3 +32,20 @@ func (s *OTPService) GenerateAndSaveOTP(phoneNumber string) error { } return nil } + +func (s *OTPService) ValidateOTP(phoneNumber string, otp string) error { + storedOTP, err := s.repository.GetOTP(phoneNumber) + if err != nil { + if err.Error() == "redis: nil" { + return fmt.Errorf("OTP not found or expired") + } + s.logger.ErrorLogger.Error("Error retrieving OTP from repository: %v", err) + return err + } + + if storedOTP != otp { + return fmt.Errorf("OTP does not match") + } + + return nil +} diff --git a/logs/Error.log b/logs/Error.log index e69de29..68bc19f 100644 --- a/logs/Error.log +++ b/logs/Error.log @@ -0,0 +1,3 @@ +time=2024-03-28T00:07:01.216+05:00 level=ERROR msg="Error retrieving OTP timestamp from repository: %v" !BADKEY="redis: nil" +time=2024-03-28T00:09:57.336+05:00 level=ERROR msg="Error retrieving OTP timestamp from repository: %v" !BADKEY="redis: nil" +time=2024-03-28T00:19:15.421+05:00 level=ERROR msg="Error retrieving OTP timestamp from repository: %v" !BADKEY="redis: nil" diff --git a/logs/Info.log b/logs/Info.log index c4e1bc9..d19c959 100644 --- a/logs/Info.log +++ b/logs/Info.log @@ -2,3 +2,8 @@ time=2024-03-27T23:24:15.715+05:00 level=INFO msg="Shutting down the server grac time=2024-03-27T23:31:35.765+05:00 level=INFO msg="Shutting down the server gracefully..." time=2024-03-27T23:39:10.332+05:00 level=INFO msg="Server is up and running" time=2024-03-27T23:39:22.414+05:00 level=INFO msg="Shutting down the server gracefully..." +time=2024-03-28T00:06:29.253+05:00 level=INFO msg="Server is up and running" +time=2024-03-28T00:18:28.728+05:00 level=INFO msg="Shutting down the server gracefully..." +time=2024-03-28T00:18:31.350+05:00 level=INFO msg="Server is up and running" +time=2024-03-28T00:20:32.122+05:00 level=INFO msg="Shutting down the server gracefully..." +time=2024-03-28T00:20:34.708+05:00 level=INFO msg="Server is up and running"