use crate::newtypes::{CommunityId, DbUrl, LanguageId, PersonId, PostId}; #[cfg(feature = "full")] use crate::schema::{post, post_like, post_read, post_saved}; 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 = post))] #[cfg_attr(feature = "full", ts(export))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] /// A post. pub struct Post { pub id: PostId, pub name: String, #[cfg_attr(feature = "full", ts(type = "string"))] /// An optional link / url for the post. pub url: Option, /// An optional post body, in markdown. pub body: Option, pub creator_id: PersonId, pub community_id: CommunityId, /// Whether the post is removed. pub removed: bool, /// Whether the post is locked. pub locked: bool, pub published: DateTime, pub updated: Option>, /// Whether the post is deleted. pub deleted: bool, /// Whether the post is NSFW. pub nsfw: bool, /// A title for the link. pub embed_title: Option, /// A description for the link. pub embed_description: Option, #[cfg_attr(feature = "full", ts(type = "string"))] /// A thumbnail picture url. pub thumbnail_url: Option, #[cfg_attr(feature = "full", ts(type = "string"))] /// The federated activity id / ap_id. pub ap_id: DbUrl, /// Whether the post is local. pub local: bool, #[cfg_attr(feature = "full", ts(type = "string"))] /// A video url for the link. pub embed_video_url: Option, pub language_id: LanguageId, /// Whether the post is featured to its community. pub featured_community: bool, /// Whether the post is featured to its site. pub featured_local: bool, } #[derive(Debug, Clone, TypedBuilder)] #[builder(field_defaults(default))] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = post))] pub struct PostInsertForm { #[builder(!default)] pub name: String, #[builder(!default)] pub creator_id: PersonId, #[builder(!default)] pub community_id: CommunityId, pub nsfw: Option, pub url: Option, pub body: Option, pub removed: Option, pub locked: Option, pub updated: Option>, pub published: Option>, pub deleted: Option, pub embed_title: Option, pub embed_description: Option, pub embed_video_url: Option, pub thumbnail_url: Option, pub ap_id: Option, pub local: Option, pub language_id: Option, pub featured_community: Option, pub featured_local: Option, } #[derive(Debug, Clone, Default)] #[cfg_attr(feature = "full", derive(AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = post))] pub struct PostUpdateForm { pub name: Option, pub nsfw: Option, pub url: Option>, pub body: Option>, pub removed: Option, pub locked: Option, pub published: Option>, pub updated: Option>>, pub deleted: Option, pub embed_title: Option>, pub embed_description: Option>, pub embed_video_url: Option>, pub thumbnail_url: Option>, pub ap_id: Option, pub local: Option, pub language_id: Option, pub featured_community: Option, pub featured_local: Option, } #[derive(PartialEq, Eq, Debug)] #[cfg_attr( feature = "full", derive(Identifiable, Queryable, Selectable, Associations) )] #[cfg_attr(feature = "full", diesel(belongs_to(crate::source::post::Post)))] #[cfg_attr(feature = "full", diesel(table_name = post_like))] #[cfg_attr(feature = "full", diesel(primary_key(person_id, post_id)))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] pub struct PostLike { pub post_id: PostId, pub person_id: PersonId, pub score: i16, pub published: DateTime, } #[derive(Clone)] #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = post_like))] pub struct PostLikeForm { pub post_id: PostId, pub person_id: PersonId, pub score: i16, } #[derive(PartialEq, Eq, Debug)] #[cfg_attr( feature = "full", derive(Identifiable, Queryable, Selectable, Associations) )] #[cfg_attr(feature = "full", diesel(belongs_to(crate::source::post::Post)))] #[cfg_attr(feature = "full", diesel(table_name = post_saved))] #[cfg_attr(feature = "full", diesel(primary_key(post_id, person_id)))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] pub struct PostSaved { pub post_id: PostId, pub person_id: PersonId, pub published: DateTime, } #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = post_saved))] pub struct PostSavedForm { pub post_id: PostId, 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::post::Post)))] #[cfg_attr(feature = "full", diesel(table_name = post_read))] #[cfg_attr(feature = "full", diesel(primary_key(post_id, person_id)))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] pub struct PostRead { pub post_id: PostId, pub person_id: PersonId, pub published: DateTime, } #[cfg_attr(feature = "full", derive(Insertable, AsChangeset))] #[cfg_attr(feature = "full", diesel(table_name = post_read))] pub(crate) struct PostReadForm { pub post_id: PostId, pub person_id: PersonId, }