use axum::Json;
use axum::extract::{Query, State};
use serde::Deserialize;
use serde_json::{Value, json};
use crate::admin;
use crate::webadmin::AdminState;
use crate::webadmin::error::AdminError;
use crate::webadmin::handlers::paging::{PageParams, page_envelope};
use crate::webadmin::handlers::params::empty_is_absent;
use crate::webadmin::session::Authenticated;
#[derive(Debug, Deserialize, Default)]
pub struct ExpiringListParams {
#[serde(default, deserialize_with = "empty_is_absent")]
pub profile: Option<String>,
pub days: Option<u64>,
#[serde(default, deserialize_with = "empty_is_absent")]
pub superseded: Option<String>,
pub limit: Option<i64>,
pub offset: Option<i64>,
}
impl ExpiringListParams {
pub(crate) fn lead_days(&self, config: &acme_proxy_core::config::Config) -> u64 {
self.days
.unwrap_or_else(|| acme_proxy_store::expiring::default_lead_days(config))
}
pub(crate) fn include_superseded(&self) -> bool {
self.superseded.as_deref() != Some("hide")
}
}
pub async fn list_expiring(
State(state): State<AdminState>,
Query(params): Query<ExpiringListParams>,
_auth: Authenticated,
) -> Result<Json<Value>, AdminError> {
let page = PageParams::from(params.limit, params.offset).resolve(&state.config);
let days = params.lead_days(&state.config);
let query = acme_proxy_store::expiring::ExpiringQuery {
profile: params.profile.clone(),
before: acme_proxy_store::expiring::expiring_horizon(days),
include_superseded: params.include_superseded(),
limit: page.limit,
offset: page.offset,
};
let (entries, total, hidden) =
acme_proxy_store::expiring::list_expiring(&query, state.database.clone()).await?;
let items = entries.iter().map(admin::render_expiring_json).collect();
let mut envelope = page_envelope(items, total, page);
if let Some(object) = envelope.as_object_mut() {
object.insert("hidden".to_string(), json!(hidden));
object.insert("days".to_string(), json!(days));
}
Ok(Json(envelope))
}