重构部分枚举, 让models包不依赖其他项目中的包
This commit is contained in:
@@ -11,8 +11,6 @@ import (
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/notify"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Service 定义了通知领域的核心业务逻辑接口
|
||||
@@ -24,14 +22,14 @@ type Service interface {
|
||||
BroadcastAlarm(ctx context.Context, content notify.AlarmContent) error
|
||||
|
||||
// SendTestMessage 向指定用户发送一条测试消息,用于手动验证特定通知渠道的配置。
|
||||
SendTestMessage(ctx context.Context, userID uint, notifierType notify.NotifierType) error
|
||||
SendTestMessage(ctx context.Context, userID uint, notifierType models.NotifierType) error
|
||||
}
|
||||
|
||||
// failoverService 是 Service 接口的实现,提供了故障转移功能
|
||||
type failoverService struct {
|
||||
ctx context.Context
|
||||
userRepo repository.UserRepository
|
||||
notifiers map[notify.NotifierType]notify.Notifier
|
||||
notifiers map[models.NotifierType]notify.Notifier
|
||||
primaryNotifier notify.Notifier
|
||||
failureThreshold int
|
||||
failureCounters *sync.Map // 使用 sync.Map 来安全地并发读写失败计数, key: userID (uint), value: counter (int)
|
||||
@@ -43,11 +41,11 @@ func NewFailoverService(
|
||||
ctx context.Context,
|
||||
userRepo repository.UserRepository,
|
||||
notifiers []notify.Notifier,
|
||||
primaryNotifierType notify.NotifierType,
|
||||
primaryNotifierType models.NotifierType,
|
||||
failureThreshold int,
|
||||
notificationRepo repository.NotificationRepository,
|
||||
) (Service, error) {
|
||||
notifierMap := make(map[notify.NotifierType]notify.Notifier)
|
||||
notifierMap := make(map[models.NotifierType]notify.Notifier)
|
||||
for _, n := range notifiers {
|
||||
notifierMap[n.Type()] = n
|
||||
}
|
||||
@@ -189,7 +187,7 @@ func (s *failoverService) sendAlarmToUser(ctx context.Context, userID uint, cont
|
||||
}
|
||||
|
||||
// SendTestMessage 实现了手动发送测试消息的功能
|
||||
func (s *failoverService) SendTestMessage(ctx context.Context, userID uint, notifierType notify.NotifierType) error {
|
||||
func (s *failoverService) SendTestMessage(ctx context.Context, userID uint, notifierType models.NotifierType) error {
|
||||
serviceCtx, logger := logs.Trace(ctx, s.ctx, "SendTestMessage")
|
||||
user, err := s.userRepo.FindByID(serviceCtx, userID)
|
||||
if err != nil {
|
||||
@@ -210,7 +208,7 @@ func (s *failoverService) SendTestMessage(ctx context.Context, userID uint, noti
|
||||
s.recordNotificationAttempt(serviceCtx, userID, notifierType, notify.AlarmContent{
|
||||
Title: "通知服务测试",
|
||||
Message: fmt.Sprintf("这是一条来自【%s】渠道的测试消息。如果您收到此消息,说明您的配置正确。", notifierType),
|
||||
Level: zap.InfoLevel,
|
||||
Level: models.InfoLevel,
|
||||
Timestamp: time.Now(),
|
||||
}, "", models.NotificationStatusFailed, fmt.Errorf("用户未配置通知方式 '%s' 的地址", notifierType))
|
||||
return fmt.Errorf("用户未配置通知方式 '%s' 的地址", notifierType)
|
||||
@@ -219,7 +217,7 @@ func (s *failoverService) SendTestMessage(ctx context.Context, userID uint, noti
|
||||
testContent := notify.AlarmContent{
|
||||
Title: "通知服务测试",
|
||||
Message: fmt.Sprintf("这是一条来自【%s】渠道的测试消息。如果您收到此消息,说明您的配置正确。", notifierType),
|
||||
Level: zap.InfoLevel,
|
||||
Level: models.InfoLevel,
|
||||
Timestamp: time.Now(),
|
||||
}
|
||||
|
||||
@@ -239,15 +237,15 @@ func (s *failoverService) SendTestMessage(ctx context.Context, userID uint, noti
|
||||
}
|
||||
|
||||
// getAddressForNotifier 是一个辅助函数,根据通知器类型从 ContactInfo 中获取对应的地址
|
||||
func getAddressForNotifier(notifierType notify.NotifierType, contact models.ContactInfo) string {
|
||||
func getAddressForNotifier(notifierType models.NotifierType, contact models.ContactInfo) string {
|
||||
switch notifierType {
|
||||
case notify.NotifierTypeSMTP:
|
||||
case models.NotifierTypeSMTP:
|
||||
return contact.Email
|
||||
case notify.NotifierTypeWeChat:
|
||||
case models.NotifierTypeWeChat:
|
||||
return contact.WeChat
|
||||
case notify.NotifierTypeLark:
|
||||
case models.NotifierTypeLark:
|
||||
return contact.Feishu
|
||||
case notify.NotifierTypeLog:
|
||||
case models.NotifierTypeLog:
|
||||
return "log" // LogNotifier不需要具体的地址,但为了函数签名一致性,返回一个无意义的非空字符串以绕过配置存在检查
|
||||
default:
|
||||
return ""
|
||||
@@ -264,7 +262,7 @@ func getAddressForNotifier(notifierType notify.NotifierType, contact models.Cont
|
||||
func (s *failoverService) recordNotificationAttempt(
|
||||
ctx context.Context,
|
||||
userID uint,
|
||||
notifierType notify.NotifierType,
|
||||
notifierType models.NotifierType,
|
||||
content notify.AlarmContent,
|
||||
toAddress string,
|
||||
status models.NotificationStatus,
|
||||
@@ -281,7 +279,7 @@ func (s *failoverService) recordNotificationAttempt(
|
||||
UserID: userID,
|
||||
Title: content.Title,
|
||||
Message: content.Message,
|
||||
Level: models.LogLevel(content.Level),
|
||||
Level: content.Level,
|
||||
AlarmTimestamp: content.Timestamp,
|
||||
ToAddress: toAddress,
|
||||
Status: status,
|
||||
|
||||
Reference in New Issue
Block a user