use std::sync::Arc;
use axum::extract::{Path, State};
use axum::http::{header, HeaderMap, StatusCode};
use axum::response::IntoResponse;
use axum::routing::get;
use axum::Router;
use crate::admin_lambda_artifacts::check_bearer;
use fakecloud_elasticache::runtime::PendingRdb;
#[derive(Clone)]
pub struct RdbRoutesContext {
pub pending_rdb: PendingRdb,
pub bearer_token: Arc<String>,
}
pub fn router(ctx: RdbRoutesContext) -> Router {
Router::new()
.route(
"/_fakecloud/elasticache/_internal/rdb/{pod}",
get(serve_rdb),
)
.with_state(ctx)
}
async fn serve_rdb(
State(ctx): State<RdbRoutesContext>,
Path(pod): Path<String>,
headers: HeaderMap,
) -> axum::response::Response {
if check_bearer(&headers, &ctx.bearer_token).is_err() {
return StatusCode::UNAUTHORIZED.into_response();
}
match ctx.pending_rdb.read().get(&pod).cloned() {
Some(bytes) => {
([(header::CONTENT_TYPE, "application/octet-stream")], bytes).into_response()
}
None => StatusCode::NOT_FOUND.into_response(),
}
}