2024-11-06 18:27:40 +00:00
|
|
|
use axum::extract::State;
|
2025-02-23 01:17:45 -05:00
|
|
|
use conduwuit::{Err, Event, Result, err};
|
|
|
|
use futures::{FutureExt, TryFutureExt, future::try_join};
|
2024-11-06 18:27:40 +00:00
|
|
|
use ruma::api::client::room::get_room_event;
|
|
|
|
|
2025-02-23 01:17:45 -05:00
|
|
|
use crate::{Ruma, client::is_ignored_pdu};
|
2024-11-06 18:27:40 +00:00
|
|
|
|
|
|
|
/// # `GET /_matrix/client/r0/rooms/{roomId}/event/{eventId}`
|
|
|
|
///
|
|
|
|
/// Gets a single event.
|
|
|
|
pub(crate) async fn get_room_event_route(
|
2025-02-06 10:23:17 +00:00
|
|
|
State(ref services): State<crate::State>,
|
2024-12-15 00:05:47 -05:00
|
|
|
ref body: Ruma<get_room_event::v3::Request>,
|
2024-11-06 18:27:40 +00:00
|
|
|
) -> Result<get_room_event::v3::Response> {
|
2025-02-06 10:23:17 +00:00
|
|
|
let event_id = &body.event_id;
|
|
|
|
let room_id = &body.room_id;
|
2024-12-04 18:33:12 -05:00
|
|
|
|
2025-02-06 10:23:17 +00:00
|
|
|
let event = services
|
2024-12-04 18:33:12 -05:00
|
|
|
.rooms
|
|
|
|
.timeline
|
2025-02-06 10:23:17 +00:00
|
|
|
.get_pdu(event_id)
|
|
|
|
.map_err(|_| err!(Request(NotFound("Event {} not found.", event_id))));
|
2024-12-04 18:33:12 -05:00
|
|
|
|
|
|
|
let visible = services
|
|
|
|
.rooms
|
|
|
|
.state_accessor
|
2025-02-06 10:23:17 +00:00
|
|
|
.user_can_see_event(body.sender_user(), room_id, event_id)
|
2024-12-04 18:33:12 -05:00
|
|
|
.map(Ok);
|
|
|
|
|
2025-02-06 10:23:17 +00:00
|
|
|
let (mut event, visible) = try_join(event, visible).await?;
|
2024-12-04 18:33:12 -05:00
|
|
|
|
2025-02-06 10:23:17 +00:00
|
|
|
if !visible || is_ignored_pdu(services, &event, body.sender_user()).await {
|
2024-12-04 18:33:12 -05:00
|
|
|
return Err!(Request(Forbidden("You don't have permission to view this event.")));
|
|
|
|
}
|
|
|
|
|
2025-02-06 10:23:17 +00:00
|
|
|
debug_assert!(
|
|
|
|
event.event_id() == event_id && event.room_id() == room_id,
|
|
|
|
"Fetched PDU must match requested"
|
|
|
|
);
|
2024-12-04 18:33:12 -05:00
|
|
|
|
|
|
|
event.add_age().ok();
|
|
|
|
|
2025-03-30 21:19:47 +00:00
|
|
|
Ok(get_room_event::v3::Response { event: event.into_room_event() })
|
2024-11-06 18:27:40 +00:00
|
|
|
}
|