Skip to main content

dsc/api/
backup.rs

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