From e612043e5f83b3c50555c23cfb393f768423fa27 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Sun, 19 Apr 2026 22:27:57 +0800 Subject: [PATCH] feat(room): auto-add new project members to all rooms --- libs/service/project/invitation.rs | 3 ++ libs/service/project/join_request.rs | 3 ++ libs/service/project/members.rs | 41 ++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/libs/service/project/invitation.rs b/libs/service/project/invitation.rs index 090ee99..8d575c8 100644 --- a/libs/service/project/invitation.rs +++ b/libs/service/project/invitation.rs @@ -369,6 +369,9 @@ impl AppService { joined_at: Set(Utc::now()), }; member.insert(&txn).await?; + + // Auto-add user to all rooms in the project + let _ = Self::add_user_to_all_project_rooms(&txn, project.id, user_uid).await; } let log = project_audit_log::ActiveModel { project: Set(project.id), diff --git a/libs/service/project/join_request.rs b/libs/service/project/join_request.rs index 891749a..580d666 100644 --- a/libs/service/project/join_request.rs +++ b/libs/service/project/join_request.rs @@ -309,6 +309,9 @@ impl AppService { joined_at: Set(Utc::now()), }; member.insert(&txn).await?; + + // Auto-add user to all rooms in the project + let _ = Self::add_user_to_all_project_rooms(&txn, project.id, request_user).await; } else { active_request.status = Set("rejected".to_string()); active_request.processed_by = Set(Some(user_uid)); diff --git a/libs/service/project/members.rs b/libs/service/project/members.rs index 441f658..3d7d9fe 100644 --- a/libs/service/project/members.rs +++ b/libs/service/project/members.rs @@ -2,8 +2,10 @@ use crate::AppService; use crate::error::AppError; use chrono::Utc; use models::projects::{MemberRole, project_audit_log, project_members}; +use models::rooms::{room, room_member, RoomMemberRole}; use models::users::user; use sea_orm::*; +use sea_orm::sea_query::OnConflict; use serde::{Deserialize, Serialize}; use session::Session; use utoipa::ToSchema; @@ -315,4 +317,43 @@ impl AppService { Ok(()) } + + /// Add a user to all rooms in a project (used automatically when a user joins a project). + pub async fn add_user_to_all_project_rooms( + db: &impl ConnectionTrait, + project_id: Uuid, + user_id: Uuid, + ) -> Result<(), AppError> { + let rooms: Vec = room::Entity::find() + .filter(room::Column::Project.eq(project_id)) + .all(db) + .await?; + + if rooms.is_empty() { + return Ok(()); + } + + let now = Utc::now(); + let values: Vec = rooms + .iter() + .map(|r| room_member::ActiveModel { + room: Set(r.id), + user: Set(user_id), + role: Set(RoomMemberRole::Member), + first_msg_in: Set(None), + joined_at: Set(Some(now)), + last_read_seq: Set(None), + do_not_disturb: Set(false), + dnd_start_hour: Set(None), + dnd_end_hour: Set(None), + }) + .collect(); + + room_member::Entity::insert_many(values) + .on_conflict(OnConflict::new().do_nothing().to_owned()) + .exec(db) + .await?; + + Ok(()) + } }