implement (not_)rooms filter on /context

This commit is contained in:
Benjamin Lee 2024-06-03 11:13:18 -07:00
parent 832b41c930
commit 1c0ead0339
No known key found for this signature in database
GPG key ID: FB9624E2885D55A4

View file

@ -9,7 +9,9 @@ use ruma::{
};
use tracing::error;
use crate::{services, Ar, Error, Ra, Result};
use crate::{
services, utils::filter::CompiledRoomEventFilter, Ar, Error, Ra, Result,
};
/// # `GET /_matrix/client/r0/rooms/{roomId}/context`
///
@ -26,6 +28,13 @@ pub(crate) async fn get_context_route(
let sender_device =
body.sender_device.as_ref().expect("user is authenticated");
let Ok(filter) = CompiledRoomEventFilter::try_from(&body.filter) else {
return Err(Error::BadRequest(
ErrorKind::InvalidParam,
"invalid 'filter' parameter",
));
};
let (lazy_load_enabled, lazy_load_send_redundant) =
match &body.filter.lazy_load_options {
LazyLoadOptions::Enabled {
@ -74,6 +83,24 @@ pub(crate) async fn get_context_route(
let base_event = base_event.to_room_event();
if !filter.room_allowed(&body.room_id) {
// The spec states that
//
// > The filter is only applied to events_before, events_after, and
// > state. It is not applied to the event itself.
//
// so we need to fetch the event before we can early-return after
// testing the room filter.
return Ok(Ra(get_context::v3::Response {
start: None,
end: None,
events_before: vec![],
event: Some(base_event),
events_after: vec![],
state: vec![],
}));
}
let events_before: Vec<_> = services()
.rooms
.timeline