diff --git a/Cargo.lock b/Cargo.lock index aca52ea..154109d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -730,6 +730,7 @@ dependencies = [ "rand", "reqwest", "serde", + "serde_json", "sha2", "tokio", "tracing", diff --git a/Cargo.toml b/Cargo.toml index 3e3ada3..b51fe4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ hex = "0.4.3" jsonwebtoken = "9.2.0" rand = "0.8.5" serde = "1.0.192" +serde_json = "1.0.108" sha2 = "0.10.8" tokio = { version = "1.34.0", features = ["full"] } tracing = "0.1.40" diff --git a/migrations/2023-11-28-150402_fediwiki_setup/up.sql b/migrations/2023-11-28-150402_fediwiki_setup/up.sql index a79d35d..be73872 100644 --- a/migrations/2023-11-28-150402_fediwiki_setup/up.sql +++ b/migrations/2023-11-28-150402_fediwiki_setup/up.sql @@ -29,7 +29,7 @@ create table local_user ( create table instance_follow ( id serial primary key, instance_id int REFERENCES instance ON UPDATE CASCADE ON DELETE CASCADE NOT NULL, - follower_id int REFERENCES person ON UPDATE CASCADE ON DELETE CASCADE NOT NULL, + follower_id int REFERENCES instance ON UPDATE CASCADE ON DELETE CASCADE NOT NULL, pending boolean not null, unique(instance_id, follower_id) ); diff --git a/src/database/schema.rs b/src/database/schema.rs index 9afd047..66637b1 100644 --- a/src/database/schema.rs +++ b/src/database/schema.rs @@ -82,8 +82,6 @@ diesel::table! { diesel::joinable!(article -> instance (instance_id)); diesel::joinable!(conflict -> article (article_id)); diesel::joinable!(edit -> article (article_id)); -diesel::joinable!(instance_follow -> instance (instance_id)); -diesel::joinable!(instance_follow -> person (follower_id)); diesel::joinable!(local_user -> person (person_id)); diesel::allow_tables_to_appear_in_same_query!( diff --git a/src/federation/activities/accept.rs b/src/federation/activities/accept.rs index 85cc0ae..9bbd527 100644 --- a/src/federation/activities/accept.rs +++ b/src/federation/activities/accept.rs @@ -52,6 +52,7 @@ impl ActivityHandler for Accept { let local_instance = DbInstance::read_local_instance(&data.db_connection)?; let actor = self.actor.dereference(data).await?; DbInstance::follow(local_instance.id, actor.id, false, data)?; + dbg!(&self); Ok(()) } } diff --git a/src/federation/activities/follow.rs b/src/federation/activities/follow.rs index 8a4f809..d5dfeaa 100644 --- a/src/federation/activities/follow.rs +++ b/src/federation/activities/follow.rs @@ -26,6 +26,7 @@ impl Follow { to: DbInstance, data: &Data, ) -> MyResult<()> { + dbg!(1); let id = generate_activity_id(local_instance.ap_id.inner())?; let follow = Follow { actor: local_instance.ap_id.clone(), @@ -33,6 +34,7 @@ impl Follow { kind: Default::default(), id, }; + dbg!(&follow); local_instance .send(follow, vec![to.shared_inbox_or_inbox()], data) .await?; diff --git a/tests/common.rs b/tests/common.rs index cd58575..27c2163 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -20,6 +20,7 @@ use std::thread::{sleep, spawn}; use std::time::Duration; use tokio::task::JoinHandle; use tracing::log::LevelFilter; +use tracing::warn; use url::Url; pub static CLIENT: Lazy = Lazy::new(Client::new); @@ -208,11 +209,12 @@ where T: for<'de> Deserialize<'de>, { let res = req.send().await?; - if res.status() == StatusCode::OK { - Ok(res.json().await?) + let status = res.status(); + let text = res.text().await?; + if status == StatusCode::OK { + Ok(serde_json::from_str(&text).map_err(|e| anyhow!("Json error on {text}: {e}"))?) } else { - let text = res.text().await?; - Err(anyhow!("Post API response {text}").into()) + Err(anyhow!("API error: {text}").into()) } } @@ -229,10 +231,14 @@ pub async fn follow_instance(api_instance: &str, follow_instance: &str) -> MyRes id: instance_resolved.id, }; // cant use post helper because follow doesnt return json - CLIENT + let res = CLIENT .post(format!("http://{}/api/v1/instance/follow", api_instance)) .form(&follow_form) .send() .await?; - Ok(()) + if res.status() == StatusCode::OK { + Ok(()) + } else { + Err(anyhow!("API error: {}", res.text().await?).into()) + } }