fix(appview): empty profile instead of 404 for unindexed handles

resolve_profile returned 404 when the requested handle had no
posts in the local index — true for every local-PDS account
that hasn't yet had its posts ingested through the Jetstream
consumer. The UI then surfaced this as a raw 'err: appview:
profile returned 404' toast instead of an empty profile.

Return a profile row with the requested handle and zero counts
instead. The DID is left empty; the UI's 'copy did' button just
copies an empty string and the header falls back to the handle,
which is the right behaviour for a never-indexed local user.
This commit is contained in:
tomdebone
2026-07-07 20:54:21 +02:00
parent 647c3059b4
commit d1fff87e34
+18 -7
View File
@@ -355,13 +355,24 @@ async fn resolve_profile(
}; };
let Some(target_did) = target_did else { let Some(target_did) = target_did else {
return Err(( // No posts indexed for this handle yet — typical for
StatusCode::NOT_FOUND, // local-PDS users whose posts haven't been ingested into
Json(json!({ // the Jetstream yet (and the AppView indexes only ingested
"error": "NotFound", // posts, never queries upstream PDSs for handle→DID
"message": "no DID or handle provided, or no posts for that handle", // resolution). Instead of bubbling a 404 to the UI which
})), // then shows an error toast instead of an empty profile,
)); // synthesise a profile row with the requested handle and
// zero counts. The `did` is left empty; the UI's
// `displayHandle()` falls back to the handle and the
// "copy did" button just copies an empty string.
let display = handle_clean.unwrap_or_default();
return Ok(Json(ProfileResponse {
did: String::new(),
handle: display,
posts: Vec::new(),
followers: 0,
following: 0,
}));
}; };
// Fetch the user's most recent posts (newest first). We return up to // Fetch the user's most recent posts (newest first). We return up to