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 =
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    /// List backups available on the Discourse instance.
21    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    /// Restore a backup by filename/path.
33    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}