09b68a8204
* Revert "NS API with directory v2 (#5068)"
This reverts commit cf4fe5f875.
* Merge pull request #5050 from nymtech/dz-node-status-api
Node Status API
* Ns agent workflow (#5055)
* feat: add dockerfile
* add github workflow for node status agent
---------
Co-authored-by: Fran Arbanas <arbanasfran@gmail.com>
* NS API with directory v2 (#5058)
* Use unstable explorer client
* Clean up stale testruns & logging
- log gw identity key
- better agent testrun logging
- log responses
- change response code for agents
* Better logging on agent
* Testrun stores gw identity key instead of gw pk
* Agent 0.1.3
* Agent 0.1.4
* Sqlx offline query data + clippy
* Compatible with directory v2
* Point to internal deps + rebase + v0.1.5
* self described field not null
* Fix build.rs typo
* Fix clippy
---------
Co-authored-by: Fran Arbanas <arbanasfran@gmail.com>
72 lines
2.0 KiB
Rust
72 lines
2.0 KiB
Rust
use models::{Gateway, GatewaySkinny, Mixnode, Service};
|
|
|
|
pub(crate) mod api;
|
|
pub(crate) mod api_docs;
|
|
pub(crate) mod error;
|
|
pub(crate) mod models;
|
|
pub(crate) mod server;
|
|
pub(crate) mod state;
|
|
|
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, utoipa::ToSchema)]
|
|
// exclude generic from auto-discovery
|
|
#[utoipauto::utoipa_ignore]
|
|
// https://docs.rs/utoipa/latest/utoipa/derive.ToSchema.html#generic-schemas-with-aliases
|
|
// Generic structs can only be included via aliases, not directly, because they
|
|
// it would cause an error in generated Swagger docs.
|
|
// Instead, you have to manually monomorphize each generic struct that
|
|
// you wish to document
|
|
#[aliases(
|
|
PagedGateway = PagedResult<Gateway>,
|
|
PagedGatewaySkinny = PagedResult<GatewaySkinny>,
|
|
PagedMixnode = PagedResult<Mixnode>,
|
|
PagedService = PagedResult<Service>,
|
|
)]
|
|
pub struct PagedResult<T> {
|
|
pub page: usize,
|
|
pub size: usize,
|
|
pub total: usize,
|
|
pub items: Vec<T>,
|
|
}
|
|
|
|
impl<T: Clone> PagedResult<T> {
|
|
pub fn paginate(pagination: Pagination, res: Vec<T>) -> Self {
|
|
let total = res.len();
|
|
let (size, mut page) = pagination.intoto_inner_values();
|
|
|
|
if page * size > total {
|
|
page = total / size;
|
|
}
|
|
|
|
let chunks: Vec<&[T]> = res.chunks(size).collect();
|
|
|
|
PagedResult {
|
|
page,
|
|
size,
|
|
total,
|
|
items: chunks.get(page).cloned().unwrap_or_default().into(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, utoipa::IntoParams)]
|
|
#[into_params(parameter_in = Query)]
|
|
pub(crate) struct Pagination {
|
|
size: Option<usize>,
|
|
page: Option<usize>,
|
|
}
|
|
|
|
impl Pagination {
|
|
// unwrap stored values or use predefined defaults
|
|
pub(crate) fn intoto_inner_values(self) -> (usize, usize) {
|
|
const SIZE_DEFAULT: usize = 10;
|
|
const SIZE_MAX: usize = 200;
|
|
|
|
const PAGE_DEFAULT: usize = 0;
|
|
|
|
(
|
|
self.size.unwrap_or(SIZE_DEFAULT).min(SIZE_MAX),
|
|
self.page.unwrap_or(PAGE_DEFAULT),
|
|
)
|
|
}
|
|
}
|