X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fdb_schema%2Fsrc%2Fimpls%2Fperson.rs;h=2e086dcb6d3f1cb9a8eda5ec61ec38ca9b142103;hb=92568956353f21649ed9aff68b42699c9d036f30;hp=032e2e0179ab4cedaf26ed340e1cfa8fe0e2da74;hpb=985fe24669d3fdeecc0aa76cc74dd6570cbad5c8;p=lemmy.git diff --git a/crates/db_schema/src/impls/person.rs b/crates/db_schema/src/impls/person.rs index 032e2e01..2e086dcb 100644 --- a/crates/db_schema/src/impls/person.rs +++ b/crates/db_schema/src/impls/person.rs @@ -1,18 +1,6 @@ use crate::{ newtypes::{CommunityId, DbUrl, PersonId}, - schema::person::dsl::{ - actor_id, - avatar, - banner, - bio, - deleted, - display_name, - local, - matrix_user_id, - name, - person, - updated, - }, + schema::{instance, local_user, person, person_follower}, source::person::{ Person, PersonFollower, @@ -23,7 +11,7 @@ use crate::{ traits::{ApubActor, Crud, Followable}, utils::{functions::lower, get_conn, naive_now, DbPool}, }; -use diesel::{dsl::insert_into, result::Error, ExpressionMethods, QueryDsl, TextExpressionMethods}; +use diesel::{dsl::insert_into, result::Error, ExpressionMethods, JoinOnDsl, QueryDsl}; use diesel_async::RunQueryDsl; #[async_trait] @@ -31,35 +19,34 @@ impl Crud for Person { type InsertForm = PersonInsertForm; type UpdateForm = PersonUpdateForm; type IdType = PersonId; - async fn read(pool: &DbPool, person_id: PersonId) -> Result { + async fn read(pool: &mut DbPool<'_>, person_id: PersonId) -> Result { let conn = &mut get_conn(pool).await?; - person - .filter(deleted.eq(false)) + person::table + .filter(person::deleted.eq(false)) .find(person_id) .first::(conn) .await } - async fn delete(pool: &DbPool, person_id: PersonId) -> Result { + async fn delete(pool: &mut DbPool<'_>, person_id: PersonId) -> Result { let conn = &mut get_conn(pool).await?; - diesel::delete(person.find(person_id)).execute(conn).await + diesel::delete(person::table.find(person_id)) + .execute(conn) + .await } - async fn create(pool: &DbPool, form: &PersonInsertForm) -> Result { + async fn create(pool: &mut DbPool<'_>, form: &PersonInsertForm) -> Result { let conn = &mut get_conn(pool).await?; - insert_into(person) + insert_into(person::table) .values(form) - .on_conflict(actor_id) - .do_update() - .set(form) .get_result::(conn) .await } async fn update( - pool: &DbPool, + pool: &mut DbPool<'_>, person_id: PersonId, form: &PersonUpdateForm, ) -> Result { let conn = &mut get_conn(pool).await?; - diesel::update(person.find(person_id)) + diesel::update(person::table.find(person_id)) .set(form) .get_result::(conn) .await @@ -67,8 +54,20 @@ impl Crud for Person { } impl Person { - pub async fn delete_account(pool: &DbPool, person_id: PersonId) -> Result { - use crate::schema::local_user; + /// Update or insert the person. + /// + /// This is necessary for federation, because Activitypub doesnt distinguish between these actions. + pub async fn upsert(pool: &mut DbPool<'_>, form: &PersonInsertForm) -> Result { + let conn = &mut get_conn(pool).await?; + insert_into(person::table) + .values(form) + .on_conflict(person::actor_id) + .do_update() + .set(form) + .get_result::(conn) + .await + } + pub async fn delete_account(pool: &mut DbPool<'_>, person_id: PersonId) -> Result { let conn = &mut get_conn(pool).await?; // Set the local user info to none @@ -80,15 +79,15 @@ impl Person { .execute(conn) .await?; - diesel::update(person.find(person_id)) + diesel::update(person::table.find(person_id)) .set(( - display_name.eq::>(None), - avatar.eq::>(None), - banner.eq::>(None), - bio.eq::>(None), - matrix_user_id.eq::>(None), - deleted.eq(true), - updated.eq(naive_now()), + person::display_name.eq::>(None), + person::avatar.eq::>(None), + person::banner.eq::>(None), + person::bio.eq::>(None), + person::matrix_user_id.eq::>(None), + person::deleted.eq(true), + person::updated.eq(naive_now()), )) .get_result::(conn) .await @@ -105,12 +104,15 @@ pub fn is_banned(banned_: bool, expires: Option) -> bool #[async_trait] impl ApubActor for Person { - async fn read_from_apub_id(pool: &DbPool, object_id: &DbUrl) -> Result, Error> { + async fn read_from_apub_id( + pool: &mut DbPool<'_>, + object_id: &DbUrl, + ) -> Result, Error> { let conn = &mut get_conn(pool).await?; Ok( - person - .filter(deleted.eq(false)) - .filter(actor_id.eq(object_id)) + person::table + .filter(person::deleted.eq(false)) + .filter(person::actor_id.eq(object_id)) .first::(conn) .await .ok() @@ -119,30 +121,33 @@ impl ApubActor for Person { } async fn read_from_name( - pool: &DbPool, + pool: &mut DbPool<'_>, from_name: &str, include_deleted: bool, ) -> Result { let conn = &mut get_conn(pool).await?; - let mut q = person + let mut q = person::table .into_boxed() - .filter(local.eq(true)) - .filter(lower(name).eq(lower(from_name))); + .filter(person::local.eq(true)) + .filter(lower(person::name).eq(from_name.to_lowercase())); if !include_deleted { - q = q.filter(deleted.eq(false)) + q = q.filter(person::deleted.eq(false)) } q.first::(conn).await } async fn read_from_name_and_domain( - pool: &DbPool, + pool: &mut DbPool<'_>, person_name: &str, - protocol_domain: &str, + for_domain: &str, ) -> Result { let conn = &mut get_conn(pool).await?; - person - .filter(lower(name).eq(lower(person_name))) - .filter(actor_id.like(format!("{protocol_domain}%"))) + + person::table + .inner_join(instance::table) + .filter(lower(person::name).eq(person_name.to_lowercase())) + .filter(instance::domain.eq(for_domain)) + .select(person::all_columns) .first::(conn) .await } @@ -151,7 +156,7 @@ impl ApubActor for Person { #[async_trait] impl Followable for PersonFollower { type Form = PersonFollowerForm; - async fn follow(pool: &DbPool, form: &PersonFollowerForm) -> Result { + async fn follow(pool: &mut DbPool<'_>, form: &PersonFollowerForm) -> Result { use crate::schema::person_follower::dsl::{follower_id, person_follower, person_id}; let conn = &mut get_conn(pool).await?; insert_into(person_follower) @@ -162,10 +167,10 @@ impl Followable for PersonFollower { .get_result::(conn) .await } - async fn follow_accepted(_: &DbPool, _: CommunityId, _: PersonId) -> Result { + async fn follow_accepted(_: &mut DbPool<'_>, _: CommunityId, _: PersonId) -> Result { unimplemented!() } - async fn unfollow(pool: &DbPool, form: &PersonFollowerForm) -> Result { + async fn unfollow(pool: &mut DbPool<'_>, form: &PersonFollowerForm) -> Result { use crate::schema::person_follower::dsl::{follower_id, person_follower, person_id}; let conn = &mut get_conn(pool).await?; diesel::delete( @@ -179,12 +184,14 @@ impl Followable for PersonFollower { } impl PersonFollower { - pub async fn list_followers(pool: &DbPool, person_id_: PersonId) -> Result, Error> { - use crate::schema::{person, person_follower, person_follower::person_id}; + pub async fn list_followers( + pool: &mut DbPool<'_>, + for_person_id: PersonId, + ) -> Result, Error> { let conn = &mut get_conn(pool).await?; person_follower::table - .inner_join(person::table) - .filter(person_id.eq(person_id_)) + .inner_join(person::table.on(person_follower::follower_id.eq(person::id))) + .filter(person_follower::person_id.eq(for_person_id)) .select(person::all_columns) .load(conn) .await @@ -193,6 +200,9 @@ impl PersonFollower { #[cfg(test)] mod tests { + #![allow(clippy::unwrap_used)] + #![allow(clippy::indexing_slicing)] + use crate::{ source::{ instance::Instance, @@ -207,6 +217,7 @@ mod tests { #[serial] async fn test_crud() { let pool = &build_db_pool_for_tests().await; + let pool = &mut pool.into(); let inserted_instance = Instance::read_or_create(pool, "my_domain.tld".to_string()) .await @@ -267,6 +278,7 @@ mod tests { #[serial] async fn follow() { let pool = &build_db_pool_for_tests().await; + let pool = &mut pool.into(); let inserted_instance = Instance::read_or_create(pool, "my_domain.tld".to_string()) .await .unwrap();