diff --git a/radicle-httpd/src/api.rs b/radicle-httpd/src/api.rs index ac5056bd3..51c937cec 100644 --- a/radicle-httpd/src/api.rs +++ b/radicle-httpd/src/api.rs @@ -25,6 +25,7 @@ use radicle::Profile; mod error; mod json; +pub(crate) mod query; mod v1; use crate::api::error::Error; @@ -154,87 +155,6 @@ async fn root_handler() -> impl IntoResponse { Json(response) } -#[derive(Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PaginationQuery { - #[serde(default)] - pub show: RepoQuery, - pub page: Option, - pub per_page: Option, -} - -#[derive(Serialize, Deserialize, Clone, Default)] -#[serde(rename_all = "camelCase")] -pub enum RepoQuery { - All, - #[default] - Pinned, -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct RawQuery { - pub mime: Option, -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct CobsQuery { - pub page: Option, - pub per_page: Option, - pub status: Option, -} - -#[derive(Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PoliciesQuery { - /// The NID from which to fetch from after tracking a repo. - pub from: Option, - pub scope: Option, -} - -#[derive(Default, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub enum IssueStatus { - Closed, - #[default] - Open, - All, -} - -impl IssueStatus { - pub fn matches(&self, issue: &issue::State) -> bool { - match self { - Self::Open => matches!(issue, issue::State::Open), - Self::Closed => matches!(issue, issue::State::Closed { .. }), - Self::All => true, - } - } -} - -#[derive(Default, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub enum PatchStatus { - #[default] - Open, - Draft, - Archived, - Merged, - All, -} - -impl PatchStatus { - pub fn matches(&self, patch: &patch::State) -> bool { - match self { - Self::Open => matches!(patch, patch::State::Open { .. }), - Self::Draft => matches!(patch, patch::State::Draft), - Self::Archived => matches!(patch, patch::State::Archived), - Self::Merged => matches!(patch, patch::State::Merged { .. }), - Self::All => true, - } - } -} - mod search { use std::cmp::Ordering; use std::collections::BTreeMap; diff --git a/radicle-httpd/src/api/query.rs b/radicle-httpd/src/api/query.rs new file mode 100644 index 000000000..9e3cf9690 --- /dev/null +++ b/radicle-httpd/src/api/query.rs @@ -0,0 +1,86 @@ +use serde::{Deserialize, Serialize}; + +use radicle::cob::{issue, patch}; +use radicle::node::policy::Scope; +use radicle::node::NodeId; + +#[derive(Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct PaginationQuery { + #[serde(default)] + pub show: RepoQuery, + pub page: Option, + pub per_page: Option, +} + +#[derive(Serialize, Deserialize, Clone, Default)] +#[serde(rename_all = "camelCase")] +pub enum RepoQuery { + All, + #[default] + Pinned, +} + +#[derive(Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct RawQuery { + pub mime: Option, +} + +#[derive(Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct CobsQuery { + pub page: Option, + pub per_page: Option, + pub status: Option, +} + +#[derive(Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct PoliciesQuery { + /// The NID from which to fetch from after tracking a repo. + pub from: Option, + pub scope: Option, +} + +#[derive(Default, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub enum IssueStatus { + Closed, + #[default] + Open, + All, +} + +impl IssueStatus { + pub fn matches(&self, issue: &issue::State) -> bool { + match self { + Self::Open => matches!(issue, issue::State::Open), + Self::Closed => matches!(issue, issue::State::Closed { .. }), + Self::All => true, + } + } +} + +#[derive(Default, Serialize, Deserialize, Clone)] +#[serde(rename_all = "camelCase")] +pub enum PatchStatus { + #[default] + Open, + Draft, + Archived, + Merged, + All, +} + +impl PatchStatus { + pub fn matches(&self, patch: &patch::State) -> bool { + match self { + Self::Open => matches!(patch, patch::State::Open { .. }), + Self::Draft => matches!(patch, patch::State::Draft), + Self::Archived => matches!(patch, patch::State::Archived), + Self::Merged => matches!(patch, patch::State::Merged { .. }), + Self::All => true, + } + } +} diff --git a/radicle-httpd/src/api/v1/delegates.rs b/radicle-httpd/src/api/v1/delegates.rs index 145076de6..f7442ef6b 100644 --- a/radicle-httpd/src/api/v1/delegates.rs +++ b/radicle-httpd/src/api/v1/delegates.rs @@ -7,7 +7,8 @@ use radicle::identity::Did; use radicle::storage::ReadStorage; use crate::api::error::Error; -use crate::api::{Context, PaginationQuery, RepoQuery}; +use crate::api::query::{PaginationQuery, RepoQuery}; +use crate::api::Context; use crate::axum_extra::{Path, Query}; pub fn router(ctx: Context) -> Router { diff --git a/radicle-httpd/src/api/v1/repos.rs b/radicle-httpd/src/api/v1/repos.rs index ba9b63298..776ecaabd 100644 --- a/radicle-httpd/src/api/v1/repos.rs +++ b/radicle-httpd/src/api/v1/repos.rs @@ -18,8 +18,9 @@ use radicle::storage::{ReadRepository, ReadStorage, RemoteRepository}; use crate::api; use crate::api::error::Error; +use crate::api::query::{CobsQuery, PaginationQuery, RepoQuery}; use crate::api::search::{SearchQueryString, SearchResult}; -use crate::api::{CobsQuery, Context, PaginationQuery, RepoQuery}; +use crate::api::Context; use crate::axum_extra::{cached_response, immutable_response, Path, Query}; const MAX_BODY_LIMIT: usize = 4_194_304; @@ -569,7 +570,7 @@ async fn readme_handler( async fn issues_handler( State(ctx): State, Path(rid): Path, - Query(qs): Query>, + Query(qs): Query>, ) -> impl IntoResponse { let (repo, _) = ctx.repo(rid)?; let CobsQuery { @@ -623,7 +624,7 @@ async fn issue_handler( async fn patches_handler( State(ctx): State, Path(rid): Path, - Query(qs): Query>, + Query(qs): Query>, ) -> impl IntoResponse { let (repo, _) = ctx.repo(rid)?; let CobsQuery { diff --git a/radicle-httpd/src/raw.rs b/radicle-httpd/src/raw.rs index cce1f3376..e3287bb6b 100644 --- a/radicle-httpd/src/raw.rs +++ b/radicle-httpd/src/raw.rs @@ -15,7 +15,7 @@ use radicle::profile::Profile; use radicle::storage::{ReadRepository, ReadStorage}; use radicle_surf::{Oid, Repository}; -use crate::api::RawQuery; +use crate::api::query::RawQuery; use crate::axum_extra::Path; use crate::error::RawError as Error;