mod pagination; use crate::db; use pagination::PaginatedResponse; use axum::{ extract::{Path, Query, State}, routing::get, Json, Router, }; pub fn router() -> Router { Router::new() .route("/repos", get(get_repos)) .route("/repos/:id", get(get_single_repo)) .route("/packages", get(get_packages)) .route("/packages/:id", get(get_single_package)) } async fn get_repos( State(global): State, Query(pagination): Query, Query(filter): Query, ) -> crate::Result>> { let items = db::query::repo::page(&global.db, pagination.per_page, pagination.page - 1, filter).await?; Ok(Json(pagination.res(items))) } async fn get_single_repo( State(global): State, Path(id): Path, ) -> crate::Result> { let repo = db::query::repo::by_id(&global.db, id) .await? .ok_or(axum::http::StatusCode::NOT_FOUND)?; Ok(Json(repo)) } async fn get_packages( State(global): State, Query(pagination): Query, Query(filter): Query, ) -> crate::Result>> { let items = db::query::package::page(&global.db, pagination.per_page, pagination.page - 1, filter) .await?; Ok(Json(pagination.res(items))) } async fn get_single_package( State(global): State, Path(id): Path, ) -> crate::Result> { let entry = db::query::package::full(&global.db, id) .await? .ok_or(axum::http::StatusCode::NOT_FOUND)?; Ok(Json(entry)) }