init
This commit is contained in:
@@ -168,3 +168,20 @@ onGatewayEvent("Category", (payload) => {
|
|||||||
void useServerStore().fetchServerTree(category.server_id);
|
void useServerStore().fetchServerTree(category.server_id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onGatewayEvent("ServerTree", (payload) => {
|
||||||
|
if (payload.action !== "refresh") return;
|
||||||
|
const serverId = String(payload.content);
|
||||||
|
if (serverId) void useServerStore().fetchServerTree(serverId);
|
||||||
|
});
|
||||||
|
|
||||||
|
onGatewayEvent("Server", (payload) => {
|
||||||
|
if (payload.action !== "update") return;
|
||||||
|
const updated = payload.content as Server;
|
||||||
|
const store = useServerStore();
|
||||||
|
const index = store.servers.findIndex(server => server.id === updated.id);
|
||||||
|
if (index >= 0) {
|
||||||
|
updated.unread_count ??= store.servers[index].unread_count ?? 0;
|
||||||
|
store.servers[index] = updated;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@@ -2,3 +2,4 @@ pub mod channel;
|
|||||||
pub mod emoji;
|
pub mod emoji;
|
||||||
pub mod message;
|
pub mod message;
|
||||||
pub mod server;
|
pub mod server;
|
||||||
|
pub mod server_tree;
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct ServerTreeInvalidatedEvent {
|
||||||
|
pub server_id: Uuid,
|
||||||
|
/// `None` means every current member of the server.
|
||||||
|
pub user_ids: Option<Vec<Uuid>>,
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ use crate::domain::events::message::{
|
|||||||
MessageCreatedEvent, MessageDeletedEvent, MessageReactionAddedEvent,
|
MessageCreatedEvent, MessageDeletedEvent, MessageReactionAddedEvent,
|
||||||
MessageReactionRemovedEvent, MessageUpdatedEvent,
|
MessageReactionRemovedEvent, MessageUpdatedEvent,
|
||||||
};
|
};
|
||||||
|
use crate::domain::events::server_tree::ServerTreeInvalidatedEvent;
|
||||||
use crate::models::{category, server, server_user, user};
|
use crate::models::{category, server, server_user, user};
|
||||||
use crate::repositories::Repositories;
|
use crate::repositories::Repositories;
|
||||||
use crate::routes::category::mapper::category_model_to_category_response;
|
use crate::routes::category::mapper::category_model_to_category_response;
|
||||||
@@ -369,6 +370,23 @@ impl RealtimeRouter {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let router = Arc::clone(self);
|
||||||
|
event_bus.on_async::<ServerTreeInvalidatedEvent, _, _>(
|
||||||
|
"server_tree_invalidated",
|
||||||
|
move |event| {
|
||||||
|
let router = Arc::clone(&router);
|
||||||
|
async move {
|
||||||
|
let users = match event.user_ids {
|
||||||
|
Some(users) => users,
|
||||||
|
None => router.server_users(event.server_id).await,
|
||||||
|
};
|
||||||
|
router
|
||||||
|
.gateway
|
||||||
|
.send_to_users(users, "ServerTree", "refresh", event.server_id);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
let router = Arc::clone(self);
|
let router = Arc::clone(self);
|
||||||
event_bus.on_async::<EmojiCreatedEvent, _, _>("emoji_created", move |event| {
|
event_bus.on_async::<EmojiCreatedEvent, _, _>("emoji_created", move |event| {
|
||||||
let router = Arc::clone(&router);
|
let router = Arc::clone(&router);
|
||||||
|
|||||||
@@ -299,6 +299,9 @@ pub async fn set_user_permission(
|
|||||||
.server
|
.server
|
||||||
.set_user_permission(server_id, user_id, payload.permissions)
|
.set_user_permission(server_id, user_id, payload.permissions)
|
||||||
.await?;
|
.await?;
|
||||||
|
state
|
||||||
|
.event_bus
|
||||||
|
.emit("server_user_permission_updated", (server_id, user_id));
|
||||||
|
|
||||||
let permission = state
|
let permission = state
|
||||||
.repositories
|
.repositories
|
||||||
@@ -346,6 +349,9 @@ pub async fn remove_user_permission(
|
|||||||
.server
|
.server
|
||||||
.remove_user_permission(server_id, user_id)
|
.remove_user_permission(server_id, user_id)
|
||||||
.await?;
|
.await?;
|
||||||
|
state
|
||||||
|
.event_bus
|
||||||
|
.emit("server_user_permission_updated", (server_id, user_id));
|
||||||
|
|
||||||
Ok(StatusCode::NO_CONTENT)
|
Ok(StatusCode::NO_CONTENT)
|
||||||
}
|
}
|
||||||
@@ -406,6 +412,9 @@ pub async fn set_role_permission(
|
|||||||
.server
|
.server
|
||||||
.set_role_permission(server_id, role_id, payload.permissions)
|
.set_role_permission(server_id, role_id, payload.permissions)
|
||||||
.await?;
|
.await?;
|
||||||
|
state
|
||||||
|
.event_bus
|
||||||
|
.emit("server_role_permission_updated", (role_id, server_id));
|
||||||
|
|
||||||
let permission = state
|
let permission = state
|
||||||
.repositories
|
.repositories
|
||||||
@@ -453,6 +462,9 @@ pub async fn remove_role_permission(
|
|||||||
.server
|
.server
|
||||||
.remove_role_permission(server_id, role_id)
|
.remove_role_permission(server_id, role_id)
|
||||||
.await?;
|
.await?;
|
||||||
|
state
|
||||||
|
.event_bus
|
||||||
|
.emit("server_role_permission_updated", (role_id, server_id));
|
||||||
|
|
||||||
Ok(StatusCode::NO_CONTENT)
|
Ok(StatusCode::NO_CONTENT)
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-5
@@ -255,6 +255,14 @@ impl ChannelService {
|
|||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
let db = &self.service_context.repositories.server.context.db;
|
let db = &self.service_context.repositories.server.context.db;
|
||||||
let event_bus = &self.service_context.event_bus;
|
let event_bus = &self.service_context.event_bus;
|
||||||
|
let server_id = self
|
||||||
|
.service_context
|
||||||
|
.repositories
|
||||||
|
.channel
|
||||||
|
.get_by_id(channel_id)
|
||||||
|
.await?
|
||||||
|
.and_then(|channel| channel.server_id)
|
||||||
|
.ok_or_else(|| anyhow::anyhow!("Server channel not found"))?;
|
||||||
|
|
||||||
let txn = db.begin().await?;
|
let txn = db.begin().await?;
|
||||||
|
|
||||||
@@ -279,10 +287,7 @@ impl ChannelService {
|
|||||||
|
|
||||||
txn.commit().await?;
|
txn.commit().await?;
|
||||||
|
|
||||||
event_bus.emit(
|
event_bus.emit("channel_role_permission_updated", (role_id, server_id));
|
||||||
"channel_role_permission_created",
|
|
||||||
(channel_id, role_id, permissions),
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -294,6 +299,14 @@ impl ChannelService {
|
|||||||
) -> Result<(), anyhow::Error> {
|
) -> Result<(), anyhow::Error> {
|
||||||
let db = &self.service_context.repositories.server.context.db;
|
let db = &self.service_context.repositories.server.context.db;
|
||||||
let event_bus = &self.service_context.event_bus;
|
let event_bus = &self.service_context.event_bus;
|
||||||
|
let server_id = self
|
||||||
|
.service_context
|
||||||
|
.repositories
|
||||||
|
.channel
|
||||||
|
.get_by_id(channel_id)
|
||||||
|
.await?
|
||||||
|
.and_then(|channel| channel.server_id)
|
||||||
|
.ok_or_else(|| anyhow::anyhow!("Server channel not found"))?;
|
||||||
|
|
||||||
let txn = db.begin().await?;
|
let txn = db.begin().await?;
|
||||||
|
|
||||||
@@ -305,7 +318,7 @@ impl ChannelService {
|
|||||||
|
|
||||||
txn.commit().await?;
|
txn.commit().await?;
|
||||||
|
|
||||||
event_bus.emit("channel_role_permission_deleted", (channel_id, role_id));
|
event_bus.emit("channel_role_permission_updated", (role_id, server_id));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
+140
-68
@@ -1,7 +1,9 @@
|
|||||||
use crate::domain::events::channel::{ChannelCreatedEvent, ChannelDeletedEvent};
|
use crate::domain::events::channel::{ChannelCreatedEvent, ChannelDeletedEvent};
|
||||||
|
use crate::domain::events::server_tree::ServerTreeInvalidatedEvent;
|
||||||
use crate::models::server;
|
use crate::models::server;
|
||||||
use crate::repositories::Repositories;
|
use crate::repositories::Repositories;
|
||||||
use crate::services::ServicesContext;
|
use crate::services::ServicesContext;
|
||||||
|
use event_bus::EventBus;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
// list of all events :
|
// list of all events :
|
||||||
@@ -57,6 +59,16 @@ pub struct PermissionSyncService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PermissionSyncService {
|
impl PermissionSyncService {
|
||||||
|
fn invalidate_tree(event_bus: &Arc<EventBus>, server_id: Uuid, user_ids: Option<Vec<Uuid>>) {
|
||||||
|
event_bus.emit(
|
||||||
|
"server_tree_invalidated",
|
||||||
|
ServerTreeInvalidatedEvent {
|
||||||
|
server_id,
|
||||||
|
user_ids,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn new(service_context: Arc<ServicesContext>) -> Self {
|
pub fn new(service_context: Arc<ServicesContext>) -> Self {
|
||||||
Self { service_context }
|
Self { service_context }
|
||||||
}
|
}
|
||||||
@@ -70,6 +82,7 @@ impl PermissionSyncService {
|
|||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
// Événements Serveur & Membres Serveur
|
// Événements Serveur & Membres Serveur
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"server_created",
|
"server_created",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
@@ -81,16 +94,25 @@ impl PermissionSyncService {
|
|||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"server_user_created",
|
"server_user_created",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
|
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"server_user_deleted",
|
"server_user_deleted",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
|
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -98,19 +120,29 @@ impl PermissionSyncService {
|
|||||||
// Événements Rôles & Membres de Rôle
|
// Événements Rôles & Membres de Rôle
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"role_user_created",
|
"role_user_created",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| async move {
|
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| {
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"role_user_deleted",
|
"role_user_deleted",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| async move {
|
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| {
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -118,19 +150,29 @@ impl PermissionSyncService {
|
|||||||
// Overrides de Permissions Serveur
|
// Overrides de Permissions Serveur
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"server_role_permission_updated",
|
"server_role_permission_updated",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, (role_id, server_id): (Uuid, Uuid)| async move {
|
move |repositories, (role_id, server_id): (Uuid, Uuid)| {
|
||||||
Self::sync_role_members(repositories, role_id, server_id).await;
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_role_members(repositories, role_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, None);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"server_user_permission_updated",
|
"server_user_permission_updated",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
|
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -138,73 +180,103 @@ impl PermissionSyncService {
|
|||||||
// Événements Canaux & Overrides de Permissions Canaux
|
// Événements Canaux & Overrides de Permissions Canaux
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"channel_created",
|
"channel_created",
|
||||||
repositories.clone(),
|
repositories.clone(),
|
||||||
move |repositories, event: ChannelCreatedEvent| async move {
|
move |repositories, event: ChannelCreatedEvent| {
|
||||||
if let Some(server_id) = event.channel.server_id {
|
let notify = notify.clone();
|
||||||
Self::sync_server(repositories, server_id).await;
|
async move {
|
||||||
}
|
if let Some(server_id) = event.channel.server_id {
|
||||||
},
|
Self::sync_server(repositories, server_id).await;
|
||||||
);
|
Self::invalidate_tree(¬ify, server_id, None);
|
||||||
|
|
||||||
event_bus.on_async_with(
|
|
||||||
"channel_deleted",
|
|
||||||
repositories.clone(),
|
|
||||||
move |repositories, event: ChannelDeletedEvent| async move {
|
|
||||||
if let Some(server_id) = event.channel.server_id {
|
|
||||||
Self::sync_server(repositories, server_id).await;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
event_bus.on_async_with(
|
|
||||||
"channel_role_permission_updated",
|
|
||||||
repositories.clone(),
|
|
||||||
move |repositories, (role_id, server_id): (Uuid, Uuid)| async move {
|
|
||||||
Self::sync_role_members(repositories, role_id, server_id).await;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
event_bus.on_async_with(
|
|
||||||
"channel_user_permission_updated",
|
|
||||||
repositories.clone(),
|
|
||||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| async move {
|
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
event_bus.on_async_with(
|
|
||||||
"channel_user_permission_created",
|
|
||||||
repositories.clone(),
|
|
||||||
move |repositories, (channel_id, user_id, _permissions): (Uuid, Uuid, u64)| async move {
|
|
||||||
if let Some(channel) = repositories
|
|
||||||
.channel
|
|
||||||
.get_by_id(channel_id)
|
|
||||||
.await
|
|
||||||
.ok()
|
|
||||||
.flatten()
|
|
||||||
{
|
|
||||||
if let Some(server_id) = channel.server_id {
|
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
|
event_bus.on_async_with(
|
||||||
|
"channel_deleted",
|
||||||
|
repositories.clone(),
|
||||||
|
move |repositories, event: ChannelDeletedEvent| {
|
||||||
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
if let Some(server_id) = event.channel.server_id {
|
||||||
|
Self::sync_server(repositories, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, None);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
|
event_bus.on_async_with(
|
||||||
|
"channel_role_permission_updated",
|
||||||
|
repositories.clone(),
|
||||||
|
move |repositories, (role_id, server_id): (Uuid, Uuid)| {
|
||||||
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_role_members(repositories, role_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, None);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
|
event_bus.on_async_with(
|
||||||
|
"channel_user_permission_updated",
|
||||||
|
repositories.clone(),
|
||||||
|
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||||
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
|
event_bus.on_async_with(
|
||||||
|
"channel_user_permission_created",
|
||||||
|
repositories.clone(),
|
||||||
|
move |repositories, (channel_id, user_id, _permissions): (Uuid, Uuid, u64)| {
|
||||||
|
let notify = notify.clone();
|
||||||
|
async move {
|
||||||
|
if let Some(channel) = repositories
|
||||||
|
.channel
|
||||||
|
.get_by_id(channel_id)
|
||||||
|
.await
|
||||||
|
.ok()
|
||||||
|
.flatten()
|
||||||
|
{
|
||||||
|
if let Some(server_id) = channel.server_id {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
let notify = event_bus.clone();
|
||||||
event_bus.on_async_with(
|
event_bus.on_async_with(
|
||||||
"channel_user_permission_deleted",
|
"channel_user_permission_deleted",
|
||||||
repositories,
|
repositories,
|
||||||
move |repositories, (channel_id, user_id): (Uuid, Uuid)| async move {
|
move |repositories, (channel_id, user_id): (Uuid, Uuid)| {
|
||||||
if let Some(channel) = repositories
|
let notify = notify.clone();
|
||||||
.channel
|
async move {
|
||||||
.get_by_id(channel_id)
|
if let Some(channel) = repositories
|
||||||
.await
|
.channel
|
||||||
.ok()
|
.get_by_id(channel_id)
|
||||||
.flatten()
|
.await
|
||||||
{
|
.ok()
|
||||||
if let Some(server_id) = channel.server_id {
|
.flatten()
|
||||||
Self::sync_user(repositories, user_id, server_id).await;
|
{
|
||||||
|
if let Some(server_id) = channel.server_id {
|
||||||
|
Self::sync_user(repositories, user_id, server_id).await;
|
||||||
|
Self::invalidate_tree(¬ify, server_id, Some(vec![user_id]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user