diff --git a/Makefiles/db.toml b/Makefiles/db.toml index d7a8d5400c..9b91b8e0c3 100644 --- a/Makefiles/db.toml +++ b/Makefiles/db.toml @@ -48,10 +48,11 @@ psql -U catalyst-event-dev -d CatalystEventDev -f test_data/03_voter_table.sql $ psql -U catalyst-event-dev -d CatalystEventDev -f test_data/04_contribution_table.sql ${@} psql -U catalyst-event-dev -d CatalystEventDev -f test_data/05_goal_table.sql ${@} psql -U catalyst-event-dev -d CatalystEventDev -f test_data/06_objective_table.sql ${@} -psql -U catalyst-event-dev -d CatalystEventDev -f test_data/07_proposal_table.sql ${@} -psql -U catalyst-event-dev -d CatalystEventDev -f test_data/08_proposal_review_table.sql ${@} -psql -U catalyst-event-dev -d CatalystEventDev -f test_data/09_review_rating_table.sql ${@} -psql -U catalyst-event-dev -d CatalystEventDev -f test_data/10_objective_review_metric_table.sql ${@} +psql -U catalyst-event-dev -d CatalystEventDev -f test_data/07_voteplan_table.sql ${@} +psql -U catalyst-event-dev -d CatalystEventDev -f test_data/08_proposal_table.sql ${@} +psql -U catalyst-event-dev -d CatalystEventDev -f test_data/09_proposal_review_table.sql ${@} +psql -U catalyst-event-dev -d CatalystEventDev -f test_data/10_review_rating_table.sql ${@} +psql -U catalyst-event-dev -d CatalystEventDev -f test_data/11_objective_review_metric_table.sql ${@} ''' # Install historic data for past events diff --git a/book/src/07_web_api/openapi/core_backend_api.yaml b/book/src/07_web_api/openapi/core_backend_api.yaml index 173e2dd0bf..bfe40942aa 100644 --- a/book/src/07_web_api/openapi/core_backend_api.yaml +++ b/book/src/07_web_api/openapi/core_backend_api.yaml @@ -869,6 +869,11 @@ components: description: Individual Objective Details type: object properties: + groups: + type: array + description: The valid voter groups for this voting event. + items: + $ref: '#/components/schemas/VoterGroup' reward: $ref: '#/components/schemas/RewardDefinition' description: |- @@ -1270,7 +1275,7 @@ components: VoterGroup: type: object properties: - id: + group: $ref: '#/components/schemas/VoterGroupId' voting_token: type: string diff --git a/src/cat-data-service/src/service/v1/event/objective/mod.rs b/src/cat-data-service/src/service/v1/event/objective/mod.rs index 74c0c52e9c..c681a88b21 100644 --- a/src/cat-data-service/src/service/v1/event/objective/mod.rs +++ b/src/cat-data-service/src/service/v1/event/objective/mod.rs @@ -66,7 +66,7 @@ mod tests { }; use event_db::types::event::objective::{ ObjectiveDetails, ObjectiveId, ObjectiveSummary, ObjectiveSupplementalData, ObjectiveType, - RewardDefintion, + RewardDefintion, VoterGroup, }; use serde_json::json; use tower::ServiceExt; @@ -97,6 +97,16 @@ mod tests { description: "description 1".to_string(), }, details: ObjectiveDetails { + groups: vec![ + VoterGroup { + group: Some("direct".to_string()), + voting_token: Some("voting token 1".to_string()), + }, + VoterGroup { + group: Some("rep".to_string()), + voting_token: Some("voting token 2".to_string()), + } + ], reward: Some(RewardDefintion { currency: "ADA".to_string(), value: 100 @@ -121,6 +131,7 @@ mod tests { description: "description 2".to_string(), }, details: ObjectiveDetails { + groups: Vec::new(), reward: None, supplemental: None, } @@ -149,6 +160,16 @@ mod tests { description: "description 1".to_string(), }, details: ObjectiveDetails { + groups: vec![ + VoterGroup { + group: Some("direct".to_string()), + voting_token: Some("voting token 1".to_string()), + }, + VoterGroup { + group: Some("rep".to_string()), + voting_token: Some("voting token 2".to_string()), + } + ], reward: Some(RewardDefintion { currency: "ADA".to_string(), value: 100 @@ -185,6 +206,7 @@ mod tests { description: "description 2".to_string(), }, details: ObjectiveDetails { + groups: Vec::new(), reward: None, supplemental: None, } diff --git a/src/event-db/src/queries/event/objective.rs b/src/event-db/src/queries/event/objective.rs index a399e5d3ba..22cd321a66 100644 --- a/src/event-db/src/queries/event/objective.rs +++ b/src/event-db/src/queries/event/objective.rs @@ -3,7 +3,7 @@ use crate::{ types::event::{ objective::{ Objective, ObjectiveDetails, ObjectiveId, ObjectiveSummary, ObjectiveSupplementalData, - ObjectiveType, RewardDefintion, + ObjectiveType, RewardDefintion, VoterGroup, }, EventId, }, @@ -23,12 +23,17 @@ pub trait ObjectiveQueries: Sync + Send + 'static { impl EventDB { const OBJECTIVES_QUERY: &'static str = - "SELECT objective.id, objective.title, objective.description, objective.rewards_currency, objective.rewards_total, objective.extra, + "SELECT objective.row_id, objective.id, objective.title, objective.description, objective.rewards_currency, objective.rewards_total, objective.extra, objective_category.name, objective_category.description as objective_category_description FROM objective INNER JOIN objective_category on objective.category = objective_category.name WHERE objective.event = $1 LIMIT $2 OFFSET $3;"; + + const VOTING_GROPUS_QEURY: &'static str = + "SELECT voteplan.group_id as group, voteplan.token_id as voting_token + FROM voteplan + WHERE objective_id = $1;"; } #[async_trait] @@ -50,6 +55,7 @@ impl ObjectiveQueries for EventDB { let mut objectives = Vec::new(); for row in rows { + let row_id: i32 = row.try_get("row_id")?; let summary = ObjectiveSummary { id: ObjectiveId(row.try_get("id")?), objective_type: ObjectiveType { @@ -65,7 +71,23 @@ impl ObjectiveQueries for EventDB { (Some(currency), Some(value)) => Some(RewardDefintion { currency, value }), _ => None, }; + + let mut groups = Vec::new(); + let rows = conn.query(Self::VOTING_GROPUS_QEURY, &[&row_id]).await?; + for row in rows { + let group: Option<_> = row.try_get("group")?; + let voting_token: Option<_> = row.try_get("voting_token")?; + match (group, voting_token) { + (None, None) => {} + (group, voting_token) => groups.push(VoterGroup { + group, + voting_token, + }), + } + } + let details = ObjectiveDetails { + groups, reward, supplemental: row .try_get::<_, Option>("extra")? @@ -122,6 +144,16 @@ mod tests { description: "description 1".to_string(), }, details: ObjectiveDetails { + groups: vec![ + VoterGroup { + group: Some("direct".to_string()), + voting_token: Some("voting token 1".to_string()), + }, + VoterGroup { + group: Some("rep".to_string()), + voting_token: Some("voting token 2".to_string()), + } + ], reward: Some(RewardDefintion { currency: "ADA".to_string(), value: 100 @@ -146,6 +178,7 @@ mod tests { description: "description 2".to_string(), }, details: ObjectiveDetails { + groups: Vec::new(), reward: None, supplemental: None, } @@ -170,6 +203,16 @@ mod tests { description: "description 1".to_string(), }, details: ObjectiveDetails { + groups: vec![ + VoterGroup { + group: Some("direct".to_string()), + voting_token: Some("voting token 1".to_string()), + }, + VoterGroup { + group: Some("rep".to_string()), + voting_token: Some("voting token 2".to_string()), + } + ], reward: Some(RewardDefintion { currency: "ADA".to_string(), value: 100 @@ -202,6 +245,7 @@ mod tests { description: "description 2".to_string(), }, details: ObjectiveDetails { + groups: Vec::new(), reward: None, supplemental: None, } diff --git a/src/event-db/src/types/event/mod.rs b/src/event-db/src/types/event/mod.rs index 713f9239da..992a358f2d 100644 --- a/src/event-db/src/types/event/mod.rs +++ b/src/event-db/src/types/event/mod.rs @@ -122,12 +122,6 @@ pub struct EventSchedule { pub tallying_end: Option>, } -#[derive(Debug, Serialize, Clone, PartialEq, Eq, Deserialize)] -pub struct VoterGroup { - pub id: String, - pub voting_token: String, -} - #[derive(Debug, Serialize, Clone, PartialEq, Eq)] pub struct EventDetails { pub voting_power: VotingPowerSettings, @@ -416,25 +410,6 @@ mod tests { ); } - #[test] - fn voter_group_json_test() { - let voter_group = VoterGroup { - id: "rep".to_string(), - voting_token: "voting token 1".to_string(), - }; - - let json = serde_json::to_value(&voter_group).unwrap(); - assert_eq!( - json, - json!( - { - "id": "rep", - "voting_token": "voting token 1", - } - ) - ); - } - #[test] fn event_details_json_test() { let event_details = EventDetails { diff --git a/src/event-db/src/types/event/objective.rs b/src/event-db/src/types/event/objective.rs index bf8c1fd4f9..0d922e17ff 100644 --- a/src/event-db/src/types/event/objective.rs +++ b/src/event-db/src/types/event/objective.rs @@ -25,16 +25,19 @@ pub struct RewardDefintion { pub value: i64, } -#[derive(Debug, Clone, Serialize, PartialEq, Eq)] -pub struct GroupBallotType { - pub group: String, - pub ballot: String, +#[derive(Debug, Serialize, Clone, PartialEq, Eq, Deserialize)] +pub struct VoterGroup { + #[serde(skip_serializing_if = "Option::is_none")] + pub group: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub voting_token: Option, } #[derive(Debug, Clone, Serialize, PartialEq, Eq)] pub struct ObjectiveSupplementalData(pub Value); #[derive(Debug, Clone, Serialize, PartialEq, Eq)] pub struct ObjectiveDetails { + pub groups: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub reward: Option, #[serde(skip_serializing_if = "Option::is_none")] @@ -122,25 +125,31 @@ mod tests { } #[test] - fn group_ballot_type_json_test() { - let group_ballot_type = GroupBallotType { - group: "rep".to_string(), - ballot: "public".to_string(), + fn voter_group_json_test() { + let voter_group = VoterGroup { + group: Some("rep".to_string()), + voting_token: Some("voting token 1".to_string()), }; - let json = serde_json::to_value(&group_ballot_type).unwrap(); + let json = serde_json::to_value(&voter_group).unwrap(); assert_eq!( json, - json!({ - "group": "rep", - "ballot": "public", - }) + json!( + { + "group": "rep", + "voting_token": "voting token 1", + } + ) ); } #[test] fn objective_details_json_test() { let objective_details = ObjectiveDetails { + groups: vec![VoterGroup { + group: Some("rep".to_string()), + voting_token: Some("voting token 1".to_string()), + }], reward: Some(RewardDefintion { currency: "ADA".to_string(), value: 100, @@ -159,6 +168,12 @@ mod tests { json, json!( { + "groups": [ + { + "group": "rep", + "voting_token": "voting token 1", + } + ], "reward": { "currency": "ADA", "value": 100, diff --git a/src/event-db/test_data/07_voteplan_table.sql b/src/event-db/test_data/07_voteplan_table.sql new file mode 100644 index 0000000000..61e185244c --- /dev/null +++ b/src/event-db/test_data/07_voteplan_table.sql @@ -0,0 +1,7 @@ +INSERT INTO voteplan +(row_id, objective_id, id, category, group_id, token_id) +VALUES +(1, 1, '1', 'public', 'direct', 'voting token 1'), +(2, 1, '2', 'public', 'rep', 'voting token 2'), +(3, 2, '2', 'public', NULL, NULL), +(4, 2, '2', 'public', NULL, NULL); \ No newline at end of file diff --git a/src/event-db/test_data/07_proposal_table.sql b/src/event-db/test_data/08_proposal_table.sql similarity index 100% rename from src/event-db/test_data/07_proposal_table.sql rename to src/event-db/test_data/08_proposal_table.sql diff --git a/src/event-db/test_data/08_proposal_review_table.sql b/src/event-db/test_data/09_proposal_review_table.sql similarity index 100% rename from src/event-db/test_data/08_proposal_review_table.sql rename to src/event-db/test_data/09_proposal_review_table.sql diff --git a/src/event-db/test_data/09_review_rating_table.sql b/src/event-db/test_data/10_review_rating_table.sql similarity index 100% rename from src/event-db/test_data/09_review_rating_table.sql rename to src/event-db/test_data/10_review_rating_table.sql diff --git a/src/event-db/test_data/10_objective_review_metric_table.sql b/src/event-db/test_data/11_objective_review_metric_table.sql similarity index 100% rename from src/event-db/test_data/10_objective_review_metric_table.sql rename to src/event-db/test_data/11_objective_review_metric_table.sql