Plumbing to pass `role` for room participants

Conrad Irwin created

Change summary

crates/collab/migrations.sqlite/20221109000000_test_schema.sql            | 3 
crates/collab/migrations/20240103025509_add_role_to_room_participants.sql | 1 
crates/collab/src/db/queries/rooms.rs                                     | 2 
crates/collab/src/db/tables/room_participant.rs                           | 3 
crates/collab/src/rpc.rs                                                  | 2 
crates/project/src/project.rs                                             | 3 
crates/rpc/proto/zed.proto                                                | 1 
7 files changed, 11 insertions(+), 4 deletions(-)

Detailed changes

crates/collab/migrations.sqlite/20221109000000_test_schema.sql 🔗

@@ -161,7 +161,8 @@ CREATE TABLE "room_participants" (
     "calling_user_id" INTEGER NOT NULL REFERENCES users (id),
     "calling_connection_id" INTEGER NOT NULL,
     "calling_connection_server_id" INTEGER REFERENCES servers (id) ON DELETE SET NULL,
-    "participant_index" INTEGER
+    "participant_index" INTEGER,
+    "role" TEXT
 );
 CREATE UNIQUE INDEX "index_room_participants_on_user_id" ON "room_participants" ("user_id");
 CREATE INDEX "index_room_participants_on_room_id" ON "room_participants" ("room_id");

crates/collab/src/db/queries/rooms.rs 🔗

@@ -1126,6 +1126,7 @@ impl Database {
                         projects: Default::default(),
                         location: Some(proto::ParticipantLocation { variant: location }),
                         participant_index: participant_index as u32,
+                        role: db_participant.role.unwrap_or(ChannelRole::Member).into(),
                     },
                 );
             } else {
@@ -1137,6 +1138,7 @@ impl Database {
             }
         }
         drop(db_participants);
+        dbg!(&participants);
 
         let mut db_projects = db_room
             .find_related(project::Entity)

crates/collab/src/db/tables/room_participant.rs 🔗

@@ -1,4 +1,4 @@
-use crate::db::{ProjectId, RoomId, RoomParticipantId, ServerId, UserId};
+use crate::db::{ChannelRole, ProjectId, RoomId, RoomParticipantId, ServerId, UserId};
 use rpc::ConnectionId;
 use sea_orm::entity::prelude::*;
 
@@ -19,6 +19,7 @@ pub struct Model {
     pub calling_connection_id: i32,
     pub calling_connection_server_id: Option<ServerId>,
     pub participant_index: Option<i32>,
+    pub role: Option<ChannelRole>,
 }
 
 impl Model {

crates/collab/src/rpc.rs 🔗

@@ -1504,7 +1504,7 @@ async fn join_project(
     // First, we send the metadata associated with each worktree.
     response.send(proto::JoinProjectResponse {
         worktrees: worktrees.clone(),
-        replica_id: replica_id.0 as u32,
+        replica_id: Some(replica_id.0 as u32),
         collaborators: collaborators.clone(),
         language_servers: project.language_servers.clone(),
     })?;

crates/project/src/project.rs 🔗

@@ -713,7 +713,8 @@ impl Project {
             })
             .await?;
         let this = cx.new_model(|cx| {
-            let replica_id = response.payload.replica_id as ReplicaId;
+            // todo!()
+            let replica_id = response.payload.replica_id.unwrap() as ReplicaId;
 
             let mut worktrees = Vec::new();
             for worktree in response.payload.worktrees {

crates/rpc/proto/zed.proto 🔗

@@ -269,6 +269,7 @@ message Participant {
     repeated ParticipantProject projects = 3;
     ParticipantLocation location = 4;
     uint32 participant_index = 5;
+    ChannelRole role = 6;
 }
 
 message PendingParticipant {