conduit/src/client_server/tag.rs

107 lines
3.0 KiB
Rust
Raw Normal View History

2021-07-14 07:07:08 +00:00
use crate::{database::DatabaseGuard, ConduitResult, Ruma};
2020-07-30 16:14:47 +00:00
use ruma::{
api::client::r0::tag::{create_tag, delete_tag, get_tags},
events::EventType,
};
2021-07-14 07:07:08 +00:00
use std::collections::BTreeMap;
2020-07-30 16:14:47 +00:00
#[cfg(feature = "conduit_bin")]
use rocket::{delete, get, put};
#[cfg_attr(
feature = "conduit_bin",
put("/_matrix/client/r0/user/<_>/rooms/<_>/tags/<_>", data = "<body>")
)]
2021-02-28 11:41:03 +00:00
#[tracing::instrument(skip(db, body))]
pub async fn update_tag_route(
2021-07-14 07:07:08 +00:00
db: DatabaseGuard,
2020-09-08 15:32:03 +00:00
body: Ruma<create_tag::Request<'_>>,
2020-07-30 16:14:47 +00:00
) -> ConduitResult<create_tag::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
2020-07-30 16:14:47 +00:00
let mut tags_event = db
.account_data
.get::<ruma::events::tag::TagEvent>(Some(&body.room_id), sender_user, EventType::Tag)?
2020-07-30 16:14:47 +00:00
.unwrap_or_else(|| ruma::events::tag::TagEvent {
content: ruma::events::tag::TagEventContent {
tags: BTreeMap::new(),
},
});
tags_event
.content
.tags
2021-05-07 23:54:24 +00:00
.insert(body.tag.clone().into(), body.tag_info.clone());
2020-07-30 16:14:47 +00:00
db.account_data.update(
Some(&body.room_id),
sender_user,
2020-07-30 16:14:47 +00:00
EventType::Tag,
&tags_event,
&db.globals,
)?;
db.flush().await?;
2020-07-30 16:14:47 +00:00
Ok(create_tag::Response.into())
}
#[cfg_attr(
feature = "conduit_bin",
delete("/_matrix/client/r0/user/<_>/rooms/<_>/tags/<_>", data = "<body>")
)]
2021-02-28 11:41:03 +00:00
#[tracing::instrument(skip(db, body))]
pub async fn delete_tag_route(
2021-07-14 07:07:08 +00:00
db: DatabaseGuard,
2020-09-08 15:32:03 +00:00
body: Ruma<delete_tag::Request<'_>>,
2020-07-30 16:14:47 +00:00
) -> ConduitResult<delete_tag::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
2020-07-30 16:14:47 +00:00
let mut tags_event = db
.account_data
.get::<ruma::events::tag::TagEvent>(Some(&body.room_id), sender_user, EventType::Tag)?
2020-07-30 16:14:47 +00:00
.unwrap_or_else(|| ruma::events::tag::TagEvent {
content: ruma::events::tag::TagEventContent {
tags: BTreeMap::new(),
},
});
2021-05-07 23:54:24 +00:00
tags_event.content.tags.remove(&body.tag.clone().into());
2020-07-30 16:14:47 +00:00
db.account_data.update(
Some(&body.room_id),
sender_user,
2020-07-30 16:14:47 +00:00
EventType::Tag,
&tags_event,
&db.globals,
)?;
db.flush().await?;
2020-07-30 16:14:47 +00:00
Ok(delete_tag::Response.into())
}
#[cfg_attr(
feature = "conduit_bin",
get("/_matrix/client/r0/user/<_>/rooms/<_>/tags", data = "<body>")
)]
2021-02-28 11:41:03 +00:00
#[tracing::instrument(skip(db, body))]
pub async fn get_tags_route(
2021-07-14 07:07:08 +00:00
db: DatabaseGuard,
2020-09-08 15:32:03 +00:00
body: Ruma<get_tags::Request<'_>>,
2020-07-30 16:14:47 +00:00
) -> ConduitResult<get_tags::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
2020-07-30 16:14:47 +00:00
Ok(get_tags::Response {
tags: db
.account_data
.get::<ruma::events::tag::TagEvent>(Some(&body.room_id), sender_user, EventType::Tag)?
2020-07-30 16:14:47 +00:00
.unwrap_or_else(|| ruma::events::tag::TagEvent {
content: ruma::events::tag::TagEventContent {
tags: BTreeMap::new(),
},
})
.content
.tags,
}
.into())
}