From 2516d44cb178547194a66fa9c44930ab9bddd910 Mon Sep 17 00:00:00 2001 From: strawberry Date: Fri, 5 Apr 2024 20:13:23 -0400 Subject: [PATCH] dont 404 and respond+update with default push rules if non-existent Signed-off-by: strawberry --- src/api/client_server/push.rs | 42 +++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/api/client_server/push.rs b/src/api/client_server/push.rs index b97e0d96..71d937a6 100644 --- a/src/api/client_server/push.rs +++ b/src/api/client_server/push.rs @@ -7,12 +7,12 @@ use ruma::{ }, }, events::{push_rules::PushRulesEvent, GlobalAccountDataEventType}, - push::{InsertPushRuleError, RemovePushRuleError}, + push::{InsertPushRuleError, RemovePushRuleError, Ruleset}, }; use crate::{services, Error, Result, Ruma}; -/// # `GET /_matrix/client/r0/pushrules` +/// # `GET /_matrix/client/r0/pushrules/` /// /// Retrieves the push rules event for this user. pub async fn get_pushrules_all_route( @@ -20,18 +20,36 @@ pub async fn get_pushrules_all_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - let event = services() - .account_data - .get(None, sender_user, GlobalAccountDataEventType::PushRules.to_string().into())? - .ok_or(Error::BadRequest(ErrorKind::NotFound, "PushRules event not found."))?; + let event = + services() + .account_data + .get(None, sender_user, GlobalAccountDataEventType::PushRules.to_string().into())?; - let account_data = serde_json::from_str::(event.get()) - .map_err(|_| Error::bad_database("Invalid account data event in db."))? - .content; + if let Some(event) = event { + let account_data = serde_json::from_str::(event.get()) + .map_err(|_| Error::bad_database("Invalid account data event in db."))? + .content; - Ok(get_pushrules_all::v3::Response { - global: account_data.global, - }) + Ok(get_pushrules_all::v3::Response { + global: account_data.global, + }) + } else { + services().account_data.update( + None, + sender_user, + GlobalAccountDataEventType::PushRules.to_string().into(), + &serde_json::to_value(PushRulesEvent { + content: ruma::events::push_rules::PushRulesEventContent { + global: Ruleset::server_default(sender_user), + }, + }) + .expect("to json always works"), + )?; + + Ok(get_pushrules_all::v3::Response { + global: Ruleset::server_default(sender_user), + }) + } } /// # `GET /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}`