kopia lustrzana https://github.com/reiver/greatape
refactor(providers): 🧑💻 improve messaging and email
rodzic
9a3a76bf1f
commit
5504e98714
|
@ -117,8 +117,7 @@ func (component *systemComponent) GenerateRSAKeyPair() (string, string, error) {
|
||||||
|
|
||||||
func (component *systemComponent) Email(destination string, format string, args ...interface{}) {
|
func (component *systemComponent) Email(destination string, format string, args ...interface{}) {
|
||||||
component.Async(func() {
|
component.Async(func() {
|
||||||
message := fmt.Sprintf(format, args...)
|
component.emailProvider.Send(destination, format, args...)
|
||||||
component.emailProvider.Send(destination, message)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,14 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
. "github.com/xeronith/diamante/contracts/logging"
|
. "github.com/xeronith/diamante/contracts/logging"
|
||||||
. "github.com/xeronith/diamante/contracts/messaging"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type IMessagingHandler func(receiver string, template string, model map[string]interface{}) error
|
||||||
|
|
||||||
|
type IMessagingProvider interface {
|
||||||
|
Send(receiver string, template string, model map[string]interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
type provider struct {
|
type provider struct {
|
||||||
name string
|
name string
|
||||||
logger ILogger
|
logger ILogger
|
||||||
|
@ -21,8 +26,8 @@ func NewProvider(name string, logger ILogger, handler IMessagingHandler) IMessag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *provider) Send(receiver, message string) error {
|
func (provider *provider) Send(receiver, message string, model map[string]interface{}) error {
|
||||||
if err := provider.handler(receiver, message); err != nil {
|
if err := provider.handler(receiver, message, model); err != nil {
|
||||||
provider.logger.Error(fmt.Sprintf("%s: %s", provider.name, err.Error()))
|
provider.logger.Error(fmt.Sprintf("%s: %s", provider.name, err.Error()))
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package postmark
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client = &http.Client{}
|
||||||
|
|
||||||
|
func handler(receiver, templateAlias string, model map[string]interface{}) error {
|
||||||
|
emailBody := map[string]interface{}{
|
||||||
|
"From": "GreatApe <no-reply@greatape.stream>",
|
||||||
|
"To": receiver,
|
||||||
|
"TemplateAlias": templateAlias,
|
||||||
|
"TemplateModel": model,
|
||||||
|
}
|
||||||
|
|
||||||
|
requestBody, _ := json.Marshal(emailBody)
|
||||||
|
buffer := bytes.NewBuffer(requestBody)
|
||||||
|
|
||||||
|
r, err := http.NewRequest("POST", "https://api.postmarkapp.com/email/withTemplate", buffer)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
token := os.Getenv("POSTMARK_TOKEN")
|
||||||
|
|
||||||
|
r.Header.Add("Content-Type", "application/json")
|
||||||
|
r.Header.Add("Accept", "application/json")
|
||||||
|
r.Header.Add("X-Postmark-Server-Token", token)
|
||||||
|
|
||||||
|
resp, err := client.Do(r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return fmt.Errorf("error sending email to %s", receiver)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package postmark
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/reiver/greatape/providers/outbound/common/messaging"
|
||||||
|
"github.com/xeronith/diamante/contracts/email"
|
||||||
|
"github.com/xeronith/diamante/contracts/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ProviderName = "POSTMARK_EMAIL_PROVIDER"
|
||||||
|
|
||||||
|
type provider struct {
|
||||||
|
messaging messaging.IMessagingProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProvider(logger logging.ILogger) email.IEmailProvider {
|
||||||
|
return &provider{
|
||||||
|
messaging: messaging.NewProvider(ProviderName, logger, handler),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (provider *provider) Send(receiver, template string, args ...interface{}) error {
|
||||||
|
model := map[string]interface{}{}
|
||||||
|
if len(args) > 0 {
|
||||||
|
if data, ok := args[0].(map[string]interface{}); ok {
|
||||||
|
model = data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider.messaging.Send(receiver, template, model)
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package postmark_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/reiver/greatape/providers/outbound/email/postmark"
|
||||||
|
"github.com/xeronith/diamante/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_Send(t *testing.T) {
|
||||||
|
logger := logging.NewLogger(false)
|
||||||
|
provider := postmark.NewProvider(logger)
|
||||||
|
|
||||||
|
if err := provider.Send("somebody@somewhere.com", "template-alias", map[string]interface{}{}); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,25 +1,12 @@
|
||||||
package email
|
package email
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/reiver/greatape/providers/outbound/common/messaging"
|
|
||||||
"github.com/xeronith/diamante/contracts/logging"
|
"github.com/xeronith/diamante/contracts/logging"
|
||||||
|
|
||||||
|
"github.com/reiver/greatape/providers/outbound/email/postmark"
|
||||||
"github.com/xeronith/diamante/contracts/email"
|
"github.com/xeronith/diamante/contracts/email"
|
||||||
. "github.com/xeronith/diamante/contracts/messaging"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const EmailProvider = "EMAIL_PROVIDER"
|
|
||||||
|
|
||||||
type provider struct {
|
|
||||||
messaging IMessagingProvider
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewProvider(logger logging.ILogger) email.IEmailProvider {
|
func NewProvider(logger logging.ILogger) email.IEmailProvider {
|
||||||
return &provider{
|
return postmark.NewProvider(logger)
|
||||||
messaging: messaging.NewProvider(EmailProvider, logger, handler),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (provider *provider) Send(receiver, message string) error {
|
|
||||||
return provider.messaging.Send(receiver, message)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package email
|
package sendgrid
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -9,7 +9,7 @@ import (
|
||||||
"github.com/sendgrid/sendgrid-go/helpers/mail"
|
"github.com/sendgrid/sendgrid-go/helpers/mail"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handler(receiver, content string) error {
|
func handler(receiver, content string, _ map[string]interface{}) error {
|
||||||
from := mail.NewEmail("Admin", "admin@site")
|
from := mail.NewEmail("Admin", "admin@site")
|
||||||
subject := "Subject"
|
subject := "Subject"
|
||||||
to := mail.NewEmail(receiver, receiver)
|
to := mail.NewEmail(receiver, receiver)
|
|
@ -0,0 +1,30 @@
|
||||||
|
package sendgrid
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/reiver/greatape/providers/outbound/common/messaging"
|
||||||
|
"github.com/xeronith/diamante/contracts/email"
|
||||||
|
"github.com/xeronith/diamante/contracts/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ProviderName = "SENDGRID_EMAIL_PROVIDER"
|
||||||
|
|
||||||
|
type provider struct {
|
||||||
|
messaging messaging.IMessagingProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProvider(logger logging.ILogger) email.IEmailProvider {
|
||||||
|
return &provider{
|
||||||
|
messaging: messaging.NewProvider(ProviderName, logger, handler),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (provider *provider) Send(receiver, template string, args ...interface{}) error {
|
||||||
|
model := map[string]interface{}{}
|
||||||
|
if len(args) > 0 {
|
||||||
|
if data, ok := args[0].(map[string]interface{}); ok {
|
||||||
|
model = data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return provider.messaging.Send(receiver, template, model)
|
||||||
|
}
|
|
@ -1,15 +1,15 @@
|
||||||
package email_test
|
package sendgrid_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/reiver/greatape/providers/outbound/email"
|
"github.com/reiver/greatape/providers/outbound/email/sendgrid"
|
||||||
"github.com/xeronith/diamante/logging"
|
"github.com/xeronith/diamante/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_Send(t *testing.T) {
|
func Test_Send(t *testing.T) {
|
||||||
logger := logging.NewLogger(false)
|
logger := logging.NewLogger(false)
|
||||||
provider := email.NewProvider(logger)
|
provider := sendgrid.NewProvider(logger)
|
||||||
|
|
||||||
if err := provider.Send("somebody@somewhere.com", "Message content"); err != nil {
|
if err := provider.Send("somebody@somewhere.com", "Message content"); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
|
@ -2,6 +2,6 @@ package sms
|
||||||
|
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
func handler(receiver, message string) error {
|
func handler(receiver, message string, _ map[string]interface{}) error {
|
||||||
return fmt.Errorf("not_implemented %s %s", receiver, message)
|
return fmt.Errorf("not_implemented %s %s", receiver, message)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,15 +3,13 @@ package sms
|
||||||
import (
|
import (
|
||||||
"github.com/reiver/greatape/providers/outbound/common/messaging"
|
"github.com/reiver/greatape/providers/outbound/common/messaging"
|
||||||
"github.com/xeronith/diamante/contracts/logging"
|
"github.com/xeronith/diamante/contracts/logging"
|
||||||
|
|
||||||
. "github.com/xeronith/diamante/contracts/messaging"
|
|
||||||
"github.com/xeronith/diamante/contracts/sms"
|
"github.com/xeronith/diamante/contracts/sms"
|
||||||
)
|
)
|
||||||
|
|
||||||
const SMSProvider = "SMS_PROVIDER"
|
const SMSProvider = "SMS_PROVIDER"
|
||||||
|
|
||||||
type provider struct {
|
type provider struct {
|
||||||
messaging IMessagingProvider
|
messaging messaging.IMessagingProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewProvider(logger logging.ILogger) sms.ISMSProvider {
|
func NewProvider(logger logging.ILogger) sms.ISMSProvider {
|
||||||
|
@ -21,5 +19,5 @@ func NewProvider(logger logging.ILogger) sms.ISMSProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *provider) Send(receiver, message string) error {
|
func (provider *provider) Send(receiver, message string) error {
|
||||||
return provider.messaging.Send(receiver, message)
|
return provider.messaging.Send(receiver, message, nil)
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue