diff --git a/src/xrpc/timeline.rs b/src/xrpc/timeline.rs index b0318a7..a0c0e37 100644 --- a/src/xrpc/timeline.rs +++ b/src/xrpc/timeline.rs @@ -14,7 +14,10 @@ use jacquard::api::app_bsky::feed::post::Post; use jacquard::types::datetime; use jacquard::types::{aturi::AtUri, cid::Cid, ident::AtIdentifier}; use jacquard_api::app_bsky::actor::ProfileViewBasic; +use jacquard_api::app_bsky::embed::external; +use jacquard_api::app_bsky::embed::external::ExternalRecord; use jacquard_api::app_bsky::embed::images; +use jacquard_api::app_bsky::embed::images::Images; use jacquard_api::app_bsky::embed::record::Record; use jacquard_api::app_bsky::embed::record::{View, ViewRecord, ViewUnionRecord}; use jacquard_api::app_bsky::feed::FeedViewPost; @@ -125,39 +128,13 @@ async fn build_feed_view_from_post<'a>( if let Some(embeded_post) = post.embed { match embeded_post { PostEmbed::Record(rec) => { - if let Some(view_record) = created_embeded_record_view(resolver, pool, rec).await { - let view = View { - record: ViewUnionRecord::ViewRecord(Box::new(view_record)), - extra_data: None, - }; - post_view.embed = Some(PostViewEmbed::RecordView(Box::new(view))); - } + post_view.embed = get_record_embed(resolver.clone(), pool, rec).await } PostEmbed::Images(images) => { - let images_view = images - .images - .into_iter() - .filter_map(|image| { - let blob_uri = get_blob_uri( - Some(image.image), - post_author.to_string(), - did_doc.pds_endpoint.clone(), - )?; - - Some(images::ViewImage { - alt: image.alt, - aspect_ratio: image.aspect_ratio, - fullsize: blob_uri.clone(), - thumb: blob_uri, - extra_data: None, - }) - }) - .collect(); - let view = images::View { - images: images_view, - extra_data: None, - }; - post_view.embed = Some(PostViewEmbed::ImagesView(Box::new(view))); + post_view.embed = get_image_embed(images, post_author, did_doc.pds_endpoint); + } + PostEmbed::External(external) => { + post_view.embed = get_external_embed(external, post_author, did_doc.pds_endpoint) } _ => {} } @@ -231,40 +208,13 @@ async fn build_feed_view_from_repost<'a>( if let Some(embeded_post) = post.embed { match embeded_post { PostEmbed::Record(rec) => { - if let Some(view_record) = created_embeded_record_view(resolver, pool, rec).await { - let view = View { - record: ViewUnionRecord::ViewRecord(Box::new(view_record)), - extra_data: None, - }; - post_view.embed = Some(PostViewEmbed::RecordView(Box::new(view))); - } + post_view.embed = get_record_embed(resolver.clone(), pool, rec).await } PostEmbed::Images(images) => { - let images_view = images - .images - .into_iter() - .filter_map(|image| { - // NOT WORKING - let blob_uri = get_blob_uri( - Some(image.image), - did_doc.did.clone(), - did_doc.pds_endpoint.clone(), - )?; - - Some(images::ViewImage { - alt: image.alt, - aspect_ratio: image.aspect_ratio, - fullsize: blob_uri.clone(), - thumb: blob_uri, - extra_data: None, - }) - }) - .collect(); - let view = images::View { - images: images_view, - extra_data: None, - }; - post_view.embed = Some(PostViewEmbed::ImagesView(Box::new(view))); + post_view.embed = get_image_embed(images, did_doc.did, did_doc.pds_endpoint); + } + PostEmbed::External(external) => { + post_view.embed = get_external_embed(external, did_doc.did, did_doc.pds_endpoint); } _ => {} } @@ -292,6 +242,76 @@ async fn build_feed_view_from_repost<'a>( }) } +async fn get_record_embed<'a>( + resolver: JacquardResolver, + pool: sqlx::SqlitePool, + rec: Box>, +) -> Option> { + if let Some(view_record) = created_embeded_record_view(resolver, pool, rec).await { + let view = View { + record: ViewUnionRecord::ViewRecord(Box::new(view_record)), + extra_data: None, + }; + return Some(PostViewEmbed::RecordView(Box::new(view))); + } + None +} + +fn get_image_embed<'a>( + images: Box>, + post_author: String, + pds_endpoint: String, +) -> Option> { + let images_view = images + .images + .into_iter() + .filter_map(|image| { + let blob_uri = + get_blob_uri(Some(image.image), post_author.clone(), pds_endpoint.clone())?; + + Some(images::ViewImage { + alt: image.alt, + aspect_ratio: image.aspect_ratio, + fullsize: blob_uri.clone(), + thumb: blob_uri, + extra_data: None, + }) + }) + .collect(); + let view = images::View { + images: images_view, + extra_data: None, + }; + + return Some(PostViewEmbed::ImagesView(Box::new(view))); +} + +fn get_external_embed<'a>( + external: Box>, + post_author: String, + pds_endpoint: String, +) -> Option> { + let thumb_uri = get_blob_uri( + external.external.thumb, + post_author.clone(), + pds_endpoint.clone(), + ); + + let external_view = external::ViewExternal { + description: external.external.description, + thumb: thumb_uri, + title: external.external.title, + uri: external.external.uri, + extra_data: None, + }; + + let view = external::View { + external: external_view, + extra_data: None, + }; + return Some(PostViewEmbed::ExternalView(Box::new(view))); +} + async fn created_embeded_record_view<'a>( resolver: JacquardResolver, pool: sqlx::SqlitePool,