Skip to content
Snippets Groups Projects
redact.rs 1.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • Timo Kösters's avatar
    Timo Kösters committed
    use std::sync::Arc;
    
    
    Timo Kösters's avatar
    Timo Kösters committed
    use crate::{service::pdu::PduBuilder, services, Result, Ruma};
    
    use ruma::{
    
    Jonathan de Jong's avatar
    Jonathan de Jong committed
        api::client::redact::redact_event,
    
    Kévin Commaille's avatar
    Kévin Commaille committed
        events::{room::redaction::RoomRedactionEventContent, TimelineEventType},
    
    Jonas Platte's avatar
    Jonas Platte committed
    use serde_json::value::to_raw_value;
    
    /// # `PUT /_matrix/client/r0/rooms/{roomId}/redact/{eventId}/{txnId}`
    ///
    /// Tries to send a redaction event into the room.
    ///
    /// - TODO: Handle txn id
    
    pub async fn redact_event_route(
    
    Jonas Platte's avatar
    Jonas Platte committed
        body: Ruma<redact_event::v3::Request>,
    
    Jonathan de Jong's avatar
    Jonathan de Jong committed
    ) -> Result<redact_event::v3::Response> {
    
        let sender_user = body.sender_user.as_ref().expect("user is authenticated");
    
        let body = body.body;
    
    Timo Kösters's avatar
    Timo Kösters committed
        let mutex_state = Arc::clone(
    
    Timo Kösters's avatar
    Timo Kösters committed
            services()
                .globals
    
    Timo Kösters's avatar
    Timo Kösters committed
                .roomid_mutex_state
    
    Timo Kösters's avatar
    Timo Kösters committed
                .write()
                .unwrap()
                .entry(body.room_id.clone())
                .or_default(),
        );
    
    Timo Kösters's avatar
    Timo Kösters committed
        let state_lock = mutex_state.lock().await;
    
    Timo Kösters's avatar
    Timo Kösters committed
    
    
        let event_id = services()
            .rooms
            .timeline
            .build_and_append_pdu(
                PduBuilder {
                    event_type: TimelineEventType::RoomRedaction,
                    content: to_raw_value(&RoomRedactionEventContent {
                        redacts: Some(body.event_id.clone()),
                        reason: body.reason.clone(),
                    })
                    .expect("event is valid, we just created it"),
                    unsigned: None,
                    state_key: None,
                    redacts: Some(body.event_id.into()),
                },
                sender_user,
                &body.room_id,
                &state_lock,
            )
            .await?;
    
    Timo Kösters's avatar
    Timo Kösters committed
        drop(state_lock);
    
    Timo Kösters's avatar
    Timo Kösters committed
    
    
        let event_id = (*event_id).to_owned();
    
    Jonathan de Jong's avatar
    Jonathan de Jong committed
        Ok(redact_event::v3::Response { event_id })