Skip to content
Snippets Groups Projects
redact.rs 1.53 KiB
Newer Older
  • Learn to ignore specific revisions
  • Timo Kösters's avatar
    Timo Kösters committed
    use std::sync::Arc;
    
    
    use crate::{database::DatabaseGuard, pdu::PduBuilder, Result, Ruma};
    
    use ruma::{
    
    Jonathan de Jong's avatar
    Jonathan de Jong committed
        api::client::redact::redact_event,
    
    Timo Kösters's avatar
    Timo Kösters committed
        events::{room::redaction::RoomRedactionEventContent, RoomEventType},
    
    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(
    
    Jonathan de Jong's avatar
    Jonathan de Jong committed
        db: DatabaseGuard,
    
    Timo Kösters's avatar
    Timo Kösters committed
        body: Ruma<redact_event::v3::IncomingRequest>,
    
    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
            db.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
    
    
    Timo Kösters's avatar
    Timo Kösters committed
        let event_id = db.rooms.build_and_append_pdu(
            PduBuilder {
    
    Timo Kösters's avatar
    Timo Kösters committed
                event_type: RoomEventType::RoomRedaction,
    
    Jonas Platte's avatar
    Jonas Platte committed
                content: to_raw_value(&RoomRedactionEventContent {
    
    Timo Kösters's avatar
    Timo Kösters committed
                    reason: body.reason.clone(),
                })
                .expect("event is valid, we just created it"),
                unsigned: None,
                state_key: None,
    
                redacts: Some(body.event_id.into()),
    
    Timo Kösters's avatar
    Timo Kösters committed
            },
    
    Timo Kösters's avatar
    Timo Kösters committed
            &body.room_id,
    
    Devin Ragotzy's avatar
    Devin Ragotzy committed
            &db,
    
    Timo Kösters's avatar
    Timo Kösters committed
            &state_lock,
    
    Timo Kösters's avatar
    Timo Kösters committed
        )?;
    
    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 })