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,9 +1,11 @@ use crate::{ - handle_string_result_as_callback, Error, CODE_VERSION, DEVICE_TYPE, - IDENTITY_SOCKET_ADDR, RUNTIME, + handle_string_result_as_callback, handle_void_result_as_callback, Error, + CODE_VERSION, DEVICE_TYPE, IDENTITY_SOCKET_ADDR, RUNTIME, }; use grpc_clients::identity::{ - get_unauthenticated_client, protos::unauth::GetFarcasterUsersRequest, + get_auth_client, get_unauthenticated_client, + protos::auth::LinkFarcasterAccountRequest, + protos::unauth::GetFarcasterUsersRequest, }; use serde::Serialize; @@ -61,3 +63,48 @@ Ok(serde_json::to_string(&mapped_response)?) } + +pub fn link_farcaster_account( + user_id: String, + device_id: String, + access_token: String, + farcaster_id: String, + promise_id: u32, +) { + RUNTIME.spawn(async move { + let result = link_farcaster_account_helper( + user_id, + device_id, + access_token, + farcaster_id, + ) + .await; + handle_void_result_as_callback(result, promise_id); + }); +} + +async fn link_farcaster_account_helper( + user_id: String, + device_id: String, + access_token: String, + farcaster_id: String, +) -> Result<(), Error> { + let mut identity_client = get_auth_client( + IDENTITY_SOCKET_ADDR, + user_id, + device_id, + access_token, + CODE_VERSION, + DEVICE_TYPE.as_str_name().to_lowercase(), + ) + .await?; + + let link_farcaster_account_request = + LinkFarcasterAccountRequest { farcaster_id }; + + identity_client + .link_farcaster_account(link_farcaster_account_request) + .await?; + + Ok(()) +} 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,9 @@ use exact_user_search::{ find_user_id_for_username, find_user_id_for_wallet_address, }; -use farcaster::{farcaster_id_string_to_option, get_farcaster_users}; +use farcaster::{ + farcaster_id_string_to_option, get_farcaster_users, link_farcaster_account, +}; use ffi::{bool_callback, string_callback, void_callback}; use future_manager::ffi::*; use grpc_clients::identity::protos::auth::{ @@ -247,6 +249,15 @@ #[cxx_name = "identityGetFarcasterUsers"] fn get_farcaster_users(farcaster_ids: Vec, promise_id: u32); + #[cxx_name = "identityLinkFarcasterAccount"] + fn link_farcaster_account( + user_id: String, + device_id: String, + access_token: String, + farcaster_id: String, + promise_id: u32, + ); + // Argon2 #[cxx_name = "compute_backup_key"] fn compute_backup_key_str(