285 lines · 8.2 KB · Rust
RawDownload
use crate::Result;use rpc::proto;use sea_orm::{entity::prelude::*, DbErr};use serde::{Deserialize, Serialize}; #[macro_export]macro_rules! id_type {    ($name:ident) => {        #[derive(            Clone,            Copy,            Debug,            Default,            PartialEq,            Eq,            PartialOrd,            Ord,            Hash,            Serialize,            Deserialize,            DeriveValueType,        )]        #[allow(missing_docs)]        #[serde(transparent)]        pub struct $name(pub i32);         impl $name {            #[allow(unused)]            #[allow(missing_docs)]            pub const MAX: Self = Self(i32::MAX);             #[allow(unused)]            #[allow(missing_docs)]            pub fn from_proto(value: u64) -> Self {                debug_assert!(value != 0);                Self(value as i32)            }             #[allow(unused)]            #[allow(missing_docs)]            pub fn to_proto(self) -> u64 {                self.0 as u64            }        }         impl std::fmt::Display for $name {            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {                self.0.fmt(f)            }        }         impl sea_orm::TryFromU64 for $name {            fn try_from_u64(n: u64) -> Result<Self, DbErr> {                Ok(Self(n.try_into().map_err(|_| {                    DbErr::ConvertFromU64(concat!(                        "error converting ",                        stringify!($name),                        " to u64"                    ))                })?))            }        }         impl sea_orm::sea_query::Nullable for $name {            fn null() -> Value {                Value::Int(None)            }        }    };} id_type!(AccessTokenId);id_type!(BillingCustomerId);id_type!(BillingSubscriptionId);id_type!(BillingPreferencesId);id_type!(BufferId);id_type!(ChannelBufferCollaboratorId);id_type!(ChannelChatParticipantId);id_type!(ChannelId);id_type!(ChannelMemberId);id_type!(ContactId);id_type!(ExtensionId);id_type!(FlagId);id_type!(FollowerId);id_type!(HostedProjectId);id_type!(MessageId);id_type!(NotificationId);id_type!(NotificationKindId);id_type!(ProjectCollaboratorId);id_type!(ProjectId);id_type!(ReplicaId);id_type!(RoomId);id_type!(RoomParticipantId);id_type!(ServerId);id_type!(SignupId);id_type!(UserId); /// ChannelRole gives you permissions for both channels and calls.#[derive(    Eq, PartialEq, Copy, Clone, Debug, EnumIter, DeriveActiveEnum, Default, Hash, Serialize,)]#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)")]pub enum ChannelRole {    /// Admin can read/write and change permissions.    #[sea_orm(string_value = "admin")]    Admin,    /// Member can read/write, but not change permissions.    #[sea_orm(string_value = "member")]    #[default]    Member,    /// Talker can read, but not write.    /// They can use microphones and the channel chat    #[sea_orm(string_value = "talker")]    Talker,    /// Guest can read, but not write.    /// They can not use microphones but can use the chat.    #[sea_orm(string_value = "guest")]    Guest,    /// Banned may not read.    #[sea_orm(string_value = "banned")]    Banned,} impl ChannelRole {    /// Returns true if this role is more powerful than the other role.    pub fn should_override(&self, other: Self) -> bool {        use ChannelRole::*;        match self {            Admin => matches!(other, Member | Banned | Talker | Guest),            Member => matches!(other, Banned | Talker | Guest),            Talker => matches!(other, Guest),            Banned => matches!(other, Guest),            Guest => false,        }    }     /// Returns the maximal role between the two    pub fn max(&self, other: Self) -> Self {        if self.should_override(other) {            *self        } else {            other        }    }     pub fn can_see_channel(&self, visibility: ChannelVisibility) -> bool {        use ChannelRole::*;        match self {            Admin | Member => true,            Guest | Talker => visibility == ChannelVisibility::Public,            Banned => false,        }    }     /// True if the role allows access to all descendant channels    pub fn can_see_all_descendants(&self) -> bool {        use ChannelRole::*;        match self {            Admin | Member => true,            Guest | Talker | Banned => false,        }    }     /// True if the role only allows access to public descendant channels    pub fn can_only_see_public_descendants(&self) -> bool {        use ChannelRole::*;        match self {            Guest | Talker => true,            Admin | Member | Banned => false,        }    }     /// True if the role can share screen/microphone/projects into rooms.    pub fn can_use_microphone(&self) -> bool {        use ChannelRole::*;        match self {            Admin | Member | Talker => true,            Guest | Banned => false,        }    }     /// True if the role can edit shared projects.    pub fn can_edit_projects(&self) -> bool {        use ChannelRole::*;        match self {            Admin | Member => true,            Talker | Guest | Banned => false,        }    }     /// True if the role can read shared projects.    pub fn can_read_projects(&self) -> bool {        use ChannelRole::*;        match self {            Admin | Member | Guest | Talker => true,            Banned => false,        }    }     pub fn requires_cla(&self) -> bool {        use ChannelRole::*;        match self {            Admin | Member => true,            Banned | Guest | Talker => false,        }    }} impl From<proto::ChannelRole> for ChannelRole {    fn from(value: proto::ChannelRole) -> Self {        match value {            proto::ChannelRole::Admin => ChannelRole::Admin,            proto::ChannelRole::Member => ChannelRole::Member,            proto::ChannelRole::Talker => ChannelRole::Talker,            proto::ChannelRole::Guest => ChannelRole::Guest,            proto::ChannelRole::Banned => ChannelRole::Banned,        }    }} impl From<ChannelRole> for proto::ChannelRole {    fn from(val: ChannelRole) -> Self {        match val {            ChannelRole::Admin => proto::ChannelRole::Admin,            ChannelRole::Member => proto::ChannelRole::Member,            ChannelRole::Talker => proto::ChannelRole::Talker,            ChannelRole::Guest => proto::ChannelRole::Guest,            ChannelRole::Banned => proto::ChannelRole::Banned,        }    }} impl From<ChannelRole> for i32 {    fn from(val: ChannelRole) -> Self {        let proto: proto::ChannelRole = val.into();        proto.into()    }} /// ChannelVisibility controls whether channels are public or private.#[derive(Eq, PartialEq, Copy, Clone, Debug, EnumIter, DeriveActiveEnum, Default, Hash)]#[sea_orm(rs_type = "String", db_type = "String(StringLen::None)")]pub enum ChannelVisibility {    /// Public channels are visible to anyone with the link. People join with the Guest role by default.    #[sea_orm(string_value = "public")]    Public,    /// Members channels are only visible to members of this channel or its parents.    #[sea_orm(string_value = "members")]    #[default]    Members,} impl From<proto::ChannelVisibility> for ChannelVisibility {    fn from(value: proto::ChannelVisibility) -> Self {        match value {            proto::ChannelVisibility::Public => ChannelVisibility::Public,            proto::ChannelVisibility::Members => ChannelVisibility::Members,        }    }} impl From<ChannelVisibility> for proto::ChannelVisibility {    fn from(val: ChannelVisibility) -> Self {        match val {            ChannelVisibility::Public => proto::ChannelVisibility::Public,            ChannelVisibility::Members => proto::ChannelVisibility::Members,        }    }} impl From<ChannelVisibility> for i32 {    fn from(val: ChannelVisibility) -> Self {        let proto: proto::ChannelVisibility = val.into();        proto.into()    }} /// Indicate whether a [Buffer] has permissions to edit.#[derive(PartialEq, Clone, Copy, Debug)]pub enum Capability {    /// The buffer is a mutable replica.    ReadWrite,    /// The buffer is a read-only replica.    ReadOnly,}