diff --git a/native/native_rust_library/src/farcaster.rs b/native/native_rust_library/src/farcaster.rs --- a/native/native_rust_library/src/farcaster.rs +++ b/native/native_rust_library/src/farcaster.rs @@ -1,3 +1,22 @@ +use crate::{ + handle_string_result_as_callback, Error, CODE_VERSION, DEVICE_TYPE, + IDENTITY_SOCKET_ADDR, RUNTIME, +}; +use grpc_clients::identity::{ + get_unauthenticated_client, protos::unauth::GetFarcasterUsersRequest, +}; +use serde::Serialize; + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct FarcasterUser { + #[serde(rename = "userID")] + user_id: String, + username: String, + #[serde(rename = "farcasterID")] + farcaster_id: String, +} + pub fn farcaster_id_string_to_option(input: &str) -> Option { if input.is_empty() { None @@ -5,3 +24,40 @@ Some(input.to_string()) } } + +pub fn get_farcaster_users(farcaster_ids: Vec, promise_id: u32) { + RUNTIME.spawn(async move { + let result = get_farcaster_users_helper(farcaster_ids).await; + handle_string_result_as_callback(result, promise_id); + }); +} + +async fn get_farcaster_users_helper( + farcaster_ids: Vec, +) -> Result { + let get_farcaster_users_request = GetFarcasterUsersRequest { farcaster_ids }; + + let mut identity_client = get_unauthenticated_client( + IDENTITY_SOCKET_ADDR, + CODE_VERSION, + DEVICE_TYPE.as_str_name().to_lowercase(), + ) + .await?; + + let response = identity_client + .get_farcaster_users(get_farcaster_users_request) + .await? + .into_inner(); + + let mapped_response: Vec = response + .farcaster_users + .into_iter() + .map(|farcaster_user| FarcasterUser { + user_id: farcaster_user.user_id, + username: farcaster_user.username, + farcaster_id: farcaster_user.farcaster_id, + }) + .collect(); + + Ok(serde_json::to_string(&mapped_response)?) +} diff --git a/native/native_rust_library/src/lib.rs b/native/native_rust_library/src/lib.rs --- a/native/native_rust_library/src/lib.rs +++ b/native/native_rust_library/src/lib.rs @@ -4,7 +4,7 @@ use exact_user_search::{ find_user_id_for_username, find_user_id_for_wallet_address, }; -use farcaster::farcaster_id_string_to_option; +use farcaster::{farcaster_id_string_to_option, get_farcaster_users}; use ffi::{bool_callback, string_callback, void_callback}; use future_manager::ffi::*; use grpc_clients::identity::protos::auth::{ @@ -243,6 +243,10 @@ #[cxx_name = "identityFindUserIDForUsername"] fn find_user_id_for_username(username: String, promise_id: u32); + // Farcaster + #[cxx_name = "identityGetFarcasterUsers"] + fn get_farcaster_users(farcaster_ids: Vec, promise_id: u32); + // Argon2 #[cxx_name = "compute_backup_key"] fn compute_backup_key_str(