Skip to content
Snippets Groups Projects
Commit a6392f11 authored by Éloïs's avatar Éloïs
Browse files

[ref] gva: separate resolvers and schema in the gql sub-crate

parent 97ea85ce
No related branches found
No related tags found
No related merge requests found
Showing
with 253 additions and 16 deletions
......@@ -1146,6 +1146,7 @@ dependencies = [
"duniter-dbs-read-ops",
"duniter-gva-db-writer",
"duniter-gva-dbs-reader",
"duniter-gva-gql",
"duniter-mempools",
"duniter-module",
"fast-threadpool",
......@@ -1189,6 +1190,33 @@ dependencies = [
"unwrap",
]
[[package]]
name = "duniter-gva-gql"
version = "0.1.0"
dependencies = [
"anyhow",
"arrayvec",
"async-graphql",
"async-trait",
"dubp",
"duniter-conf",
"duniter-dbs",
"duniter-dbs-read-ops",
"duniter-gva-dbs-reader",
"duniter-mempools",
"duniter-module",
"fast-threadpool",
"flume",
"futures",
"log",
"mockall",
"resiter",
"serde",
"serde_json",
"tokio",
"unwrap",
]
[[package]]
name = "duniter-integration-tests"
version = "0.1.0"
......
......@@ -44,6 +44,7 @@ members = [
"rust-libs/modules/gva",
"rust-libs/modules/gva/dbs-reader",
"rust-libs/modules/gva/db-writer",
"rust-libs/modules/gva/gql",
"rust-libs/tests/duniter-integration-tests",
"rust-libs/tools/kv_typed"
]
......
......@@ -17,6 +17,7 @@ duniter-dbs = { path = "../../duniter-dbs" }
duniter-dbs-read-ops = { path = "../../duniter-dbs-read-ops" }
duniter-gva-dbs-reader = { path = "./dbs-reader" }
duniter-gva-db-writer = { path = "./db-writer" }
duniter-gva-gql = { path = "./gql" }
duniter-mempools = { path = "../../duniter-mempools" }
duniter-module = { path = "../../duniter-module" }
fast-threadpool = "0.2.2"
......
[package]
name = "duniter-gva-gql"
version = "0.1.0"
authors = ["librelois <elois@duniter.org>"]
license = "AGPL-3.0"
edition = "2018"
[dependencies]
anyhow = "1.0.33"
arrayvec = "0.5.1"
async-graphql = "2.2.0"
async-trait = "0.1.41"
dubp = { version = "0.34.0" }
duniter-conf = { path = "../../../duniter-conf" }
duniter-dbs = { path = "../../../duniter-dbs" }
duniter-dbs-read-ops = { path = "../../../duniter-dbs-read-ops" }
duniter-gva-dbs-reader = { path = "../dbs-reader" }
duniter-mempools = { path = "../../../duniter-mempools" }
duniter-module = { path = "../../../duniter-module" }
fast-threadpool = "0.2.2"
flume = "0.9.1"
futures = "0.3.6"
log = "0.4.11"
resiter = "0.4.0"
serde = { version = "1.0.105", features = ["derive"] }
[dev-dependencies]
duniter-dbs = { path = "../../../duniter-dbs", features = ["mem"] }
mockall = "0.8.0"
serde_json = "1.0.53"
tokio = { version = "0.2.22", features = ["macros", "rt-threaded", "time"] }
unwrap = "1.2.1"
// 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/>.
#![deny(
clippy::unwrap_used,
missing_copy_implementations,
trivial_casts,
trivial_numeric_casts,
unstable_features,
unused_import_braces
)]
mod entities;
mod inputs;
mod inputs_validators;
mod mutations;
mod pagination;
mod queries;
mod schema;
mod subscriptions;
pub use schema::{build_schema, build_schema_with_data, GvaSchema, GvaSchemaData};
use crate::entities::{
block_gva::Block,
tx_gva::TxGva,
ud_gva::{CurrentUdGva, RevalUdGva, UdGva},
AggregateSum, AmountWithBase, EdgeTx, PeerCardGva, RawTxOrChanges, Sum, TxDirection,
TxsHistoryMempool, UtxoGva,
};
use crate::inputs::{TxIssuer, TxRecipient, UdsFilter};
use crate::inputs_validators::TxCommentValidator;
use crate::pagination::Pagination;
#[cfg(test)]
use crate::tests::DbsReader;
use async_graphql::connection::{Connection, Edge, EmptyFields};
use async_graphql::validators::{IntGreaterThan, ListMinLength, StringMaxLength, StringMinLength};
use dubp::common::crypto::keys::{ed25519::PublicKey, PublicKey as _};
use dubp::common::prelude::*;
use dubp::crypto::hashs::Hash;
use dubp::documents::prelude::*;
use dubp::documents::transaction::{TransactionDocumentTrait, TransactionDocumentV10};
use dubp::documents_parser::prelude::*;
use dubp::wallet::prelude::*;
use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbReadable;
use duniter_dbs::prelude::*;
use duniter_dbs::{kv_typed::prelude::*, FileBackend, TxDbV2};
use duniter_gva_dbs_reader::pagination::PageInfo;
#[cfg(not(test))]
use duniter_gva_dbs_reader::DbsReader;
use duniter_mempools::TxsMempool;
use futures::{Stream, StreamExt};
use resiter::map::Map;
use std::{convert::TryFrom, ops::Deref};
#[derive(Debug, Default)]
pub struct ServerMetaData {
pub currency: String,
pub self_pubkey: PublicKey,
pub software_version: &'static str,
}
#[cfg(test)]
mod tests {
use super::*;
use dubp::documents::transaction::TransactionInputV10;
use duniter_dbs::databases::bc_v2::*;
use duniter_dbs::SourceAmountValV2;
use duniter_gva_dbs_reader::pagination::*;
use fast_threadpool::ThreadPoolConfig;
use std::collections::VecDeque;
mockall::mock! {
pub DbsReader {
fn all_uds_of_pubkey(
&self,
bc_db: &BcV2DbRo<FileBackend>,
pubkey: PublicKey,
page_info: PageInfo<BlockNumber>,
) -> KvResult<PagedData<duniter_gva_dbs_reader::uds_of_pubkey::UdsWithSum>>;
fn get_current_frame<BcDb: 'static + BcV2DbReadable>(
&self,
bc_db: &BcDb,
) -> anyhow::Result<Vec<duniter_dbs::BlockMetaV2>>;
fn find_inputs<BcDb: 'static + BcV2DbReadable, TxsMpDb: 'static + TxsMpV2DbReadable>(
&self,
bc_db: &BcDb,
txs_mp_db: &TxsMpDb,
amount: SourceAmount,
script: &WalletScriptV10,
use_mempool_sources: bool,
) -> anyhow::Result<(Vec<TransactionInputV10>, SourceAmount)>;
fn find_script_utxos<TxsMpDb: 'static + TxsMpV2DbReadable>(
&self,
txs_mp_db_ro: &TxsMpDb,
amount_target_opt: Option<SourceAmount>,
page_info: PageInfo<duniter_gva_dbs_reader::utxos::UtxoCursor>,
script: &WalletScriptV10,
) -> anyhow::Result<PagedData<duniter_gva_dbs_reader::utxos::UtxosWithSum>>;
fn get_account_balance(
&self,
account_script: &WalletScriptV10,
) -> KvResult<Option<SourceAmountValV2>>;
fn get_blockchain_time(
&self,
block_number: BlockNumber,
) -> anyhow::Result<u64>;
fn get_current_ud<BcDb: 'static + BcV2DbReadable>(
&self,
bc_db: &BcDb,
) -> KvResult<Option<SourceAmount>>;
fn get_txs_history_bc_received(
&self,
page_info: PageInfo<duniter_gva_dbs_reader::txs_history::TxBcCursor>,
script_hash: Hash,
) -> KvResult<PagedData<VecDeque<TxDbV2>>>;
fn get_txs_history_bc_sent(
&self,
page_info: PageInfo<duniter_gva_dbs_reader::txs_history::TxBcCursor>,
script_hash: Hash,
) -> KvResult<PagedData<VecDeque<TxDbV2>>>;
fn get_txs_history_mempool<TxsMpDb: 'static + TxsMpV2DbReadable>(
&self,
txs_mp_db_ro: &TxsMpDb,
pubkey: PublicKey,
) -> KvResult<(Vec<TransactionDocumentV10>, Vec<TransactionDocumentV10>)>;
fn unspent_uds_of_pubkey<BcDb: 'static + BcV2DbReadable>(
&self,
bc_db: &BcDb,
pubkey: PublicKey,
page_info: PageInfo<BlockNumber>,
bn_to_exclude_opt: Option<&'static std::collections::BTreeSet<BlockNumber>>,
amount_target_opt: Option<SourceAmount>,
) -> KvResult<PagedData<duniter_gva_dbs_reader::uds_of_pubkey::UdsWithSum>>;
}
}
pub type DbsReader = duniter_dbs::kv_typed::prelude::Arc<MockDbsReader>;
pub(crate) fn create_schema(dbs_ops: MockDbsReader) -> KvResult<GvaSchema> {
let dbs = SharedDbs::mem()?;
let threadpool = fast_threadpool::ThreadPool::start(ThreadPoolConfig::default(), dbs);
Ok(schema::build_schema_with_data(
schema::GvaSchemaData {
dbs_pool: threadpool.into_async_handler(),
dbs_reader: Arc::new(dbs_ops),
server_meta_data: ServerMetaData {
currency: "test_currency".to_owned(),
self_pubkey: PublicKey::default(),
software_version: "test",
},
txs_mempool: TxsMempool::new(10),
},
true,
))
}
pub(crate) async fn exec_graphql_request(
schema: &GvaSchema,
request: &str,
) -> anyhow::Result<serde_json::Value> {
Ok(serde_json::to_value(schema.execute(request).await)?)
}
}
......@@ -29,7 +29,7 @@ impl MutationRoot {
) -> async_graphql::Result<TxGva> {
let tx = TransactionDocumentV10::parse_from_raw_text(&raw_tx)?;
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let expected_currency = data.server_meta_data.currency.clone();
tx.verify(Some(&expected_currency))?;
......@@ -61,7 +61,7 @@ impl MutationRoot {
.map(|raw_tx| TransactionDocumentV10::parse_from_raw_text(&raw_tx))
.collect::<Result<Vec<TransactionDocumentV10>, _>>()?;
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let expected_currency = data.server_meta_data.currency.clone();
let server_pubkey = data.server_meta_data.self_pubkey;
......
......@@ -50,7 +50,7 @@ impl Node {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<Option<PeerCardGva>> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
Ok(data
.dbs_pool
......@@ -67,7 +67,7 @@ impl Node {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<&'static str> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
Ok(data.server_meta_data.software_version)
}
}
......@@ -31,7 +31,7 @@ impl AccountBalanceQuery {
dubp::documents_parser::wallet_script_from_str(&script)?
};
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let dbs_reader = data.dbs_reader();
let balance = data
......
......@@ -24,7 +24,7 @@ impl CurrentFrameQuery {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<Vec<Block>> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let dbs_reader = data.dbs_reader();
Ok(data
......
......@@ -111,7 +111,7 @@ impl GenTxsQuery {
let issuer = PublicKey::from_base58(&issuer)?;
let recipient = PublicKey::from_base58(&recipient)?;
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let currency = data.server_meta_data.currency.clone();
......@@ -186,7 +186,7 @@ impl GenTxsQuery {
));
}
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let currency = data.server_meta_data.currency.clone();
......
......@@ -58,7 +58,7 @@ impl TxsHistoryBlockchainQueryInner {
) -> async_graphql::Result<Connection<String, TxGva, EmptyFields, EdgeTx>> {
let start_time = std::time::Instant::now();
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let pagination = self.pagination;
......@@ -136,7 +136,7 @@ impl TxsHistoryBlockchainQueryInner {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<Connection<String, TxGva, EmptyFields, EmptyFields>> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let pagination = self.pagination;
let script_hash = self.script_hash;
......@@ -163,7 +163,7 @@ impl TxsHistoryBlockchainQueryInner {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<Connection<String, TxGva, EmptyFields, EmptyFields>> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let pagination = self.pagination;
let script_hash = self.script_hash;
......@@ -200,7 +200,7 @@ impl TxsHistoryMempoolQuery {
) -> async_graphql::Result<TxsHistoryMempool> {
let pubkey = PublicKey::from_base58(&pubkey)?;
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let (sending, pending) = data
......
......@@ -27,7 +27,7 @@ impl UdsQuery {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<Option<CurrentUdGva>> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let dbs_reader = data.dbs_reader();
Ok(data
......@@ -53,7 +53,7 @@ impl UdsQuery {
let pubkey = PublicKey::from_base58(&pubkey)?;
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let dbs_reader = data.dbs_reader();
let (
......@@ -134,7 +134,7 @@ impl UdsQuery {
&self,
ctx: &async_graphql::Context<'_>,
) -> async_graphql::Result<Vec<RevalUdGva>> {
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
Ok(data
.dbs_pool
......
......@@ -36,7 +36,7 @@ impl UtxosQuery {
let script = dubp::documents_parser::wallet_script_from_str(&script)?;
let data = ctx.data::<SchemaData>()?;
let data = ctx.data::<GvaSchemaData>()?;
let db_reader = data.dbs_reader();
let (
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment