diff --git a/crates/api_apub/src/users/user_followers.rs b/crates/api_apub/src/users/user_followers.rs index fe3fa718..ca2029ce 100644 --- a/crates/api_apub/src/users/user_followers.rs +++ b/crates/api_apub/src/users/user_followers.rs @@ -88,7 +88,8 @@ pub async fn handler( .fetch_page(page - 1) .await? .into_iter() - .map(|follow| Url::parse(&follow.id).unwrap()) + .map(|follow| Url::parse(&follow.id)) + .filter_map(Result::ok) .collect(), total.number_of_pages, page, diff --git a/crates/api_apub/src/users/user_outbox.rs b/crates/api_apub/src/users/user_outbox.rs index ce301413..70d01825 100644 --- a/crates/api_apub/src/users/user_outbox.rs +++ b/crates/api_apub/src/users/user_outbox.rs @@ -92,8 +92,9 @@ pub async fn handler( .into_iter() .map(|activity| { let activity: ApubActivity = activity.into(); - activity.into_json().unwrap() + activity.into_json() }) + .filter_map(Result::ok) .collect(), total.number_of_pages, page, diff --git a/crates/api_mastodon/src/entities/context.rs b/crates/api_mastodon/src/entities/context.rs index 40a8bd29..8bb24492 100644 --- a/crates/api_mastodon/src/entities/context.rs +++ b/crates/api_mastodon/src/entities/context.rs @@ -1,4 +1,5 @@ use activitypub_federation::{config::Data, traits::Object}; +use futures::future::TryJoinAll; use hatsu_apub::objects::{ApubPost, Note}; use hatsu_db_schema::{post, prelude::Post}; use hatsu_utils::{AppData, AppError}; @@ -24,26 +25,21 @@ impl Context { .await? { Some(post) => { - // https://www.sea-ql.org/SeaORM/docs/relation/chained-relations/ - let handles = post - .find_linked(post::SelfReferencingLink) - .all(&data.conn) - .await? - .into_iter() - .map(|post| async move { - let apub_post: ApubPost = post.clone().into(); - // TODO: remove unwrap - let note: Note = apub_post.into_json(data).await.unwrap(); - - Status::from_json(note, data).await.unwrap() - }) - .collect::>(); - - let descendants: Vec = futures::future::join_all(handles).await; - Ok(Self { ancestors: vec![], - descendants, + // https://www.sea-ql.org/SeaORM/docs/relation/chained-relations/ + descendants: post + .find_linked(post::SelfReferencingLink) + .all(&data.conn) + .await? + .into_iter() + .map(|post| async move { + let apub_post: ApubPost = post.clone().into(); + let note: Note = apub_post.into_json(data).await?; + Status::from_json(note, data).await + }) + .collect::>() + .await?, }) }, None => Err(AppError::not_found("Record", post_id.as_ref())), diff --git a/crates/api_mastodon/src/routes/statuses/status_favourited_by.rs b/crates/api_mastodon/src/routes/statuses/status_favourited_by.rs index aef31b4b..140a14bd 100644 --- a/crates/api_mastodon/src/routes/statuses/status_favourited_by.rs +++ b/crates/api_mastodon/src/routes/statuses/status_favourited_by.rs @@ -1,5 +1,6 @@ use activitypub_federation::config::Data; use axum::{debug_handler, extract::Path, Json}; +use futures::future::TryJoinAll; use hatsu_db_schema::prelude::{Post, ReceivedLike}; use hatsu_utils::{AppData, AppError}; use sea_orm::{EntityTrait, ModelTrait}; @@ -37,20 +38,17 @@ pub async fn status_favourited_by( .one(&data.conn) .await? { - Some(post) => { - let handles = post - .find_related(ReceivedLike) + Some(post) => Ok(Json( + post.find_related(ReceivedLike) .all(&data.conn) - .await - .unwrap() + .await? .into_iter() .map(|received_like| async { - Account::from_id(received_like.actor, &data).await.unwrap() + Account::from_id(received_like.actor, &data).await }) - .collect::>(); - - Ok(Json(futures::future::join_all(handles).await)) - }, + .collect::>() + .await?, + )), _ => Err(AppError::not_found("Record", &base64_url)), } }, diff --git a/crates/api_mastodon/src/routes/statuses/status_reblogged_by.rs b/crates/api_mastodon/src/routes/statuses/status_reblogged_by.rs index d5d0fcae..cb0fc68e 100644 --- a/crates/api_mastodon/src/routes/statuses/status_reblogged_by.rs +++ b/crates/api_mastodon/src/routes/statuses/status_reblogged_by.rs @@ -1,5 +1,6 @@ use activitypub_federation::config::Data; use axum::{debug_handler, extract::Path, Json}; +use futures::future::TryJoinAll; use hatsu_db_schema::prelude::{Post, ReceivedAnnounce}; use hatsu_utils::{AppData, AppError}; use sea_orm::{EntityTrait, ModelTrait}; @@ -37,20 +38,17 @@ pub async fn status_reblogged_by( .one(&data.conn) .await? { - Some(post) => { - let handles = post - .find_related(ReceivedAnnounce) + Some(post) => Ok(Json( + post.find_related(ReceivedAnnounce) .all(&data.conn) - .await - .unwrap() + .await? .into_iter() .map(|received_like| async { - Account::from_id(received_like.actor, &data).await.unwrap() + Account::from_id(received_like.actor, &data).await }) - .collect::>(); - - Ok(Json(futures::future::join_all(handles).await)) - }, + .collect::>() + .await?, + )), _ => Err(AppError::not_found("Record", &base64_url)), } }, diff --git a/crates/apub/src/actors/db_user.rs b/crates/apub/src/actors/db_user.rs index 3bd507f3..a9b40368 100644 --- a/crates/apub/src/actors/db_user.rs +++ b/crates/apub/src/actors/db_user.rs @@ -128,11 +128,11 @@ impl Object for ApubUser { icon: self .icon .clone() - .map(|icon| UserImage::new(Url::parse(&icon).unwrap())), + .and_then(|icon| Url::parse(&icon).map_or(None, |url| Some(UserImage::new(url)))), image: self.hatsu.clone().and_then(|hatsu| { - hatsu - .banner_image - .map(|image| UserImage::new(Url::parse(&image).unwrap())) + hatsu.banner_image.and_then(|image| { + Url::parse(&image).map_or(None, |url| Some(UserImage::new(url))) + }) }), attachment: self .feed diff --git a/crates/apub/src/actors/db_user_impl.rs b/crates/apub/src/actors/db_user_impl.rs index 203ca633..99289a20 100644 --- a/crates/apub/src/actors/db_user_impl.rs +++ b/crates/apub/src/actors/db_user_impl.rs @@ -7,6 +7,7 @@ use activitypub_federation::{ http_signatures::generate_actor_keypair, traits::{ActivityHandler, Actor}, }; +use futures::future::TryJoinAll; use hatsu_db_schema::{prelude::ReceivedFollow, user::Model as DbUser}; use hatsu_feed::{UserFeed, UserFeedHatsu, UserFeedTopLevel}; use hatsu_utils::{AppData, AppError}; @@ -92,24 +93,22 @@ impl ApubUser { let inboxes = if let Some(inboxes) = inboxes { inboxes } else { - // 获取 followers inbox - let handles = self - .find_related(ReceivedFollow) + // get followers inbox + self.find_related(ReceivedFollow) .all(&data.conn) .await? .into_iter() .map(|received_follow| async move { - let follower: ObjectId = - Url::parse(&received_follow.actor).unwrap().into(); - let follower: Self = follower.dereference_local(data).await.unwrap(); - follower.shared_inbox_or_inbox() - }) - .collect::>(); + let follower: ObjectId = Url::parse(&received_follow.actor)?.into(); + let follower: Self = follower.dereference_local(data).await?; - futures::future::join_all(handles).await + Ok::(follower.shared_inbox_or_inbox()) + }) + .collect::>() + .await? }; - // 发送 + // send queue_activity(&activity, self, inboxes, data).await?; Ok(()) diff --git a/crates/feed/src/user_feed_item.rs b/crates/feed/src/user_feed_item.rs index 7aa5f7ef..771c2226 100644 --- a/crates/feed/src/user_feed_item.rs +++ b/crates/feed/src/user_feed_item.rs @@ -70,7 +70,7 @@ impl WrappedUserFeedItem { tags: self .tags .clone() - .map(|tags| serde_json::from_str(&tags).unwrap()), + .and_then(|tags| serde_json::from_str(&tags).ok()), date_published: self.date_published.clone(), date_modified: self.date_modified.clone(), }) @@ -98,7 +98,7 @@ impl WrappedUserFeedItem { language: json.language, tags: json .tags - .map(|tags| serde_json::to_string::>(&tags).unwrap()), + .and_then(|tags| serde_json::to_string::>(&tags).ok()), date_published: json.date_published, date_modified: json.date_modified, };