use crate::models::base_info::UserBaseInfo; use crate::models::common::{ ChannelKind, ChannelType, ForumLayout, ForumSortOrder, JsonValue, Visibility, }; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use uuid::Uuid; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::FromRow, utoipa::ToSchema)] pub struct Channel { pub id: Uuid, pub workspace_id: Uuid, pub repo_id: Option, pub category_id: Option, pub created_by: Uuid, pub name: String, pub topic: Option, pub description: Option, pub channel_type: ChannelType, pub channel_kind: ChannelKind, pub visibility: Visibility, pub position: Option, pub nsfw: bool, pub archived: bool, pub read_only: bool, pub bitrate: Option, pub user_limit: Option, pub rtc_region: Option, pub default_auto_archive_duration: Option, pub default_reaction_emoji: Option, pub default_sort_order: Option, pub default_forum_layout: Option, pub require_tag: Option, pub available_tags: Option, pub default_thread_rate_limit: Option, pub rate_limit_per_user: Option, pub parent_channel_id: Option, pub last_message_id: Option, pub last_message_at: Option>, pub archived_at: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] pub struct ChannelDetail { pub id: Uuid, pub workspace_id: Uuid, pub repo_id: Option, pub category_id: Option, pub creator: UserBaseInfo, pub name: String, pub topic: Option, pub description: Option, pub channel_type: ChannelType, pub channel_kind: ChannelKind, pub visibility: Visibility, pub position: Option, pub nsfw: bool, pub archived: bool, pub read_only: bool, pub bitrate: Option, pub user_limit: Option, pub rtc_region: Option, pub parent_channel_id: Option, pub last_message_id: Option, pub last_message_at: Option>, pub archived_at: Option>, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } impl Channel { pub fn into_detail(self, creator: UserBaseInfo) -> ChannelDetail { ChannelDetail { id: self.id, workspace_id: self.workspace_id, repo_id: self.repo_id, category_id: self.category_id, creator, name: self.name, topic: self.topic, description: self.description, channel_type: self.channel_type, channel_kind: self.channel_kind, visibility: self.visibility, position: self.position, nsfw: self.nsfw, archived: self.archived, read_only: self.read_only, bitrate: self.bitrate, user_limit: self.user_limit, rtc_region: self.rtc_region, parent_channel_id: self.parent_channel_id, last_message_id: self.last_message_id, last_message_at: self.last_message_at, archived_at: self.archived_at, created_at: self.created_at, updated_at: self.updated_at, deleted_at: self.deleted_at, } } }