diff --git a/Cargo.lock b/Cargo.lock index 3d4e0a2..2a0eaf8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2843,9 +2843,9 @@ dependencies = [ [[package]] name = "k-ap" -version = "0.3.1" +version = "0.4.0" source = "sparse+https://git.gabrielkaszewski.dev/api/packages/GKaszewski/cargo/" -checksum = "f73de37ac4feab6d7b78e73c60acbb07933c2be58dcbb12e8a34201f66e0480d" +checksum = "ccaa914953bfd45ea206e11826da8f61ce1fbe02f8fe0622880527046ad6ae24" dependencies = [ "activitypub_federation", "anyhow", @@ -6623,7 +6623,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/crates/adapters/activitypub/Cargo.toml b/crates/adapters/activitypub/Cargo.toml index 4ada70a..260fd52 100644 --- a/crates/adapters/activitypub/Cargo.toml +++ b/crates/adapters/activitypub/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -k-ap = { version = "0.3.1", registry = "gitea" } +k-ap = { version = "0.4.0", registry = "gitea" } domain = { workspace = true } axum = { workspace = true } serde = { workspace = true } diff --git a/crates/adapters/postgres-federation/Cargo.toml b/crates/adapters/postgres-federation/Cargo.toml index 28ab5f1..31e546b 100644 --- a/crates/adapters/postgres-federation/Cargo.toml +++ b/crates/adapters/postgres-federation/Cargo.toml @@ -12,7 +12,7 @@ sqlx = { version = "0.8.6", features = [ "chrono", ] } activitypub = { workspace = true } -k-ap = { version = "0.3.1", registry = "gitea" } +k-ap = { version = "0.4.0", registry = "gitea" } domain = { workspace = true } uuid = { workspace = true } chrono = { workspace = true } diff --git a/crates/adapters/postgres-federation/src/lib.rs b/crates/adapters/postgres-federation/src/lib.rs index 7b2a28a..380c88c 100644 --- a/crates/adapters/postgres-federation/src/lib.rs +++ b/crates/adapters/postgres-federation/src/lib.rs @@ -65,10 +65,11 @@ fn pg_remote_actor(row: &sqlx::postgres::PgRow, url_col: &str) -> RemoteActor { }) }) .unwrap_or_default(), + fetched_at: row.try_get("fetched_at").ok(), } } -const PG_ACTOR_COLS: &str = "a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as"; +const PG_ACTOR_COLS: &str = "a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at"; #[async_trait] impl FollowRepository for PostgresFederationRepository { diff --git a/crates/adapters/sqlite-federation/Cargo.toml b/crates/adapters/sqlite-federation/Cargo.toml index 02289e8..d3adaeb 100644 --- a/crates/adapters/sqlite-federation/Cargo.toml +++ b/crates/adapters/sqlite-federation/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" [dependencies] sqlx = { workspace = true } activitypub = { workspace = true } -k-ap = { version = "0.3.1", registry = "gitea" } +k-ap = { version = "0.4.0", registry = "gitea" } domain = { workspace = true } anyhow = { workspace = true } serde_json = { workspace = true } diff --git a/crates/adapters/sqlite-federation/src/lib.rs b/crates/adapters/sqlite-federation/src/lib.rs index 3fa7c58..5404a78 100644 --- a/crates/adapters/sqlite-federation/src/lib.rs +++ b/crates/adapters/sqlite-federation/src/lib.rs @@ -65,6 +65,16 @@ fn remote_actor_from_row(row: &sqlx::sqlite::SqliteRow, url_col: &str) -> Remote }) }) .unwrap_or_default(), + fetched_at: row + .try_get::, _>("fetched_at") + .ok() + .flatten() + .and_then(|s| { + chrono::NaiveDateTime::parse_from_str(&s, "%Y-%m-%d %H:%M:%S") + .map(|ndt| ndt.and_utc()) + .or_else(|_| chrono::DateTime::parse_from_rfc3339(&s).map(|dt| dt.with_timezone(&chrono::Utc))) + .ok() + }), } } @@ -136,7 +146,7 @@ impl FollowRepository for SqliteFederationRepository { let rows = sqlx::query( "SELECT f.remote_actor_url, f.status, a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, - a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as + a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at FROM ap_followers f LEFT JOIN ap_remote_actors a ON a.url = f.remote_actor_url WHERE f.local_user_id = ?", @@ -170,7 +180,7 @@ impl FollowRepository for SqliteFederationRepository { let rows = sqlx::query( "SELECT f.remote_actor_url, f.status, a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, - a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as + a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at FROM ap_followers f LEFT JOIN ap_remote_actors a ON a.url = f.remote_actor_url WHERE f.local_user_id = ? AND f.status = 'accepted' @@ -237,7 +247,7 @@ impl FollowRepository for SqliteFederationRepository { let rows = sqlx::query( "SELECT f.remote_actor_url, a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, - a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as + a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at FROM ap_followers f LEFT JOIN ap_remote_actors a ON a.url = f.remote_actor_url WHERE f.local_user_id = ? AND f.status = 'pending'", @@ -301,7 +311,7 @@ impl FollowRepository for SqliteFederationRepository { let rows = sqlx::query( "SELECT f.remote_actor_url, a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, - a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as + a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at FROM ap_followers f LEFT JOIN ap_remote_actors a ON a.url = f.remote_actor_url WHERE f.local_user_id = ? AND f.status = 'accepted' @@ -377,7 +387,7 @@ impl FollowRepository for SqliteFederationRepository { let rows = sqlx::query( "SELECT a.url, a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, - a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as + a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at FROM ap_following f INNER JOIN ap_remote_actors a ON a.url = f.remote_actor_url WHERE f.local_user_id = ? AND f.status = 'accepted'", @@ -415,7 +425,7 @@ impl FollowRepository for SqliteFederationRepository { let rows = sqlx::query( "SELECT a.url, a.handle, a.inbox_url, a.shared_inbox_url, a.display_name, a.avatar_url, - a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as + a.outbox_url, a.bio, a.banner_url, a.followers_url, a.following_url, a.also_known_as, a.fetched_at FROM ap_following f INNER JOIN ap_remote_actors a ON a.url = f.remote_actor_url WHERE f.local_user_id = ? AND f.status = 'accepted' @@ -607,7 +617,7 @@ impl ActorRepository for SqliteFederationRepository { async fn get_remote_actor(&self, actor_url: &str) -> Result> { let row = sqlx::query( "SELECT url, handle, inbox_url, shared_inbox_url, display_name, avatar_url, - outbox_url, bio, banner_url, followers_url, following_url, also_known_as + outbox_url, bio, banner_url, followers_url, following_url, also_known_as, fetched_at FROM ap_remote_actors WHERE url = ?", ) .bind(actor_url) @@ -1154,6 +1164,7 @@ mod outbox_url_tests { followers_url: None, following_url: None, also_known_as: vec![], + fetched_at: None, }; repo.add_following(local_user, actor, "https://local/activities/1") .await