mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-19 08:41:24 +01:00
implement (not_)rooms filter on /context
This commit is contained in:
parent
832b41c930
commit
1c0ead0339
1 changed files with 28 additions and 1 deletions
|
|
@ -9,7 +9,9 @@ use ruma::{
|
||||||
};
|
};
|
||||||
use tracing::error;
|
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`
|
/// # `GET /_matrix/client/r0/rooms/{roomId}/context`
|
||||||
///
|
///
|
||||||
|
|
@ -26,6 +28,13 @@ pub(crate) async fn get_context_route(
|
||||||
let sender_device =
|
let sender_device =
|
||||||
body.sender_device.as_ref().expect("user is authenticated");
|
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) =
|
let (lazy_load_enabled, lazy_load_send_redundant) =
|
||||||
match &body.filter.lazy_load_options {
|
match &body.filter.lazy_load_options {
|
||||||
LazyLoadOptions::Enabled {
|
LazyLoadOptions::Enabled {
|
||||||
|
|
@ -74,6 +83,24 @@ pub(crate) async fn get_context_route(
|
||||||
|
|
||||||
let base_event = base_event.to_room_event();
|
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()
|
let events_before: Vec<_> = services()
|
||||||
.rooms
|
.rooms
|
||||||
.timeline
|
.timeline
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue