diff --git a/services/tunnelbroker/src/constants.rs b/services/tunnelbroker/src/constants.rs --- a/services/tunnelbroker/src/constants.rs +++ b/services/tunnelbroker/src/constants.rs @@ -61,6 +61,17 @@ pub const DEVICE_TOKEN_INDEX_NAME: &str = "deviceToken-index"; } + + //FIXME: This is a temporary solution to retrieve the Farcaster-related + // data without introducing dependency between services and will be + // fixed as part of ENG-11058. + pub mod users { + pub const TABLE_NAME: &str = "identity-users"; + pub const PARTITION_KEY: &str = "userID"; + pub const USERS_TABLE_FARCASTER_ID_ATTRIBUTE_NAME: &str = "farcasterID"; + pub const USERS_TABLE_FARCASTER_DCS_TOKEN_ATTRIBUTE_NAME: &str = + "farcasterDCsToken"; + } } // Log Error Types diff --git a/services/tunnelbroker/src/database/mod.rs b/services/tunnelbroker/src/database/mod.rs --- a/services/tunnelbroker/src/database/mod.rs +++ b/services/tunnelbroker/src/database/mod.rs @@ -13,7 +13,7 @@ use std::sync::Arc; use tracing::{debug, error, warn}; -use crate::constants::dynamodb::{device_tokens, undelivered_messages}; +use crate::constants::dynamodb::{device_tokens, undelivered_messages, users}; use crate::constants::error_types; pub mod message; @@ -326,4 +326,32 @@ })?; Ok(()) } + + pub async fn get_farcaster_token( + &self, + user_id: &str, + ) -> Result, Error> { + let get_response = self + .client + .get_item() + .table_name(users::TABLE_NAME) + .key(users::PARTITION_KEY, AttributeValue::S(user_id.into())) + .send() + .await + .map_err(|e| { + error!( + errorType = error_types::DDB_ERROR, + "DynamoDB client failed to get device farcaster token {:?}", e + ); + Error::AwsSdk(e.into()) + })?; + + let Some(mut item) = get_response.item else { + return Ok(None); + }; + + let device_token: String = + item.take_attr(users::USERS_TABLE_FARCASTER_DCS_TOKEN_ATTRIBUTE_NAME)?; + Ok(Some(device_token)) + } }