diff --git a/swagger.yml b/swagger.yml index ae6e101b..aac69936 100644 --- a/swagger.yml +++ b/swagger.yml @@ -394,16 +394,17 @@ paths: - in: query name: status schema: - type: string - enum: - [ - pending, - votingPeriod, - passed, - rejected, - executedPassed, - executedRejected, - ] + type: array + items: + enum: + [ + pending, + votingPeriod, + passed, + rejected, + executedPassed, + executedRejected, + ] description: The status of the proposal - in: query name: kind @@ -438,16 +439,17 @@ paths: - in: query name: status schema: - type: string - enum: - [ - pending, - votingPeriod, - passed, - rejected, - executedPassed, - executedRejected, - ] + type: array + items: + enum: + [ + pending, + votingPeriod, + passed, + rejected, + executedPassed, + executedRejected, + ] description: The status of the proposal - in: query name: kind diff --git a/webserver/src/dto/governance.rs b/webserver/src/dto/governance.rs index 0b5c7f8f..33167121 100644 --- a/webserver/src/dto/governance.rs +++ b/webserver/src/dto/governance.rs @@ -25,7 +25,7 @@ pub enum ProposalKind { pub struct ProposalQueryParams { #[validate(range(min = 1, max = 10000))] pub page: Option, - pub status: Option, + pub status: Option>, pub kind: Option, pub pattern: Option, } diff --git a/webserver/src/handler/governance.rs b/webserver/src/handler/governance.rs index 617f60cd..7d3625f1 100644 --- a/webserver/src/handler/governance.rs +++ b/webserver/src/handler/governance.rs @@ -1,6 +1,7 @@ use axum::Json; use axum::extract::{Path, Query, State}; use axum::http::HeaderMap; +use axum_extra::extract::Query as QueryExt; use axum_macros::debug_handler; use crate::dto::governance::{ProposalQueryParams, ProposalVotesQueryparams}; @@ -13,7 +14,7 @@ use crate::state::common::CommonState; #[debug_handler] pub async fn get_governance_proposals( _headers: HeaderMap, - Query(query): Query, + QueryExt(query): QueryExt, State(state): State, ) -> Result>>, ApiError> { let page = query.page.unwrap_or(1); @@ -35,7 +36,7 @@ pub async fn get_governance_proposals( #[debug_handler] pub async fn get_all_governance_proposals( _headers: HeaderMap, - Query(query): Query, + QueryExt(query): QueryExt, State(state): State, ) -> Result>, ApiError> { let proposals = state diff --git a/webserver/src/repository/governance.rs b/webserver/src/repository/governance.rs index 9e3a862d..b6577ee9 100644 --- a/webserver/src/repository/governance.rs +++ b/webserver/src/repository/governance.rs @@ -25,7 +25,7 @@ pub trait GovernanceRepoTrait { async fn find_governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, page: i64, @@ -33,7 +33,7 @@ pub trait GovernanceRepoTrait { async fn find_all_governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, ) -> Result, String>; @@ -69,7 +69,7 @@ impl GovernanceRepoTrait for GovernanceRepo { async fn find_governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, page: i64, @@ -91,7 +91,7 @@ impl GovernanceRepoTrait for GovernanceRepo { async fn find_all_governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, ) -> Result, String> { @@ -187,15 +187,15 @@ impl GovernanceRepoTrait for GovernanceRepo { impl<'a> GovernanceRepo { fn governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, ) -> IntoBoxed<'a, governance_proposals::table, Pg> { let mut query = governance_proposals::table.into_boxed(); if let Some(status) = status { - query = query - .filter(governance_proposals::dsl::result.eq(status.clone())) + query = + query.filter(governance_proposals::dsl::result.eq_any(status)) } if let Some(kind) = kind { diff --git a/webserver/src/service/governance.rs b/webserver/src/service/governance.rs index 9692b08a..7441f0bf 100644 --- a/webserver/src/service/governance.rs +++ b/webserver/src/service/governance.rs @@ -25,7 +25,7 @@ impl GovernanceService { pub async fn find_governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, page: u64, @@ -83,7 +83,7 @@ impl GovernanceService { pub async fn find_all_governance_proposals( &self, - status: Option, + status: Option>, kind: Option, pattern: Option, ) -> Result, GovernanceError> { @@ -232,21 +232,31 @@ impl GovernanceService { fn map_status( &self, - status: Option, - ) -> Option { - status.map(|s| match s { - ProposalStatus::Pending => GovernanceProposalResultDb::Pending, - ProposalStatus::VotingPeriod => { - GovernanceProposalResultDb::VotingPeriod - } - ProposalStatus::Passed => GovernanceProposalResultDb::Passed, - ProposalStatus::Rejected => GovernanceProposalResultDb::Rejected, - ProposalStatus::ExecutedPassed => { - GovernanceProposalResultDb::ExecutedPassed - } - ProposalStatus::ExecutedRejected => { - GovernanceProposalResultDb::ExecutedRejected - } + status: Option>, + ) -> Option> { + status.map(|s| { + s.iter() + .map(|s| match s { + ProposalStatus::Pending => { + GovernanceProposalResultDb::Pending + } + ProposalStatus::VotingPeriod => { + GovernanceProposalResultDb::VotingPeriod + } + ProposalStatus::Passed => { + GovernanceProposalResultDb::Passed + } + ProposalStatus::Rejected => { + GovernanceProposalResultDb::Rejected + } + ProposalStatus::ExecutedPassed => { + GovernanceProposalResultDb::ExecutedPassed + } + ProposalStatus::ExecutedRejected => { + GovernanceProposalResultDb::ExecutedRejected + } + }) + .collect() }) }