use crate::dao::generated::token_accounts;
use sea_orm::{DatabaseConnection, EntityTrait, QueryFilter, QuerySelect};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use super::super::error::PhotonApiError;
use super::utils::{parse_decimal, AccountDataTable};
use super::utils::{BalanceModel, CompressedAccountRequest, Context};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct TokenAccountBalance {
pub amount: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
pub struct GetCompressedTokenAccountBalanceResponse {
pub context: Context,
pub value: TokenAccountBalance,
}
pub async fn get_compressed_token_account_balance(
conn: &DatabaseConnection,
request: CompressedAccountRequest,
) -> Result<GetCompressedTokenAccountBalanceResponse, PhotonApiError> {
let context = Context::extract(conn).await?;
let id = request.parse_id()?;
let balance = token_accounts::Entity::find()
.select_only()
.column(token_accounts::Column::Amount)
.filter(id.filter(AccountDataTable::TokenAccounts))
.into_model::<BalanceModel>()
.one(conn)
.await?
.ok_or(id.not_found_error())?;
Ok(GetCompressedTokenAccountBalanceResponse {
value: TokenAccountBalance {
amount: parse_decimal(balance.amount)?,
},
context,
})
}