diff --git a/orm/src/balances.rs b/orm/src/balances.rs index 0f5d2eb6..91ee539f 100644 --- a/orm/src/balances.rs +++ b/orm/src/balances.rs @@ -2,7 +2,10 @@ use std::str::FromStr; use bigdecimal::BigDecimal; use diesel::{Insertable, Queryable, Selectable}; -use shared::balance::Balance; +use shared::{ + balance::{Amount, Balance}, + id::Id, +}; use crate::schema::balances; @@ -27,3 +30,13 @@ impl BalancesInsertDb { } } } + +impl From for Balance { + fn from(balance: BalanceDb) -> Self { + Self { + owner: Id::from_account_str(&balance.owner), + token: Id::from_account_str(&balance.token), + amount: Amount::from(balance.raw_amount), + } + } +} diff --git a/shared/src/id.rs b/shared/src/id.rs index 7c6864b5..f7cce54c 100644 --- a/shared/src/id.rs +++ b/shared/src/id.rs @@ -82,3 +82,11 @@ impl From for Id { Id::Account(value.to_string()) } } + +impl Id { + pub fn from_account_str(address: &str) -> Self { + let account = + NamadaAddress::from_str(address).expect("Invalid address"); + Self::from(account) + } +} diff --git a/webserver/src/handler/balance.rs b/webserver/src/handler/balance.rs index e7e05f96..5addbf72 100644 --- a/webserver/src/handler/balance.rs +++ b/webserver/src/handler/balance.rs @@ -2,6 +2,7 @@ use axum::extract::{Path, State}; use axum::http::HeaderMap; use axum::Json; use axum_macros::debug_handler; +use shared::balance::DenominatedAmount; use crate::error::api::ApiError; use crate::response::balance::AddressBalance; @@ -15,5 +16,15 @@ pub async fn get_address_balance( ) -> Result>, ApiError> { let balances = state.balance_service.get_address_balances(address).await?; - Ok(Json(balances)) + let balances_response: Vec = balances + .iter() + .map(|balance| AddressBalance { + token_address: balance.token.to_string(), + // TODO: temporary solution as we only store NAM balances + balance: DenominatedAmount::native(balance.amount.clone()) + .to_string_precise(), + }) + .collect(); + + Ok(Json(balances_response)) } diff --git a/webserver/src/service/balance.rs b/webserver/src/service/balance.rs index 22a50d65..4046615c 100644 --- a/webserver/src/service/balance.rs +++ b/webserver/src/service/balance.rs @@ -1,9 +1,8 @@ -use shared::balance::{Amount, DenominatedAmount}; +use shared::balance::{Amount, Balance, DenominatedAmount}; use crate::appstate::AppState; use crate::error::balance::BalanceError; use crate::repository::balance::{BalanceRepo, BalanceRepoTrait}; -use crate::response::balance::AddressBalance; #[derive(Clone)] pub struct BalanceService { @@ -20,27 +19,16 @@ impl BalanceService { pub async fn get_address_balances( &self, address: String, - ) -> Result, BalanceError> { - let balances = self + ) -> Result, BalanceError> { + let balances_db = self .balance_repo .get_address_balances(address) .await .map_err(BalanceError::Database)?; - // TODO: temporary solution as we only store NAM balances - let denominated_balances: Vec = balances - .iter() - .cloned() - .map(|balance| AddressBalance { - token_address: balance.token, - // TODO: change native to new once we support multiple tokens - balance: DenominatedAmount::native(Amount::from( - balance.raw_amount, - )) - .to_string_precise(), - }) - .collect(); + let balances: Vec = + balances_db.iter().cloned().map(Balance::from).collect(); - Ok(denominated_balances) + Ok(balances) } }