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.send_retrying(|| Ok(self.post("/admin/backups.json")?.form(&payload)))?;
11        let status = response.status();
12        let text = response.text().context("reading backup create response")?;
13        if !status.is_success() {
14            return Err(http_error("create backup request", status, &text));
15        }
16        Ok(())
17    }
18
19    /// List backups available on the Discourse instance.
20    pub fn list_backups(&self) -> Result<Value> {
21        let response = self.get("/admin/backups.json")?;
22        let status = response.status();
23        let text = response.text().context("reading backups list response")?;
24        if !status.is_success() {
25            return Err(http_error("list backups request", status, &text));
26        }
27        let body: Value = serde_json::from_str(&text).context("parsing backups list json")?;
28        Ok(body)
29    }
30
31    /// Restore a backup by filename/path.
32    pub fn restore_backup(&self, backup_path: &str) -> Result<()> {
33        let path = format!("/admin/backups/{}/restore", backup_path);
34        let response = self.send_retrying(|| Ok(self.post(&path)?))?;
35        let status = response.status();
36        let text = response.text().context("reading backup restore response")?;
37        if !status.is_success() {
38            return Err(http_error("restore backup request", status, &text));
39        }
40        Ok(())
41    }
42}