use crate::federate_retry_sleep_duration; use chrono::{DateTime, Utc}; use lemmy_db_schema::{ newtypes::{CommentId, CommunityId, InstanceId, LanguageId, PersonId, PostId}, source::{ federation_queue_state::FederationQueueState, instance::Instance, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, tagline::Tagline, }, ListingType, ModlogActionType, PostListingMode, RegistrationMode, SearchType, SortType, }; use lemmy_db_views::structs::{ CommentView, CustomEmojiView, LocalUserView, PostView, RegistrationApplicationView, SiteView, }; use lemmy_db_views_actor::structs::{ CommunityBlockView, CommunityFollowerView, CommunityModeratorView, CommunityView, InstanceBlockView, PersonBlockView, PersonView, }; use lemmy_db_views_moderator::structs::{ AdminPurgeCommentView, AdminPurgeCommunityView, AdminPurgePersonView, AdminPurgePostView, ModAddCommunityView, ModAddView, ModBanFromCommunityView, ModBanView, ModFeaturePostView, ModHideCommunityView, ModLockPostView, ModRemoveCommentView, ModRemoveCommunityView, ModRemovePostView, ModTransferCommunityView, }; 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))] /// Searches the site, given a query string, and some optional filters. pub struct Search { pub q: String, pub community_id: Option, pub community_name: Option, pub creator_id: Option, pub type_: Option, pub sort: Option, pub listing_type: Option, pub page: Option, pub limit: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The search response, containing lists of the return type possibilities // TODO this should be redone as a list of tagged enums pub struct SearchResponse { pub type_: SearchType, pub comments: Vec, pub posts: Vec, pub communities: Vec, pub users: Vec, } #[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Does an apub fetch for an object. pub struct ResolveObject { /// Can be the full url, or a shortened version like: !fediverse@lemmy.ml pub q: String, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Default)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] // TODO Change this to an enum /// The response of an apub object fetch. pub struct ResolveObjectResponse { pub comment: Option, pub post: Option, pub community: Option, pub person: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Fetches the modlog. pub struct GetModlog { pub mod_person_id: Option, pub community_id: Option, pub page: Option, pub limit: Option, pub type_: Option, pub other_person_id: Option, pub post_id: Option, pub comment_id: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The modlog fetch response. // TODO this should be redone as a list of tagged enums pub struct GetModlogResponse { pub removed_posts: Vec, pub locked_posts: Vec, pub featured_posts: Vec, pub removed_comments: Vec, pub removed_communities: Vec, pub banned_from_community: Vec, pub banned: Vec, pub added_to_community: Vec, pub transferred_to_community: Vec, pub added: Vec, pub admin_purged_persons: Vec, pub admin_purged_communities: Vec, pub admin_purged_posts: Vec, pub admin_purged_comments: Vec, pub hidden_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))] /// Creates a site. Should be done after first running lemmy. pub struct CreateSite { pub name: String, pub sidebar: Option, pub description: Option, pub icon: Option, pub banner: Option, pub enable_downvotes: Option, pub enable_nsfw: Option, pub community_creation_admin_only: Option, pub require_email_verification: Option, pub application_question: Option, pub private_instance: Option, pub default_theme: Option, pub default_post_listing_type: Option, pub default_sort_type: Option, pub legal_information: Option, pub application_email_admins: Option, pub hide_modlog_mod_names: Option, pub discussion_languages: Option>, pub slur_filter_regex: Option, pub actor_name_max_length: Option, pub rate_limit_message: Option, pub rate_limit_message_per_second: Option, pub rate_limit_post: Option, pub rate_limit_post_per_second: Option, pub rate_limit_register: Option, pub rate_limit_register_per_second: Option, pub rate_limit_image: Option, pub rate_limit_image_per_second: Option, pub rate_limit_comment: Option, pub rate_limit_comment_per_second: Option, pub rate_limit_search: Option, pub rate_limit_search_per_second: Option, pub federation_enabled: Option, pub federation_debug: Option, pub captcha_enabled: Option, pub captcha_difficulty: Option, pub allowed_instances: Option>, pub blocked_instances: Option>, pub taglines: Option>, pub registration_mode: Option, pub content_warning: Option, pub default_post_listing_mode: 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))] /// Edits a site. pub struct EditSite { pub name: Option, pub sidebar: Option, /// A shorter, one line description of your site. pub description: Option, /// A url for your site's icon. pub icon: Option, /// A url for your site's banner. pub banner: Option, /// Whether to enable downvotes. pub enable_downvotes: Option, /// Whether to enable NSFW. pub enable_nsfw: Option, /// Limits community creation to admins only. pub community_creation_admin_only: Option, /// Whether to require email verification. pub require_email_verification: Option, /// Your application question form. This is in markdown, and can be many questions. pub application_question: Option, /// Whether your instance is public, or private. pub private_instance: Option, /// The default theme. Usually "browser" pub default_theme: Option, pub default_post_listing_type: Option, /// The default sort, usually "active" pub default_sort_type: Option, /// An optional page of legal information pub legal_information: Option, /// Whether to email admins when receiving a new application. pub application_email_admins: Option, /// Whether to hide moderator names from the modlog. pub hide_modlog_mod_names: Option, /// A list of allowed discussion languages. pub discussion_languages: Option>, /// A regex string of items to filter. pub slur_filter_regex: Option, /// The max length of actor names. pub actor_name_max_length: Option, /// The number of messages allowed in a given time frame. pub rate_limit_message: Option, pub rate_limit_message_per_second: Option, /// The number of posts allowed in a given time frame. pub rate_limit_post: Option, pub rate_limit_post_per_second: Option, /// The number of registrations allowed in a given time frame. pub rate_limit_register: Option, pub rate_limit_register_per_second: Option, /// The number of image uploads allowed in a given time frame. pub rate_limit_image: Option, pub rate_limit_image_per_second: Option, /// The number of comments allowed in a given time frame. pub rate_limit_comment: Option, pub rate_limit_comment_per_second: Option, /// The number of searches allowed in a given time frame. pub rate_limit_search: Option, pub rate_limit_search_per_second: Option, /// Whether to enable federation. pub federation_enabled: Option, /// Enables federation debugging. pub federation_debug: Option, /// Whether to enable captchas for signups. pub captcha_enabled: Option, /// The captcha difficulty. Can be easy, medium, or hard pub captcha_difficulty: Option, /// A list of allowed instances. If none are set, federation is open. pub allowed_instances: Option>, /// A list of blocked instances. pub blocked_instances: Option>, /// A list of blocked URLs pub blocked_urls: Option>, /// A list of taglines shown at the top of the front page. pub taglines: Option>, pub registration_mode: Option, /// Whether to email admins for new reports. pub reports_email_admins: Option, /// If present, nsfw content is visible by default. Should be displayed by frontends/clients /// when the site is first opened by a user. pub content_warning: Option, /// Default value for [LocalUser.post_listing_mode] pub default_post_listing_mode: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The response for a site. pub struct SiteResponse { pub site_view: SiteView, pub taglines: Vec, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// An expanded response for a site. pub struct GetSiteResponse { pub site_view: SiteView, pub admins: Vec, pub version: String, pub my_user: Option, pub all_languages: Vec, pub discussion_languages: Vec, /// A list of taglines shown at the top of the front page. pub taglines: Vec, /// A list of custom emojis your site supports. pub custom_emojis: Vec, pub blocked_urls: Vec, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// A response of federated instances. pub struct GetFederatedInstancesResponse { /// Optional, because federation may be disabled. pub federated_instances: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Your user info. pub struct MyUserInfo { pub local_user_view: LocalUserView, pub follows: Vec, pub moderates: Vec, pub community_blocks: Vec, pub instance_blocks: Vec, pub person_blocks: Vec, pub discussion_languages: Vec, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// A list of federated instances. pub struct FederatedInstances { pub linked: Vec, pub allowed: Vec, pub blocked: Vec, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct ReadableFederationState { #[serde(flatten)] internal_state: FederationQueueState, /// timestamp of the next retry attempt (null if fail count is 0) next_retry: Option>, } impl From for ReadableFederationState { fn from(internal_state: FederationQueueState) -> Self { ReadableFederationState { next_retry: internal_state.last_retry.map(|r| { r + chrono::Duration::from_std(federate_retry_sleep_duration(internal_state.fail_count)) .expect("sleep duration longer than 2**63 ms (262 million years)") }), internal_state, } } } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct InstanceWithFederationState { #[serde(flatten)] pub instance: Instance, /// if federation to this instance is or was active, show state of outgoing federation to this /// instance pub federation_state: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Purges a person from the database. This will delete all content attached to that person. pub struct PurgePerson { pub person_id: PersonId, pub reason: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Purges a community from the database. This will delete all content attached to that community. pub struct PurgeCommunity { pub community_id: CommunityId, pub reason: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Purges a post from the database. This will delete all content attached to that post. pub struct PurgePost { pub post_id: PostId, pub reason: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Purges a comment from the database. This will delete all content attached to that comment. pub struct PurgeComment { pub comment_id: CommentId, pub reason: Option, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Fetches a list of registration applications. pub struct ListRegistrationApplications { /// Only shows the unread applications (IE those without an admin actor) pub unread_only: Option, pub page: Option, pub limit: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The list of registration applications. pub struct ListRegistrationApplicationsResponse { pub registration_applications: 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))] /// Approves a registration application. pub struct ApproveRegistrationApplication { pub id: i32, pub approve: bool, pub deny_reason: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The response of an action done to a registration application. pub struct RegistrationApplicationResponse { pub registration_application: RegistrationApplicationView, } #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// The count of unread registration applications. pub struct GetUnreadRegistrationApplicationCountResponse { pub registration_applications: i64, } #[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] /// Block an instance as user pub struct BlockInstance { pub instance_id: InstanceId, pub block: bool, } #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS))] #[cfg_attr(feature = "full", ts(export))] pub struct BlockInstanceResponse { pub blocked: bool, }