From a6f749acd4f69d6f2d1d76e1fce6c7db8b87955f Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Wed, 21 Apr 2021 16:42:15 +0200 Subject: [PATCH] [ref] gva: move query endpoints in network --- .../modules/gva/dbs-reader/src/endpoints.rs | 120 ------------------ rust-libs/modules/gva/dbs-reader/src/lib.rs | 1 - .../modules/gva/dbs-reader/src/network.rs | 97 +++++++++++++- rust-libs/modules/gva/gql/src/queries.rs | 2 - .../modules/gva/gql/src/queries/endpoints.rs | 80 ------------ .../modules/gva/gql/src/queries/network.rs | 47 +++++++ 6 files changed, 142 insertions(+), 205 deletions(-) delete mode 100644 rust-libs/modules/gva/dbs-reader/src/endpoints.rs delete mode 100644 rust-libs/modules/gva/gql/src/queries/endpoints.rs diff --git a/rust-libs/modules/gva/dbs-reader/src/endpoints.rs b/rust-libs/modules/gva/dbs-reader/src/endpoints.rs deleted file mode 100644 index 47eae2d47..000000000 --- a/rust-libs/modules/gva/dbs-reader/src/endpoints.rs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (C) 2020 Éloïs SANCHEZ. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see <https://www.gnu.org/licenses/>. - -use crate::*; -use duniter_dbs::databases::dunp_v1::DunpV1DbReadable; - -#[cfg(test)] -mod tests { - use super::*; - use duniter_dbs::databases::dunp_v1::DunpV1DbWritable; - use duniter_dbs::PeerCardDbV1; - - #[test] - fn test_empty_endpoints() -> KvResult<()> { - // Populate DB - let dunp_db = duniter_dbs::databases::dunp_v1::DunpV1Db::<Mem>::open(MemConf::default())?; - let db_reader = DbsReaderImpl::mem(); - let pk = PublicKey::default(); - - dunp_db - .peers_old_write() - .upsert(PubKeyKeyV2(pk), PeerCardDbV1::default())?; - - // Request Data - let api_list = vec!["GVA".to_owned()]; - assert_eq!( - db_reader.endpoints_(&dunp_db, api_list)?, - Vec::<String>::new() - ); - - Ok(()) - } - #[test] - fn test_endpoints_with_empty_api_list() -> KvResult<()> { - let dummy_endpoint = "GVA S domain.tld 443 gva"; - - // Populate DB - let dunp_db = duniter_dbs::databases::dunp_v1::DunpV1Db::<Mem>::open(MemConf::default())?; - let db_reader = DbsReaderImpl::mem(); - let pk = PublicKey::default(); - let peer = PeerCardDbV1 { - endpoints: vec![dummy_endpoint.to_owned()], - ..Default::default() - }; - - dunp_db.peers_old_write().upsert(PubKeyKeyV2(pk), peer)?; - - // Request Data - let api_list = vec![]; - assert_eq!( - db_reader.endpoints_(&dunp_db, api_list)?, - Vec::<String>::new() - ); - - Ok(()) - } - #[test] - fn test_single_peer_endpoints() -> KvResult<()> { - let dummy_endpoint = "GVA S domain.tld 443 gva"; - - // Populate DB - let dunp_db = duniter_dbs::databases::dunp_v1::DunpV1Db::<Mem>::open(MemConf::default())?; - let db_reader = DbsReaderImpl::mem(); - let pk = PublicKey::default(); - let peer = PeerCardDbV1 { - endpoints: vec![dummy_endpoint.to_owned()], - ..Default::default() - }; - - dunp_db.peers_old_write().upsert(PubKeyKeyV2(pk), peer)?; - - // Request Data - let api_list = vec!["GVA".to_owned()]; - assert_eq!( - db_reader.endpoints_(&dunp_db, api_list)?, - vec![dummy_endpoint.to_owned()] - ); - - Ok(()) - } -} - -impl DbsReaderImpl { - pub(super) fn endpoints_<DB: DunpV1DbReadable>( - &self, - network_db: &DB, - mut api_list: Vec<String>, - ) -> KvResult<Vec<String>> { - if api_list.is_empty() { - return Ok(vec![]); - } - for api in &mut api_list { - api.push(' '); - } - network_db.peers_old().iter(.., |it| { - it.values() - .map_ok(|peer| { - peer.endpoints.into_iter().filter(|endpoint| { - api_list - .iter() - .any(|api| endpoint.starts_with(api.as_str())) - }) - }) - .flatten_ok() - .collect::<Result<Vec<String>, _>>() - }) - } -} diff --git a/rust-libs/modules/gva/dbs-reader/src/lib.rs b/rust-libs/modules/gva/dbs-reader/src/lib.rs index 8e15fea48..f297f8d09 100644 --- a/rust-libs/modules/gva/dbs-reader/src/lib.rs +++ b/rust-libs/modules/gva/dbs-reader/src/lib.rs @@ -24,7 +24,6 @@ pub mod block; pub mod current_frame; -pub mod endpoints; pub mod find_inputs; pub mod idty; pub mod network; diff --git a/rust-libs/modules/gva/dbs-reader/src/network.rs b/rust-libs/modules/gva/dbs-reader/src/network.rs index 05f3b7c33..b540e505f 100644 --- a/rust-libs/modules/gva/dbs-reader/src/network.rs +++ b/rust-libs/modules/gva/dbs-reader/src/network.rs @@ -15,11 +15,34 @@ use crate::*; use dubp::crypto::keys::PublicKey as _; -use duniter_dbs::databases::dunp_v1::DunpV1DbReadable; -use duniter_dbs::{DunpHeadDbV1, PeerCardDbV1}; +use duniter_dbs::{databases::dunp_v1::DunpV1DbReadable, DunpHeadDbV1, PeerCardDbV1}; #[allow(clippy::unnecessary_wraps)] impl DbsReaderImpl { + pub(super) fn endpoints_<DB: DunpV1DbReadable>( + &self, + network_db: &DB, + mut api_list: Vec<String>, + ) -> KvResult<Vec<String>> { + if api_list.is_empty() { + return Ok(vec![]); + } + for api in &mut api_list { + api.push(' '); + } + network_db.peers_old().iter(.., |it| { + it.values() + .map_ok(|peer| { + peer.endpoints.into_iter().filter(|endpoint| { + api_list + .iter() + .any(|api| endpoint.starts_with(api.as_str())) + }) + }) + .flatten_ok() + .collect::<Result<Vec<String>, _>>() + }) + } pub(super) fn peers_and_heads_<DB: DunpV1DbReadable>( &self, dunp_db: &DB, @@ -53,6 +76,76 @@ impl DbsReaderImpl { mod tests { use super::*; use duniter_dbs::databases::dunp_v1::DunpV1DbWritable; + use duniter_dbs::PeerCardDbV1; + + #[test] + fn test_empty_endpoints() -> KvResult<()> { + // Populate DB + let dunp_db = duniter_dbs::databases::dunp_v1::DunpV1Db::<Mem>::open(MemConf::default())?; + let db_reader = DbsReaderImpl::mem(); + let pk = PublicKey::default(); + + dunp_db + .peers_old_write() + .upsert(PubKeyKeyV2(pk), PeerCardDbV1::default())?; + + // Request Data + let api_list = vec!["GVA".to_owned()]; + assert_eq!( + db_reader.endpoints_(&dunp_db, api_list)?, + Vec::<String>::new() + ); + + Ok(()) + } + #[test] + fn test_endpoints_with_empty_api_list() -> KvResult<()> { + let dummy_endpoint = "GVA S domain.tld 443 gva"; + + // Populate DB + let dunp_db = duniter_dbs::databases::dunp_v1::DunpV1Db::<Mem>::open(MemConf::default())?; + let db_reader = DbsReaderImpl::mem(); + let pk = PublicKey::default(); + let peer = PeerCardDbV1 { + endpoints: vec![dummy_endpoint.to_owned()], + ..Default::default() + }; + + dunp_db.peers_old_write().upsert(PubKeyKeyV2(pk), peer)?; + + // Request Data + let api_list = vec![]; + assert_eq!( + db_reader.endpoints_(&dunp_db, api_list)?, + Vec::<String>::new() + ); + + Ok(()) + } + #[test] + fn test_single_peer_endpoints() -> KvResult<()> { + let dummy_endpoint = "GVA S domain.tld 443 gva"; + + // Populate DB + let dunp_db = duniter_dbs::databases::dunp_v1::DunpV1Db::<Mem>::open(MemConf::default())?; + let db_reader = DbsReaderImpl::mem(); + let pk = PublicKey::default(); + let peer = PeerCardDbV1 { + endpoints: vec![dummy_endpoint.to_owned()], + ..Default::default() + }; + + dunp_db.peers_old_write().upsert(PubKeyKeyV2(pk), peer)?; + + // Request Data + let api_list = vec!["GVA".to_owned()]; + assert_eq!( + db_reader.endpoints_(&dunp_db, api_list)?, + vec![dummy_endpoint.to_owned()] + ); + + Ok(()) + } #[test] fn test_peers_and_heads() -> KvResult<()> { diff --git a/rust-libs/modules/gva/gql/src/queries.rs b/rust-libs/modules/gva/gql/src/queries.rs index a23e8ad7c..7357f4937 100644 --- a/rust-libs/modules/gva/gql/src/queries.rs +++ b/rust-libs/modules/gva/gql/src/queries.rs @@ -17,7 +17,6 @@ pub mod account_balance; pub mod block; pub mod current_block; pub mod current_frame; -pub mod endpoints; pub mod first_utxos_of_scripts; pub mod gen_tx; pub mod idty; @@ -35,7 +34,6 @@ pub struct QueryRoot( queries::block::BlockQuery, queries::current_block::CurrentBlockQuery, queries::current_frame::CurrentFrameQuery, - queries::endpoints::EndpointsQuery, queries::first_utxos_of_scripts::FirstUtxosQuery, queries::gen_tx::GenTxsQuery, queries::idty::IdtyQuery, diff --git a/rust-libs/modules/gva/gql/src/queries/endpoints.rs b/rust-libs/modules/gva/gql/src/queries/endpoints.rs deleted file mode 100644 index 38dd6595a..000000000 --- a/rust-libs/modules/gva/gql/src/queries/endpoints.rs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (C) 2020 Éloïs SANCHEZ. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see <https://www.gnu.org/licenses/>. - -use crate::*; - -// e2e requester pour obtenir la fiche de peer et un tableau de heads pour une pubKey donnée - -// e2e requester pour obtenir la list des endpoints connu filtrable par type (gva, bma, ws2p, es?data-pod) -// ? e2e list endpoints type -// ? renomer dunp_v1 en network_v1 & DunpV1Db & co - -#[cfg(test)] -mod tests { - use super::*; - use crate::tests::*; - use duniter_dbs::databases::dunp_v1::DunpV1Db; - - #[tokio::test] - async fn endpoints_gva_resolver() -> anyhow::Result<()> { - let mock_cm = MockAsyncAccessor::new(); - let mut mock_dbs_reader = MockDbsReader::new(); - mock_dbs_reader - .expect_endpoints::<DunpV1Db<FileBackend>>() - .times(1) - .returning(|_, _| { - Ok(vec![ - "GVA S g1.librelois.fr 443 gva".to_owned(), - "GVA S domain.tld 443 gva".to_owned(), - ]) - }); - let schema = create_schema(mock_cm, mock_dbs_reader)?; - assert_eq!( - exec_graphql_request(&schema, r#"{ endpoints(apiList:["GVA"]) }"#).await?, - serde_json::json!({ - "data": { - "endpoints": [ - "GVA S g1.librelois.fr 443 gva", - "GVA S domain.tld 443 gva" - ] - } - }) - ); - Ok(()) - } -} - -#[derive(Default)] -pub(crate) struct EndpointsQuery; -#[async_graphql::Object] -impl EndpointsQuery { - /// Get endpoints known by the node - async fn endpoints( - &self, - ctx: &async_graphql::Context<'_>, - #[graphql( - desc = "filter endpoints by api (exact match endpoint first word, case sensitive)" - )] - api_list: Vec<String>, - ) -> async_graphql::Result<Vec<String>> { - let data = ctx.data::<GvaSchemaData>()?; - let dbs_reader = data.dbs_reader(); - - Ok(data - .dbs_pool - .execute(move |dbs| dbs_reader.endpoints(&dbs.dunp_db, api_list)) - .await??) - } -} diff --git a/rust-libs/modules/gva/gql/src/queries/network.rs b/rust-libs/modules/gva/gql/src/queries/network.rs index 39d104aab..25cb150d0 100644 --- a/rust-libs/modules/gva/gql/src/queries/network.rs +++ b/rust-libs/modules/gva/gql/src/queries/network.rs @@ -25,6 +25,23 @@ pub(crate) struct NetworkQueryInner; #[async_graphql::Object] impl NetworkQueryInner { + /// Get endpoints known by the node + async fn endpoints( + &self, + ctx: &async_graphql::Context<'_>, + #[graphql( + desc = "filter endpoints by api (exact match endpoint first word, case sensitive)" + )] + api_list: Vec<String>, + ) -> async_graphql::Result<Vec<String>> { + let data = ctx.data::<GvaSchemaData>()?; + let dbs_reader = data.dbs_reader(); + + Ok(data + .dbs_pool + .execute(move |dbs| dbs_reader.endpoints(&dbs.dunp_db, api_list)) + .await??) + } /// Get peers and heads async fn nodes( &self, @@ -54,6 +71,36 @@ mod tests { use duniter_dbs::databases::dunp_v1::DunpV1Db; use pretty_assertions::assert_eq; + #[tokio::test] + async fn test_endpoints() -> anyhow::Result<()> { + let mock_cm = MockAsyncAccessor::new(); + let mut mock_dbs_reader = MockDbsReader::new(); + mock_dbs_reader + .expect_endpoints::<DunpV1Db<FileBackend>>() + .times(1) + .returning(|_, _| { + Ok(vec![ + "GVA S g1.librelois.fr 443 gva".to_owned(), + "GVA S domain.tld 443 gva".to_owned(), + ]) + }); + let schema = create_schema(mock_cm, mock_dbs_reader)?; + assert_eq!( + exec_graphql_request(&schema, r#"{ network { endpoints(apiList:["GVA"]) } }"#).await?, + serde_json::json!({ + "data": { + "network": { + "endpoints": [ + "GVA S g1.librelois.fr 443 gva", + "GVA S domain.tld 443 gva" + ] + } + } + }) + ); + Ok(()) + } + #[tokio::test] async fn test_peers_and_heads() -> anyhow::Result<()> { let mut dbs_reader = MockDbsReader::new(); -- GitLab