From bcbecb488fbe20f162e4cc4e16b7f17fd92514ca Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Tue, 9 Aug 2022 14:33:16 +0300 Subject: [PATCH 01/10] Documentation for channel accounting --- primitives/Cargo.toml | 3 +++ primitives/examples/accounting_response.rs | 31 ++++++++++++++++++++++ primitives/src/sentry.rs | 6 +++++ sentry/src/routes.rs | 8 +++++- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 primitives/examples/accounting_response.rs diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 4dc4868db..19073cc56 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -20,6 +20,9 @@ postgres = ["bytes", "tokio-postgres", "deadpool-postgres"] # All Addresses and keystore files exist in the ganache-cli setup for testing with the EthereumAdapter test-util = [] +[[example]] +name = "accounting_response" + [[example]] name = "analytics_query" diff --git a/primitives/examples/accounting_response.rs b/primitives/examples/accounting_response.rs new file mode 100644 index 000000000..15ad30687 --- /dev/null +++ b/primitives/examples/accounting_response.rs @@ -0,0 +1,31 @@ +use primitives::{sentry::AccountingResponse, balances::CheckedState}; +use serde_json::{from_value, json}; + +fn main() { + + + // Empty balances + { + let json = json!({ + "earners": {}, + "spenders": {}, + }); + assert!(from_value::>(json).is_ok()); + } + + // Non-empty balances + { + // earners sum and spenders sum should always match since balances are CheckedState + let json = json!({ + "earners": { + "0x0000000000000000000000000000000000000000": "10000000000", + "0x1111111111111111111111111111111111111111": "20000000000", + "0x2222222222222222222222222222222222222222": "30000000000", + }, + "spenders": { + "0x7777777777777777777777777777777777777777": "60000000000", + }, + }); + assert!(from_value::>(json).is_ok()); + } +} diff --git a/primitives/src/sentry.rs b/primitives/src/sentry.rs index f14d56f42..5212f4809 100644 --- a/primitives/src/sentry.rs +++ b/primitives/src/sentry.rs @@ -24,6 +24,12 @@ pub use event::{Event, EventType, CLICK, IMPRESSION}; #[serde(rename_all = "camelCase")] /// Channel Accounting response /// A collection of all `Accounting`s for a specific `Channel` +/// +/// # Examples +/// +/// ``` +#[doc = include_str!("../examples/accounting_response.rs")] +/// ``` pub struct AccountingResponse { #[serde(flatten, bound = "S: BalancesState")] pub balances: Balances, diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index 617ff456d..6ffb7496e 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -59,9 +59,15 @@ //! //! #### GET `/v5/channel/:id/accounting` //! +//! Gets all of the accounting entries for a channel from the database and checks the balances. +//! //! The route is handled by [`channel::get_accounting_for_channel()`]. //! -//! Response: [`AccountingResponse::`](primitives::sentry::AccountingResponse) +//! Response: +//! +//! ``` +#![doc = include_str!("../../primitives/examples/accounting_response.rs")] +//! ``` //! //! #### GET `/v5/channel/:id/spender/:addr` (auth required) //! From 41007341525e4651f6de0d96f3e2f4004acdb407 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Tue, 9 Aug 2022 14:44:48 +0300 Subject: [PATCH 02/10] formatting --- primitives/examples/accounting_response.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/primitives/examples/accounting_response.rs b/primitives/examples/accounting_response.rs index 15ad30687..d875ee1b1 100644 --- a/primitives/examples/accounting_response.rs +++ b/primitives/examples/accounting_response.rs @@ -1,15 +1,13 @@ -use primitives::{sentry::AccountingResponse, balances::CheckedState}; +use primitives::{balances::CheckedState, sentry::AccountingResponse}; use serde_json::{from_value, json}; fn main() { - - // Empty balances { let json = json!({ - "earners": {}, - "spenders": {}, - }); + "earners": {}, + "spenders": {}, + }); assert!(from_value::>(json).is_ok()); } From 06522b66e62ed7823a00874f268581c09e36db27 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Tue, 9 Aug 2022 15:09:29 +0300 Subject: [PATCH 03/10] documentation for SpenderResponse + examples --- primitives/Cargo.toml | 3 +++ primitives/examples/spender_response.rs | 12 ++++++++++++ primitives/src/sentry.rs | 7 +++++++ sentry/src/routes.rs | 11 ++++++++++- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 primitives/examples/spender_response.rs diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 19073cc56..13d5c7793 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -48,6 +48,9 @@ required-features = ["test-util"] [[example]] name = "modify_campaign" +[[example]] +name = "spender_response" + [dependencies] # (De)Serialization serde = { version = "1.0", features = ["derive"] } diff --git a/primitives/examples/spender_response.rs b/primitives/examples/spender_response.rs new file mode 100644 index 000000000..453171707 --- /dev/null +++ b/primitives/examples/spender_response.rs @@ -0,0 +1,12 @@ +use primitives::{sentry::SpenderResponse}; +use serde_json::{from_value, json}; + +fn main() { + let json = json!({ + "spender": { + "totalDeposited": "10000000000", + "totalSpent": "100000000", + }, + }); + assert!(from_value::(json).is_ok()); +} diff --git a/primitives/src/sentry.rs b/primitives/src/sentry.rs index 5212f4809..921538e19 100644 --- a/primitives/src/sentry.rs +++ b/primitives/src/sentry.rs @@ -598,6 +598,13 @@ pub struct SuccessResponse { pub success: bool, } +/// Spender limits for a spender on a channel. +/// +/// # Examples +/// +/// ``` +#[doc = include_str!("../examples/spender_response.rs")] +/// ``` #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct SpenderResponse { diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index 6ffb7496e..3efa92c43 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -70,10 +70,19 @@ //! ``` //! //! #### GET `/v5/channel/:id/spender/:addr` (auth required) +//! +//! Gets the spender limits for a spender on a channel. It does so by fetching the +//! latest Spendable entry from the database (or creating one if it doesn't exist yet) from which +//! the total deposited amount is retrieved, and the latest NewState from which the total spent +//! amount is retrieved. //! //! The route is handled by [`channel::get_spender_limits()`]. //! -//! Response: [`SpenderResponse`](primitives::sentry::SpenderResponse) +//! Response: +//! +//! ``` +#![doc = include_str!("../../primitives/examples/spender_response.rs")] +//! ``` //! //! #### POST `/v5/channel/:id/spender/:addr` (auth required) //! From f56122f5dd9b537bc061a16c4e1f6ca38e2f5d89 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Tue, 9 Aug 2022 15:10:00 +0300 Subject: [PATCH 04/10] formatting --- primitives/examples/spender_response.rs | 2 +- sentry/src/routes.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/primitives/examples/spender_response.rs b/primitives/examples/spender_response.rs index 453171707..801ee8770 100644 --- a/primitives/examples/spender_response.rs +++ b/primitives/examples/spender_response.rs @@ -1,4 +1,4 @@ -use primitives::{sentry::SpenderResponse}; +use primitives::sentry::SpenderResponse; use serde_json::{from_value, json}; fn main() { diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index 3efa92c43..b1e64e4d4 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -70,7 +70,7 @@ //! ``` //! //! #### GET `/v5/channel/:id/spender/:addr` (auth required) -//! +//! //! Gets the spender limits for a spender on a channel. It does so by fetching the //! latest Spendable entry from the database (or creating one if it doesn't exist yet) from which //! the total deposited amount is retrieved, and the latest NewState from which the total spent From c40b4b924ed1fd34919a9d3f60314bf4891d44cd Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Tue, 9 Aug 2022 15:34:54 +0300 Subject: [PATCH 05/10] Documentation + examples for channel get all spenders route --- primitives/Cargo.toml | 3 +++ primitives/examples/all_spenders_response.rs | 24 ++++++++++++++++++++ primitives/src/sentry.rs | 9 +++++++- sentry/src/routes.rs | 10 ++++++-- 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 primitives/examples/all_spenders_response.rs diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 13d5c7793..2673911d4 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -23,6 +23,9 @@ test-util = [] [[example]] name = "accounting_response" +[[example]] +name = "all_spenders_response" + [[example]] name = "analytics_query" diff --git a/primitives/examples/all_spenders_response.rs b/primitives/examples/all_spenders_response.rs new file mode 100644 index 000000000..d547956c2 --- /dev/null +++ b/primitives/examples/all_spenders_response.rs @@ -0,0 +1,24 @@ +use primitives::sentry::AllSpendersResponse; +use serde_json::{from_value, json}; + +fn main() { + let json = json!({ + "spenders": { + "0x0000000000000000000000000000000000000000": { + "totalDeposited": "10000000000", + "totalSpent": "100000000", + }, + "0x1111111111111111111111111111111111111111": { + "totalDeposited": "90000000000", + "totalSpent": "20000000000", + }, + "0x2222222222222222222222222222222222222222": { + "totalDeposited": "1000000000", + "totalSpent": "1000000000", + }, + }, + "totalPages": 1, + "page": 0 + }); + assert!(from_value::(json).is_ok()); +} diff --git a/primitives/src/sentry.rs b/primitives/src/sentry.rs index 921538e19..c4e4c8f74 100644 --- a/primitives/src/sentry.rs +++ b/primitives/src/sentry.rs @@ -598,7 +598,7 @@ pub struct SuccessResponse { pub success: bool, } -/// Spender limits for a spender on a channel. +/// Spender limits for a spender on a `Channel` /// /// # Examples /// @@ -611,6 +611,13 @@ pub struct SpenderResponse { pub spender: Spender, } +/// Spender limits for all spenders on a `Channel` +/// +/// # Examples +/// +/// ``` +#[doc = include_str!("../examples/all_spenders_response.rs")] +/// ``` #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct AllSpendersResponse { diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index b1e64e4d4..442018d29 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -71,7 +71,7 @@ //! //! #### GET `/v5/channel/:id/spender/:addr` (auth required) //! -//! Gets the spender limits for a spender on a channel. It does so by fetching the +//! Gets the spender limits for a spender on a [`Channel`]. It does so by fetching the //! latest Spendable entry from the database (or creating one if it doesn't exist yet) from which //! the total deposited amount is retrieved, and the latest NewState from which the total spent //! amount is retrieved. @@ -96,9 +96,15 @@ //! //! #### GET `/v5/channel/:id/spender/all` (auth required) //! +//! This routes gets total_deposited and total_spent for every spender on a [`Channel`] +//! //! The route is handled by [`channel::get_all_spender_limits()`]. //! -//! Response: [`AllSpendersResponse`](primitives::sentry::AllSpendersResponse) +//! Response: +//! +//! ``` +#![doc = include_str!("../../primitives/examples/all_spenders_response.rs")] +//! ``` //! //! #### GET `/v5/channel/:id/validator-messages` //! From 46e1d6676c70c17e62f273e7c739be9b04776ff6 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Wed, 10 Aug 2022 14:21:46 +0300 Subject: [PATCH 06/10] renaming some functions and files + ValidatorMessagesCreateRequest example --- primitives/Cargo.toml | 7 ++- ...campaign.rs => create_campaign_request.rs} | 0 ...campaign.rs => modify_campaign_request.rs} | 0 .../validator_messages_create_request.rs | 50 +++++++++++++++++++ primitives/src/sentry.rs | 13 +++-- sentry/src/db/validator_message.rs | 2 +- sentry/src/routes.rs | 20 +++----- sentry/src/routes/channel.rs | 4 +- 8 files changed, 76 insertions(+), 20 deletions(-) rename primitives/examples/{create_campaign.rs => create_campaign_request.rs} (100%) rename primitives/examples/{modify_campaign.rs => modify_campaign_request.rs} (100%) create mode 100644 primitives/examples/validator_messages_create_request.rs diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index 2673911d4..f082bf42f 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -45,15 +45,18 @@ name = "channel_list_query" required-features = ["test-util"] [[example]] -name = "create_campaign" +name = "create_campaign_request" required-features = ["test-util"] [[example]] -name = "modify_campaign" +name = "modify_campaign_request" [[example]] name = "spender_response" +[[example]] +name = "validator_messages_create_request" + [dependencies] # (De)Serialization serde = { version = "1.0", features = ["derive"] } diff --git a/primitives/examples/create_campaign.rs b/primitives/examples/create_campaign_request.rs similarity index 100% rename from primitives/examples/create_campaign.rs rename to primitives/examples/create_campaign_request.rs diff --git a/primitives/examples/modify_campaign.rs b/primitives/examples/modify_campaign_request.rs similarity index 100% rename from primitives/examples/modify_campaign.rs rename to primitives/examples/modify_campaign_request.rs diff --git a/primitives/examples/validator_messages_create_request.rs b/primitives/examples/validator_messages_create_request.rs new file mode 100644 index 000000000..6158154af --- /dev/null +++ b/primitives/examples/validator_messages_create_request.rs @@ -0,0 +1,50 @@ +use primitives::sentry::ValidatorMessagesCreateRequest; +use serde_json::json; +use std::str::FromStr; + +fn main() { + + let messages_json = json!({ + "messages": [ + { + "type": "ApproveState", + "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", + "signature": "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7", + "isHealthy": true, + }, + { // RejectState + "type": "RejectState", + "reason": "rejected", + "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", + "signature": "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7", + "earners": {}, + "spenders": {}, + "timestamp": "2022-08-09T16:07:18.136334Z", + }, + { // NewState + "type": "NewState", + "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", + "signature": "0x80690751969B234697e9059e04ed72195c3507fa", + "earners": { + "0x0e880972A4b216906F05D67EeaaF55d16B5EE4F1": "2000", + "0xE882ebF439207a70dDcCb39E13CA8506c9F45fD9": "2000", + }, + "spenders": { + "0xaCBaDA2d5830d1875ae3D2de207A1363B316Df2F": "2000", + "0xDd589B43793934EF6Ad266067A0d1D4896b0dff0": "2000", + }, + }, + { // Heartbeat + "type": "Heartbeat", + "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", + "signature": "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7", + "timestamp": "1612162800000", + } + ] + }); + + let messages_json = + serde_json::to_string(&messages_json).expect("should serialize"); + + // assert!(serde_json::from_str::(&messages_json).is_ok()); +} diff --git a/primitives/src/sentry.rs b/primitives/src/sentry.rs index c4e4c8f74..02b718520 100644 --- a/primitives/src/sentry.rs +++ b/primitives/src/sentry.rs @@ -28,7 +28,7 @@ pub use event::{Event, EventType, CLICK, IMPRESSION}; /// # Examples /// /// ``` -#[doc = include_str!("../examples/accounting_response.rs")] +#[doc = include_str!("../examples/validator_messages_create_request.rs")] /// ``` pub struct AccountingResponse { #[serde(flatten, bound = "S: BalancesState")] @@ -651,6 +651,13 @@ pub struct ValidatorMessagesListResponse { pub messages: Vec, } +/// Contains all the different validator messages to be inserted +/// +/// # Examples +/// +/// ``` +#[doc = include_str!("../examples/validator_messages_create_request.rs")] +/// ``` #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct ValidatorMessagesCreateRequest { @@ -846,7 +853,7 @@ pub mod campaign_create { /// # Examples /// /// ``` - #[doc = include_str!("../examples/create_campaign.rs")] + #[doc = include_str!("../examples/create_campaign_request.rs")] /// ``` #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] @@ -939,7 +946,7 @@ pub mod campaign_modify { /// /// # Examples: /// ``` - #[doc = include_str!("../examples/modify_campaign.rs")] + #[doc = include_str!("../examples/modify_campaign_request.rs")] /// ``` #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct ModifyCampaign { diff --git a/sentry/src/db/validator_message.rs b/sentry/src/db/validator_message.rs index d124f18c3..e3611688b 100644 --- a/sentry/src/db/validator_message.rs +++ b/sentry/src/db/validator_message.rs @@ -11,7 +11,7 @@ use primitives::{ use super::{DbPool, PoolError}; /// Inserts a new validator [`MessageTypes`] using the `from` [`ValidatorId`] and `received` at: [`Utc::now()`][Utc] -pub async fn insert_validator_messages( +pub async fn insert_validator_message( pool: &DbPool, channel: &Channel, from: &ValidatorId, diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index 442018d29..aadd7e7f1 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -123,19 +123,15 @@ //! //! #### POST `/v5/channel/:id/validator-messages` (auth required) //! -//! The route is handled by [`channel::validator_message::create_validator_messages()`]. +//! Inserts the validator messages in the request body in the databse for a specific [`Channel`]. +//! The request sender must be a [`Validator`] of the [`Channel`]. //! -//! Request body (json): [`ValidatorMessagesCreateRequest`](primitives::sentry::ValidatorMessagesCreateRequest) +//! The route is handled by [`channel::validator_message::create_validator_messages()`]. //! -//! ##### Examples: +//! Request body (json): //! -//! ```json -//! { -//! "messages": [ -//! /// validator messages -//! ... -//! ] -//! } +//! ``` +#![doc = include_str!("../../primitives/examples/validator_messages_create_request.rs")] //! ``` //! //! Validator messages: [`MessageTypes`] @@ -264,7 +260,7 @@ //! ##### Examples //! //! ``` -#![doc = include_str!("../../primitives/examples/create_campaign.rs")] +#![doc = include_str!("../../primitives/examples/create_campaign_request.rs")] //! ``` //! //! #### POST `/v5/campaign/:id` (auth required) @@ -282,7 +278,7 @@ //! ##### Examples //! //! ``` -#![doc = include_str!("../../primitives/examples/modify_campaign.rs")] +#![doc = include_str!("../../primitives/examples/modify_campaign_request.rs")] //! ``` //! //! #### POST `/v5/campaign/:id/events` diff --git a/sentry/src/routes/channel.rs b/sentry/src/routes/channel.rs index d0f2c7444..28771d8e0 100644 --- a/sentry/src/routes/channel.rs +++ b/sentry/src/routes/channel.rs @@ -608,7 +608,7 @@ pub async fn channel_dummy_deposit( /// pub mod validator_message { use crate::{ - db::validator_message::{get_validator_messages, insert_validator_messages}, + db::validator_message::{get_validator_messages, insert_validator_message}, Auth, }; use crate::{ @@ -734,7 +734,7 @@ pub mod validator_message { None => Err(ResponseError::Unauthorized), _ => { try_join_all(create_request.messages.iter().map(|message| { - insert_validator_messages(&app.pool, &channel, &session.uid, message) + insert_validator_message(&app.pool, &channel, &session.uid, message) })) .await?; From 299adfd2a080b04d0a0e4963b8803e3d0d84c77d Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Wed, 10 Aug 2022 14:22:05 +0300 Subject: [PATCH 07/10] formatting --- primitives/examples/validator_messages_create_request.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/primitives/examples/validator_messages_create_request.rs b/primitives/examples/validator_messages_create_request.rs index 6158154af..4e45caa00 100644 --- a/primitives/examples/validator_messages_create_request.rs +++ b/primitives/examples/validator_messages_create_request.rs @@ -3,7 +3,6 @@ use serde_json::json; use std::str::FromStr; fn main() { - let messages_json = json!({ "messages": [ { @@ -43,8 +42,7 @@ fn main() { ] }); - let messages_json = - serde_json::to_string(&messages_json).expect("should serialize"); + let messages_json = serde_json::to_string(&messages_json).expect("should serialize"); // assert!(serde_json::from_str::(&messages_json).is_ok()); } From eb3e2998f2b8cfdb3944534f42b5a2fedeb87393 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Wed, 10 Aug 2022 16:17:45 +0300 Subject: [PATCH 08/10] ChannelPayRequest examples --- primitives/Cargo.toml | 3 ++ primitives/examples/channel_pay_request.rs | 17 +++++++ .../validator_messages_create_request.rs | 48 ------------------- primitives/src/sentry.rs | 7 +++ sentry/src/routes.rs | 5 +- 5 files changed, 31 insertions(+), 49 deletions(-) create mode 100644 primitives/examples/channel_pay_request.rs delete mode 100644 primitives/examples/validator_messages_create_request.rs diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index f082bf42f..0d01b0403 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -44,6 +44,9 @@ required-features = ["test-util"] name = "channel_list_query" required-features = ["test-util"] +[[example]] +name = "channel_pay_request" + [[example]] name = "create_campaign_request" required-features = ["test-util"] diff --git a/primitives/examples/channel_pay_request.rs b/primitives/examples/channel_pay_request.rs new file mode 100644 index 000000000..b875125be --- /dev/null +++ b/primitives/examples/channel_pay_request.rs @@ -0,0 +1,17 @@ +use primitives::sentry::ChannelPayRequest; +use serde_json::json; +use std::str::FromStr; + +fn main() { + let channel_pay_json = json!({ + "payouts": { + "0x80690751969B234697e9059e04ed72195c3507fa": "10000000000", + "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7": "20000000000", + "0x0e880972A4b216906F05D67EeaaF55d16B5EE4F1": "30000000000", + }, + }); + + let channel_pay_json = serde_json::to_string(&channel_pay_json).expect("should serialize"); + + assert!(serde_json::from_str::(&channel_pay_json).is_ok()); +} diff --git a/primitives/examples/validator_messages_create_request.rs b/primitives/examples/validator_messages_create_request.rs deleted file mode 100644 index 4e45caa00..000000000 --- a/primitives/examples/validator_messages_create_request.rs +++ /dev/null @@ -1,48 +0,0 @@ -use primitives::sentry::ValidatorMessagesCreateRequest; -use serde_json::json; -use std::str::FromStr; - -fn main() { - let messages_json = json!({ - "messages": [ - { - "type": "ApproveState", - "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", - "signature": "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7", - "isHealthy": true, - }, - { // RejectState - "type": "RejectState", - "reason": "rejected", - "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", - "signature": "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7", - "earners": {}, - "spenders": {}, - "timestamp": "2022-08-09T16:07:18.136334Z", - }, - { // NewState - "type": "NewState", - "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", - "signature": "0x80690751969B234697e9059e04ed72195c3507fa", - "earners": { - "0x0e880972A4b216906F05D67EeaaF55d16B5EE4F1": "2000", - "0xE882ebF439207a70dDcCb39E13CA8506c9F45fD9": "2000", - }, - "spenders": { - "0xaCBaDA2d5830d1875ae3D2de207A1363B316Df2F": "2000", - "0xDd589B43793934EF6Ad266067A0d1D4896b0dff0": "2000", - }, - }, - { // Heartbeat - "type": "Heartbeat", - "stateRoot": "b1a4fc6c1a1e1ab908a487e504006edcebea297f61b4b8ce6cad3b29e29454cc", - "signature": "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7", - "timestamp": "1612162800000", - } - ] - }); - - let messages_json = serde_json::to_string(&messages_json).expect("should serialize"); - - // assert!(serde_json::from_str::(&messages_json).is_ok()); -} diff --git a/primitives/src/sentry.rs b/primitives/src/sentry.rs index 02b718520..60e58ebc5 100644 --- a/primitives/src/sentry.rs +++ b/primitives/src/sentry.rs @@ -633,6 +633,13 @@ pub struct AllSpendersQuery { pub page: u64, } +/// Includes all the payouts that need to be done for that channel +/// +/// # Examples +/// +/// ``` +#[doc = include_str!("../examples/channel_pay_request.rs")] +/// ``` #[derive(Debug, Serialize, Deserialize)] pub struct ChannelPayRequest { pub payouts: UnifiedMap, diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index aadd7e7f1..cd2568d77 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -155,8 +155,11 @@ //! //! The route is handled by [`channel::channel_payout()`]. //! -//! Request JSON body: [`ChannelPayRequest`](primitives::sentry::ChannelPayRequest) +//! Request JSON body: //! +//! ``` +#![doc = include_str!("../../primitives/examples/channel_pay_request.rs")] +//! ``` //! Response: [`SuccessResponse`](primitives::sentry::SuccessResponse) //! //! From a0adce2babbcb9a46f4555774ca43fb3d7ebbbf7 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Wed, 10 Aug 2022 17:28:09 +0300 Subject: [PATCH 09/10] cleaned up problems during merge --- sentry/src/routes.rs | 1 - sentry/src/routes/channel.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index 5ee7b8cb2..bcb7dbfe3 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -152,7 +152,6 @@ //! the [`Channel.leader`] or [`Channel.follower`]. //! //! The route is handled by [`channel::validator_message::create_validator_messages()`]. ->>>>>>> 630f89827d679c2e72268d956742d91f556d9e89 //! //! Request body (json): [`ValidatorMessagesCreateRequest`](primitives::sentry::ValidatorMessagesCreateRequest) //! diff --git a/sentry/src/routes/channel.rs b/sentry/src/routes/channel.rs index fbad86e1c..c8d6e04f1 100644 --- a/sentry/src/routes/channel.rs +++ b/sentry/src/routes/channel.rs @@ -740,7 +740,7 @@ pub mod validator_message { None => Err(ResponseError::Unauthorized), _ => { try_join_all(create_request.messages.iter().map(|message| { - insert_validator_message(&app.pool, &channel, &session.uid, message) + insert_validator_message(&app.pool, &channel, &auth.uid, message) })) .await?; From 166a2cd26b50f3f5208312362e84cdf25a3c1835 Mon Sep 17 00:00:00 2001 From: Simeon Nakov Date: Thu, 11 Aug 2022 17:10:53 +0300 Subject: [PATCH 10/10] requested changes --- primitives/examples/accounting_response.rs | 8 +++--- primitives/examples/all_spenders_response.rs | 6 ++--- primitives/src/sentry.rs | 11 ++++---- sentry/src/routes.rs | 27 ++++++++++++++++---- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/primitives/examples/accounting_response.rs b/primitives/examples/accounting_response.rs index d875ee1b1..728a6fce9 100644 --- a/primitives/examples/accounting_response.rs +++ b/primitives/examples/accounting_response.rs @@ -16,12 +16,12 @@ fn main() { // earners sum and spenders sum should always match since balances are CheckedState let json = json!({ "earners": { - "0x0000000000000000000000000000000000000000": "10000000000", - "0x1111111111111111111111111111111111111111": "20000000000", - "0x2222222222222222222222222222222222222222": "30000000000", + "0x80690751969B234697e9059e04ed72195c3507fa": "10000000000", + "0xf3f583AEC5f7C030722Fe992A5688557e1B86ef7": "20000000000", + "0xE882ebF439207a70dDcCb39E13CA8506c9F45fD9": "30000000000", }, "spenders": { - "0x7777777777777777777777777777777777777777": "60000000000", + "0xaCBaDA2d5830d1875ae3D2de207A1363B316Df2F": "60000000000", }, }); assert!(from_value::>(json).is_ok()); diff --git a/primitives/examples/all_spenders_response.rs b/primitives/examples/all_spenders_response.rs index d547956c2..a525de6a5 100644 --- a/primitives/examples/all_spenders_response.rs +++ b/primitives/examples/all_spenders_response.rs @@ -4,15 +4,15 @@ use serde_json::{from_value, json}; fn main() { let json = json!({ "spenders": { - "0x0000000000000000000000000000000000000000": { + "0xaCBaDA2d5830d1875ae3D2de207A1363B316Df2F": { "totalDeposited": "10000000000", "totalSpent": "100000000", }, - "0x1111111111111111111111111111111111111111": { + "0xDd589B43793934EF6Ad266067A0d1D4896b0dff0": { "totalDeposited": "90000000000", "totalSpent": "20000000000", }, - "0x2222222222222222222222222222222222222222": { + "0x541b401362Ea1D489D322579552B099e801F3632": { "totalDeposited": "1000000000", "totalSpent": "1000000000", }, diff --git a/primitives/src/sentry.rs b/primitives/src/sentry.rs index f9ff2913e..d61f93b0a 100644 --- a/primitives/src/sentry.rs +++ b/primitives/src/sentry.rs @@ -23,12 +23,13 @@ pub use event::{Event, EventType, CLICK, IMPRESSION}; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] /// Channel Accounting response +/// /// A collection of all `Accounting`s for a specific [`Channel`](`crate::Channel`) /// /// # Examples /// /// ``` -#[doc = include_str!("../examples/validator_messages_create_request.rs")] +#[doc = include_str!("../examples/accounting_response.rs")] /// ``` pub struct AccountingResponse { #[serde(flatten, bound = "S: BalancesState")] @@ -633,7 +634,7 @@ pub struct SuccessResponse { pub success: bool, } -/// Spender limits for a spender on a `Channel` +/// Spender limits for a spender on a `Channel`. /// /// # Examples /// @@ -646,7 +647,7 @@ pub struct SpenderResponse { pub spender: Spender, } -/// Spender limits for all spenders on a `Channel` +/// Spender limits for all spenders on a `Channel`. /// /// # Examples /// @@ -668,7 +669,7 @@ pub struct AllSpendersQuery { pub page: u64, } -/// Includes all the payouts that need to be done for that channel +/// Payouts to be performed for the given [`Channel`](`crate::Channel`). /// /// # Examples /// @@ -693,7 +694,7 @@ pub struct ValidatorMessagesListResponse { pub messages: Vec, } -/// Contains all the different validator messages to be inserted +/// Contains all the different validator messages to be created. /// /// # Examples /// diff --git a/sentry/src/routes.rs b/sentry/src/routes.rs index bcb7dbfe3..a498ac004 100644 --- a/sentry/src/routes.rs +++ b/sentry/src/routes.rs @@ -63,6 +63,10 @@ //! //! The route is handled by [`channel::get_accounting_for_channel()`]. //! +//! Response: [`AccountingResponse`] +//! +//! ##### Examples +//! //! Response: //! //! ``` @@ -78,6 +82,10 @@ //! //! The route is handled by [`channel::get_spender_limits()`]. //! +//! Response: [`SpenderResponse`] +//! +//! ##### Examples +//! //! Response: //! //! ``` @@ -100,6 +108,10 @@ //! //! The route is handled by [`channel::get_all_spender_limits()`]. //! +//! Response: [`AllSpendersResponse`] +//! +//! ##### Examples +//! //! Response: //! //! ``` @@ -164,9 +176,6 @@ //! ``` #![doc = include_str!("../../primitives/examples/validator_messages_create_request.rs")] //! ``` -//! Response: [`SuccessResponse`] -//! -//! Validator messages: [`MessageTypes`] //! //! #### GET `/v5/channel/:id/last-approved` //! @@ -215,12 +224,17 @@ //! //! The route is handled by [`channel::channel_payout()`]. //! -//! Request JSON body: +//! Request JSON body: [`ChannelPayRequest`] +//! +//! Response: [`SuccessResponse`](primitives::sentry::SuccessResponse) +//! +//! ##### Examples +//! +//! Request (json): //! //! ``` #![doc = include_str!("../../primitives/examples/channel_pay_request.rs")] //! ``` -//! Response: [`SuccessResponse`](primitives::sentry::SuccessResponse) //! //! //! #### GET `/v5/channel/:id/get-leaf` @@ -450,6 +464,7 @@ //! [`ApproveState`]: primitives::validator::ApproveState //! [`Accounting`]: crate::db::accounting::Accounting //! [`AccountingResponse`]: primitives::sentry::AccountingResponse +//! [`AllSpendersResponse`]: primitives::sentry::AllSpendersResponse //! [`AnalyticsResponse`]: primitives::sentry::AnalyticsResponse //! [`AnalyticsQuery`]: primitives::analytics::AnalyticsQuery //! [`Auth.uid`]: crate::Auth::uid @@ -461,12 +476,14 @@ //! [`Channel.leader`]: primitives::Channel::leader //! [`Channel.follower`]: primitives::Channel::follower //! [`ChannelId`]: primitives::ChannelId +//! [`ChannelPayRequest`]: primitives::sentry::ChannelPayRequest //! [`check_access()`]: crate::access::check_access //! [`Config.msgs_find_limit`]: primitives::Config::msgs_find_limit //! [`Event`]: primitives::sentry::Event //! [`Heartbeat`]: primitives::validator::Heartbeat //! [`MessageTypes`]: primitives::validator::MessageTypes //! [`NewState`]: primitives::validator::NewState +//! [`SpenderResponse`]: primitives::sentry::SpenderResponse //! [`SuccessResponse`]: primitives::sentry::SuccessResponse //! [`ValidatorId`]: primitives::ValidatorId