use crate::{json_error, require_admin, RouterContext};
use pylon_http::HttpMethod;
pub(crate) fn handle(
ctx: &RouterContext,
method: HttpMethod,
url: &str,
_body: &str,
_auth_token: Option<&str>,
) -> Option<(u16, String)> {
let tail = url.strip_prefix("/api/admin/ops/")?;
if method != HttpMethod::Get {
return Some((
405,
json_error("METHOD_NOT_ALLOWED", "Only GET is supported here"),
));
}
if let Some(err) = require_admin(ctx) {
return Some(err);
}
let body = match tail {
"jobs" => jobs_view(ctx),
"workflows" => workflows_view(ctx),
"scheduler" => scheduler_view(ctx),
"search_indexes" => search_indexes_view(ctx),
other => {
return Some((
404,
json_error(
"UNKNOWN_OPS_TABLE",
&format!(
"Unknown ops table \"{other}\". Valid: jobs, workflows, scheduler, search_indexes"
),
),
));
}
};
Some((
200,
serde_json::to_string(&body).unwrap_or_else(|_| "[]".into()),
))
}
fn jobs_view(ctx: &RouterContext) -> serde_json::Value {
let raw = ctx.jobs.list_jobs(None, None, 1000);
extract_rows(raw)
}
fn workflows_view(ctx: &RouterContext) -> serde_json::Value {
let raw = ctx.workflows.list(None);
extract_rows(raw)
}
fn scheduler_view(ctx: &RouterContext) -> serde_json::Value {
let raw = ctx.scheduler.list_tasks();
extract_rows(raw)
}
fn search_indexes_view(ctx: &RouterContext) -> serde_json::Value {
let manifest = ctx.store.manifest();
let mut rows = Vec::new();
for ent in &manifest.entities {
let Some(cfg) = &ent.search else { continue };
if cfg.is_empty() {
continue;
}
rows.push(serde_json::json!({
"id": ent.name.clone(),
"entity": ent.name.clone(),
"text_fields": cfg.text.clone(),
"facet_fields": cfg.facets.clone(),
"sortable_fields": cfg.sortable.clone(),
"fts_table": format!("_fts_{}", ent.name),
}));
}
serde_json::Value::Array(rows)
}
fn extract_rows(v: serde_json::Value) -> serde_json::Value {
if let Some(arr) = v.as_array() {
return serde_json::Value::Array(arr.clone());
}
if let Some(obj) = v.as_object() {
if let Some(rows) = obj.get("rows") {
return rows.clone();
}
if let Some(jobs) = obj.get("jobs") {
return jobs.clone();
}
return serde_json::Value::Array(vec![v]);
}
serde_json::Value::Array(Vec::new())
}