use crate::{ naive_now, schema::{community, community_follower, community_moderator, community_person_ban}, CommunityId, DbUrl, PersonId, }; use chrono::NaiveDateTime; use diesel::{ExpressionMethods, PgConnection, QueryDsl, RunQueryDsl}; use lemmy_apub_lib::traits::{ActorType, ApubObject}; use lemmy_utils::LemmyError; use serde::{Deserialize, Serialize}; use url::Url; #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] #[table_name = "community"] pub struct Community { pub id: CommunityId, pub name: String, pub title: String, pub description: Option, pub removed: bool, pub published: chrono::NaiveDateTime, pub updated: Option, pub deleted: bool, pub nsfw: bool, pub actor_id: DbUrl, pub local: bool, pub private_key: Option, pub public_key: Option, pub last_refreshed_at: chrono::NaiveDateTime, pub icon: Option, pub banner: Option, pub followers_url: DbUrl, pub inbox_url: DbUrl, pub shared_inbox_url: Option, } /// A safe representation of community, without the sensitive info #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] #[table_name = "community"] pub struct CommunitySafe { pub id: CommunityId, pub name: String, pub title: String, pub description: Option, pub removed: bool, pub published: chrono::NaiveDateTime, pub updated: Option, pub deleted: bool, pub nsfw: bool, pub actor_id: DbUrl, pub local: bool, pub icon: Option, pub banner: Option, } #[derive(Insertable, AsChangeset, Debug, Default)] #[table_name = "community"] pub struct CommunityForm { pub name: String, 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: 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>, } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] #[belongs_to(Community)] #[table_name = "community_moderator"] pub struct CommunityModerator { pub id: i32, pub community_id: CommunityId, pub person_id: PersonId, pub published: chrono::NaiveDateTime, } #[derive(Insertable, AsChangeset, Clone)] #[table_name = "community_moderator"] pub struct CommunityModeratorForm { pub community_id: CommunityId, pub person_id: PersonId, } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] #[belongs_to(Community)] #[table_name = "community_person_ban"] pub struct CommunityPersonBan { pub id: i32, pub community_id: CommunityId, pub person_id: PersonId, pub published: chrono::NaiveDateTime, } #[derive(Insertable, AsChangeset, Clone)] #[table_name = "community_person_ban"] pub struct CommunityPersonBanForm { pub community_id: CommunityId, pub person_id: PersonId, } #[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] #[belongs_to(Community)] #[table_name = "community_follower"] pub struct CommunityFollower { pub id: i32, pub community_id: CommunityId, pub person_id: PersonId, pub published: chrono::NaiveDateTime, pub pending: Option, } #[derive(Insertable, AsChangeset, Clone)] #[table_name = "community_follower"] pub struct CommunityFollowerForm { pub community_id: CommunityId, pub person_id: PersonId, pub pending: bool, } impl ApubObject for Community { type DataType = PgConnection; fn last_refreshed_at(&self) -> Option { Some(self.last_refreshed_at) } fn read_from_apub_id(conn: &PgConnection, object_id: Url) -> Result, LemmyError> { use crate::schema::community::dsl::*; let object_id: DbUrl = object_id.into(); Ok( community .filter(actor_id.eq(object_id)) .first::(conn) .ok(), ) } fn delete(self, conn: &PgConnection) -> Result<(), LemmyError> { use crate::schema::community::dsl::*; diesel::update(community.find(self.id)) .set((deleted.eq(true), updated.eq(naive_now()))) .get_result::(conn)?; Ok(()) } } impl ActorType for Community { fn is_local(&self) -> bool { self.local } fn actor_id(&self) -> Url { self.actor_id.to_owned().into() } fn name(&self) -> String { self.name.clone() } fn public_key(&self) -> Option { self.public_key.to_owned() } fn private_key(&self) -> Option { self.private_key.to_owned() } fn inbox_url(&self) -> Url { self.inbox_url.clone().into() } fn shared_inbox_url(&self) -> Option { self.shared_inbox_url.clone().map(|s| s.into_inner()) } }