diff options
Diffstat (limited to 'adenosine-pds/src/db_bsky.rs')
-rw-r--r-- | adenosine-pds/src/db_bsky.rs | 117 |
1 files changed, 71 insertions, 46 deletions
diff --git a/adenosine-pds/src/db_bsky.rs b/adenosine-pds/src/db_bsky.rs index b80ff4f..c603235 100644 --- a/adenosine-pds/src/db_bsky.rs +++ b/adenosine-pds/src/db_bsky.rs @@ -8,7 +8,6 @@ use adenosine::repo::Mutation; use anyhow::anyhow; use libipld::Cid; use rusqlite::params; -use serde_json::json; use std::str::FromStr; /// Handles updating the database with creation, update, deletion of arbitrary records @@ -59,7 +58,10 @@ pub fn bsky_mutate_db(db: &mut AtpDatabase, did: &Did, mutations: Vec<Mutation>) } // TODO: should probably return Result<Option<Profile>>? -pub fn bsky_get_profile(srv: &mut AtpService, did: &Did) -> Result<app_bsky::ProfileView> { +pub fn bsky_get_profile_detailed( + srv: &mut AtpService, + did: &Did, +) -> Result<app_bsky::ProfileViewDetailed> { // first get the profile record let mut profile_cid: Option<Cid> = None; let commit_cid = match srv.repo.lookup_commit(did)? { @@ -78,7 +80,7 @@ pub fn bsky_get_profile(srv: &mut AtpService, did: &Did) -> Result<app_bsky::Pro if let Some(cid) = profile_cid { let record: app_bsky::ProfileRecord = serde_json::from_value(ipld_into_json_value(srv.repo.get_ipld(&cid)?))?; - (Some(record.displayName), record.description) + (record.displayName, record.description) } else { (None, None) }; @@ -102,22 +104,33 @@ pub fn bsky_get_profile(srv: &mut AtpService, did: &Did) -> Result<app_bsky::Pro .conn .prepare_cached("SELECT COUNT(*) FROM bsky_follow WHERE subject_did = $1")?; let followers_count: u64 = stmt.query_row(params!(did.to_string()), |row| row.get(0))?; - let decl = app_bsky::DeclRef { - actorType: "app.bsky.system.actorUser".to_string(), - cid: "bafyreid27zk7lbis4zw5fz4podbvbs4fc5ivwji3dmrwa6zggnj4bnd57u".to_string(), - }; - Ok(app_bsky::ProfileView { + Ok(app_bsky::ProfileViewDetailed { did: did.to_string(), handle, - creator: did.to_string(), displayName: display_name, description, - declaration: decl, + avatar: None, + banner: None, followersCount: followers_count, followsCount: follows_count, postsCount: post_count, - membersCount: 0, - viewer: json!({}), + viewer: None, + labels: None, + indexedAt: None, + }) +} + +pub fn bsky_get_profile(srv: &mut AtpService, did: &Did) -> Result<app_bsky::ProfileView> { + let d = bsky_get_profile_detailed(srv, did)?; + Ok(app_bsky::ProfileView { + did: d.did, + handle: d.handle, + displayName: d.displayName, + description: d.description, + avatar: d.avatar, + indexedAt: d.indexedAt, + viewer: d.viewer, + labels: d.labels, }) } @@ -177,9 +190,10 @@ fn feed_row(row: &rusqlite::Row) -> Result<FeedRow> { }) } -fn feed_row_to_item(srv: &mut AtpService, row: FeedRow) -> Result<app_bsky::FeedPostView> { +fn feed_row_to_item(srv: &mut AtpService, row: FeedRow) -> Result<app_bsky::FeedViewPost> { let record_ipld = srv.repo.get_ipld(&row.item_post_cid)?; - let post_record: app_bsky::Post = serde_json::from_value(ipld_into_json_value(record_ipld))?; + let post_record: app_bsky::PostRecord = + serde_json::from_value(ipld_into_json_value(record_ipld))?; let uri = format!( "at://{}/{}/{}", row.item_did, "app.bsky.feed.post", row.item_post_tid @@ -201,31 +215,27 @@ fn feed_row_to_item(srv: &mut AtpService, row: FeedRow) -> Result<app_bsky::Feed .prepare_cached("SELECT COUNT(*) FROM bsky_post WHERE reply_to_parent_uri = $1")?; let reply_count: u64 = stmt.query_row(params!(uri), |row| row.get(0))?; - let decl = app_bsky::DeclRef { - actorType: "app.bsky.system.actorUser".to_string(), - cid: "bafyreid27zk7lbis4zw5fz4podbvbs4fc5ivwji3dmrwa6zggnj4bnd57u".to_string(), - }; - let feed_item = app_bsky::FeedPostView { + let feed_item = app_bsky::FeedViewPost { post: app_bsky::PostView { uri, cid: row.item_post_cid.to_string(), - author: app_bsky::UserView { + author: app_bsky::ProfileViewBasic { did: row.item_did.to_string(), handle: row.item_handle, - declaration: decl, // TODO: displayName: None, avatar: None, viewer: None, + labels: None, }, record: post_record, embed: None, replyCount: reply_count, repostCount: repost_count, - upvoteCount: like_count, - downvoteCount: 0, + likeCount: like_count, indexedAt: row.indexed_at, viewer: None, + labels: None, }, // TODO: reason: None, @@ -235,7 +245,7 @@ fn feed_row_to_item(srv: &mut AtpService, row: FeedRow) -> Result<app_bsky::Feed } pub fn bsky_get_timeline(srv: &mut AtpService, did: &Did) -> Result<app_bsky::GenericFeed> { - let mut feed: Vec<app_bsky::FeedPostView> = vec![]; + let mut feed: Vec<app_bsky::FeedViewPost> = vec![]; // TODO: also handle reposts let rows = { let mut stmt = srv.atp_db @@ -252,11 +262,11 @@ pub fn bsky_get_timeline(srv: &mut AtpService, did: &Did) -> Result<app_bsky::Ge for row in rows { feed.push(feed_row_to_item(srv, row)?); } - Ok(app_bsky::GenericFeed { feed }) + Ok(app_bsky::GenericFeed { feed, cursor: None }) } pub fn bsky_get_author_feed(srv: &mut AtpService, did: &Did) -> Result<app_bsky::GenericFeed> { - let mut feed: Vec<app_bsky::FeedPostView> = vec![]; + let mut feed: Vec<app_bsky::FeedViewPost> = vec![]; // TODO: also handle reposts let rows = { let mut stmt = srv.atp_db @@ -273,7 +283,7 @@ pub fn bsky_get_author_feed(srv: &mut AtpService, did: &Did) -> Result<app_bsky: for row in rows { feed.push(feed_row_to_item(srv, row)?); } - Ok(app_bsky::GenericFeed { feed }) + Ok(app_bsky::GenericFeed { feed, cursor: None }) } // TODO: this is a partial implementation @@ -298,7 +308,7 @@ pub fn bsky_get_thread( _ => Err(anyhow!("expected a record in uri: {}", uri))?, }; - // post itself, as a app_bsky::FeedPostView + // post itself, as a app_bsky::FeedViewPost let post_items = { let mut stmt = srv.atp_db .conn @@ -335,7 +345,7 @@ pub fn bsky_get_thread( }; for row in rows { let item = feed_row_to_item(srv, row)?.post; - children.push(app_bsky::ThreadPostView { + children.push(app_bsky::ThreadViewPost { post: Some(app_bsky::PostView { uri: item.uri, cid: item.cid, @@ -343,11 +353,11 @@ pub fn bsky_get_thread( record: item.record, embed: item.embed, replyCount: item.replyCount, - upvoteCount: item.upvoteCount, - downvoteCount: 0, + likeCount: item.likeCount, repostCount: item.repostCount, indexedAt: item.indexedAt, viewer: None, + labels: None, }), // don't want a loop here parent: None, @@ -356,11 +366,14 @@ pub fn bsky_get_thread( // for "notfound" uri: None, notFound: None, + // for "blocked" variant + blocked: None, + author: None, }); } let pip = post_item.post; - let post = app_bsky::ThreadPostView { + let post = app_bsky::ThreadViewPost { post: Some(app_bsky::PostView { uri: pip.uri, cid: pip.cid, @@ -368,17 +381,20 @@ pub fn bsky_get_thread( record: pip.record, embed: pip.embed, replyCount: pip.replyCount, - upvoteCount: pip.upvoteCount, - downvoteCount: 0, + likeCount: pip.likeCount, repostCount: pip.repostCount, indexedAt: pip.indexedAt, viewer: None, + labels: None, }), parent, replies: Some(children), // for "notfound" variant uri: None, notFound: None, + // for "blocked" variant + blocked: None, + author: None, }; Ok(app_bsky::PostThread { thread: post }) } @@ -394,6 +410,7 @@ fn test_bsky_profile() { let mut srv = AtpService::new_ephemeral().unwrap(); let req = com_atproto::AccountRequest { + did: None, email: "test@bogus.com".to_string(), handle: "handle.test".to_string(), password: "bogus".to_string(), @@ -402,7 +419,7 @@ fn test_bsky_profile() { }; let session = create_account(&mut srv, &req, true).unwrap(); let did = Did::from_str(&session.did).unwrap(); - let profile = bsky_get_profile(&mut srv, &did).unwrap(); + let profile = bsky_get_profile_detailed(&mut srv, &did).unwrap(); assert_eq!(profile.did, session.did); assert_eq!(profile.handle, req.handle); assert_eq!(profile.displayName, None); @@ -412,21 +429,25 @@ fn test_bsky_profile() { assert_eq!(profile.postsCount, 0); let record = app_bsky::ProfileRecord { - displayName: "Test Name".to_string(), + displayName: Some("Test Name".to_string()), description: Some("short description".to_string()), + avatar: None, + banner: None, }; bsky_update_profile(&mut srv, &did, record.clone()).unwrap(); let profile = bsky_get_profile(&mut srv, &did).unwrap(); - assert_eq!(profile.displayName, Some(record.displayName)); + assert_eq!(profile.displayName, record.displayName); assert_eq!(profile.description, record.description); let record = app_bsky::ProfileRecord { - displayName: "New Test Name".to_string(), + displayName: Some("New Test Name".to_string()), description: Some("longer description".to_string()), + avatar: None, + banner: None, }; bsky_update_profile(&mut srv, &did, record.clone()).unwrap(); let profile = bsky_get_profile(&mut srv, &did).unwrap(); - assert_eq!(profile.displayName, Some(record.displayName)); + assert_eq!(profile.displayName, record.displayName); assert_eq!(profile.description, record.description); let mutations = vec![ @@ -461,7 +482,7 @@ fn test_bsky_profile() { .unwrap(); bsky_mutate_db(&mut srv.atp_db, &did, mutations).unwrap(); - let profile = bsky_get_profile(&mut srv, &did).unwrap(); + let profile = bsky_get_profile_detailed(&mut srv, &did).unwrap(); assert_eq!(profile.followersCount, 1); assert_eq!(profile.followsCount, 2); assert_eq!(profile.postsCount, 3); @@ -482,6 +503,7 @@ fn test_bsky_feeds() { let mut srv = AtpService::new_ephemeral().unwrap(); let alice_did = { let req = com_atproto::AccountRequest { + did: None, email: "alice@bogus.com".to_string(), handle: "alice.test".to_string(), password: "bogus".to_string(), @@ -493,6 +515,7 @@ fn test_bsky_feeds() { }; let bob_did = { let req = com_atproto::AccountRequest { + did: None, email: "bob@bogus.com".to_string(), handle: "bob.test".to_string(), password: "bogus".to_string(), @@ -504,6 +527,7 @@ fn test_bsky_feeds() { }; let carol_did = { let req = com_atproto::AccountRequest { + did: None, email: "carol@bogus.com".to_string(), handle: "carol.test".to_string(), password: "bogus".to_string(), @@ -596,7 +620,7 @@ fn test_bsky_feeds() { bsky_mutate_db(&mut srv.atp_db, &carol_did, mutations).unwrap(); // test alice profile: counts should be updated - let alice_profile = bsky_get_profile(&mut srv, &alice_did).unwrap(); + let alice_profile = bsky_get_profile_detailed(&mut srv, &alice_did).unwrap(); assert_eq!(alice_profile.followersCount, 1); assert_eq!(alice_profile.followsCount, 0); assert_eq!(alice_profile.postsCount, 3); @@ -621,18 +645,17 @@ fn test_bsky_feeds() { assert_eq!(alice_feed.feed[2].post.embed, None); assert_eq!(alice_feed.feed[2].post.replyCount, 0); assert_eq!(alice_feed.feed[2].post.repostCount, 0); - assert_eq!(alice_feed.feed[2].post.upvoteCount, 1); - assert_eq!(alice_feed.feed[2].post.downvoteCount, 0); + assert_eq!(alice_feed.feed[2].post.likeCount, 1); assert_eq!(alice_feed.feed[1].post.author.did, alice_did.to_string()); assert_eq!(alice_feed.feed[1].post.replyCount, 0); assert_eq!(alice_feed.feed[1].post.repostCount, 1); - assert_eq!(alice_feed.feed[1].post.upvoteCount, 0); + assert_eq!(alice_feed.feed[1].post.likeCount, 0); assert_eq!(alice_feed.feed[0].post.author.did, alice_did.to_string()); assert_eq!(alice_feed.feed[0].post.replyCount, 1); assert_eq!(alice_feed.feed[0].post.repostCount, 0); - assert_eq!(alice_feed.feed[0].post.upvoteCount, 0); + assert_eq!(alice_feed.feed[0].post.likeCount, 0); // test bob timeline: should include alice posts let bob_timeline = bsky_get_timeline(&mut srv, &bob_did).unwrap(); @@ -687,6 +710,7 @@ fn test_bsky_thread() { let mut srv = AtpService::new_ephemeral().unwrap(); let alice_did = { let req = com_atproto::AccountRequest { + did: None, email: "alice@bogus.com".to_string(), handle: "alice.test".to_string(), password: "bogus".to_string(), @@ -698,6 +722,7 @@ fn test_bsky_thread() { }; let bob_did = { let req = com_atproto::AccountRequest { + did: None, email: "bob@bogus.com".to_string(), handle: "bob.test".to_string(), password: "bogus".to_string(), @@ -758,7 +783,7 @@ fn test_bsky_thread() { assert_eq!(ppost.embed, None); assert_eq!(ppost.replyCount, 1); assert_eq!(ppost.repostCount, 0); - assert_eq!(ppost.upvoteCount, 0); + assert_eq!(ppost.likeCount, 0); assert_eq!(post.replies.as_ref().unwrap().len(), 1); let post_replies = post.replies.unwrap(); |