add event_bus_typed
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
use crate::domain::events::category::{
|
||||
CategoryCreatedEvent, CategoryDeletedEvent, CategoryUpdatedEvent,
|
||||
};
|
||||
use crate::models::category;
|
||||
use crate::models::server_item_order::OrderedResourceType;
|
||||
use crate::services::ServicesContext;
|
||||
@@ -49,7 +52,9 @@ impl CategoryService {
|
||||
})
|
||||
.await?;
|
||||
|
||||
event_bus.emit("category_created", cat.clone());
|
||||
event_bus.emit(CategoryCreatedEvent {
|
||||
category: cat.clone(),
|
||||
});
|
||||
|
||||
Ok(cat)
|
||||
}
|
||||
@@ -76,7 +81,9 @@ impl CategoryService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("category_updated", cat.clone());
|
||||
event_bus.emit(CategoryUpdatedEvent {
|
||||
category: cat.clone(),
|
||||
});
|
||||
|
||||
Ok(cat)
|
||||
}
|
||||
@@ -107,7 +114,7 @@ impl CategoryService {
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
event_bus.emit("category_deleted", existing);
|
||||
event_bus.emit(CategoryDeletedEvent { category: existing });
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
|
||||
+44
-21
@@ -2,6 +2,10 @@ use crate::domain::dto::channel::{CreateChannelRequest, UpdateChannelRequest};
|
||||
use crate::domain::events::channel::{
|
||||
ChannelCreatedEvent, ChannelDeletedEvent, ChannelUpdatedEvent,
|
||||
};
|
||||
use crate::domain::events::channel_permission::{
|
||||
ChannelRolePermissionUpdatedEvent, ChannelUserPermissionCreatedEvent,
|
||||
ChannelUserPermissionDeletedEvent,
|
||||
};
|
||||
use crate::models::server_item_order::OrderedResourceType;
|
||||
use crate::models::{channel, role};
|
||||
use crate::permissions::PermissionSet;
|
||||
@@ -91,12 +95,9 @@ impl ChannelService {
|
||||
.await?;
|
||||
|
||||
// Post-commit event emission
|
||||
event_bus.emit(
|
||||
"channel_created",
|
||||
ChannelCreatedEvent {
|
||||
channel: channel.clone(),
|
||||
},
|
||||
);
|
||||
event_bus.emit(ChannelCreatedEvent {
|
||||
channel: channel.clone(),
|
||||
});
|
||||
|
||||
Ok(channel)
|
||||
}
|
||||
@@ -141,13 +142,10 @@ impl ChannelService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit(
|
||||
"channel_updated",
|
||||
ChannelUpdatedEvent {
|
||||
previous,
|
||||
channel: channel.clone(),
|
||||
},
|
||||
);
|
||||
event_bus.emit(ChannelUpdatedEvent {
|
||||
previous,
|
||||
channel: channel.clone(),
|
||||
});
|
||||
|
||||
Ok(channel)
|
||||
}
|
||||
@@ -178,7 +176,7 @@ impl ChannelService {
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
event_bus.emit("channel_deleted", ChannelDeletedEvent { channel: existing });
|
||||
event_bus.emit(ChannelDeletedEvent { channel: existing });
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
@@ -214,12 +212,15 @@ impl ChannelService {
|
||||
.exec(&txn)
|
||||
.await?;
|
||||
|
||||
let permission = crate::models::channel_user_permission::Entity::find()
|
||||
.filter(crate::models::channel_user_permission::Column::ChannelId.eq(channel_id))
|
||||
.filter(crate::models::channel_user_permission::Column::UserId.eq(user_id))
|
||||
.one(&txn)
|
||||
.await?
|
||||
.ok_or_else(|| anyhow::anyhow!("Permission not found"))?;
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit(
|
||||
"channel_user_permission_created",
|
||||
(channel_id, user_id, permissions),
|
||||
);
|
||||
event_bus.emit(ChannelUserPermissionCreatedEvent { permission });
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -234,6 +235,11 @@ impl ChannelService {
|
||||
|
||||
let txn = db.begin().await?;
|
||||
|
||||
let existing = crate::models::channel_user_permission::Entity::find()
|
||||
.filter(crate::models::channel_user_permission::Column::ChannelId.eq(channel_id))
|
||||
.filter(crate::models::channel_user_permission::Column::UserId.eq(user_id))
|
||||
.one(&txn)
|
||||
.await?;
|
||||
crate::models::channel_user_permission::Entity::delete_many()
|
||||
.filter(crate::models::channel_user_permission::Column::ChannelId.eq(channel_id))
|
||||
.filter(crate::models::channel_user_permission::Column::UserId.eq(user_id))
|
||||
@@ -242,7 +248,9 @@ impl ChannelService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("channel_user_permission_deleted", (channel_id, user_id));
|
||||
if let Some(permission) = existing {
|
||||
event_bus.emit(ChannelUserPermissionDeletedEvent { permission });
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -285,9 +293,19 @@ impl ChannelService {
|
||||
.exec(&txn)
|
||||
.await?;
|
||||
|
||||
let permission = crate::models::channel_role_permission::Entity::find()
|
||||
.filter(crate::models::channel_role_permission::Column::ChannelId.eq(channel_id))
|
||||
.filter(crate::models::channel_role_permission::Column::RoleId.eq(role_id))
|
||||
.one(&txn)
|
||||
.await?;
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("channel_role_permission_updated", (role_id, server_id));
|
||||
event_bus.emit(ChannelRolePermissionUpdatedEvent {
|
||||
channel_id,
|
||||
server_id,
|
||||
role_id,
|
||||
permission,
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -318,7 +336,12 @@ impl ChannelService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("channel_role_permission_updated", (role_id, server_id));
|
||||
event_bus.emit(ChannelRolePermissionUpdatedEvent {
|
||||
channel_id,
|
||||
server_id,
|
||||
role_id,
|
||||
permission: None,
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+20
-56
@@ -3,7 +3,6 @@ use crate::domain::events::message::{
|
||||
};
|
||||
use crate::models::{attachment, channel, message};
|
||||
use crate::services::ServicesContext;
|
||||
use event_bus::Scope;
|
||||
use sea_orm::{
|
||||
ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QuerySelect, Set, TransactionTrait,
|
||||
};
|
||||
@@ -41,9 +40,6 @@ impl MessageService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
let mut scopes: Vec<Scope> = Vec::new();
|
||||
scopes.push(Scope::uuid("channel", msg.channel_id));
|
||||
|
||||
let server_id: Option<Uuid> = channel::Entity::find_by_id(msg.channel_id)
|
||||
.select_only()
|
||||
.column(channel::Column::ServerId)
|
||||
@@ -52,19 +48,11 @@ impl MessageService {
|
||||
.await?
|
||||
.flatten();
|
||||
|
||||
if let Some(server_id) = server_id {
|
||||
scopes.push(Scope::uuid("server", server_id));
|
||||
}
|
||||
|
||||
event_bus.emit_scoped(
|
||||
"message_created",
|
||||
scopes,
|
||||
MessageCreatedEvent {
|
||||
server_id,
|
||||
channel_id: msg.channel_id,
|
||||
message: msg.clone(),
|
||||
},
|
||||
);
|
||||
event_bus.emit(MessageCreatedEvent {
|
||||
server_id,
|
||||
channel_id: msg.channel_id,
|
||||
message: msg.clone(),
|
||||
});
|
||||
|
||||
Ok(msg)
|
||||
}
|
||||
@@ -119,19 +107,11 @@ impl MessageService {
|
||||
.one(db)
|
||||
.await?
|
||||
.flatten();
|
||||
let mut scopes = vec![Scope::uuid("channel", msg.channel_id)];
|
||||
if let Some(server_id) = server_id {
|
||||
scopes.push(Scope::uuid("server", server_id));
|
||||
}
|
||||
event_bus.emit_scoped(
|
||||
"message_created",
|
||||
scopes,
|
||||
MessageCreatedEvent {
|
||||
server_id,
|
||||
channel_id: msg.channel_id,
|
||||
message: msg.clone(),
|
||||
},
|
||||
);
|
||||
event_bus.emit(MessageCreatedEvent {
|
||||
server_id,
|
||||
channel_id: msg.channel_id,
|
||||
message: msg.clone(),
|
||||
});
|
||||
Ok(msg)
|
||||
}
|
||||
|
||||
@@ -165,19 +145,11 @@ impl MessageService {
|
||||
.await?
|
||||
.flatten();
|
||||
|
||||
let mut scopes = vec![Scope::uuid("channel", msg.channel_id)];
|
||||
if let Some(server_id) = server_id {
|
||||
scopes.push(Scope::uuid("server", server_id));
|
||||
}
|
||||
event_bus.emit_scoped(
|
||||
"message_updated",
|
||||
scopes,
|
||||
MessageUpdatedEvent {
|
||||
server_id,
|
||||
channel_id: msg.channel_id,
|
||||
message: msg.clone(),
|
||||
},
|
||||
);
|
||||
event_bus.emit(MessageUpdatedEvent {
|
||||
server_id,
|
||||
channel_id: msg.channel_id,
|
||||
message: msg.clone(),
|
||||
});
|
||||
|
||||
Ok(msg)
|
||||
}
|
||||
@@ -208,19 +180,11 @@ impl MessageService {
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
let mut scopes = vec![Scope::uuid("channel", existing.channel_id)];
|
||||
if let Some(server_id) = server_id {
|
||||
scopes.push(Scope::uuid("server", server_id));
|
||||
}
|
||||
event_bus.emit_scoped(
|
||||
"message_deleted",
|
||||
scopes,
|
||||
MessageDeletedEvent {
|
||||
server_id,
|
||||
channel_id: existing.channel_id,
|
||||
message: existing,
|
||||
},
|
||||
);
|
||||
event_bus.emit(MessageDeletedEvent {
|
||||
server_id,
|
||||
channel_id: existing.channel_id,
|
||||
message: existing,
|
||||
});
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
|
||||
@@ -3,7 +3,6 @@ use crate::domain::events::message::{MessageReactionAddedEvent, MessageReactionR
|
||||
use crate::http::error::HTTPError;
|
||||
use crate::models::{emoji, message_reaction};
|
||||
use crate::services::ServicesContext;
|
||||
use event_bus::Scope;
|
||||
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter, Set};
|
||||
use std::collections::HashMap;
|
||||
use std::sync::Arc;
|
||||
@@ -117,19 +116,11 @@ impl MessageReactionService {
|
||||
})
|
||||
.await?;
|
||||
|
||||
let mut scopes = vec![Scope::uuid("channel", message.channel_id)];
|
||||
if let Some(server_id) = server_id {
|
||||
scopes.push(Scope::uuid("server", server_id));
|
||||
}
|
||||
self.context.event_bus.emit_scoped(
|
||||
"message_reaction_added",
|
||||
scopes,
|
||||
MessageReactionAddedEvent {
|
||||
server_id,
|
||||
channel_id: message.channel_id,
|
||||
reaction: reaction.clone(),
|
||||
},
|
||||
);
|
||||
self.context.event_bus.emit(MessageReactionAddedEvent {
|
||||
server_id,
|
||||
channel_id: message.channel_id,
|
||||
reaction: reaction.clone(),
|
||||
});
|
||||
|
||||
Ok((reaction, true))
|
||||
}
|
||||
@@ -151,19 +142,11 @@ impl MessageReactionService {
|
||||
.await?
|
||||
.ok_or(HTTPError::NotFound)?;
|
||||
|
||||
let mut scopes = vec![Scope::uuid("channel", message.channel_id)];
|
||||
if let Some(server_id) = server_id {
|
||||
scopes.push(Scope::uuid("server", server_id));
|
||||
}
|
||||
self.context.event_bus.emit_scoped(
|
||||
"message_reaction_removed",
|
||||
scopes,
|
||||
MessageReactionRemovedEvent {
|
||||
server_id,
|
||||
channel_id: message.channel_id,
|
||||
reaction: reaction.clone(),
|
||||
},
|
||||
);
|
||||
self.context.event_bus.emit(MessageReactionRemovedEvent {
|
||||
server_id,
|
||||
channel_id: message.channel_id,
|
||||
reaction: reaction.clone(),
|
||||
});
|
||||
|
||||
Ok(reaction)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
use crate::domain::events::channel::{ChannelCreatedEvent, ChannelDeletedEvent};
|
||||
use crate::domain::events::channel_permission::{
|
||||
ChannelRolePermissionUpdatedEvent, ChannelUserPermissionCreatedEvent,
|
||||
ChannelUserPermissionDeletedEvent, ChannelUserPermissionUpdatedEvent,
|
||||
};
|
||||
use crate::domain::events::role::{RoleUserCreatedEvent, RoleUserDeletedEvent};
|
||||
use crate::domain::events::server::{
|
||||
ServerCreatedEvent, ServerUserCreatedEvent, ServerUserDeletedEvent,
|
||||
};
|
||||
use crate::domain::events::server_permission::{
|
||||
ServerRolePermissionUpdatedEvent, ServerUserPermissionUpdatedEvent,
|
||||
};
|
||||
use crate::domain::events::server_tree::ServerTreeInvalidatedEvent;
|
||||
use crate::models::server;
|
||||
use crate::repositories::Repositories;
|
||||
use crate::services::ServicesContext;
|
||||
use event_bus::EventBus;
|
||||
@@ -60,13 +70,10 @@ pub struct 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,
|
||||
},
|
||||
);
|
||||
event_bus.emit(ServerTreeInvalidatedEvent {
|
||||
server_id,
|
||||
user_ids,
|
||||
});
|
||||
}
|
||||
|
||||
pub fn new(service_context: Arc<ServicesContext>) -> Self {
|
||||
@@ -83,18 +90,18 @@ impl PermissionSyncService {
|
||||
// Événements Serveur & Membres Serveur
|
||||
// ---------------------------------------------------------------------
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"server_created",
|
||||
event_bus.on_async_with::<ServerCreatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, server: server::Model| async move {
|
||||
Self::sync_server(repositories, server.id).await;
|
||||
move |repositories, event| async move {
|
||||
Self::sync_server(repositories, event.server.id).await;
|
||||
},
|
||||
);
|
||||
|
||||
event_bus.on_async_with(
|
||||
"server_user_created",
|
||||
event_bus.on_async_with::<ServerUserCreatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let server_id = event.server_user.server_id;
|
||||
let user_id = event.server_user.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
@@ -104,10 +111,11 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"server_user_deleted",
|
||||
event_bus.on_async_with::<ServerUserDeletedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let server_id = event.server_user.server_id;
|
||||
let user_id = event.server_user.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
@@ -121,10 +129,11 @@ impl PermissionSyncService {
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"role_user_created",
|
||||
event_bus.on_async_with::<RoleUserCreatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let server_id = event.server_id;
|
||||
let user_id = event.role_user.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
@@ -134,10 +143,11 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"role_user_deleted",
|
||||
event_bus.on_async_with::<RoleUserDeletedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (_role_id, user_id, server_id): (Uuid, Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let server_id = event.server_id;
|
||||
let user_id = event.role_user.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
@@ -151,10 +161,11 @@ impl PermissionSyncService {
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"server_role_permission_updated",
|
||||
event_bus.on_async_with::<ServerRolePermissionUpdatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (role_id, server_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let role_id = event.role_id;
|
||||
let server_id = event.server_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_role_members(repositories, role_id, server_id).await;
|
||||
@@ -164,10 +175,11 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"server_user_permission_updated",
|
||||
event_bus.on_async_with::<ServerUserPermissionUpdatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let server_id = event.server_id;
|
||||
let user_id = event.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_user(repositories, user_id, server_id).await;
|
||||
@@ -181,10 +193,9 @@ impl PermissionSyncService {
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"channel_created",
|
||||
event_bus.on_async_with::<ChannelCreatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, event: ChannelCreatedEvent| {
|
||||
move |repositories, event| {
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
if let Some(server_id) = event.channel.server_id {
|
||||
@@ -196,10 +207,9 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"channel_deleted",
|
||||
event_bus.on_async_with::<ChannelDeletedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, event: ChannelDeletedEvent| {
|
||||
move |repositories, event| {
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
if let Some(server_id) = event.channel.server_id {
|
||||
@@ -211,10 +221,11 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"channel_role_permission_updated",
|
||||
event_bus.on_async_with::<ChannelRolePermissionUpdatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (role_id, server_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let role_id = event.role_id;
|
||||
let server_id = event.server_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
Self::sync_role_members(repositories, role_id, server_id).await;
|
||||
@@ -224,23 +235,34 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"channel_user_permission_updated",
|
||||
event_bus.on_async_with::<ChannelUserPermissionUpdatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (server_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let user_id = event.user_id;
|
||||
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]));
|
||||
if let Some(channel) = repositories
|
||||
.channel
|
||||
.get_by_id(event.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(
|
||||
"channel_user_permission_created",
|
||||
event_bus.on_async_with::<ChannelUserPermissionCreatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (channel_id, user_id, _permissions): (Uuid, Uuid, u64)| {
|
||||
move |repositories, event| {
|
||||
let channel_id = event.permission.channel_id;
|
||||
let user_id = event.permission.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
if let Some(channel) = repositories
|
||||
@@ -260,10 +282,11 @@ impl PermissionSyncService {
|
||||
);
|
||||
|
||||
let notify = event_bus.clone();
|
||||
event_bus.on_async_with(
|
||||
"channel_user_permission_deleted",
|
||||
event_bus.on_async_with::<ChannelUserPermissionDeletedEvent, _>(
|
||||
repositories,
|
||||
move |repositories, (channel_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let channel_id = event.permission.channel_id;
|
||||
let user_id = event.permission.user_id;
|
||||
let notify = notify.clone();
|
||||
async move {
|
||||
if let Some(channel) = repositories
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
use crate::domain::events::channel_permission::{
|
||||
ChannelUserPermissionCreatedEvent, ChannelUserPermissionDeletedEvent,
|
||||
ChannelUserPermissionUpdatedEvent,
|
||||
};
|
||||
use crate::domain::events::server_permission::ServerUserPermissionUpdatedEvent;
|
||||
use crate::models::{channel, channel_user, computed_permission::PermissionScopeType};
|
||||
use crate::permissions::ChannelPermission;
|
||||
use crate::repositories::Repositories;
|
||||
@@ -204,10 +209,10 @@ impl RealtimeRegistry {
|
||||
event_bus: Arc<EventBus>,
|
||||
) {
|
||||
let registry = Arc::clone(self);
|
||||
event_bus.on_async_with(
|
||||
"channel_user_permission_updated",
|
||||
event_bus.on_async_with::<ChannelUserPermissionUpdatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (_channel_id, user_id, _permissions): (Uuid, Uuid, u64)| {
|
||||
move |repositories, event| {
|
||||
let user_id = event.user_id;
|
||||
let registry = Arc::clone(®istry);
|
||||
async move {
|
||||
if let Err(error) = registry.refresh_user(&repositories, user_id).await {
|
||||
@@ -218,10 +223,10 @@ impl RealtimeRegistry {
|
||||
);
|
||||
|
||||
let registry = Arc::clone(self);
|
||||
event_bus.on_async_with(
|
||||
"channel_user_permission_created",
|
||||
event_bus.on_async_with::<ChannelUserPermissionCreatedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (_channel_id, user_id, _permissions): (Uuid, Uuid, u64)| {
|
||||
move |repositories, event| {
|
||||
let user_id = event.permission.user_id;
|
||||
let registry = Arc::clone(®istry);
|
||||
async move {
|
||||
if let Err(error) = registry.refresh_user(&repositories, user_id).await {
|
||||
@@ -232,10 +237,10 @@ impl RealtimeRegistry {
|
||||
);
|
||||
|
||||
let registry = Arc::clone(self);
|
||||
event_bus.on_async_with(
|
||||
"channel_user_permission_deleted",
|
||||
event_bus.on_async_with::<ChannelUserPermissionDeletedEvent, _>(
|
||||
repositories.clone(),
|
||||
move |repositories, (_channel_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let user_id = event.permission.user_id;
|
||||
let registry = Arc::clone(®istry);
|
||||
async move {
|
||||
if let Err(error) = registry.refresh_user(&repositories, user_id).await {
|
||||
@@ -247,10 +252,10 @@ impl RealtimeRegistry {
|
||||
|
||||
let registry = Arc::clone(self);
|
||||
let repositories = repositories.clone();
|
||||
event_bus.on_async_with(
|
||||
"server_user_permission_updated",
|
||||
event_bus.on_async_with::<ServerUserPermissionUpdatedEvent, _>(
|
||||
repositories,
|
||||
move |repositories, (_server_id, user_id): (Uuid, Uuid)| {
|
||||
move |repositories, event| {
|
||||
let user_id = event.user_id;
|
||||
let registry = Arc::clone(®istry);
|
||||
async move {
|
||||
if let Err(error) = registry.refresh_user(&repositories, user_id).await {
|
||||
|
||||
+26
-12
@@ -1,4 +1,8 @@
|
||||
use crate::models::role;
|
||||
use crate::domain::events::role::{
|
||||
RoleCreatedEvent, RoleDeletedEvent, RoleUpdatedEvent, RoleUserCreatedEvent,
|
||||
RoleUserDeletedEvent,
|
||||
};
|
||||
use crate::models::{role, role_user};
|
||||
use crate::services::ServicesContext;
|
||||
use sea_orm::{ActiveModelTrait, EntityTrait, TransactionTrait};
|
||||
use std::sync::Arc;
|
||||
@@ -27,7 +31,7 @@ impl RoleService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("role_created", role.clone());
|
||||
event_bus.emit(RoleCreatedEvent { role: role.clone() });
|
||||
|
||||
Ok(role)
|
||||
}
|
||||
@@ -45,7 +49,7 @@ impl RoleService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("role_updated", role.clone());
|
||||
event_bus.emit(RoleUpdatedEvent { role: role.clone() });
|
||||
|
||||
Ok(role)
|
||||
}
|
||||
@@ -56,14 +60,15 @@ impl RoleService {
|
||||
|
||||
let txn = db.begin().await?;
|
||||
|
||||
let existing = role::Entity::find_by_id(id).one(&txn).await?;
|
||||
let res = role::Entity::delete_by_id(id).exec(&txn).await?;
|
||||
|
||||
let deleted = res.rows_affected > 0;
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
event_bus.emit("role_deleted", id);
|
||||
if let Some(role) = existing.filter(|_| deleted) {
|
||||
event_bus.emit(RoleDeletedEvent { role });
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
@@ -82,9 +87,14 @@ impl RoleService {
|
||||
.add_member(role_id, user_id)
|
||||
.await?;
|
||||
if added {
|
||||
self.service_context
|
||||
.event_bus
|
||||
.emit("role_user_created", (role_id, user_id, server_id));
|
||||
let role_user = role_user::Entity::find_by_id((role_id, user_id))
|
||||
.one(&self.service_context.repositories.server.context.db)
|
||||
.await?
|
||||
.ok_or_else(|| anyhow::anyhow!("Role membership not found"))?;
|
||||
self.service_context.event_bus.emit(RoleUserCreatedEvent {
|
||||
role_user,
|
||||
server_id,
|
||||
});
|
||||
}
|
||||
Ok(added)
|
||||
}
|
||||
@@ -95,16 +105,20 @@ impl RoleService {
|
||||
user_id: Uuid,
|
||||
server_id: Uuid,
|
||||
) -> Result<bool, anyhow::Error> {
|
||||
let existing = role_user::Entity::find_by_id((role_id, user_id))
|
||||
.one(&self.service_context.repositories.server.context.db)
|
||||
.await?;
|
||||
let removed = self
|
||||
.service_context
|
||||
.repositories
|
||||
.role
|
||||
.remove_member(role_id, user_id)
|
||||
.await?;
|
||||
if removed {
|
||||
self.service_context
|
||||
.event_bus
|
||||
.emit("role_user_deleted", (role_id, user_id, server_id));
|
||||
if let Some(role_user) = existing.filter(|_| removed) {
|
||||
self.service_context.event_bus.emit(RoleUserDeletedEvent {
|
||||
role_user,
|
||||
server_id,
|
||||
});
|
||||
}
|
||||
Ok(removed)
|
||||
}
|
||||
|
||||
+29
-9
@@ -1,3 +1,7 @@
|
||||
use crate::domain::events::server::{
|
||||
ServerCreatedEvent, ServerDeletedEvent, ServerUpdatedEvent, ServerUserCreatedEvent,
|
||||
ServerUserDeletedEvent,
|
||||
};
|
||||
use crate::models::{role, role_user, server, server_user};
|
||||
use crate::services::ServicesContext;
|
||||
use sea_orm::{
|
||||
@@ -63,7 +67,9 @@ impl ServerService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("server_created", srv.clone());
|
||||
event_bus.emit(ServerCreatedEvent {
|
||||
server: srv.clone(),
|
||||
});
|
||||
|
||||
Ok(srv)
|
||||
}
|
||||
@@ -97,7 +103,7 @@ impl ServerService {
|
||||
return Ok(srv);
|
||||
}
|
||||
|
||||
server_user::ActiveModel {
|
||||
let membership = server_user::ActiveModel {
|
||||
server_id: Set(server_id),
|
||||
user_id: Set(user_id),
|
||||
..Default::default()
|
||||
@@ -119,7 +125,9 @@ impl ServerService {
|
||||
.await?;
|
||||
|
||||
txn.commit().await?;
|
||||
event_bus.emit("server_user_created", (server_id, user_id));
|
||||
event_bus.emit(ServerUserCreatedEvent {
|
||||
server_user: membership,
|
||||
});
|
||||
self.service_context
|
||||
.repositories
|
||||
.read_state
|
||||
@@ -152,7 +160,9 @@ impl ServerService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("server_updated", srv.clone());
|
||||
event_bus.emit(ServerUpdatedEvent {
|
||||
server: srv.clone(),
|
||||
});
|
||||
|
||||
Ok(srv)
|
||||
}
|
||||
@@ -182,7 +192,10 @@ impl ServerService {
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
event_bus.emit("server_deleted", (existing, audience));
|
||||
event_bus.emit(ServerDeletedEvent {
|
||||
server: existing,
|
||||
audience,
|
||||
});
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
@@ -194,7 +207,7 @@ impl ServerService {
|
||||
|
||||
let txn = db.begin().await?;
|
||||
|
||||
crate::models::server_user::ActiveModel {
|
||||
let membership = crate::models::server_user::ActiveModel {
|
||||
server_id: Set(server_id),
|
||||
user_id: Set(user_id),
|
||||
..Default::default()
|
||||
@@ -214,7 +227,9 @@ impl ServerService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("server_user_created", (server_id, user_id));
|
||||
event_bus.emit(ServerUserCreatedEvent {
|
||||
server_user: membership,
|
||||
});
|
||||
|
||||
Ok(true)
|
||||
}
|
||||
@@ -225,6 +240,11 @@ impl ServerService {
|
||||
|
||||
let txn = db.begin().await?;
|
||||
|
||||
let membership = server_user::Entity::find()
|
||||
.filter(server_user::Column::ServerId.eq(server_id))
|
||||
.filter(server_user::Column::UserId.eq(user_id))
|
||||
.one(&txn)
|
||||
.await?;
|
||||
let res = crate::models::server_user::Entity::delete_many()
|
||||
.filter(crate::models::server_user::Column::ServerId.eq(server_id))
|
||||
.filter(crate::models::server_user::Column::UserId.eq(user_id))
|
||||
@@ -235,8 +255,8 @@ impl ServerService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
event_bus.emit("server_user_deleted", (server_id, user_id));
|
||||
if let Some(server_user) = membership.filter(|_| deleted) {
|
||||
event_bus.emit(ServerUserDeletedEvent { server_user });
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
use crate::auth::password;
|
||||
use crate::domain::events::user::{
|
||||
UserChangedEvent, UserCreatedEvent, UserDeletedEvent, UserUpdatedEvent,
|
||||
};
|
||||
use crate::models::{role, user};
|
||||
use crate::services::ServicesContext;
|
||||
use sea_orm::{
|
||||
@@ -30,7 +33,7 @@ impl UserService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("user_created", usr.clone());
|
||||
event_bus.emit(UserCreatedEvent { user: usr.clone() });
|
||||
|
||||
Ok(usr)
|
||||
}
|
||||
@@ -48,7 +51,7 @@ impl UserService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("user_updated", usr.clone());
|
||||
event_bus.emit(UserUpdatedEvent { user: usr.clone() });
|
||||
|
||||
Ok(usr)
|
||||
}
|
||||
@@ -79,7 +82,7 @@ impl UserService {
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
event_bus.emit("user_changed", usr);
|
||||
event_bus.emit(UserChangedEvent { user: usr });
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -90,14 +93,15 @@ impl UserService {
|
||||
|
||||
let txn = db.begin().await?;
|
||||
|
||||
let existing = user::Entity::find_by_id(id).one(&txn).await?;
|
||||
let res = user::Entity::delete_by_id(id).exec(&txn).await?;
|
||||
|
||||
let deleted = res.rows_affected > 0;
|
||||
|
||||
txn.commit().await?;
|
||||
|
||||
if deleted {
|
||||
event_bus.emit("user_deleted", id);
|
||||
if let Some(user) = existing.filter(|_| deleted) {
|
||||
event_bus.emit(UserDeletedEvent { user });
|
||||
}
|
||||
|
||||
Ok(deleted)
|
||||
|
||||
Reference in New Issue
Block a user