backend/pkg/notification/repository/mitake_sms_sender.go

64 lines
1.6 KiB
Go

package repository
import (
"backend/pkg/notification/config"
"backend/pkg/notification/domain"
"backend/pkg/notification/domain/repository"
"context"
"fmt"
"backend/pkg/library/errs"
"backend/pkg/library/errs/code"
"github.com/minchao/go-mitake"
"github.com/zeromicro/go-zero/core/logx"
)
// MitakeSMSDeliveryParam 三竹傳送參數配置
type MitakeSMSDeliveryParam struct {
Conf *config.MitakeSMSSender
}
type MitakeSMSDeliveryRepository struct {
Client *mitake.Client
}
func (repo *MitakeSMSDeliveryRepository) SendSMS(ctx context.Context, req repository.SMSMessageRequest) error {
// 檢查 context 是否已取消
if ctx.Err() != nil {
return ctx.Err()
}
// 構建簡訊訊息
message := mitake.Message{
Dstaddr: req.PhoneNumber,
Destname: req.RecipientName,
Smbody: req.MessageContent,
}
// 直接發送,不使用 goroutine pool
// 讓 delivery usecase 統一管理重試和超時
_, err := repo.Client.Send(message)
if err != nil {
return errs.ThirdPartyErrorL(
code.CloudEPNotification,
domain.FailedToSendSMSErrorCode,
logx.WithContext(ctx),
[]logx.LogField{
{Key: "req", Value: req},
{Key: "func", Value: "MitakeSMSDeliveryRepository.Send"},
{Key: "err", Value: err.Error()},
},
fmt.Sprintf("failed to send sms by mitake: %v", err)).Wrap(err)
}
logx.WithContext(ctx).Infof("SMS sent successfully via Mitake to %s", req.PhoneNumber)
return nil
}
func MustMitakeRepository(param MitakeSMSDeliveryParam) repository.SMSClientRepository {
return &MitakeSMSDeliveryRepository{
Client: mitake.NewClient(param.Conf.User, param.Conf.Password, nil),
}
}