use lemmy_db_schema::{ newtypes::{CommunityId, LanguageId, PersonId}, source::site::Site, CommunityVisibility, ListingType, }; use lemmy_db_views_actor::structs::{ CommunityModeratorView, CommunitySortType, CommunityView, PendingFollow, PersonView, }; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; #[cfg(feature = "full")] use ts_rs::TS; #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] // TODO make this into a tagged enum /// Get a community. Must provide either an id, or a name. pub struct GetCommunity { #[cfg_attr(feature = "full", ts(optional))] pub id: Option, /// Example: star_trek , or star_trek@xyz.tld #[cfg_attr(feature = "full", ts(optional))] pub name: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The community response. pub struct GetCommunityResponse { pub community_view: CommunityView, #[cfg_attr(feature = "full", ts(optional))] pub site: Option, pub moderators: Vec, pub discussion_languages: Vec, } #[skip_serializing_none] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] /// Create a community. pub struct CreateCommunity { /// The unique name. pub name: String, /// A longer title. pub title: String, /// A sidebar for the community in markdown. #[cfg_attr(feature = "full", ts(optional))] pub sidebar: Option, /// A shorter, one line description of your community. #[cfg_attr(feature = "full", ts(optional))] pub description: Option, /// An icon URL. #[cfg_attr(feature = "full", ts(optional))] pub icon: Option, /// A banner URL. #[cfg_attr(feature = "full", ts(optional))] pub banner: Option, /// Whether its an NSFW community. #[cfg_attr(feature = "full", ts(optional))] pub nsfw: Option, /// Whether to restrict posting only to moderators. #[cfg_attr(feature = "full", ts(optional))] pub posting_restricted_to_mods: Option, #[cfg_attr(feature = "full", ts(optional))] pub discussion_languages: Option>, #[cfg_attr(feature = "full", ts(optional))] pub visibility: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// A simple community response. pub struct CommunityResponse { pub community_view: CommunityView, pub discussion_languages: Vec, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Fetches a list of communities. pub struct ListCommunities { #[cfg_attr(feature = "full", ts(optional))] pub type_: Option, #[cfg_attr(feature = "full", ts(optional))] pub sort: Option, #[cfg_attr(feature = "full", ts(optional))] pub show_nsfw: Option, #[cfg_attr(feature = "full", ts(optional))] pub page: Option, #[cfg_attr(feature = "full", ts(optional))] pub limit: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The response for listing communities. pub struct ListCommunitiesResponse { pub communities: Vec, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Ban a user from a community. pub struct BanFromCommunity { pub community_id: CommunityId, pub person_id: PersonId, pub ban: bool, /// Optionally remove or restore all their data. Useful for new troll accounts. /// If ban is true, then this means remove. If ban is false, it means restore. #[cfg_attr(feature = "full", ts(optional))] pub remove_or_restore_data: Option, #[cfg_attr(feature = "full", ts(optional))] pub reason: Option, /// A time that the ban will expire, in unix epoch seconds. /// /// An i64 unix timestamp is used for a simpler API client implementation. #[cfg_attr(feature = "full", ts(optional))] pub expires: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The response for banning a user from a community. pub struct BanFromCommunityResponse { pub person_view: PersonView, pub banned: bool, } #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Add a moderator to a community. pub struct AddModToCommunity { pub community_id: CommunityId, pub person_id: PersonId, pub added: bool, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The response of adding a moderator to a community. pub struct AddModToCommunityResponse { pub moderators: Vec, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Edit a community. pub struct EditCommunity { pub community_id: CommunityId, /// A longer title. #[cfg_attr(feature = "full", ts(optional))] pub title: Option, /// A sidebar for the community in markdown. #[cfg_attr(feature = "full", ts(optional))] pub sidebar: Option, /// A shorter, one line description of your community. #[cfg_attr(feature = "full", ts(optional))] pub description: Option, /// An icon URL. #[cfg_attr(feature = "full", ts(optional))] pub icon: Option, /// A banner URL. #[cfg_attr(feature = "full", ts(optional))] pub banner: Option, /// Whether its an NSFW community. #[cfg_attr(feature = "full", ts(optional))] pub nsfw: Option, /// Whether to restrict posting only to moderators. #[cfg_attr(feature = "full", ts(optional))] pub posting_restricted_to_mods: Option, #[cfg_attr(feature = "full", ts(optional))] pub discussion_languages: Option>, #[cfg_attr(feature = "full", ts(optional))] pub visibility: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Hide a community from the main view. pub struct HideCommunity { pub community_id: CommunityId, pub hidden: bool, #[cfg_attr(feature = "full", ts(optional))] pub reason: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Delete your own community. pub struct DeleteCommunity { pub community_id: CommunityId, pub deleted: bool, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Remove a community (only doable by moderators). pub struct RemoveCommunity { pub community_id: CommunityId, pub removed: bool, #[cfg_attr(feature = "full", ts(optional))] pub reason: Option, } #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Follow / subscribe to a community. pub struct FollowCommunity { pub community_id: CommunityId, pub follow: bool, } #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Block a community. pub struct BlockCommunity { pub community_id: CommunityId, pub block: bool, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The block community response. pub struct BlockCommunityResponse { pub community_view: CommunityView, pub blocked: bool, } #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Transfer a community to a new owner. pub struct TransferCommunity { pub community_id: CommunityId, pub person_id: PersonId, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Fetches a random community pub struct GetRandomCommunity { #[cfg_attr(feature = "full", ts(optional))] pub type_: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct ListCommunityPendingFollows { /// Only shows the unapproved applications #[cfg_attr(feature = "full", ts(optional))] pub pending_only: Option, // Only for admins, show pending follows for communities which you dont moderate #[cfg_attr(feature = "full", ts(optional))] pub all_communities: Option, #[cfg_attr(feature = "full", ts(optional))] pub page: Option, #[cfg_attr(feature = "full", ts(optional))] pub limit: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct GetCommunityPendingFollowsCount { pub community_id: CommunityId, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct GetCommunityPendingFollowsCountResponse { pub count: i64, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct ListCommunityPendingFollowsResponse { pub items: Vec, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct ApproveCommunityPendingFollower { pub community_id: CommunityId, pub follower_id: PersonId, pub approve: bool, }