mirror of
https://github.com/getnora-io/nora.git
synced 2026-04-12 05:40:31 +00:00
Cloud-native multi-protocol artifact registry in Rust. - Docker Registry v2 - Maven (+ proxy) - npm (+ proxy) - Cargo, PyPI - Web UI, Swagger, Prometheus - Local & S3 storage - 32MB Docker image Created by DevITWay https://getnora.io
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
use crate::AppState;
|
|
use axum::{
|
|
extract::{Path, State},
|
|
http::StatusCode,
|
|
response::{IntoResponse, Response},
|
|
routing::get,
|
|
Router,
|
|
};
|
|
use std::sync::Arc;
|
|
|
|
pub fn routes() -> Router<Arc<AppState>> {
|
|
Router::new()
|
|
.route("/cargo/api/v1/crates/{crate_name}", get(get_metadata))
|
|
.route(
|
|
"/cargo/api/v1/crates/{crate_name}/{version}/download",
|
|
get(download),
|
|
)
|
|
}
|
|
|
|
async fn get_metadata(
|
|
State(state): State<Arc<AppState>>,
|
|
Path(crate_name): Path<String>,
|
|
) -> Response {
|
|
let key = format!("cargo/{}/metadata.json", crate_name);
|
|
match state.storage.get(&key).await {
|
|
Ok(data) => (StatusCode::OK, data).into_response(),
|
|
Err(_) => StatusCode::NOT_FOUND.into_response(),
|
|
}
|
|
}
|
|
|
|
async fn download(
|
|
State(state): State<Arc<AppState>>,
|
|
Path((crate_name, version)): Path<(String, String)>,
|
|
) -> Response {
|
|
let key = format!(
|
|
"cargo/{}/{}/{}-{}.crate",
|
|
crate_name, version, crate_name, version
|
|
);
|
|
match state.storage.get(&key).await {
|
|
Ok(data) => (StatusCode::OK, data).into_response(),
|
|
Err(_) => StatusCode::NOT_FOUND.into_response(),
|
|
}
|
|
}
|