notification

This commit is contained in:
efrilm 2025-09-21 16:51:26 +07:00
parent 709ffda4e1
commit ca2acfd850

View File

@ -730,6 +730,11 @@ func (s *LetterOutgoingServiceImpl) CreateDiscussion(ctx context.Context, letter
return nil, err return nil, err
} }
if s.notificationProcessor != nil && req.Mentions != nil {
go s.sendOutgoingDiscussionMentionNotifications(context.Background(), letterID, userID, req.Mentions, req.Message)
}
return transformDiscussionToResponse(result), nil return transformDiscussionToResponse(result), nil
} }
@ -1633,3 +1638,86 @@ func (s *LetterOutgoingServiceImpl) sendApprovalNotificationToCreator(ctx contex
log.Printf("[DEBUG] Successfully sent notification to creator %s", creatorID.String()) log.Printf("[DEBUG] Successfully sent notification to creator %s", creatorID.String())
} }
} }
func (s *LetterOutgoingServiceImpl) sendOutgoingDiscussionMentionNotifications(ctx context.Context, letterID uuid.UUID, senderUserID uuid.UUID, mentions map[string]interface{}, message string) {
log.Printf("[DEBUG] sendOutgoingDiscussionMentionNotifications START - LetterID: %s", letterID.String())
// Extract user_ids dari mentions
userIDs := s.extractUserIDsFromMentions(mentions)
if len(userIDs) == 0 {
log.Printf("[DEBUG] No user IDs found in mentions")
return
}
log.Printf("[DEBUG] Found %d mentioned users", len(userIDs))
// Get letter details untuk notification
letter, err := s.processor.GetOutgoingLetterByID(ctx, letterID)
if err != nil {
log.Printf("[ERROR] Failed to get letter details: %v", err)
return
}
// Get sender user name dari context (bisa juga dari user service)
appContext := appcontext.FromGinContext(ctx)
senderName := appContext.UserName
if senderName == "" {
senderName = "Seseorang" // fallback jika nama tidak tersedia
}
// Kirim notification ke setiap mentioned user
for _, mentionedUserID := range userIDs {
// Jangan kirim notification ke sender sendiri
if mentionedUserID == senderUserID {
continue
}
subject := "Anda Disebutkan dalam Diskusi Surat Keluar"
notificationMessage := fmt.Sprintf("%s menyebutkan Anda dalam diskusi surat keluar: %s", senderName, letter.Subject)
err := s.notificationProcessor.SendOutgoingLetterNotification(
ctx,
letterID,
mentionedUserID,
subject,
notificationMessage)
if err != nil {
log.Printf("[ERROR] Failed to send mention notification to user %s: %v", mentionedUserID.String(), err)
} else {
log.Printf("[DEBUG] Successfully sent mention notification to user %s", mentionedUserID.String())
}
}
}
// Helper function untuk extract user IDs dari mentions map
func (s *LetterOutgoingServiceImpl) extractUserIDsFromMentions(mentions map[string]interface{}) []uuid.UUID {
userIDs := make([]uuid.UUID, 0)
if mentions == nil {
return userIDs
}
if userIDsInterface, exists := mentions["user_ids"]; exists {
switch userIDsValue := userIDsInterface.(type) {
case []interface{}:
for _, userIDInterface := range userIDsValue {
if userIDStr, ok := userIDInterface.(string); ok {
if userID, err := uuid.Parse(userIDStr); err == nil {
userIDs = append(userIDs, userID)
}
}
}
case []string:
for _, userIDStr := range userIDsValue {
if userID, err := uuid.Parse(userIDStr); err == nil {
userIDs = append(userIDs, userID)
}
}
case []uuid.UUID:
userIDs = userIDsValue
}
}
return userIDs
}