ceres: a small planet in a giant solar system
33
fork

Configure Feed

Select the types of activity you want to include in your feed.

simple proof of concept

+36 -3
+36 -3
src/handlers/xrpc/app_bsky_actor.rs
··· 2 2 use crate::state::AppState; 3 3 use axum::{ 4 4 Json, Router, 5 + extract::State, 5 6 response::{IntoResponse, Response}, 6 7 }; 7 - use jacquard::types::{datetime::Datetime, did::Did, handle::Handle, uri::UriValue}; 8 + use jacquard::{ 9 + prelude::IdentityResolver, 10 + types::{datetime::Datetime, did::Did, handle::Handle, uri::UriValue}, 11 + }; 8 12 use jacquard_api::app_bsky::actor::{ 9 13 ProfileViewDetailed, 10 14 get_profile::{GetProfileOutput, GetProfileRequest}, ··· 13 17 use log::info; 14 18 15 19 pub async fn get_profile( 20 + State(state): State<AppState>, 16 21 ExtractOptionalServiceAuth(auth): ExtractOptionalServiceAuth, 17 22 ExtractXrpc(req): ExtractXrpc<GetProfileRequest>, 18 23 ) -> Result<Response, XrpcErrorResponse> { 19 24 info!("get_profile actor={}", req.actor.as_ref()); 25 + let did = match req.actor { 26 + jacquard::types::ident::AtIdentifier::Did(did) => did, 27 + jacquard::types::ident::AtIdentifier::Handle(handle) => state 28 + .resolver 29 + .resolve_handle(&handle) 30 + .await 31 + .map_err(|err| { 32 + log::error!("Error resolving the handle to a did for: {handle}"); 33 + log::error!("{err}"); 34 + XrpcErrorResponse::internal_server_error() 35 + })?, 36 + }; 37 + let requested_did_doc = state.resolver.resolve_did_doc(&did).await.map_err(|err| { 38 + log::error!("{err}"); 39 + XrpcErrorResponse::internal_server_error() 40 + })?; 41 + 42 + let did_doc = requested_did_doc.parse().map_err(|err| { 43 + log::error!("{err}"); 44 + XrpcErrorResponse::internal_server_error() 45 + })?; 46 + 47 + let handle = did_doc.handles().get(0) 48 + .cloned() 49 + .ok_or_else(|| { 50 + log::error!("No handle found in DID document"); 51 + XrpcErrorResponse::internal_server_error() 52 + })?; 53 + 20 54 info!("{:?}", auth); 21 55 let profile = GetProfileOutput { 22 56 value: ProfileViewDetailed { ··· 43 77 display_name: Some("Example User".into()), 44 78 followers_count: Some(1234), 45 79 follows_count: Some(56), 46 - handle: Handle::new_static("example.bsky.social") 47 - .map_err(|_| XrpcErrorResponse::internal_server_error())?, 80 + handle: handle, 48 81 indexed_at: Some(Datetime::now()), 49 82 joined_via_starter_pack: None, 50 83 labels: None,