fix(bonfire): populate cache for calculating permissions (#259)
This commit is contained in:
@@ -23,8 +23,7 @@ impl Cache {
|
|||||||
pub async fn can_view_channel(&self, db: &Database, channel: &Channel) -> bool {
|
pub async fn can_view_channel(&self, db: &Database, channel: &Channel) -> bool {
|
||||||
match &channel {
|
match &channel {
|
||||||
Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => {
|
Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => {
|
||||||
let member = self.members.values().find(|x| &x.id.server == server);
|
let member = self.members.get(server);
|
||||||
|
|
||||||
let server = self.servers.get(server);
|
let server = self.servers.get(server);
|
||||||
let mut perms = perms(self.users.get(&self.user_id).unwrap()).channel(channel);
|
let mut perms = perms(self.users.get(&self.user_id).unwrap()).channel(channel);
|
||||||
|
|
||||||
@@ -107,9 +106,15 @@ impl State {
|
|||||||
|
|
||||||
// Fetch all memberships with their corresponding servers.
|
// Fetch all memberships with their corresponding servers.
|
||||||
let members: Vec<Member> = db.fetch_all_memberships(&user.id).await?;
|
let members: Vec<Member> = db.fetch_all_memberships(&user.id).await?;
|
||||||
|
self.cache.members = members
|
||||||
|
.iter()
|
||||||
|
.cloned()
|
||||||
|
.map(|x| (x.id.server.clone(), x))
|
||||||
|
.collect();
|
||||||
|
|
||||||
let server_ids: Vec<String> = members.iter().map(|x| x.id.server.clone()).collect();
|
let server_ids: Vec<String> = members.iter().map(|x| x.id.server.clone()).collect();
|
||||||
let servers = db.fetch_servers(&server_ids).await?;
|
let servers = db.fetch_servers(&server_ids).await?;
|
||||||
|
self.cache.servers = servers.iter().cloned().map(|x| (x.id.clone(), x)).collect();
|
||||||
|
|
||||||
// Collect channel ids from servers.
|
// Collect channel ids from servers.
|
||||||
let mut channel_ids = vec![];
|
let mut channel_ids = vec![];
|
||||||
@@ -164,17 +169,11 @@ impl State {
|
|||||||
self.cache
|
self.cache
|
||||||
.users
|
.users
|
||||||
.insert(self.cache.user_id.clone(), user.clone());
|
.insert(self.cache.user_id.clone(), user.clone());
|
||||||
self.cache.servers = servers.iter().cloned().map(|x| (x.id.clone(), x)).collect();
|
|
||||||
self.cache.channels = channels
|
self.cache.channels = channels
|
||||||
.iter()
|
.iter()
|
||||||
.cloned()
|
.cloned()
|
||||||
.map(|x| (x.id().to_string(), x))
|
.map(|x| (x.id().to_string(), x))
|
||||||
.collect();
|
.collect();
|
||||||
self.cache.members = members
|
|
||||||
.iter()
|
|
||||||
.cloned()
|
|
||||||
.map(|x| (x.id.server.clone(), x))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
// Make all users appear from our perspective.
|
// Make all users appear from our perspective.
|
||||||
let mut users: Vec<User> = users
|
let mut users: Vec<User> = users
|
||||||
@@ -353,7 +352,7 @@ impl State {
|
|||||||
let could_view: bool = if let Some(channel) = self.cache.channels.get(id) {
|
let could_view: bool = if let Some(channel) = self.cache.channels.get(id) {
|
||||||
self.cache.can_view_channel(db, channel).await
|
self.cache.can_view_channel(db, channel).await
|
||||||
} else {
|
} else {
|
||||||
true
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(channel) = self.cache.channels.get_mut(id) {
|
if let Some(channel) = self.cache.channels.get_mut(id) {
|
||||||
@@ -364,6 +363,12 @@ impl State {
|
|||||||
channel.apply_options(data.clone());
|
channel.apply_options(data.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !self.cache.channels.contains_key(id) {
|
||||||
|
if let Ok(channel) = db.fetch_channel(id).await {
|
||||||
|
self.cache.channels.insert(id.clone(), channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(channel) = self.cache.channels.get(id) {
|
if let Some(channel) = self.cache.channels.get(id) {
|
||||||
let can_view = self.cache.can_view_channel(db, channel).await;
|
let can_view = self.cache.can_view_channel(db, channel).await;
|
||||||
if could_view != can_view {
|
if could_view != can_view {
|
||||||
@@ -398,7 +403,9 @@ impl State {
|
|||||||
channels,
|
channels,
|
||||||
} => {
|
} => {
|
||||||
self.insert_subscription(id.clone());
|
self.insert_subscription(id.clone());
|
||||||
self.cache.servers.insert(id.to_string(), server.clone());
|
self.cache.servers.insert(id.clone(), server.clone());
|
||||||
|
let member = Member::new(id.clone(), self.cache.user_id.clone());
|
||||||
|
self.cache.members.insert(id.clone(), member);
|
||||||
|
|
||||||
for channel in channels {
|
for channel in channels {
|
||||||
self.cache
|
self.cache
|
||||||
@@ -436,6 +443,7 @@ impl State {
|
|||||||
self.cache.channels.remove(channel);
|
self.cache.channels.remove(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.cache.members.remove(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EventV1::ServerDelete { id } => {
|
EventV1::ServerDelete { id } => {
|
||||||
@@ -447,6 +455,7 @@ impl State {
|
|||||||
self.cache.channels.remove(channel);
|
self.cache.channels.remove(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.cache.members.remove(id);
|
||||||
}
|
}
|
||||||
EventV1::ServerMemberUpdate { id, data, clear } => {
|
EventV1::ServerMemberUpdate { id, data, clear } => {
|
||||||
if id.user == self.cache.user_id {
|
if id.user == self.cache.user_id {
|
||||||
|
|||||||
@@ -3,22 +3,10 @@ use crate::{AbstractServerMember, Result};
|
|||||||
|
|
||||||
use super::super::DummyDb;
|
use super::super::DummyDb;
|
||||||
|
|
||||||
use iso8601_timestamp::Timestamp;
|
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl AbstractServerMember for DummyDb {
|
impl AbstractServerMember for DummyDb {
|
||||||
async fn fetch_member(&self, server: &str, user: &str) -> Result<Member> {
|
async fn fetch_member(&self, server: &str, user: &str) -> Result<Member> {
|
||||||
Ok(Member {
|
Ok(Member::new(server.into(), user.into()))
|
||||||
id: MemberCompositeKey {
|
|
||||||
server: server.into(),
|
|
||||||
user: user.into(),
|
|
||||||
},
|
|
||||||
joined_at: Timestamp::now_utc(),
|
|
||||||
nickname: None,
|
|
||||||
avatar: None,
|
|
||||||
roles: vec![],
|
|
||||||
timeout: None,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn insert_member(&self, member: &Member) -> Result<()> {
|
async fn insert_member(&self, member: &Member) -> Result<()> {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use iso8601_timestamp::Timestamp;
|
|
||||||
use ulid::Ulid;
|
use ulid::Ulid;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@@ -186,18 +185,7 @@ impl Server {
|
|||||||
return Err(Error::Banned);
|
return Err(Error::Banned);
|
||||||
}
|
}
|
||||||
|
|
||||||
let member = Member {
|
let member = Member::new(self.id.clone(), user.id.clone());
|
||||||
id: MemberCompositeKey {
|
|
||||||
server: self.id.clone(),
|
|
||||||
user: user.id.clone(),
|
|
||||||
},
|
|
||||||
joined_at: Timestamp::now_utc(),
|
|
||||||
nickname: None,
|
|
||||||
avatar: None,
|
|
||||||
roles: vec![],
|
|
||||||
timeout: None,
|
|
||||||
};
|
|
||||||
|
|
||||||
db.insert_member(&member).await?;
|
db.insert_member(&member).await?;
|
||||||
|
|
||||||
let should_fetch = channels.is_none();
|
let should_fetch = channels.is_none();
|
||||||
|
|||||||
@@ -3,13 +3,27 @@ use iso8601_timestamp::Timestamp;
|
|||||||
use crate::{
|
use crate::{
|
||||||
events::client::EventV1,
|
events::client::EventV1,
|
||||||
models::{
|
models::{
|
||||||
server_member::{FieldsMember, PartialMember},
|
server_member::{FieldsMember, MemberCompositeKey, PartialMember},
|
||||||
Member, Server,
|
Member, Server,
|
||||||
},
|
},
|
||||||
Database, Result,
|
Database, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
impl Member {
|
impl Member {
|
||||||
|
pub fn new(server_id: String, user_id: String) -> Self {
|
||||||
|
Self {
|
||||||
|
id: MemberCompositeKey {
|
||||||
|
server: server_id,
|
||||||
|
user: user_id,
|
||||||
|
},
|
||||||
|
joined_at: Timestamp::now_utc(),
|
||||||
|
nickname: None,
|
||||||
|
avatar: None,
|
||||||
|
roles: vec![],
|
||||||
|
timeout: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Update member data
|
/// Update member data
|
||||||
pub async fn update<'a>(
|
pub async fn update<'a>(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|||||||
Reference in New Issue
Block a user