From d72019e39f38757d63157e484ccfbf79047cd0f9 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Sun, 26 Apr 2026 23:58:33 +0800 Subject: [PATCH] feat(room): add WS events for AI config and repo lifecycle changes Add RoomAiUpdated, RepoCreated, RepoUpdated, RepoDeleted event types. Publish RoomAiUpdated after room_ai upsert/delete and repo events after repo create/update. Always set model_name in AI list response (fallback to "AI {uuid}" when model lookup fails) so frontend never displays a raw UUID. --- libs/room/src/ai.rs | 35 +++++++++++++++++++++++++++++++---- libs/room/src/types.rs | 12 ++++++++++++ libs/service/git/repo.rs | 10 ++++++++++ libs/service/project/repo.rs | 9 +++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/libs/room/src/ai.rs b/libs/room/src/ai.rs index 73a45eb..e40f2d4 100644 --- a/libs/room/src/ai.rs +++ b/libs/room/src/ai.rs @@ -28,9 +28,10 @@ impl RoomService { .await .ok() .flatten() - .map(|m| m.name); + .map(|m| m.name) + .unwrap_or_else(|| format!("AI {}", model.model)); let mut resp = super::RoomAiResponse::from(model); - resp.model_name = model_name; + resp.model_name = Some(model_name); responses.push(resp); } @@ -113,9 +114,22 @@ impl RoomService { .await .ok() .flatten() - .map(|m| m.name); + .map(|m| m.name) + .unwrap_or_else(|| format!("AI {}", saved.model)); let mut resp = super::RoomAiResponse::from(saved); - resp.model_name = model_name; + resp.model_name = Some(model_name); + + if let Ok(room) = self.find_room_or_404(room_id).await { + self.publish_room_event( + room.project, + super::RoomEventType::RoomAiUpdated, + Some(room_id), + None, + None, + None, + ) + .await; + } Ok(resp) } @@ -132,6 +146,19 @@ impl RoomService { room_ai::Entity::delete_by_id((room_id, model_id)) .exec(&self.db) .await?; + + if let Ok(room) = self.find_room_or_404(room_id).await { + self.publish_room_event( + room.project, + super::RoomEventType::RoomAiUpdated, + Some(room_id), + None, + None, + None, + ) + .await; + } + Ok(()) } } diff --git a/libs/room/src/types.rs b/libs/room/src/types.rs index 00a2357..117a66f 100644 --- a/libs/room/src/types.rs +++ b/libs/room/src/types.rs @@ -35,6 +35,10 @@ pub enum RoomEventType { ReactionRemoved, TypingStart, TypingStop, + RoomAiUpdated, + RepoCreated, + RepoUpdated, + RepoDeleted, } impl RoomEventType { @@ -59,6 +63,10 @@ impl RoomEventType { RoomEventType::ReactionRemoved => "reaction_removed", RoomEventType::TypingStart => "typing_start", RoomEventType::TypingStop => "typing_stop", + RoomEventType::RoomAiUpdated => "room_ai_updated", + RoomEventType::RepoCreated => "repo_created", + RoomEventType::RepoUpdated => "repo_updated", + RoomEventType::RepoDeleted => "repo_deleted", } } @@ -83,6 +91,10 @@ impl RoomEventType { "reaction_removed" => Some(RoomEventType::ReactionRemoved), "typing_start" => Some(RoomEventType::TypingStart), "typing_stop" => Some(RoomEventType::TypingStop), + "room_ai_updated" => Some(RoomEventType::RoomAiUpdated), + "repo_created" => Some(RoomEventType::RepoCreated), + "repo_updated" => Some(RoomEventType::RepoUpdated), + "repo_deleted" => Some(RoomEventType::RepoDeleted), _ => None, } } diff --git a/libs/service/git/repo.rs b/libs/service/git/repo.rs index de77421..be509d7 100644 --- a/libs/service/git/repo.rs +++ b/libs/service/git/repo.rs @@ -465,6 +465,16 @@ impl AppService { } active.update(&txn).await?; txn.commit().await?; + + self.room.publish_room_event( + repo.project, + room::RoomEventType::RepoUpdated, + None, + None, + None, + None, + ).await; + Ok(()) } } diff --git a/libs/service/project/repo.rs b/libs/service/project/repo.rs index 29471ba..3895b6a 100644 --- a/libs/service/project/repo.rs +++ b/libs/service/project/repo.rs @@ -337,6 +337,15 @@ impl AppService { ) .await; + self.room.publish_room_event( + project.id, + room::RoomEventType::RepoCreated, + None, + None, + None, + None, + ).await; + Ok(ProjectRepoCreateResponse { uid: repo.id, repo_name: repo.repo_name,