From 5e7d4cc838a04428956e7aa7bc798babb2900d99 Mon Sep 17 00:00:00 2001 From: "Calum H." Date: Wed, 3 Jun 2026 14:00:12 +0100 Subject: [PATCH] fix: notifs not live (#6299) * fix: notifs not live * Update apps/labrinth/src/routes/internal/external_notifications.rs Co-authored-by: Sychic <47618543+Sychic@users.noreply.github.com> Signed-off-by: Calum H. * fix: fmt --------- Signed-off-by: Calum H. Co-authored-by: Sychic <47618543+Sychic@users.noreply.github.com> --- .../src/database/models/notification_item.rs | 7 ++-- .../routes/internal/external_notifications.rs | 32 ++++++++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/apps/labrinth/src/database/models/notification_item.rs b/apps/labrinth/src/database/models/notification_item.rs index 14fdb7198..dda5b230f 100644 --- a/apps/labrinth/src/database/models/notification_item.rs +++ b/apps/labrinth/src/database/models/notification_item.rs @@ -204,10 +204,11 @@ impl NotificationBuilder { users: Vec, transaction: &mut PgTransaction<'_>, redis: &RedisPool, - ) -> Result<(), DatabaseError> { - self.insert_many_records(&users, transaction).await?; + ) -> Result, DatabaseError> { + let notification_ids = + self.insert_many_records(&users, transaction).await?; DBNotification::clear_user_notifications_cache(&users, redis).await?; - Ok(()) + Ok(notification_ids) } pub async fn insert_many_deliveries( diff --git a/apps/labrinth/src/routes/internal/external_notifications.rs b/apps/labrinth/src/routes/internal/external_notifications.rs index 3381af196..4a26c4416 100644 --- a/apps/labrinth/src/routes/internal/external_notifications.rs +++ b/apps/labrinth/src/routes/internal/external_notifications.rs @@ -151,12 +151,42 @@ pub async fn create_email_sync( .filter(|id| !already_notified.contains(id)) .collect::>(); - NotificationBuilder { body: body.clone() } + let notification_ids = NotificationBuilder { body: body.clone() } .insert_many_without_delivery(notification_user_ids, &mut txn, &redis) .await?; + let notifications = DBNotification::get_many(¬ification_ids, &mut txn) + .await? + .into_iter() + .map(Notification::from) + .collect::>(); + txn.commit().await?; + for notification in notifications { + let Notification { + user_id: to_user, + id: notification_id, + .. + } = notification; + if let Err(error) = broadcast_friends_message( + &redis, + RedisFriendsMessage::Notification { + to_user, + notification, + }, + ) + .await + { + tracing::warn!( + ?error, + ?notification_id, + ?to_user, + "failed to broadcast realtime notification" + ); + } + } + let mut email_txn = pool.begin().await?; let mut failed = Vec::new();