use crate::db::{ChannelId, ChannelVisibility}; use sea_orm::entity::prelude::*; #[derive(Clone, Debug, Default, PartialEq, Eq, DeriveEntityModel)] #[sea_orm(table_name = "channels")] pub struct Model { #[sea_orm(primary_key)] pub id: ChannelId, pub name: String, pub visibility: ChannelVisibility, pub parent_path: String, } impl Model { pub fn parent_id(&self) -> Option { self.ancestors().last() } pub fn ancestors(&self) -> impl Iterator + '_ { self.parent_path .trim_end_matches('/') .split('/') .filter_map(|id| Some(ChannelId::from_proto(id.parse().ok()?))) } pub fn ancestors_including_self(&self) -> impl Iterator + '_ { self.ancestors().chain(Some(self.id)) } pub fn path(&self) -> String { format!("{}{}/", self.parent_path, self.id) } } impl ActiveModelBehavior for ActiveModel {} #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] pub enum Relation { #[sea_orm(has_one = "super::room::Entity")] Room, #[sea_orm(has_one = "super::buffer::Entity")] Buffer, #[sea_orm(has_many = "super::channel_member::Entity")] Member, #[sea_orm(has_many = "super::channel_buffer_collaborator::Entity")] BufferCollaborators, #[sea_orm(has_many = "super::channel_chat_participant::Entity")] ChatParticipants, } impl Related for Entity { fn to() -> RelationDef { Relation::Member.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::Room.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::Buffer.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::BufferCollaborators.def() } } impl Related for Entity { fn to() -> RelationDef { Relation::ChatParticipants.def() } }