Finish implementing `Db::update_project`

Antonio Scandurra created

Change summary

crates/collab/src/db.rs        | 17 +++++++++++
crates/collab/src/rpc.rs       |  9 ++----
crates/collab/src/rpc/store.rs | 49 ------------------------------------
crates/project/src/project.rs  |  6 ++--
crates/rpc/proto/zed.proto     |  7 -----
crates/rpc/src/proto.rs        |  2 -
6 files changed, 22 insertions(+), 68 deletions(-)

Detailed changes

crates/collab/src/db.rs 🔗

@@ -1515,8 +1515,23 @@ where
             }
             query.execute(&mut tx).await?;
 
+            let mut guest_connection_ids = Vec::new();
+            {
+                let mut db_guest_connection_ids = sqlx::query_scalar::<_, i32>(
+                    "
+                    SELECT connection_id
+                    FROM project_collaborators
+                    WHERE project_id = $1 AND is_host = FALSE
+                    ",
+                )
+                .fetch(&mut tx);
+                while let Some(connection_id) = db_guest_connection_ids.next().await {
+                    guest_connection_ids.push(ConnectionId(connection_id? as u32));
+                }
+            }
+
             let room = self.commit_room_transaction(room_id, tx).await?;
-            todo!()
+            Ok((room, guest_connection_ids))
         })
         .await
     }

crates/collab/src/rpc.rs 🔗

@@ -1100,13 +1100,10 @@ impl Server {
             request.sender_connection_id,
             guest_connection_ids,
             |connection_id| {
-                self.peer.send(
+                self.peer.forward_send(
+                    request.sender_connection_id,
                     connection_id,
-                    proto::ProjectUpdated {
-                        project_id: project_id.to_proto(),
-                        worktrees: request.payload.worktrees.clone(),
-                        room_version: room.version,
-                    },
+                    request.payload.clone(),
                 )
             },
         );

crates/collab/src/rpc/store.rs 🔗

@@ -253,55 +253,6 @@ impl Store {
         }
     }
 
-    pub fn update_project(
-        &mut self,
-        project_id: ProjectId,
-        worktrees: &[proto::WorktreeMetadata],
-        connection_id: ConnectionId,
-    ) -> Result<&proto::Room> {
-        let project = self
-            .projects
-            .get_mut(&project_id)
-            .ok_or_else(|| anyhow!("no such project"))?;
-        if project.host_connection_id == connection_id {
-            let mut old_worktrees = mem::take(&mut project.worktrees);
-            for worktree in worktrees {
-                if let Some(old_worktree) = old_worktrees.remove(&worktree.id) {
-                    project.worktrees.insert(worktree.id, old_worktree);
-                } else {
-                    project.worktrees.insert(
-                        worktree.id,
-                        Worktree {
-                            root_name: worktree.root_name.clone(),
-                            visible: worktree.visible,
-                            ..Default::default()
-                        },
-                    );
-                }
-            }
-
-            let room = self
-                .rooms
-                .get_mut(&project.room_id)
-                .ok_or_else(|| anyhow!("no such room"))?;
-            let participant_project = room
-                .participants
-                .iter_mut()
-                .flat_map(|participant| &mut participant.projects)
-                .find(|project| project.id == project_id.to_proto())
-                .ok_or_else(|| anyhow!("no such project"))?;
-            participant_project.worktree_root_names = worktrees
-                .iter()
-                .filter(|worktree| worktree.visible)
-                .map(|worktree| worktree.root_name.clone())
-                .collect();
-
-            Ok(room)
-        } else {
-            Err(anyhow!("no such project"))?
-        }
-    }
-
     pub fn update_diagnostic_summary(
         &mut self,
         project_id: ProjectId,

crates/project/src/project.rs 🔗

@@ -373,7 +373,7 @@ impl Project {
         client.add_model_message_handler(Self::handle_start_language_server);
         client.add_model_message_handler(Self::handle_update_language_server);
         client.add_model_message_handler(Self::handle_remove_collaborator);
-        client.add_model_message_handler(Self::handle_project_updated);
+        client.add_model_message_handler(Self::handle_update_project);
         client.add_model_message_handler(Self::handle_unshare_project);
         client.add_model_message_handler(Self::handle_create_buffer_for_peer);
         client.add_model_message_handler(Self::handle_update_buffer_file);
@@ -4533,9 +4533,9 @@ impl Project {
         })
     }
 
-    async fn handle_project_updated(
+    async fn handle_update_project(
         this: ModelHandle<Self>,
-        envelope: TypedEnvelope<proto::ProjectUpdated>,
+        envelope: TypedEnvelope<proto::UpdateProject>,
         client: Arc<Client>,
         mut cx: AsyncAppContext,
     ) -> Result<()> {

crates/rpc/proto/zed.proto 🔗

@@ -48,7 +48,6 @@ message Envelope {
         OpenBufferForSymbolResponse open_buffer_for_symbol_response = 40;
 
         UpdateProject update_project = 41;
-        ProjectUpdated project_updated = 42;
         UpdateWorktree update_worktree = 43;
 
         CreateProjectEntry create_project_entry = 45;
@@ -257,12 +256,6 @@ message UpdateProject {
     repeated WorktreeMetadata worktrees = 2;
 }
 
-message ProjectUpdated {
-    uint64 project_id = 1;
-    repeated WorktreeMetadata worktrees = 2;
-    uint64 room_version = 3;
-}
-
 message JoinProject {
     uint64 project_id = 1;
 }

crates/rpc/src/proto.rs 🔗

@@ -144,7 +144,6 @@ messages!(
     (PrepareRename, Background),
     (PrepareRenameResponse, Background),
     (ProjectEntryResponse, Foreground),
-    (ProjectUpdated, Foreground),
     (RemoveContact, Foreground),
     (ReloadBuffers, Foreground),
     (ReloadBuffersResponse, Foreground),
@@ -261,7 +260,6 @@ entity_messages!(
     OpenBufferByPath,
     OpenBufferForSymbol,
     PerformRename,
-    ProjectUpdated,
     PrepareRename,
     ReloadBuffers,
     RemoveProjectCollaborator,