60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/pkgs/helpers"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
func (s *Service) SendOtp(ctx context.Context, sentTo string, otpFor domain.OtpFor, medium domain.OtpMedium, provider domain.SMSProvider) error {
|
|
otpCode := helpers.GenerateOTP()
|
|
|
|
message := fmt.Sprintf("Welcome to Fortune bets, your OTP is %s please don't share with anyone.", otpCode)
|
|
|
|
switch medium {
|
|
case domain.OtpMediumSms:
|
|
|
|
switch provider {
|
|
case domain.TwilioSms:
|
|
if err := s.messengerSvc.SendTwilioSMS(ctx, sentTo, message); err != nil {
|
|
return err
|
|
}
|
|
case domain.AfroMessage:
|
|
if err := s.messengerSvc.SendAfroMessageSMS(ctx, sentTo, message); err != nil {
|
|
return err
|
|
}
|
|
default:
|
|
return fmt.Errorf("invalid sms provider: %s", provider)
|
|
}
|
|
case domain.OtpMediumEmail:
|
|
if err := s.messengerSvc.SendEmail(ctx, sentTo, message, "FortuneBets - One Time Password"); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
otp := domain.Otp{
|
|
SentTo: sentTo,
|
|
Medium: medium,
|
|
For: otpFor,
|
|
Otp: otpCode,
|
|
Used: false,
|
|
CreatedAt: time.Now(),
|
|
ExpiresAt: time.Now().Add(OtpExpiry),
|
|
}
|
|
|
|
return s.otpStore.CreateOtp(ctx, otp)
|
|
}
|
|
|
|
func hashPassword(plaintextPassword string) ([]byte, error) {
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(plaintextPassword), 12)
|
|
if err != nil {
|
|
return []byte{}, err
|
|
}
|
|
|
|
return hash, nil
|
|
}
|