#[cfg(feature = "full")] use crate::schema::{community, community_follower, community_moderator, community_person_ban}; use crate::{ newtypes::{CommunityId, DbUrl, InstanceId, PersonId}, source::placeholder_apub_url, }; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[cfg(feature = "full")] use ts_rs::TS; use typed_builder::TypedBuilder; #[skip_serializing_none] #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] #[cfg_attr(feature = "full", derive(Queryable, Selectable, Identifiable, TS))] #[cfg_attr(feature = "full", diesel(table_name = community))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] #[cfg_attr(feature = "full", ts(export))] /// A community. pub struct Community { pub id: CommunityId, pub name: String, /// A longer title, that can contain other characters, and doesn't have to be unique. pub title: String, /// A sidebar / markdown description. pub description: Option, /// Whether the community is removed by a mod. pub removed: bool, pub published: DateTime, pub updated: Option>, /// Whether the community has been deleted by its creator. pub deleted: bool, /// Whether its an NSFW community. pub nsfw: bool, /// The federated actor_id. pub actor_id: DbUrl, /// Whether the community is local. pub local: bool, #[serde(skip)] pub private_key: Option, #[serde(skip)] pub public_key: String, #[serde(skip)] pub last_refreshed_at: DateTime, /// A URL for an icon. pub icon: Option, /// A URL for a banner. pub banner: Option, #[cfg_attr(feature = "full", ts(skip))] #[serde(skip, default = "placeholder_apub_url")] pub followers_url: DbUrl, #[cfg_attr(feature = "full", ts(skip))] #[serde(skip, default = "placeholder_apub_url")] pub inbox_url: DbUrl, #[serde(skip)] pub shared_inbox_url: Option, /// Whether the community is hidden. pub hidden: bool, /// Whether posting is restricted to mods only. pub posting_restricted_to_mods: bool, pub instance_id: InstanceId, /// Url where moderators collection is served over Activitypub #[serde(skip)] pub moderators_url: Option, /// Url where featured posts collection is served over Activitypub #[serde(skip)] pub featured_url: Option, } #[derive(Debug, Clone, TypedBuilder)] #[builder(field_defaults(default))] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = community))] pub struct CommunityInsertForm { #[builder(!default)] pub name: String, #[builder(!default)] pub title: String, pub description: Option, pub removed: Option, pub published: Option>, pub updated: Option>, pub deleted: Option, pub nsfw: Option, pub actor_id: Option, pub local: Option, pub private_key: Option, pub public_key: String, pub last_refreshed_at: Option>, pub icon: Option, pub banner: Option, pub followers_url: Option, pub inbox_url: Option, pub shared_inbox_url: Option, pub moderators_url: Option, pub featured_url: Option, pub hidden: Option, pub posting_restricted_to_mods: Option, #[builder(!default)] pub instance_id: InstanceId, } #[derive(Debug, Clone, Default)] #[cfg_attr(feature = "full", derive(AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = community))] pub struct CommunityUpdateForm { pub title: Option, pub description: Option>, pub removed: Option, pub published: Option>, pub updated: Option>>, pub deleted: Option, pub nsfw: Option, pub actor_id: Option, pub local: Option, pub public_key: Option, pub private_key: Option>, pub last_refreshed_at: Option>, pub icon: Option>, pub banner: Option>, pub followers_url: Option, pub inbox_url: Option, pub shared_inbox_url: Option>, pub moderators_url: Option, pub featured_url: Option, pub hidden: Option, pub posting_restricted_to_mods: Option, } #[derive(PartialEq, Eq, Debug)] #[cfg_attr( feature = "full", derive(Identifiable, Queryable, Selectable, Associations) )] #[cfg_attr( feature = "full", diesel(belongs_to(crate::source::community::Community)) )] #[cfg_attr(feature = "full", diesel(table_name = community_moderator))] #[cfg_attr(feature = "full", diesel(primary_key(person_id, community_id)))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] pub struct CommunityModerator { pub community_id: CommunityId, pub person_id: PersonId, pub published: DateTime, } #[derive(Clone)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = community_moderator))] pub struct CommunityModeratorForm { pub community_id: CommunityId, pub person_id: PersonId, } #[derive(PartialEq, Eq, Debug)] #[cfg_attr( feature = "full", derive(Identifiable, Queryable, Selectable, Associations) )] #[cfg_attr( feature = "full", diesel(belongs_to(crate::source::community::Community)) )] #[cfg_attr(feature = "full", diesel(table_name = community_person_ban))] #[cfg_attr(feature = "full", diesel(primary_key(person_id, community_id)))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] pub struct CommunityPersonBan { pub community_id: CommunityId, pub person_id: PersonId, pub published: DateTime, pub expires: Option>, } #[derive(Clone)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = community_person_ban))] pub struct CommunityPersonBanForm { pub community_id: CommunityId, pub person_id: PersonId, pub expires: Option>>, } #[derive(PartialEq, Eq, Debug)] #[cfg_attr( feature = "full", derive(Identifiable, Queryable, Selectable, Associations) )] #[cfg_attr( feature = "full", diesel(belongs_to(crate::source::community::Community)) )] #[cfg_attr(feature = "full", diesel(table_name = community_follower))] #[cfg_attr(feature = "full", diesel(primary_key(person_id, community_id)))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] pub struct CommunityFollower { pub community_id: CommunityId, pub person_id: PersonId, pub published: DateTime, pub pending: bool, } #[derive(Clone)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = community_follower))] pub struct CommunityFollowerForm { pub community_id: CommunityId, pub person_id: PersonId, pub pending: bool, }