Add channel visibility columns and protos

Mikayla created

Change summary

crates/channel/src/channel_store_tests.rs                  | 10 ++
crates/collab/migrations/20231011214412_add_guest_role.sql |  4 
crates/collab/src/db/ids.rs                                | 35 ++++++++
crates/collab/src/db/tables/channel.rs                     |  3 
crates/collab/src/rpc.rs                                   | 20 ++++
crates/rpc/proto/zed.proto                                 |  6 +
6 files changed, 72 insertions(+), 6 deletions(-)

Detailed changes

crates/channel/src/channel_store_tests.rs 🔗

@@ -3,7 +3,7 @@ use crate::channel_chat::ChannelChatEvent;
 use super::*;
 use client::{test::FakeServer, Client, UserStore};
 use gpui::{AppContext, ModelHandle, TestAppContext};
-use rpc::proto;
+use rpc::proto::{self, ChannelRole};
 use settings::SettingsStore;
 use util::http::FakeHttpClient;
 
@@ -18,10 +18,12 @@ fn test_update_channels(cx: &mut AppContext) {
                 proto::Channel {
                     id: 1,
                     name: "b".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
                 proto::Channel {
                     id: 2,
                     name: "a".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
             ],
             channel_permissions: vec![proto::ChannelPermission {
@@ -49,10 +51,12 @@ fn test_update_channels(cx: &mut AppContext) {
                 proto::Channel {
                     id: 3,
                     name: "x".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
                 proto::Channel {
                     id: 4,
                     name: "y".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
             ],
             insert_edge: vec![
@@ -92,14 +96,17 @@ fn test_dangling_channel_paths(cx: &mut AppContext) {
                 proto::Channel {
                     id: 0,
                     name: "a".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
                 proto::Channel {
                     id: 1,
                     name: "b".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
                 proto::Channel {
                     id: 2,
                     name: "c".to_string(),
+                    visibility: proto::ChannelVisibility::ChannelMembers as i32,
                 },
             ],
             insert_edge: vec![
@@ -158,6 +165,7 @@ async fn test_channel_messages(cx: &mut TestAppContext) {
         channels: vec![proto::Channel {
             id: channel_id,
             name: "the-channel".to_string(),
+            visibility: proto::ChannelVisibility::ChannelMembers as i32,
         }],
         ..Default::default()
     });

crates/collab/migrations/20231011214412_add_guest_role.sql 🔗

@@ -1,4 +1,4 @@
--- Add migration script here
-
 ALTER TABLE channel_members ADD COLUMN role TEXT;
 UPDATE channel_members SET role = CASE WHEN admin THEN 'admin' ELSE 'member' END;
+
+ALTER TABLE channels ADD COLUMN visibility TEXT NOT NULL DEFAULT 'channel_members';

crates/collab/src/db/ids.rs 🔗

@@ -119,3 +119,38 @@ impl Into<i32> for ChannelRole {
         proto.into()
     }
 }
+
+#[derive(Eq, PartialEq, Copy, Clone, Debug, EnumIter, DeriveActiveEnum, Default)]
+#[sea_orm(rs_type = "String", db_type = "String(None)")]
+pub enum ChannelVisibility {
+    #[sea_orm(string_value = "public")]
+    Public,
+    #[sea_orm(string_value = "channel_members")]
+    #[default]
+    ChannelMembers,
+}
+
+impl From<proto::ChannelVisibility> for ChannelVisibility {
+    fn from(value: proto::ChannelVisibility) -> Self {
+        match value {
+            proto::ChannelVisibility::Public => ChannelVisibility::Public,
+            proto::ChannelVisibility::ChannelMembers => ChannelVisibility::ChannelMembers,
+        }
+    }
+}
+
+impl Into<proto::ChannelVisibility> for ChannelVisibility {
+    fn into(self) -> proto::ChannelVisibility {
+        match self {
+            ChannelVisibility::Public => proto::ChannelVisibility::Public,
+            ChannelVisibility::ChannelMembers => proto::ChannelVisibility::ChannelMembers,
+        }
+    }
+}
+
+impl Into<i32> for ChannelVisibility {
+    fn into(self) -> i32 {
+        let proto: proto::ChannelVisibility = self.into();
+        proto.into()
+    }
+}

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

@@ -1,4 +1,4 @@
-use crate::db::ChannelId;
+use crate::db::{ChannelId, ChannelVisibility};
 use sea_orm::entity::prelude::*;
 
 #[derive(Clone, Debug, Default, PartialEq, Eq, DeriveEntityModel)]
@@ -7,6 +7,7 @@ pub struct Model {
     #[sea_orm(primary_key)]
     pub id: ChannelId,
     pub name: String,
+    pub visbility: ChannelVisibility,
 }
 
 impl ActiveModelBehavior for ActiveModel {}

crates/collab/src/rpc.rs 🔗

@@ -38,8 +38,8 @@ use lazy_static::lazy_static;
 use prometheus::{register_int_gauge, IntGauge};
 use rpc::{
     proto::{
-        self, Ack, AnyTypedEnvelope, ChannelEdge, EntityMessage, EnvelopedMessage,
-        LiveKitConnectionInfo, RequestMessage, UpdateChannelBufferCollaborators,
+        self, Ack, AnyTypedEnvelope, ChannelEdge, ChannelVisibility, EntityMessage,
+        EnvelopedMessage, LiveKitConnectionInfo, RequestMessage, UpdateChannelBufferCollaborators,
     },
     Connection, ConnectionId, Peer, Receipt, TypedEnvelope,
 };
@@ -2210,6 +2210,8 @@ async fn create_channel(
     let channel = proto::Channel {
         id: id.to_proto(),
         name: request.name,
+        // TODO: Visibility
+        visibility: proto::ChannelVisibility::ChannelMembers as i32,
     };
 
     response.send(proto::CreateChannelResponse {
@@ -2299,6 +2301,8 @@ async fn invite_channel_member(
     update.channel_invitations.push(proto::Channel {
         id: channel.id.to_proto(),
         name: channel.name,
+        // TODO: Visibility
+        visibility: proto::ChannelVisibility::ChannelMembers as i32,
     });
     for connection_id in session
         .connection_pool()
@@ -2394,6 +2398,8 @@ async fn rename_channel(
     let channel = proto::Channel {
         id: request.channel_id,
         name: new_name,
+        // TODO: Visibility
+        visibility: proto::ChannelVisibility::ChannelMembers as i32,
     };
     response.send(proto::RenameChannelResponse {
         channel: Some(channel.clone()),
@@ -2432,6 +2438,8 @@ async fn link_channel(
             .map(|channel| proto::Channel {
                 id: channel.id.to_proto(),
                 name: channel.name,
+                // TODO: Visibility
+                visibility: proto::ChannelVisibility::ChannelMembers as i32,
             })
             .collect(),
         insert_edge: channels_to_send.edges,
@@ -2523,6 +2531,8 @@ async fn move_channel(
             .map(|channel| proto::Channel {
                 id: channel.id.to_proto(),
                 name: channel.name,
+                // TODO: Visibility
+                visibility: proto::ChannelVisibility::ChannelMembers as i32,
             })
             .collect(),
         insert_edge: channels_to_send.edges,
@@ -2579,6 +2589,8 @@ async fn respond_to_channel_invite(
                     .map(|channel| proto::Channel {
                         id: channel.id.to_proto(),
                         name: channel.name,
+                        // TODO: Visibility
+                        visibility: ChannelVisibility::ChannelMembers.into(),
                     }),
             );
         update.unseen_channel_messages = result.channel_messages;
@@ -3082,6 +3094,8 @@ fn build_initial_channels_update(
         update.channels.push(proto::Channel {
             id: channel.id.to_proto(),
             name: channel.name,
+            // TODO: Visibility
+            visibility: ChannelVisibility::Public.into(),
         });
     }
 
@@ -3114,6 +3128,8 @@ fn build_initial_channels_update(
         update.channel_invitations.push(proto::Channel {
             id: channel.id.to_proto(),
             name: channel.name,
+            // TODO: Visibility
+            visibility: ChannelVisibility::Public.into(),
         });
     }
 

crates/rpc/proto/zed.proto 🔗

@@ -1539,9 +1539,15 @@ message Nonce {
     uint64 lower_half = 2;
 }
 
+enum ChannelVisibility {
+    Public = 0;
+    ChannelMembers = 1;
+}
+
 message Channel {
     uint64 id = 1;
     string name = 2;
+    ChannelVisibility visibility = 3;
 }
 
 message Contact {