use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; use utoipa::ToSchema; pub mod space_extras; pub mod space_group_permissions; pub mod space_groups; pub mod space_invite_redemptions; pub mod space_invites; pub mod space_join_requests; pub mod space_join_rules; pub mod space_member_extras; pub mod space_member_groups; pub mod space_member_permissions; pub mod space_member_roles; pub mod space_members; pub mod space_role_permissions; pub mod space_roles; pub mod space_warn; pub mod spaces; #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] pub enum SpaceStatus { Active, Suspended, Archived, } #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] pub enum SpaceMemberRole { Member, Admin, Owner, } #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] pub enum SpaceJoinMethod { Direct, InviteLink, InviteTargeted, InviteEmail, } #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] pub enum PermissionEffect { Allow, Deny, } /// 会籍的通知偏好,对应旧 `space_members.message_notifications`。 /// 旧表用 0/1/2 存,这里用字符串存,便于跨服务读写时直接透传。 #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] pub enum MessageNotifications { All, Mentions, Nothing, } impl MessageNotifications { pub fn as_str(self) -> &'static str { match self { Self::All => "all", Self::Mentions => "mentions", Self::Nothing => "nothing", } } pub fn from_str(value: &str) -> Self { match value.trim() { "mentions" => Self::Mentions, "nothing" => Self::Nothing, _ => Self::All, } } } #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] #[derive(Default)] pub enum SpaceJoinPolicy { Open, Approval, #[default] InviteOnly, Private, } #[derive( Clone, Copy, Debug, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize, ToSchema, )] #[serde(rename_all = "snake_case")] #[sea_orm( rs_type = "String", db_type = "String(StringLen::N(16))", rename_all = "snake_case" )] #[derive(Default)] pub enum SpaceJoinRequestState { #[default] Pending, Approved, Rejected, Withdrawn, } /// 会籍状态,由 `joined_at` / `left_at` / `banned_at` 推导,供 API 层展示。 #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize, ToSchema)] pub enum MemberStatus { #[default] Active, Inactive, Left, Removed, Banned, } impl space_members::Model { pub fn status(&self) -> MemberStatus { if self.banned_at.is_some() { MemberStatus::Banned } else if self.left_at.is_some() { MemberStatus::Left } else { MemberStatus::Active } } } /// 允许加入的历史开关,映射 `spaces.allow_join_level`。 #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize, ToSchema)] pub enum AllowJoinLevel { #[default] None, NeedMailActive, NeedMailActiveAndLastOneMid, NeedMailActiveAndLastOneHours, NeedMailActiveAndPhoneActive, } impl AllowJoinLevel { pub fn from_i16(value: i16) -> Self { match value { 1 => Self::NeedMailActive, 2 => Self::NeedMailActiveAndLastOneMid, 3 => Self::NeedMailActiveAndLastOneHours, 4 => Self::NeedMailActiveAndPhoneActive, _ => Self::None, } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum SpaceJoinTrigger { #[default] IssueReaction, IssueCommentReaction, } impl SpaceJoinTrigger { pub fn as_str(self) -> &'static str { match self { Self::IssueReaction => "issue_reaction", Self::IssueCommentReaction => "issue_comment_reaction", } } pub fn from_str(value: &str) -> Self { match value.trim() { "issue_comment_reaction" => Self::IssueCommentReaction, _ => Self::IssueReaction, } } }