Be more explicit about returning deleted actors or not (#2335)

* Be more explicit about returning deleted actors or not

* simplify db queries
This commit is contained in:
Nutomic 2022-07-05 21:40:44 +00:00 committed by GitHub
parent 587a0de8f7
commit b7a2677b4d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 42 additions and 21 deletions

View file

@ -58,7 +58,7 @@ where
let identifier = identifier.to_string(); let identifier = identifier.to_string();
Ok( Ok(
blocking(context.pool(), move |conn| { blocking(context.pool(), move |conn| {
DbActor::read_from_name(conn, &identifier) DbActor::read_from_name(conn, &identifier, false)
}) })
.await??, .await??,
) )

View file

@ -35,7 +35,7 @@ pub(crate) async fn get_apub_community_http(
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let community: ApubCommunity = blocking(context.pool(), move |conn| { let community: ApubCommunity = blocking(context.pool(), move |conn| {
Community::read_from_name(conn, &info.community_name) Community::read_from_name(conn, &info.community_name, true)
}) })
.await?? .await??
.into(); .into();
@ -66,7 +66,7 @@ pub(crate) async fn get_apub_community_followers(
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let community = blocking(context.pool(), move |conn| { let community = blocking(context.pool(), move |conn| {
Community::read_from_name(conn, &info.community_name) Community::read_from_name(conn, &info.community_name, false)
}) })
.await??; .await??;
let followers = GroupFollowers::new(community, &context).await?; let followers = GroupFollowers::new(community, &context).await?;
@ -80,7 +80,7 @@ pub(crate) async fn get_apub_community_outbox(
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let community = blocking(context.pool(), move |conn| { let community = blocking(context.pool(), move |conn| {
Community::read_from_name(conn, &info.community_name) Community::read_from_name(conn, &info.community_name, false)
}) })
.await??; .await??;
let id = ObjectId::new(generate_outbox_url(&community.actor_id)?); let id = ObjectId::new(generate_outbox_url(&community.actor_id)?);
@ -97,7 +97,7 @@ pub(crate) async fn get_apub_community_moderators(
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let community: ApubCommunity = blocking(context.pool(), move |conn| { let community: ApubCommunity = blocking(context.pool(), move |conn| {
Community::read_from_name(conn, &info.community_name) Community::read_from_name(conn, &info.community_name, false)
}) })
.await?? .await??
.into(); .into();

View file

@ -28,7 +28,7 @@ pub(crate) async fn get_apub_person_http(
let user_name = info.into_inner().user_name; let user_name = info.into_inner().user_name;
// TODO: this needs to be able to read deleted persons, so that it can send tombstones // TODO: this needs to be able to read deleted persons, so that it can send tombstones
let person: ApubPerson = blocking(context.pool(), move |conn| { let person: ApubPerson = blocking(context.pool(), move |conn| {
Person::read_from_name(conn, &user_name) Person::read_from_name(conn, &user_name, true)
}) })
.await?? .await??
.into(); .into();
@ -60,7 +60,7 @@ pub(crate) async fn get_apub_person_outbox(
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let person = blocking(context.pool(), move |conn| { let person = blocking(context.pool(), move |conn| {
Person::read_from_name(conn, &info.user_name) Person::read_from_name(conn, &info.user_name, false)
}) })
.await??; .await??;
let outbox_id = generate_outbox_url(&person.actor_id)?.into(); let outbox_id = generate_outbox_url(&person.actor_id)?.into();

View file

@ -332,12 +332,20 @@ impl ApubActor for Community {
) )
} }
fn read_from_name(conn: &PgConnection, community_name: &str) -> Result<Community, Error> { fn read_from_name(
conn: &PgConnection,
community_name: &str,
include_deleted: bool,
) -> Result<Community, Error> {
use crate::schema::community::dsl::*; use crate::schema::community::dsl::*;
community let mut q = community
.into_boxed()
.filter(local.eq(true)) .filter(local.eq(true))
.filter(lower(name).eq(lower(community_name))) .filter(lower(name).eq(lower(community_name)));
.first::<Self>(conn) if !include_deleted {
q = q.filter(deleted.eq(false)).filter(removed.eq(false));
}
q.first::<Self>(conn)
} }
fn read_from_name_and_domain( fn read_from_name_and_domain(

View file

@ -305,12 +305,19 @@ impl ApubActor for Person {
) )
} }
fn read_from_name(conn: &PgConnection, from_name: &str) -> Result<Person, Error> { fn read_from_name(
person conn: &PgConnection,
.filter(deleted.eq(false)) from_name: &str,
include_deleted: bool,
) -> Result<Person, Error> {
let mut q = person
.into_boxed()
.filter(local.eq(true)) .filter(local.eq(true))
.filter(lower(name).eq(lower(from_name))) .filter(lower(name).eq(lower(from_name)));
.first::<Person>(conn) if !include_deleted {
q = q.filter(deleted.eq(false))
}
q.first::<Self>(conn)
} }
fn read_from_name_and_domain( fn read_from_name_and_domain(

View file

@ -168,7 +168,13 @@ pub trait ApubActor {
fn read_from_apub_id(conn: &PgConnection, object_id: &DbUrl) -> Result<Option<Self>, Error> fn read_from_apub_id(conn: &PgConnection, object_id: &DbUrl) -> Result<Option<Self>, Error>
where where
Self: Sized; Self: Sized;
fn read_from_name(conn: &PgConnection, actor_name: &str) -> Result<Self, Error> /// - actor_name is the name of the community or user to read.
/// - include_deleted, if true, will return communities or users that were deleted/removed
fn read_from_name(
conn: &PgConnection,
actor_name: &str,
include_deleted: bool,
) -> Result<Self, Error>
where where
Self: Sized; Self: Sized;
fn read_from_name_and_domain( fn read_from_name_and_domain(

View file

@ -181,7 +181,7 @@ fn get_feed_user(
protocol_and_hostname: &str, protocol_and_hostname: &str,
) -> Result<ChannelBuilder, LemmyError> { ) -> Result<ChannelBuilder, LemmyError> {
let site_view = SiteView::read_local(conn)?; let site_view = SiteView::read_local(conn)?;
let person = Person::read_from_name(conn, user_name)?; let person = Person::read_from_name(conn, user_name, false)?;
let posts = PostQueryBuilder::create(conn) let posts = PostQueryBuilder::create(conn)
.listing_type(ListingType::All) .listing_type(ListingType::All)
@ -210,7 +210,7 @@ fn get_feed_community(
protocol_and_hostname: &str, protocol_and_hostname: &str,
) -> Result<ChannelBuilder, LemmyError> { ) -> Result<ChannelBuilder, LemmyError> {
let site_view = SiteView::read_local(conn)?; let site_view = SiteView::read_local(conn)?;
let community = Community::read_from_name(conn, community_name)?; let community = Community::read_from_name(conn, community_name, false)?;
let posts = PostQueryBuilder::create(conn) let posts = PostQueryBuilder::create(conn)
.listing_type(ListingType::Community) .listing_type(ListingType::Community)

View file

@ -46,13 +46,13 @@ async fn get_webfinger_response(
let name_ = name.clone(); let name_ = name.clone();
let user_id: Option<Url> = blocking(context.pool(), move |conn| { let user_id: Option<Url> = blocking(context.pool(), move |conn| {
Person::read_from_name(conn, &name_) Person::read_from_name(conn, &name_, false)
}) })
.await? .await?
.ok() .ok()
.map(|c| c.actor_id.into()); .map(|c| c.actor_id.into());
let community_id: Option<Url> = blocking(context.pool(), move |conn| { let community_id: Option<Url> = blocking(context.pool(), move |conn| {
Community::read_from_name(conn, &name) Community::read_from_name(conn, &name, false)
}) })
.await? .await?
.ok() .ok()