Porównaj commity

...

2 Commity

Autor SHA1 Wiadomość Data
Xeronith 5504e98714 refactor(providers): 🧑‍💻 improve messaging and email 2023-06-07 11:02:03 +03:30
Xeronith 9a3a76bf1f chore(project): ⬆️ upgrade dependencies 2023-06-07 10:50:17 +03:30
13 zmienionych plików z 146 dodań i 33 usunięć

Wyświetl plik

@ -117,8 +117,7 @@ func (component *systemComponent) GenerateRSAKeyPair() (string, string, error) {
func (component *systemComponent) Email(destination string, format string, args ...interface{}) {
component.Async(func() {
message := fmt.Sprintf(format, args...)
component.emailProvider.Send(destination, message)
component.emailProvider.Send(destination, format, args...)
})
}

2
go.mod
Wyświetl plik

@ -8,7 +8,7 @@ require (
github.com/robfig/cron v1.2.0
github.com/sendgrid/sendgrid-go v3.12.0+incompatible
github.com/valyala/fastjson v1.6.4
github.com/xeronith/diamante v1.9.0
github.com/xeronith/diamante v1.9.1
google.golang.org/protobuf v1.28.1
)

4
go.sum
Wyświetl plik

@ -62,8 +62,8 @@ github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLr
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/xeronith/diamante v1.9.0 h1:RuhtwLP1iCi9FdxwnLBsROecApIHlF5ompOjFO+cva4=
github.com/xeronith/diamante v1.9.0/go.mod h1:DSw8TsKcdU+Lg+cmgx8aDjRbu2NSOcJRQtialnKHoOU=
github.com/xeronith/diamante v1.9.1 h1:Kg47vqrBybbezFEz2rr/Az2PYyg1O5bagbK5RxAZp2I=
github.com/xeronith/diamante v1.9.1/go.mod h1:DSw8TsKcdU+Lg+cmgx8aDjRbu2NSOcJRQtialnKHoOU=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=

Wyświetl plik

@ -4,9 +4,14 @@ import (
"fmt"
. "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 {
name string
logger ILogger
@ -21,8 +26,8 @@ func NewProvider(name string, logger ILogger, handler IMessagingHandler) IMessag
}
}
func (provider *provider) Send(receiver, message string) error {
if err := provider.handler(receiver, message); err != nil {
func (provider *provider) Send(receiver, message string, model map[string]interface{}) error {
if err := provider.handler(receiver, message, model); err != nil {
provider.logger.Error(fmt.Sprintf("%s: %s", provider.name, err.Error()))
return err
} else {

Wyświetl plik

@ -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
}

Wyświetl plik

@ -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)
}

Wyświetl plik

@ -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)
}
}

Wyświetl plik

@ -1,25 +1,12 @@
package email
import (
"github.com/reiver/greatape/providers/outbound/common/messaging"
"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/messaging"
)
const EmailProvider = "EMAIL_PROVIDER"
type provider struct {
messaging IMessagingProvider
}
func NewProvider(logger logging.ILogger) email.IEmailProvider {
return &provider{
messaging: messaging.NewProvider(EmailProvider, logger, handler),
}
}
func (provider *provider) Send(receiver, message string) error {
return provider.messaging.Send(receiver, message)
return postmark.NewProvider(logger)
}

Wyświetl plik

@ -1,4 +1,4 @@
package email
package sendgrid
import (
"fmt"
@ -9,7 +9,7 @@ import (
"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")
subject := "Subject"
to := mail.NewEmail(receiver, receiver)

Wyświetl plik

@ -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)
}

Wyświetl plik

@ -1,15 +1,15 @@
package email_test
package sendgrid_test
import (
"testing"
"github.com/reiver/greatape/providers/outbound/email"
"github.com/reiver/greatape/providers/outbound/email/sendgrid"
"github.com/xeronith/diamante/logging"
)
func Test_Send(t *testing.T) {
logger := logging.NewLogger(false)
provider := email.NewProvider(logger)
provider := sendgrid.NewProvider(logger)
if err := provider.Send("somebody@somewhere.com", "Message content"); err != nil {
t.Fatal(err)

Wyświetl plik

@ -2,6 +2,6 @@ package sms
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)
}

Wyświetl plik

@ -3,15 +3,13 @@ package sms
import (
"github.com/reiver/greatape/providers/outbound/common/messaging"
"github.com/xeronith/diamante/contracts/logging"
. "github.com/xeronith/diamante/contracts/messaging"
"github.com/xeronith/diamante/contracts/sms"
)
const SMSProvider = "SMS_PROVIDER"
type provider struct {
messaging IMessagingProvider
messaging messaging.IMessagingProvider
}
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 {
return provider.messaging.Send(receiver, message)
return provider.messaging.Send(receiver, message, nil)
}