simplify client event endpoint
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
565837ad75
commit
31ab84e928
3 changed files with 71 additions and 53 deletions
|
@ -1,52 +1,44 @@
|
|||
use axum::extract::State;
|
||||
use conduwuit::{err, Err, Event, Result};
|
||||
use futures::{try_join, FutureExt, TryFutureExt};
|
||||
use futures::{future::try_join, FutureExt, TryFutureExt};
|
||||
use ruma::api::client::room::get_room_event;
|
||||
|
||||
use crate::{client::ignored_filter, Ruma};
|
||||
use crate::{client::is_ignored_pdu, Ruma};
|
||||
|
||||
/// # `GET /_matrix/client/r0/rooms/{roomId}/event/{eventId}`
|
||||
///
|
||||
/// Gets a single event.
|
||||
pub(crate) async fn get_room_event_route(
|
||||
State(services): State<crate::State>,
|
||||
State(ref services): State<crate::State>,
|
||||
ref body: Ruma<get_room_event::v3::Request>,
|
||||
) -> Result<get_room_event::v3::Response> {
|
||||
let event_id = &body.event_id;
|
||||
let room_id = &body.room_id;
|
||||
|
||||
let event = services
|
||||
.rooms
|
||||
.timeline
|
||||
.get_pdu(&body.event_id)
|
||||
.map_err(|_| err!(Request(NotFound("Event {} not found.", &body.event_id))));
|
||||
|
||||
let token = services
|
||||
.rooms
|
||||
.timeline
|
||||
.get_pdu_count(&body.event_id)
|
||||
.map_err(|_| err!(Request(NotFound("Event not found."))));
|
||||
.get_pdu(event_id)
|
||||
.map_err(|_| err!(Request(NotFound("Event {} not found.", event_id))));
|
||||
|
||||
let visible = services
|
||||
.rooms
|
||||
.state_accessor
|
||||
.user_can_see_event(body.sender_user(), &body.room_id, &body.event_id)
|
||||
.user_can_see_event(body.sender_user(), room_id, event_id)
|
||||
.map(Ok);
|
||||
|
||||
let (token, mut event, visible) = try_join!(token, event, visible)?;
|
||||
let (mut event, visible) = try_join(event, visible).await?;
|
||||
|
||||
if !visible
|
||||
|| ignored_filter(&services, (token, event.clone()), body.sender_user())
|
||||
.await
|
||||
.is_none()
|
||||
{
|
||||
if !visible || is_ignored_pdu(services, &event, body.sender_user()).await {
|
||||
return Err!(Request(Forbidden("You don't have permission to view this event.")));
|
||||
}
|
||||
|
||||
if event.event_id() != &body.event_id || event.room_id() != body.room_id {
|
||||
return Err!(Request(NotFound("Event not found")));
|
||||
}
|
||||
debug_assert!(
|
||||
event.event_id() == event_id && event.room_id() == room_id,
|
||||
"Fetched PDU must match requested"
|
||||
);
|
||||
|
||||
event.add_age().ok();
|
||||
|
||||
let event = event.to_room_event();
|
||||
|
||||
Ok(get_room_event::v3::Response { event })
|
||||
Ok(get_room_event::v3::Response { event: event.to_room_event() })
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue