use affinidi_status_list::StatusPurpose;
use axum::extract::{Path, State};
use axum::http::{HeaderValue, StatusCode, header};
use axum::response::{IntoResponse, Response};
use serde_json::Value as JsonValue;
use vti_common::error::AppError;
use crate::server::AppState;
use crate::status_list;
fn parse_purpose(s: &str) -> Option<StatusPurpose> {
match s {
"revocation" => Some(StatusPurpose::Revocation),
"suspension" => Some(StatusPurpose::Suspension),
_ => None,
}
}
pub async fn show(
State(state): State<AppState>,
Path(purpose_str): Path<String>,
) -> Result<Response, AppError> {
let purpose = parse_purpose(&purpose_str).ok_or_else(|| {
AppError::NotFound(format!(
"unknown status-list purpose '{purpose_str}' \
(expected 'revocation' or 'suspension')"
))
})?;
let signer = state.credential_signer.as_ref().ok_or_else(|| {
AppError::Internal(format!(
"credential signer not initialised — status list for {purpose} unavailable"
))
})?;
let row = status_list::get_state(&state.status_lists_ks, purpose).await?;
let row = row.ok_or_else(|| {
AppError::NotFound(format!(
"status list for {purpose} not provisioned — \
set `public_url` and restart the daemon to initialise"
))
})?;
let vc = status_list::build_status_list_credential(signer, &row).await?;
let body = serde_json::to_value(&vc)
.map_err(|e| AppError::Internal(format!("status-list VC serialize: {e}")))?;
Ok((
StatusCode::OK,
[
(header::CACHE_CONTROL, HeaderValue::from_static("no-store")),
(
header::CONTENT_TYPE,
HeaderValue::from_static("application/json"),
),
],
axum::Json::<JsonValue>(body),
)
.into_response())
}