tuwunel_api/client/backup/
keys_room.rs1use axum::extract::State;
2use futures::{StreamExt, TryStreamExt};
3use ruma::api::client::backup::{
4 add_backup_keys_for_room, delete_backup_keys_for_room, get_backup_keys_for_room,
5};
6use tuwunel_core::{Result, utils::stream::IterStream};
7
8use super::{check_backup_version, get_count_etag};
9use crate::Ruma;
10
11pub(crate) async fn add_backup_keys_for_room_route(
20 State(services): State<crate::State>,
21 body: Ruma<add_backup_keys_for_room::v3::Request>,
22) -> Result<add_backup_keys_for_room::v3::Response> {
23 check_backup_version(&services, body.sender_user(), &body.version).await?;
24
25 body.sessions
26 .iter()
27 .stream()
28 .map(Ok)
29 .try_for_each(|(sid, kd)| {
30 services.key_backups.add_key(
31 body.sender_user(),
32 &body.version,
33 &body.room_id,
34 sid,
35 kd,
36 )
37 })
38 .await?;
39
40 let (count, etag) = get_count_etag(&services, body.sender_user(), &body.version).await?;
41
42 Ok(add_backup_keys_for_room::v3::Response { count, etag })
43}
44
45pub(crate) async fn get_backup_keys_for_room_route(
49 State(services): State<crate::State>,
50 body: Ruma<get_backup_keys_for_room::v3::Request>,
51) -> Result<get_backup_keys_for_room::v3::Response> {
52 let sessions = services
53 .key_backups
54 .get_room(body.sender_user(), &body.version, &body.room_id)
55 .await;
56
57 Ok(get_backup_keys_for_room::v3::Response { sessions })
58}
59
60pub(crate) async fn delete_backup_keys_for_room_route(
64 State(services): State<crate::State>,
65 body: Ruma<delete_backup_keys_for_room::v3::Request>,
66) -> Result<delete_backup_keys_for_room::v3::Response> {
67 services
68 .key_backups
69 .delete_room_keys(body.sender_user(), &body.version, &body.room_id)
70 .await;
71
72 let (count, etag) = get_count_etag(&services, body.sender_user(), &body.version).await?;
73
74 Ok(delete_backup_keys_for_room::v3::Response { count, etag })
75}