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();
Ok(
blocking(context.pool(), move |conn| {
DbActor::read_from_name(conn, &identifier)
DbActor::read_from_name(conn, &identifier, false)
})
.await??,
)

View file

@ -35,7 +35,7 @@ pub(crate) async fn get_apub_community_http(
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
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??
.into();
@ -66,7 +66,7 @@ pub(crate) async fn get_apub_community_followers(
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
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??;
let followers = GroupFollowers::new(community, &context).await?;
@ -80,7 +80,7 @@ pub(crate) async fn get_apub_community_outbox(
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
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??;
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>,
) -> Result<HttpResponse, LemmyError> {
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??
.into();

View file

@ -28,7 +28,7 @@ pub(crate) async fn get_apub_person_http(
let user_name = info.into_inner().user_name;
// TODO: this needs to be able to read deleted persons, so that it can send tombstones
let person: ApubPerson = blocking(context.pool(), move |conn| {
Person::read_from_name(conn, &user_name)
Person::read_from_name(conn, &user_name, true)
})
.await??
.into();
@ -60,7 +60,7 @@ pub(crate) async fn get_apub_person_outbox(
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, LemmyError> {
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??;
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::*;
community
let mut q = community
.into_boxed()
.filter(local.eq(true))
.filter(lower(name).eq(lower(community_name)))
.first::<Self>(conn)
.filter(lower(name).eq(lower(community_name)));
if !include_deleted {
q = q.filter(deleted.eq(false)).filter(removed.eq(false));
}
q.first::<Self>(conn)
}
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> {
person
.filter(deleted.eq(false))
fn read_from_name(
conn: &PgConnection,
from_name: &str,
include_deleted: bool,
) -> Result<Person, Error> {
let mut q = person
.into_boxed()
.filter(local.eq(true))
.filter(lower(name).eq(lower(from_name)))
.first::<Person>(conn)
.filter(lower(name).eq(lower(from_name)));
if !include_deleted {
q = q.filter(deleted.eq(false))
}
q.first::<Self>(conn)
}
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>
where
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
Self: Sized;
fn read_from_name_and_domain(

View file

@ -181,7 +181,7 @@ fn get_feed_user(
protocol_and_hostname: &str,
) -> Result<ChannelBuilder, LemmyError> {
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)
.listing_type(ListingType::All)
@ -210,7 +210,7 @@ fn get_feed_community(
protocol_and_hostname: &str,
) -> Result<ChannelBuilder, LemmyError> {
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)
.listing_type(ListingType::Community)

View file

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