diff --git a/docs/src/api/room.md b/docs/src/api/room.md index 5cab76ff..dd877fd7 100644 --- a/docs/src/api/room.md +++ b/docs/src/api/room.md @@ -21,10 +21,11 @@ If either * the room was updated so that the closure datetime was moved from future into the past, * the room was vacuumed -`room.close` event will be sent to room topic. -This event is not guaranteed to be unique, that is two `room.close` events could be sent by the service. +`room.close` event will be sent to room topic and tenant topics. +This event is not guaranteed to be unique for a room, that is two `room.close` events could be sent by the service. **URI:** `rooms/:room_id/events` +**URI:** `audiences/:audience/events` **Label:** `room.close`. diff --git a/src/app/endpoint/room.rs b/src/app/endpoint/room.rs index 464d29f8..654c8c9d 100644 --- a/src/app/endpoint/room.rs +++ b/src/app/endpoint/room.rs @@ -251,14 +251,21 @@ impl RequestHandler for UpdateHandler { let mut responses = vec![response, notification]; let append_closed_notification = || { - let closed_notification = helpers::build_notification( + responses.push(helpers::build_notification( "room.close", &format!("rooms/{}/events", room.id()), + room.clone(), + reqp, + context.start_timestamp(), + )); + + responses.push(helpers::build_notification( + "room.close", + &format!("audiences/{}/events", room.audience()), room, reqp, context.start_timestamp(), - ); - responses.push(closed_notification); + )); }; // Publish room closed notification @@ -810,16 +817,29 @@ mod test { .await .expect("Room update failed"); - assert_eq!(messages.len(), 3); + assert_eq!(messages.len(), 4); + + let (closed_tenant_notification, _, _) = find_event_by_predicate::( + messages.as_slice(), + |evp, _, topic| evp.label() == "room.close" && topic.contains("audiences"), + ) + .expect("Failed to find room.close event"); + + assert_eq!( + closed_tenant_notification + .get("id") + .and_then(|v| v.as_str()), + Some(room.id().to_string()).as_deref() + ); - let (closed_notification, _, _) = - find_event_by_predicate::(messages.as_slice(), |evp, _| { - evp.label() == "room.close" - }) - .expect("Failed to find room.close event"); + let (closed_room_notification, _, _) = find_event_by_predicate::( + messages.as_slice(), + |evp, _, topic| evp.label() == "room.close" && topic.contains("rooms"), + ) + .expect("Failed to find room.close event"); assert_eq!( - closed_notification.get("id").and_then(|v| v.as_str()), + closed_room_notification.get("id").and_then(|v| v.as_str()), Some(room.id().to_string()).as_deref() ); }); diff --git a/src/app/endpoint/system.rs b/src/app/endpoint/system.rs index c4159ff1..731c5421 100644 --- a/src/app/endpoint/system.rs +++ b/src/app/endpoint/system.rs @@ -335,7 +335,7 @@ mod test { assert_eq!(recording.status(), &RecordingStatus::InProgress); - find_event_by_predicate::(&messages, |evp, p| { + find_event_by_predicate::(&messages, |evp, p, _| { evp.label() == "room.close" && p.get("id").and_then(|v| v.as_str()) == Some(rtc.room_id().to_string()).as_deref() diff --git a/src/test_helpers/mod.rs b/src/test_helpers/mod.rs index 02f74c4f..e88426ca 100644 --- a/src/test_helpers/mod.rs +++ b/src/test_helpers/mod.rs @@ -117,11 +117,11 @@ pub(crate) fn find_event_by_predicate( ) -> Option<(P, &OutgoingEventProperties, &str)> where P: DeserializeOwned, - F: Fn(&OutgoingEventProperties, P) -> bool, + F: Fn(&OutgoingEventProperties, P, &str) -> bool, { for message in messages { if let OutgoingEnvelopeProperties::Event(evp) = message.properties() { - if f(evp, message.payload::

()) { + if f(evp, message.payload::

(), message.topic()) { return Some((message.payload::

(), evp, message.topic())); } }