separate account_data service methods for room vs global events

Previously we were mashing everything together as RoomAccountDataEvent,
even the global events. This technically worked, because of the hidden
custom fields on the ruma event types, but it's confusing and easy to
mess up. Separate methods with appropriate types are preferable.
This commit is contained in:
Olivia Lee 2025-03-23 02:08:38 -07:00
parent 6897f0ba34
commit 66210bc32d
No known key found for this signature in database
GPG key ID: 54D568A15B9CD1F9
16 changed files with 349 additions and 361 deletions

View file

@ -6,8 +6,8 @@ use std::{
use ruma::{
events::{
ignored_user_list::IgnoredUserListEvent, room::member::MembershipState,
AnyStrippedStateEvent, AnySyncStateEvent, GlobalAccountDataEventType,
RoomAccountDataEventType,
AnyGlobalAccountDataEvent, AnyStrippedStateEvent, AnySyncStateEvent,
GlobalAccountDataEventType, RoomAccountDataEventType,
},
serde::Raw,
OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId,
@ -92,29 +92,21 @@ impl Service {
self.db.mark_as_joined(user_id, room_id)?;
}
MembershipState::Invite => {
let event_kind = RoomAccountDataEventType::from(
GlobalAccountDataEventType::IgnoredUserList.to_string(),
);
// We want to know if the sender is ignored by the receiver
let is_ignored = services()
.account_data
.get(
// Ignored users are in global account data
None,
// Ignored users are in global account data
.get_global(
// Receiver
user_id,
event_kind.clone(),
&GlobalAccountDataEventType::IgnoredUserList,
)?
.map(|event| {
serde_json::from_str::<IgnoredUserListEvent>(
event.get(),
)
event.deserialize_as::<IgnoredUserListEvent>()
.map_err(|error| {
warn!(
%error,
%event_kind,
"Invalid account data event",
"Invalid m.ignored_user_list account data event",
);
Error::BadDatabase("Invalid account data event.")
})
@ -200,20 +192,18 @@ impl Service {
from_room_id: &RoomId,
to_room_id: &RoomId,
) -> Result<()> {
let Some(event) = services().account_data.get(
Some(from_room_id),
let Some(event) = services().account_data.get_room(
from_room_id,
user_id,
RoomAccountDataEventType::Tag,
&RoomAccountDataEventType::Tag,
)?
else {
return Ok(());
};
let event = serde_json::from_str::<serde_json::Value>(event.get())
.expect("RawValue -> Value should always succeed");
if let Err(error) = services().account_data.update(
Some(to_room_id),
if let Err(error) = services().account_data.update_room(
to_room_id,
user_id,
RoomAccountDataEventType::Tag,
&RoomAccountDataEventType::Tag,
&event,
) {
warn!(%error, "error writing m.tag account data to upgraded room");
@ -231,16 +221,15 @@ impl Service {
from_room_id: &RoomId,
to_room_id: &RoomId,
) -> Result<()> {
let event_kind = RoomAccountDataEventType::from(
GlobalAccountDataEventType::Direct.to_string(),
);
let Some(event) =
services().account_data.get(None, user_id, event_kind.clone())?
let Some(event) = services()
.account_data
.get_global(user_id, &GlobalAccountDataEventType::Direct)?
else {
return Ok(());
};
let mut event = serde_json::from_str::<serde_json::Value>(event.get())
let mut event = event
.deserialize_as::<serde_json::Value>()
.expect("RawValue -> Value should always succeed");
// As a server, we should try not to assume anything about the schema
@ -285,13 +274,14 @@ impl Service {
}
if event_updated {
if let Err(error) = services().account_data.update(
None,
if let Err(error) = services().account_data.update_global(
user_id,
event_kind.clone(),
&event,
&GlobalAccountDataEventType::Direct,
&Raw::new(&event)
.expect("json serialization should always succeed")
.cast::<AnyGlobalAccountDataEvent>(),
) {
warn!(%event_kind, %error, "error writing account data event after upgrading room");
warn!(%error, "error writing m.direct account data event after upgrading room");
}
}
Ok(())

View file

@ -417,19 +417,11 @@ impl Service {
let rules_for_user = services()
.account_data
.get(
None,
user,
GlobalAccountDataEventType::PushRules.to_string().into(),
)?
.get_global(user, &GlobalAccountDataEventType::PushRules)?
.map(|event| {
serde_json::from_str::<PushRulesEvent>(event.get()).map_err(
|_| {
Error::bad_database(
"Invalid push rules event in db.",
)
},
)
event.deserialize_as::<PushRulesEvent>().map_err(|_| {
Error::bad_database("Invalid push rules event in db.")
})
})
.transpose()?
.map_or_else(