diff --git a/rust-libs/modules/gva/dbs-reader/src/current_frame.rs b/rust-libs/modules/gva/dbs-reader/src/current_frame.rs index 70106c0dbc5af31a25bbc015fe26fd540c659793..79b739478cf7853ce31682c23ea8b5cedd3d33f8 100644 --- a/rust-libs/modules/gva/dbs-reader/src/current_frame.rs +++ b/rust-libs/modules/gva/dbs-reader/src/current_frame.rs @@ -23,9 +23,9 @@ impl DbsReader { bc_db: &BcDb, cm_db: &CmDb, ) -> anyhow::Result<Vec<BlockMetaV2>> { - if let Some(current_block) = self.get_current_block(cm_db)? { - let issuers_frame = current_block.issuers_frame; - let start = U32BE(current_block.number + 1 - issuers_frame as u32); + if let Some(current_block_meta) = self.get_current_block_meta(cm_db)? { + let issuers_frame = current_block_meta.issuers_frame; + let start = U32BE(current_block_meta.number + 1 - issuers_frame as u32); bc_db .blocks_meta() .iter_rev(start.., |it| it.values().collect::<KvResult<_>>()) diff --git a/rust-libs/modules/gva/dbs-reader/src/lib.rs b/rust-libs/modules/gva/dbs-reader/src/lib.rs index af3f9b5bc4771716429c9876008c76612e7e2731..10d743aff99ac06a386a29aed32ed05c871dd29d 100644 --- a/rust-libs/modules/gva/dbs-reader/src/lib.rs +++ b/rust-libs/modules/gva/dbs-reader/src/lib.rs @@ -32,9 +32,9 @@ pub mod utxos; pub use crate::pagination::{PageInfo, PagedData}; use crate::pagination::{has_next_page, has_previous_page}; -use dubp::common::crypto::hashs::Hash; use dubp::common::crypto::keys::ed25519::PublicKey; use dubp::documents::transaction::TransactionDocumentV10; +use dubp::{block::DubpBlockV10, common::crypto::hashs::Hash}; use dubp::{common::prelude::BlockNumber, wallet::prelude::*}; use duniter_dbs::FileBackend; use duniter_dbs::{ @@ -82,6 +82,13 @@ impl DbsReader { pub fn get_current_block<CmDb: CmV1DbReadable>( &self, cm_db: &CmDb, + ) -> KvResult<Option<DubpBlockV10>> { + Ok(cm_db.current_block().get(&())?.map(|db_block| db_block.0)) + } + + pub fn get_current_block_meta<CmDb: CmV1DbReadable>( + &self, + cm_db: &CmDb, ) -> KvResult<Option<BlockMetaV2>> { cm_db.current_block_meta().get(&()) } diff --git a/rust-libs/modules/gva/gql/src/entities/block_gva.rs b/rust-libs/modules/gva/gql/src/entities/block_gva.rs index 414471e20a2a763ed0c6d2bfc90ffcb042e50b6a..c5be43c5dba1620fbd40eaaf860d6dbc742b5988 100644 --- a/rust-libs/modules/gva/gql/src/entities/block_gva.rs +++ b/rust-libs/modules/gva/gql/src/entities/block_gva.rs @@ -89,6 +89,20 @@ pub(crate) struct Block { pub unit_base: u32, pub dividend: Option<u32>, // Payload + /// Identities + pub identities: Vec<String>, + /// joiners + pub joiners: Vec<String>, + /// Actives (=renewals) + pub actives: Vec<String>, + /// Leavers + pub leavers: Vec<String>, + /// Revokeds + pub revoked: Vec<String>, + /// Excludeds + pub excluded: Vec<String>, + /// Certifications + pub certifications: Vec<String>, pub transactions: Vec<TxGva>, } @@ -96,6 +110,7 @@ impl From<&DubpBlockV10> for Block { fn from(block: &DubpBlockV10) -> Self { let block = block.to_string_object(); Block { + // Meta version: block.version, number: block.number as u32, hash: block.hash.unwrap_or_default(), @@ -113,7 +128,49 @@ impl From<&DubpBlockV10> for Block { monetary_mass: block.monetary_mass, unit_base: block.unit_base as u32, dividend: block.dividend.map(|amount| amount as u32), + // Payload + identities: block.identities, + joiners: block.joiners, + actives: block.actives, + leavers: block.leavers, + revoked: block.revoked, + excluded: block.excluded, + certifications: block.certifications, transactions: block.transactions.into_iter().map(Into::into).collect(), } } } + +impl From<&BlockMetaV2> for Block { + fn from(block: &BlockMetaV2) -> Self { + Block { + // Meta + version: block.version, + number: block.number, + hash: block.hash.to_string(), + signature: block.signature.to_string(), + inner_hash: block.inner_hash.to_string(), + previous_hash: Some(block.previous_hash.to_string()), + issuer: block.issuer.to_string(), + time: block.time, + pow_min: block.pow_min, + members_count: block.members_count, + issuers_count: block.issuers_count, + issuers_frame: block.issuers_frame, + median_time: block.median_time, + nonce: block.nonce, + monetary_mass: block.monetary_mass, + unit_base: block.unit_base, + dividend: block.dividend.map(|sa| sa.amount() as u32), + // Payload + identities: vec![], + joiners: vec![], + actives: vec![], + leavers: vec![], + revoked: vec![], + excluded: vec![], + certifications: vec![], + transactions: vec![], + } + } +} diff --git a/rust-libs/modules/gva/gql/src/lib.rs b/rust-libs/modules/gva/gql/src/lib.rs index 7822db758dd251b7fbeda56de770e943517dcfcf..b405760862033ef7a4a7ecf200eafd503d330fae 100644 --- a/rust-libs/modules/gva/gql/src/lib.rs +++ b/rust-libs/modules/gva/gql/src/lib.rs @@ -75,7 +75,7 @@ pub struct ServerMetaData { #[cfg(test)] mod tests { use super::*; - use dubp::documents::transaction::TransactionInputV10; + use dubp::{block::DubpBlockV10, documents::transaction::TransactionInputV10}; use duniter_dbs::{ databases::{bc_v2::*, cm_v1::CmV1DbReadable}, BlockMetaV2, SourceAmountValV2, @@ -118,6 +118,10 @@ mod tests { fn get_current_block<CmDb: 'static + CmV1DbReadable>( &self, cm_db: &CmDb, + ) -> KvResult<Option<DubpBlockV10>>; + fn get_current_block_meta<CmDb: 'static + CmV1DbReadable>( + &self, + cm_db: &CmDb, ) -> KvResult<Option<BlockMetaV2>>; fn get_current_frame<BcDb: 'static + BcV2DbReadable, CmDb: 'static + CmV1DbReadable>( &self, diff --git a/rust-libs/modules/gva/gql/src/queries/current_block.rs b/rust-libs/modules/gva/gql/src/queries/current_block.rs index 4151a817df8e0dd18fe010ae14b1cac169e4771f..a6d9ff13ba86ce57e1526895ea866f480f8c5ec0 100644 --- a/rust-libs/modules/gva/gql/src/queries/current_block.rs +++ b/rust-libs/modules/gva/gql/src/queries/current_block.rs @@ -23,20 +23,19 @@ impl CurrentBlockQuery { async fn current_block( &self, ctx: &async_graphql::Context<'_>, - ) -> async_graphql::Result<BlockMeta> { + ) -> async_graphql::Result<Block> { let data = ctx.data::<GvaSchemaData>()?; let dbs_reader = data.dbs_reader(); - if let Some(current_block_meta) = data - .dbs_pool - .execute(move |dbs| dbs_reader.get_current_block(&dbs.cm_db)) - .await?? - .map(Into::into) - { - Ok(current_block_meta) - } else { - Err(async_graphql::Error::new("no blockchain")) - } + data.dbs_pool + .execute(move |dbs| { + if let Some(current_block) = dbs_reader.get_current_block(&dbs.cm_db)? { + Ok(Block::from(¤t_block)) + } else { + Err(async_graphql::Error::new("no blockchain")) + } + }) + .await? } } @@ -44,20 +43,16 @@ impl CurrentBlockQuery { mod tests { use super::*; use crate::tests::*; + use dubp::block::DubpBlockV10; use duniter_dbs::databases::cm_v1::CmV1Db; - use duniter_dbs::BlockMetaV2; #[tokio::test] - async fn query_current_frame() -> anyhow::Result<()> { + async fn query_current_block() -> anyhow::Result<()> { let mut dbs_reader = MockDbsReader::new(); dbs_reader .expect_get_current_block::<CmV1Db<MemSingleton>>() .times(1) - .returning(|_| { - Ok(Some(BlockMetaV2 { - ..Default::default() - })) - }); + .returning(|_| Ok(Some(DubpBlockV10::default()))); let schema = create_schema(dbs_reader)?; assert_eq!( exec_graphql_request(&schema, r#"{ currentBlock {nonce} }"#).await?,