mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-12 05:15:00 +00:00
Delete some old code, reame ChannelMembers -> Members
This commit is contained in:
parent
9c6f5de551
commit
e050d168a7
2 changed files with 21 additions and 170 deletions
|
@ -141,16 +141,16 @@ impl Into<i32> for ChannelRole {
|
||||||
pub enum ChannelVisibility {
|
pub enum ChannelVisibility {
|
||||||
#[sea_orm(string_value = "public")]
|
#[sea_orm(string_value = "public")]
|
||||||
Public,
|
Public,
|
||||||
#[sea_orm(string_value = "channel_members")]
|
#[sea_orm(string_value = "members")]
|
||||||
#[default]
|
#[default]
|
||||||
ChannelMembers,
|
Members,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<proto::ChannelVisibility> for ChannelVisibility {
|
impl From<proto::ChannelVisibility> for ChannelVisibility {
|
||||||
fn from(value: proto::ChannelVisibility) -> Self {
|
fn from(value: proto::ChannelVisibility) -> Self {
|
||||||
match value {
|
match value {
|
||||||
proto::ChannelVisibility::Public => ChannelVisibility::Public,
|
proto::ChannelVisibility::Public => ChannelVisibility::Public,
|
||||||
proto::ChannelVisibility::ChannelMembers => ChannelVisibility::ChannelMembers,
|
proto::ChannelVisibility::ChannelMembers => ChannelVisibility::Members,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -159,7 +159,7 @@ impl Into<proto::ChannelVisibility> for ChannelVisibility {
|
||||||
fn into(self) -> proto::ChannelVisibility {
|
fn into(self) -> proto::ChannelVisibility {
|
||||||
match self {
|
match self {
|
||||||
ChannelVisibility::Public => proto::ChannelVisibility::Public,
|
ChannelVisibility::Public => proto::ChannelVisibility::Public,
|
||||||
ChannelVisibility::ChannelMembers => proto::ChannelVisibility::ChannelMembers,
|
ChannelVisibility::Members => proto::ChannelVisibility::ChannelMembers,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,6 @@ use std::cmp::Ordering;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use rpc::proto::{channel_member::Kind, ChannelEdge};
|
use rpc::proto::{channel_member::Kind, ChannelEdge};
|
||||||
use smallvec::SmallVec;
|
|
||||||
|
|
||||||
type ChannelDescendants = HashMap<ChannelId, SmallSet<ChannelId>>;
|
|
||||||
|
|
||||||
impl Database {
|
impl Database {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -41,7 +38,7 @@ impl Database {
|
||||||
let channel = channel::ActiveModel {
|
let channel = channel::ActiveModel {
|
||||||
id: ActiveValue::NotSet,
|
id: ActiveValue::NotSet,
|
||||||
name: ActiveValue::Set(name.to_string()),
|
name: ActiveValue::Set(name.to_string()),
|
||||||
visibility: ActiveValue::Set(ChannelVisibility::ChannelMembers),
|
visibility: ActiveValue::Set(ChannelVisibility::Members),
|
||||||
}
|
}
|
||||||
.insert(&*tx)
|
.insert(&*tx)
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -349,49 +346,6 @@ impl Database {
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_channel_graph(
|
|
||||||
&self,
|
|
||||||
parents_by_child_id: ChannelDescendants,
|
|
||||||
trim_dangling_parents: bool,
|
|
||||||
tx: &DatabaseTransaction,
|
|
||||||
) -> Result<ChannelGraph> {
|
|
||||||
let mut channels = Vec::with_capacity(parents_by_child_id.len());
|
|
||||||
{
|
|
||||||
let mut rows = channel::Entity::find()
|
|
||||||
.filter(channel::Column::Id.is_in(parents_by_child_id.keys().copied()))
|
|
||||||
.stream(&*tx)
|
|
||||||
.await?;
|
|
||||||
while let Some(row) = rows.next().await {
|
|
||||||
let row = row?;
|
|
||||||
channels.push(Channel {
|
|
||||||
id: row.id,
|
|
||||||
name: row.name,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut edges = Vec::with_capacity(parents_by_child_id.len());
|
|
||||||
for (channel, parents) in parents_by_child_id.iter() {
|
|
||||||
for parent in parents.into_iter() {
|
|
||||||
if trim_dangling_parents {
|
|
||||||
if parents_by_child_id.contains_key(parent) {
|
|
||||||
edges.push(ChannelEdge {
|
|
||||||
channel_id: channel.to_proto(),
|
|
||||||
parent_id: parent.to_proto(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
edges.push(ChannelEdge {
|
|
||||||
channel_id: channel.to_proto(),
|
|
||||||
parent_id: parent.to_proto(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(ChannelGraph { channels, edges })
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_channels_for_user(&self, user_id: UserId) -> Result<ChannelsForUser> {
|
pub async fn get_channels_for_user(&self, user_id: UserId) -> Result<ChannelsForUser> {
|
||||||
self.transaction(|tx| async move {
|
self.transaction(|tx| async move {
|
||||||
let tx = tx;
|
let tx = tx;
|
||||||
|
@ -637,7 +591,7 @@ impl Database {
|
||||||
.one(&*tx)
|
.one(&*tx)
|
||||||
.await?
|
.await?
|
||||||
.map(|channel| channel.visibility)
|
.map(|channel| channel.visibility)
|
||||||
.unwrap_or(ChannelVisibility::ChannelMembers);
|
.unwrap_or(ChannelVisibility::Members);
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
|
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
|
||||||
enum QueryMemberDetails {
|
enum QueryMemberDetails {
|
||||||
|
@ -1011,79 +965,6 @@ impl Database {
|
||||||
Ok(results)
|
Ok(results)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the channel descendants,
|
|
||||||
/// Structured as a map from child ids to their parent ids
|
|
||||||
/// For example, the descendants of 'a' in this DAG:
|
|
||||||
///
|
|
||||||
/// /- b -\
|
|
||||||
/// a -- c -- d
|
|
||||||
///
|
|
||||||
/// would be:
|
|
||||||
/// {
|
|
||||||
/// a: [],
|
|
||||||
/// b: [a],
|
|
||||||
/// c: [a],
|
|
||||||
/// d: [a, c],
|
|
||||||
/// }
|
|
||||||
async fn get_channel_descendants(
|
|
||||||
&self,
|
|
||||||
channel_ids: impl IntoIterator<Item = ChannelId>,
|
|
||||||
tx: &DatabaseTransaction,
|
|
||||||
) -> Result<ChannelDescendants> {
|
|
||||||
let mut values = String::new();
|
|
||||||
for id in channel_ids {
|
|
||||||
if !values.is_empty() {
|
|
||||||
values.push_str(", ");
|
|
||||||
}
|
|
||||||
write!(&mut values, "({})", id).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
if values.is_empty() {
|
|
||||||
return Ok(HashMap::default());
|
|
||||||
}
|
|
||||||
|
|
||||||
let sql = format!(
|
|
||||||
r#"
|
|
||||||
SELECT
|
|
||||||
descendant_paths.*
|
|
||||||
FROM
|
|
||||||
channel_paths parent_paths, channel_paths descendant_paths
|
|
||||||
WHERE
|
|
||||||
parent_paths.channel_id IN ({values}) AND
|
|
||||||
descendant_paths.id_path LIKE (parent_paths.id_path || '%')
|
|
||||||
"#
|
|
||||||
);
|
|
||||||
|
|
||||||
let stmt = Statement::from_string(self.pool.get_database_backend(), sql);
|
|
||||||
|
|
||||||
let mut parents_by_child_id: ChannelDescendants = HashMap::default();
|
|
||||||
let mut paths = channel_path::Entity::find()
|
|
||||||
.from_raw_sql(stmt)
|
|
||||||
.stream(tx)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
while let Some(path) = paths.next().await {
|
|
||||||
let path = path?;
|
|
||||||
let ids = path.id_path.trim_matches('/').split('/');
|
|
||||||
let mut parent_id = None;
|
|
||||||
for id in ids {
|
|
||||||
if let Ok(id) = id.parse() {
|
|
||||||
let id = ChannelId::from_proto(id);
|
|
||||||
if id == path.channel_id {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
parent_id = Some(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let entry = parents_by_child_id.entry(path.channel_id).or_default();
|
|
||||||
if let Some(parent_id) = parent_id {
|
|
||||||
entry.insert(parent_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(parents_by_child_id)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the channel with the given ID and:
|
/// Returns the channel with the given ID and:
|
||||||
/// - true if the user is a member
|
/// - true if the user is a member
|
||||||
/// - false if the user hasn't accepted the invitation yet
|
/// - false if the user hasn't accepted the invitation yet
|
||||||
|
@ -1242,18 +1123,23 @@ impl Database {
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut channel_descendants = self.get_channel_descendants([channel], &*tx).await?;
|
let membership = channel_member::Entity::find()
|
||||||
if let Some(channel) = channel_descendants.get_mut(&channel) {
|
.filter(
|
||||||
// Remove the other parents
|
channel_member::Column::ChannelId
|
||||||
channel.clear();
|
.eq(channel)
|
||||||
channel.insert(new_parent);
|
.and(channel_member::Column::UserId.eq(user)),
|
||||||
}
|
)
|
||||||
|
.all(tx)
|
||||||
let channels = self
|
|
||||||
.get_channel_graph(channel_descendants, false, &*tx)
|
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(channels)
|
let mut channel_info = self.get_user_channels(user, membership, &*tx).await?;
|
||||||
|
|
||||||
|
channel_info.channels.edges.push(ChannelEdge {
|
||||||
|
channel_id: channel.to_proto(),
|
||||||
|
parent_id: new_parent.to_proto(),
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(channel_info.channels)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unlink a channel from a given parent. This will add in a root edge if
|
/// Unlink a channel from a given parent. This will add in a root edge if
|
||||||
|
@ -1405,38 +1291,3 @@ impl PartialEq for ChannelGraph {
|
||||||
self.channels == other.channels && self.edges == other.edges
|
self.channels == other.channels && self.edges == other.edges
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SmallSet<T>(SmallVec<[T; 1]>);
|
|
||||||
|
|
||||||
impl<T> Deref for SmallSet<T> {
|
|
||||||
type Target = [T];
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
self.0.deref()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> Default for SmallSet<T> {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self(SmallVec::new())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> SmallSet<T> {
|
|
||||||
fn insert(&mut self, value: T) -> bool
|
|
||||||
where
|
|
||||||
T: Ord,
|
|
||||||
{
|
|
||||||
match self.binary_search(&value) {
|
|
||||||
Ok(_) => false,
|
|
||||||
Err(ix) => {
|
|
||||||
self.0.insert(ix, value);
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn clear(&mut self) {
|
|
||||||
self.0.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue