chatdesk-ui/auth_v2.169.0/internal/api/sms_provider/sms_provider.go

71 lines
1.7 KiB
Go

package sms_provider
import (
"fmt"
"log"
"os"
"time"
"github.com/supabase/auth/internal/conf"
)
// overrides the SmsProvider set to always return the mock provider
var MockProvider SmsProvider = nil
var defaultTimeout time.Duration = time.Second * 10
const SMSProvider = "sms"
const WhatsappProvider = "whatsapp"
func init() {
timeoutStr := os.Getenv("GOTRUE_INTERNAL_HTTP_TIMEOUT")
if timeoutStr != "" {
if timeout, err := time.ParseDuration(timeoutStr); err != nil {
log.Fatalf("error loading GOTRUE_INTERNAL_HTTP_TIMEOUT: %v", err.Error())
} else if timeout != 0 {
defaultTimeout = timeout
}
}
}
type SmsProvider interface {
SendMessage(phone, message, channel, otp string) (string, error)
VerifyOTP(phone, token string) error
}
func GetSmsProvider(config conf.GlobalConfiguration) (SmsProvider, error) {
if MockProvider != nil {
return MockProvider, nil
}
switch name := config.Sms.Provider; name {
case "twilio":
return NewTwilioProvider(config.Sms.Twilio)
case "messagebird":
return NewMessagebirdProvider(config.Sms.Messagebird)
case "textlocal":
return NewTextlocalProvider(config.Sms.Textlocal)
case "vonage":
return NewVonageProvider(config.Sms.Vonage)
case "twilio_verify":
return NewTwilioVerifyProvider(config.Sms.TwilioVerify)
default:
return nil, fmt.Errorf("sms Provider %s could not be found", name)
}
}
func IsValidMessageChannel(channel string, config *conf.GlobalConfiguration) bool {
if config.Hook.SendSMS.Enabled {
// channel doesn't matter if SMS hook is enabled
return true
}
switch channel {
case SMSProvider:
return true
case WhatsappProvider:
return config.Sms.Provider == "twilio" || config.Sms.Provider == "twilio_verify"
default:
return false
}
}