1use anyhow::Result;
2use std::path::Path;
3
4pub fn run(
5 root: &Path,
6 username: Option<&str>,
7 device: Option<&str>,
8 all: bool,
9) -> Result<()> {
10 let config = apm_core::config::Config::load(root)?;
11 let url = format!("{}/api/auth/sessions", config.server.url);
12 let body = serde_json::json!({
13 "username": username,
14 "device": device,
15 "all": all,
16 });
17 let client = reqwest::blocking::Client::new();
18 let resp = client
19 .delete(&url)
20 .json(&body)
21 .send()
22 .map_err(|e| anyhow::anyhow!("error: cannot connect to apm-server: {e}"))?;
23 if !resp.status().is_success() {
24 let status = resp.status();
25 eprintln!("error: server returned {status}");
26 std::process::exit(1);
27 }
28 let json: serde_json::Value = resp
29 .json()
30 .map_err(|e| anyhow::anyhow!("error: invalid response from server: {e}"))?;
31 let revoked = json
32 .get("revoked")
33 .and_then(|v| v.as_u64())
34 .ok_or_else(|| anyhow::anyhow!("error: missing revoked field in response"))? as usize;
35 if revoked == 0 {
36 if let Some(u) = username {
37 println!("No sessions found for {u}.");
38 } else {
39 println!("Revoked 0 session(s).");
40 }
41 } else {
42 println!("Revoked {revoked} session(s).");
43 }
44 Ok(())
45}