1use super::client::DiscourseClient;
2use super::error::http_error;
3use anyhow::{Context, Result};
4use serde_json::Value;
5
6impl DiscourseClient {
7 pub fn create_backup(&self) -> Result<()> {
9 let payload = [("with_uploads", "true")];
10 let response =
11 self.send_retrying(|| Ok(self.post("/admin/backups.json")?.form(&payload)))?;
12 let status = response.status();
13 let text = response.text().context("reading backup create response")?;
14 if !status.is_success() {
15 return Err(http_error("create backup request", status, &text));
16 }
17 Ok(())
18 }
19
20 pub fn list_backups(&self) -> Result<Value> {
22 let response = self.get("/admin/backups.json")?;
23 let status = response.status();
24 let text = response.text().context("reading backups list response")?;
25 if !status.is_success() {
26 return Err(http_error("list backups request", status, &text));
27 }
28 let body: Value = serde_json::from_str(&text).context("parsing backups list json")?;
29 Ok(body)
30 }
31
32 pub fn restore_backup(&self, backup_path: &str) -> Result<()> {
34 let path = format!("/admin/backups/{}/restore", backup_path);
35 let response = self.send_retrying(|| self.post(&path))?;
36 let status = response.status();
37 let text = response.text().context("reading backup restore response")?;
38 if !status.is_success() {
39 return Err(http_error("restore backup request", status, &text));
40 }
41 Ok(())
42 }
43}