75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package sms
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"lone-services/pkg/sms/aliyun"
|
|
)
|
|
|
|
type TemplateKind string
|
|
|
|
const (
|
|
TemplateCode TemplateKind = "code"
|
|
TemplatePassword TemplateKind = "password"
|
|
)
|
|
|
|
type SMS interface {
|
|
Send(phone string, templateCode string, params map[string]string) error
|
|
SendByKind(phone string, kind TemplateKind, params map[string]string) error
|
|
Template(kind TemplateKind) string
|
|
Timeout() int
|
|
}
|
|
|
|
type Config struct {
|
|
AccessKeyId string
|
|
AccessKeySecret string
|
|
SignName string
|
|
Endpoint string
|
|
TemplateCode string
|
|
TemplatePwd string
|
|
Timeout int
|
|
}
|
|
|
|
type client struct {
|
|
sender *aliyun.Client
|
|
templates map[TemplateKind]string
|
|
timeout int
|
|
}
|
|
|
|
func New(cfg Config) (SMS, error) {
|
|
if cfg.AccessKeyId == "" || cfg.AccessKeySecret == "" || cfg.SignName == "" {
|
|
return nil, fmt.Errorf("config missing")
|
|
}
|
|
|
|
sender, err := aliyun.New(cfg.AccessKeyId, cfg.AccessKeySecret, cfg.SignName, cfg.Endpoint)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if cfg.Timeout <= 0 {
|
|
cfg.Timeout = 600
|
|
}
|
|
return &client{
|
|
sender: sender,
|
|
templates: map[TemplateKind]string{
|
|
TemplateCode: cfg.TemplateCode,
|
|
TemplatePassword: cfg.TemplatePwd,
|
|
},
|
|
timeout: cfg.Timeout,
|
|
}, nil
|
|
}
|
|
|
|
func (c *client) Send(phone, templateCode string, params map[string]string) error {
|
|
return c.sender.Send(phone, templateCode, params)
|
|
}
|
|
|
|
func (c *client) SendByKind(phone string, kind TemplateKind, params map[string]string) error {
|
|
code := c.Template(kind)
|
|
if code == "" {
|
|
return fmt.Errorf("sms template not configured for kind %s", kind)
|
|
}
|
|
return c.Send(phone, code, params)
|
|
}
|
|
|
|
func (c *client) Template(kind TemplateKind) string { return c.templates[kind] }
|
|
func (c *client) Timeout() int { return c.timeout }
|