64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
notifconfig "gateway/internal/model/notification/config"
|
|
"gateway/internal/model/notification/domain/enum"
|
|
domtpl "gateway/internal/model/notification/domain/template"
|
|
domusecase "gateway/internal/model/notification/domain/usecase"
|
|
"gateway/internal/model/notification/provider/email"
|
|
"gateway/internal/model/notification/provider/sms"
|
|
)
|
|
|
|
type deliveryDeps struct {
|
|
Renderer domtpl.Renderer
|
|
Email *email.Chain
|
|
SMS *sms.Chain
|
|
Config notifconfig.Config
|
|
}
|
|
|
|
func (d deliveryDeps) deliver(ctx context.Context, req *domusecase.SendRequest, rendered *domtpl.Rendered) (provider, messageID string, err error) {
|
|
switch req.Channel {
|
|
case enum.ChannelEmail:
|
|
if d.Email == nil {
|
|
return "", "", fmt.Errorf("email provider chain is not configured")
|
|
}
|
|
return d.Email.Send(ctx, &email.Message{
|
|
From: d.Config.Email.From,
|
|
To: []string{req.Target},
|
|
Subject: rendered.Subject,
|
|
Body: rendered.Body,
|
|
})
|
|
case enum.ChannelSMS:
|
|
if d.SMS == nil {
|
|
return "", "", fmt.Errorf("sms provider chain is not configured")
|
|
}
|
|
name := req.UID
|
|
if name == "" {
|
|
name = "User"
|
|
}
|
|
return d.SMS.Send(ctx, &sms.Message{
|
|
PhoneNumber: req.Target,
|
|
RecipientName: name,
|
|
Body: rendered.SMSText,
|
|
})
|
|
default:
|
|
return "", "", fmt.Errorf("channel %q delivery not implemented", req.Channel)
|
|
}
|
|
}
|
|
|
|
func sendRequestFromJob(job *domusecase.RetryJob) *domusecase.SendRequest {
|
|
return &domusecase.SendRequest{
|
|
TenantID: job.TenantID,
|
|
UID: job.UID,
|
|
Channel: job.Channel,
|
|
Kind: job.Kind,
|
|
Target: job.Target,
|
|
Locale: job.Locale,
|
|
Data: job.Data,
|
|
DoNotPersistBody: job.DoNotPersistBody,
|
|
}
|
|
}
|