From 6f22f0a2b6c6416a85ccdfe4c51beed53117ef80 Mon Sep 17 00:00:00 2001 From: Mia Date: Sun, 3 Aug 2025 15:58:35 +0100 Subject: [PATCH] fix(parakeet): mute and list related clownery --- parakeet/src/xrpc/app_bsky/graph/lists.rs | 55 +++++++++++------------ parakeet/src/xrpc/app_bsky/graph/mutes.rs | 23 ++++++---- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/parakeet/src/xrpc/app_bsky/graph/lists.rs b/parakeet/src/xrpc/app_bsky/graph/lists.rs index 7bb0b9ae..6db7dafc 100644 --- a/parakeet/src/xrpc/app_bsky/graph/lists.rs +++ b/parakeet/src/xrpc/app_bsky/graph/lists.rs @@ -21,7 +21,7 @@ pub struct ListWithCursorQuery { } #[derive(Debug, Serialize)] -pub struct AppBskyGraphGetListsRes { +pub struct GetListsRes { #[serde(skip_serializing_if = "Option::is_none")] cursor: Option, lists: Vec, @@ -32,7 +32,7 @@ pub async fn get_lists( AtpAcceptLabelers(labelers): AtpAcceptLabelers, maybe_auth: Option, Query(query): Query, -) -> XrpcResult> { +) -> XrpcResult> { let mut conn = state.pool.get().await?; let hyd = StatefulHydrator::new(&state.dataloaders, &state.cdn, &labelers, maybe_auth); @@ -70,7 +70,7 @@ pub async fn get_lists( .filter_map(|(_, uri)| lists.remove(&uri)) .collect(); - Ok(Json(AppBskyGraphGetListsRes { cursor, lists })) + Ok(Json(GetListsRes { cursor, lists })) } #[derive(Debug, Serialize)] @@ -138,19 +138,12 @@ pub async fn get_list( })) } -#[derive(Debug, Serialize)] -pub struct GetListMutesRes { - #[serde(skip_serializing_if = "Option::is_none")] - cursor: Option, - lists: Vec, -} - pub async fn get_list_mutes( State(state): State, AtpAcceptLabelers(labelers): AtpAcceptLabelers, auth: AtpAuth, Query(query): Query, -) -> XrpcResult> { +) -> XrpcResult> { let mut conn = state.pool.get().await?; let did = auth.0.clone(); let hyd = StatefulHydrator::new(&state.dataloaders, &state.cdn, &labelers, Some(auth)); @@ -158,28 +151,30 @@ pub async fn get_list_mutes( let limit = query.limit.unwrap_or(50).clamp(1, 100); let mut mutes_query = schema::list_mutes::table - .select(schema::list_mutes::list_uri) + .select((schema::list_mutes::created_at, schema::list_mutes::list_uri)) .filter(schema::list_mutes::did.eq(did)) .into_boxed(); - if let Some(cursor) = query.cursor { - mutes_query = mutes_query.filter(schema::list_mutes::list_uri.lt(cursor)); + if let Some(cursor) = datetime_cursor(query.cursor.as_ref()) { + mutes_query = mutes_query.filter(schema::list_mutes::created_at.lt(cursor)); } - let mutes = mutes_query - .order(schema::list_mutes::list_uri.desc()) + let results = mutes_query + .order(schema::list_mutes::created_at.desc()) .limit(limit as i64) - .load(&mut conn) + .load::<(chrono::DateTime, String)>(&mut conn) .await?; - let lists = hyd.hydrate_lists(mutes).await; - let mutes = lists.into_values().collect::>(); - let cursor = mutes.last().map(|v| v.uri.clone()); + let cursor = results + .last() + .map(|(last, _)| last.timestamp_millis().to_string()); - Ok(Json(GetListMutesRes { - cursor, - lists: mutes, - })) + let uris = results.iter().map(|(_, uri)| uri.clone()).collect(); + + let lists = hyd.hydrate_lists(uris).await; + let lists = lists.into_values().collect::>(); + + Ok(Json(GetListsRes { cursor, lists })) } pub async fn get_list_blocks( @@ -187,7 +182,7 @@ pub async fn get_list_blocks( AtpAcceptLabelers(labelers): AtpAcceptLabelers, auth: AtpAuth, Query(query): Query, -) -> XrpcResult> { +) -> XrpcResult> { let mut conn = state.pool.get().await?; let did = auth.0.clone(); let hyd = StatefulHydrator::new(&state.dataloaders, &state.cdn, &labelers, Some(auth)); @@ -195,7 +190,10 @@ pub async fn get_list_blocks( let limit = query.limit.unwrap_or(50).clamp(1, 100); let mut blocks_query = schema::list_blocks::table - .select((schema::list_blocks::created_at, schema::list_blocks::list_uri)) + .select(( + schema::list_blocks::created_at, + schema::list_blocks::list_uri, + )) .filter(schema::list_blocks::did.eq(did)) .into_boxed(); @@ -218,8 +216,5 @@ pub async fn get_list_blocks( let lists = hyd.hydrate_lists(uris).await; let lists = lists.into_values().collect::>(); - Ok(Json(GetListMutesRes { - cursor, - lists, - })) + Ok(Json(GetListsRes { cursor, lists })) } diff --git a/parakeet/src/xrpc/app_bsky/graph/mutes.rs b/parakeet/src/xrpc/app_bsky/graph/mutes.rs index 693c2c2c..f0ef748e 100644 --- a/parakeet/src/xrpc/app_bsky/graph/mutes.rs +++ b/parakeet/src/xrpc/app_bsky/graph/mutes.rs @@ -1,7 +1,7 @@ use crate::hydration::StatefulHydrator; use crate::xrpc::error::XrpcResult; use crate::xrpc::extract::{AtpAcceptLabelers, AtpAuth}; -use crate::xrpc::CursorQuery; +use crate::xrpc::{datetime_cursor, CursorQuery}; use crate::GlobalState; use axum::extract::{Query, State}; use axum::Json; @@ -31,23 +31,28 @@ pub async fn get_mutes( let limit = query.limit.unwrap_or(50).clamp(1, 100); let mut muted_query = schema::mutes::table - .select(schema::mutes::subject) + .select((schema::mutes::created_at, schema::mutes::subject)) .filter(schema::mutes::did.eq(did)) .into_boxed(); - if let Some(cursor) = query.cursor { - muted_query = muted_query.filter(schema::mutes::subject.lt(cursor)); + if let Some(cursor) = datetime_cursor(query.cursor.as_ref()) { + muted_query = muted_query.filter(schema::mutes::created_at.lt(cursor)); } - let muted = muted_query - .order(schema::mutes::subject.desc()) + let results = muted_query + .order(schema::mutes::created_at.desc()) .limit(limit as i64) - .load(&mut conn) + .load::<(chrono::DateTime, String)>(&mut conn) .await?; - let profiles = hyd.hydrate_profiles(muted).await; + let cursor = results + .last() + .map(|(last, _)| last.timestamp_millis().to_string()); + + let dids = results.iter().map(|(_, did)| did.clone()).collect(); + + let profiles = hyd.hydrate_profiles(dids).await; let mutes = profiles.into_values().collect::>(); - let cursor = mutes.last().map(|v| v.did.clone()); Ok(Json(GetMutesRes { cursor, mutes })) } -- 2.51.2