diff --git a/lib/modules/gva/resources/schema.gql b/lib/modules/gva/resources/schema.gql index a57118e06ff7a083b79b5aaa64fc49092fddeb6e..f2fe3b632c30d5fb786a4d97e0df0e4e4336fd16 100644 --- a/lib/modules/gva/resources/schema.gql +++ b/lib/modules/gva/resources/schema.gql @@ -15,6 +15,7 @@ type Query { step: Int = 1, sortOrder: SortOrder = ASC ): BlocksPage! @juniper(ownership: "owned") + currentUd: CurrentUd @juniper(ownership: "owned") } type Mutation { @@ -93,3 +94,16 @@ type Block { ################################# scalar DateTimeUtc @juniper(with_time_zone: false) + +################################# +# CurrentUd types +################################# + +type CurrentUd { + amount: Int! + base: Int! + blockNumber: Int! + commonTime: DateTimeUtc! + membersCount: Int! + monetaryMass: Int! +} \ No newline at end of file diff --git a/lib/modules/gva/src/schema.rs b/lib/modules/gva/src/schema.rs index 1680be6b4753fb1ef74e489620048935622b618a..6ac93199f36630cdb5d56a7a76b058fefdf4dbcf 100644 --- a/lib/modules/gva/src/schema.rs +++ b/lib/modules/gva/src/schema.rs @@ -21,6 +21,7 @@ mod queries; use self::entities::block::Block; use self::entities::blocks_page::BlocksPage; +use self::entities::current_ud::CurrentUd; use self::entities::node::{Node, Summary}; use crate::context::QueryContext; #[cfg(not(test))] @@ -118,6 +119,21 @@ impl QueryFields for Query { } } } + #[inline] + fn field_current_ud( + &self, + executor: &Executor<'_, QueryContext>, + trail: &QueryTrail<'_, CurrentUd, Walked>, + ) -> FieldResult<Option<CurrentUd>> { + let db = executor.context().get_db(); + cfg_if::cfg_if! { + if #[cfg(not(test))] { + db.read(|r| queries::current_ud::execute(&BcDbRoWithReader { db, r }, trail)).map_err(Into::into) + } else { + queries::current_ud::execute(db, trail).map_err(Into::into) + } + } + } } pub struct Mutation; diff --git a/lib/modules/gva/src/schema/entities.rs b/lib/modules/gva/src/schema/entities.rs index c277e3739ea0f7c6b41a4e374c316e3be04d665b..523b6a827f59a7b19a5da932e6b39d75a88f5f9b 100644 --- a/lib/modules/gva/src/schema/entities.rs +++ b/lib/modules/gva/src/schema/entities.rs @@ -17,4 +17,5 @@ pub mod block; pub mod blocks_page; +pub mod current_ud; pub mod node; diff --git a/lib/modules/gva/src/schema/entities/current_ud.rs b/lib/modules/gva/src/schema/entities/current_ud.rs new file mode 100644 index 0000000000000000000000000000000000000000..3a7871acf7f52cbdf63a5b1673934186932b7ef3 --- /dev/null +++ b/lib/modules/gva/src/schema/entities/current_ud.rs @@ -0,0 +1,73 @@ +// Copyright (C) 2017-2019 The AXIOM TEAM Association. +// +// 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/>. + +// ! Module define graphql BlockCurrent UD type +use crate::context::QueryContext; +use chrono::NaiveDateTime; +use durs_bc_db_reader::current_metadata::current_ud::CurrentUdDb; +use juniper::{Executor, FieldResult}; + +pub struct CurrentUd { + pub amount: i32, + pub base: i32, + pub block_number: i32, + pub common_time: NaiveDateTime, + pub members_count: i32, + pub monetary_mass: i32, +} + +impl CurrentUd { + // Convert BloCurrentUdDb (db entity) into CurrentUd (gva entity) + pub(crate) fn from_current_du_db(current_du_db: CurrentUdDb) -> CurrentUd { + CurrentUd { + amount: current_du_db.amount as i32, + base: current_du_db.base as i32, + block_number: current_du_db.block_number.0 as i32, + common_time: NaiveDateTime::from_timestamp(current_du_db.common_time as i64, 0), + members_count: current_du_db.members_count as i32, + monetary_mass: current_du_db.monetary_mass as i32, + } + } +} + +impl super::super::CurrentUdFields for CurrentUd { + #[inline] + fn field_amount(&self, _executor: &Executor<'_, QueryContext>) -> FieldResult<&i32> { + Ok(&self.amount) + } + #[inline] + fn field_base(&self, _executor: &Executor<'_, QueryContext>) -> FieldResult<&i32> { + Ok(&self.base) + } + #[inline] + fn field_block_number(&self, _executor: &Executor<'_, QueryContext>) -> FieldResult<&i32> { + Ok(&self.block_number) + } + #[inline] + fn field_common_time( + &self, + _executor: &Executor<'_, QueryContext>, + ) -> FieldResult<&NaiveDateTime> { + Ok(&self.common_time) + } + #[inline] + fn field_members_count(&self, _executor: &Executor<'_, QueryContext>) -> FieldResult<&i32> { + Ok(&self.members_count) + } + #[inline] + fn field_monetary_mass(&self, _executor: &Executor<'_, QueryContext>) -> FieldResult<&i32> { + Ok(&self.monetary_mass) + } +} diff --git a/lib/modules/gva/src/schema/queries.rs b/lib/modules/gva/src/schema/queries.rs index 1cf29e5abe77dc05f26efa128b928951d173b422..d8f9bc717f406d9c317245d83e18da5cf03e1770 100644 --- a/lib/modules/gva/src/schema/queries.rs +++ b/lib/modules/gva/src/schema/queries.rs @@ -18,6 +18,7 @@ pub mod block; pub mod blocks; pub mod current; +pub mod current_ud; pub mod node; #[cfg(test)] diff --git a/lib/modules/gva/src/schema/queries/current_ud.rs b/lib/modules/gva/src/schema/queries/current_ud.rs new file mode 100644 index 0000000000000000000000000000000000000000..282bc739adb3f63e4073171434379b0a305f91fc --- /dev/null +++ b/lib/modules/gva/src/schema/queries/current_ud.rs @@ -0,0 +1,76 @@ +// Copyright (C) 2017-2019 The AXIOM TEAM Association. +// +// 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/>. + +// ! Module execute GraphQl schema currentUd query +use crate::schema::entities::current_ud::CurrentUd; +use durs_bc_db_reader::{BcDbInReadTx, DbError}; +use juniper_from_schema::{QueryTrail, Walked}; + +pub(crate) fn execute<DB: BcDbInReadTx>( + db: &DB, + _trail: &QueryTrail<'_, CurrentUd, Walked>, +) -> Result<Option<CurrentUd>, DbError> { + Ok(db + .get_current_ud()? + .map(|current_ud_db| CurrentUd::from_current_du_db(current_ud_db))) +} + +#[cfg(test)] +mod tests { + use crate::db::BcDbRo; + use crate::schema::queries::tests; + use dubp_common_doc::BlockNumber; + use durs_bc_db_reader::current_metadata::current_ud::CurrentUdDb; + use serde_json::json; + + static mut DB_TEST_CURRENT_UD_1: Option<BcDbRo> = None; + + #[test] + fn test_graphql_current_ud() { + let mut mock_db = BcDbRo::new(); + + // Define mock db expectations here + + mock_db.expect_get_current_ud().times(1).returning(|| { + Ok(Some(CurrentUdDb { + amount: 1_000, + base: 0, + block_number: BlockNumber(1), + common_time: 1_488_987_127, + members_count: 59, + monetary_mass: 59_000, + })) + }); + + let schema = tests::setup(mock_db, unsafe { &mut DB_TEST_CURRENT_UD_1 }); + + tests::test_gql_query( + schema, + "{ currentUd { amount, base, blockNumber, commonTime, membersCount, monetaryMass } }", + json!({ + "data": { + "currentUd": { + "amount": 1_000, + "base": 0, + "blockNumber": 1, + "commonTime": 1_488_987_127.0, + "membersCount": 59, + "monetaryMass": 59000 + } + } + }), + ) + } +}