mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-20 09:11:24 +01:00
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:
parent
6897f0ba34
commit
66210bc32d
16 changed files with 349 additions and 361 deletions
|
|
@ -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(())
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue