influxdb2/api/
delete.rs

1//! Delete API
2
3use chrono::NaiveDateTime;
4use reqwest::Method;
5use snafu::ResultExt;
6
7use crate::{Client, Http, RequestError, ReqwestProcessing};
8
9impl Client {
10    /// Delete data points from a bucket matching specified parameters.
11    ///
12    /// Usage:
13    ///
14    /// ```
15    /// use chrono::NaiveDate;
16    /// use influxdb2::Client;
17    ///
18    /// async fn foo() {
19    ///     let client = Client::new("some-host", "some-org", "some-token");
20    ///     let start = NaiveDate::from_ymd(2020, 1, 1).and_hms(0, 0, 0);
21    ///     let stop = NaiveDate::from_ymd(2020, 12, 31).and_hms(23, 59, 59);
22    ///     let predicate = Some("_measurement=\"some-measurement\"".to_owned());
23    ///     client.delete("some-bucket", start, stop, predicate).await.unwrap();
24    /// }
25    /// ```
26    ///
27    pub async fn delete(
28        &self,
29        bucket: &str,
30        start: NaiveDateTime,
31        stop: NaiveDateTime,
32        predicate: Option<String>,
33    ) -> Result<(), RequestError> {
34        let delete_url = self.url("/api/v2/delete");
35
36        let body = serde_json
37        ::json!({
38            "start": start.format("%Y-%m-%dT%H:%M:%SZ").to_string(),
39            "stop": stop.format("%Y-%m-%dT%H:%M:%SZ").to_string(),
40            "predicate": predicate,
41        })
42        .to_string();
43
44        let response = self
45            .request(Method::POST, &delete_url)
46            .query(&[("bucket", bucket), ("org", &self.org)])
47            .body(body)
48            .send()
49            .await
50            .context(ReqwestProcessing)?;
51
52        if !response.status().is_success() {
53            let status = response.status();
54            let text = response.text().await.context(ReqwestProcessing)?;
55            Http { status, text }.fail()?;
56        }
57
58        Ok(())
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65    use chrono::NaiveDate;
66    use mockito::mock;
67
68    #[tokio::test]
69    async fn delete_points() {
70        let org = "some-org";
71        let bucket = "some-bucket";
72        let token = "some-token";
73
74        let mock_server = mock(
75                "POST",
76                format!("/api/v2/delete?bucket={}&org={}", bucket, org).as_str(),
77            )
78            .match_header("Authorization", format!("Token {}", token).as_str())
79            .match_body(
80                "{\"predicate\":null,\"start\":\"2020-01-01T00:00:00Z\",\"stop\":\"2021-01-01T00:00:00Z\"}"
81            )
82            .create();
83
84        let client = Client::new(mockito::server_url(), org, token);
85
86        let start = NaiveDate::from_ymd(2020, 1, 1).and_hms(0, 0, 0);
87        let stop = NaiveDate::from_ymd(2021, 1, 1).and_hms(0, 0, 0);
88        let _result = client.delete(bucket, start, stop, None).await;
89
90        mock_server.assert();
91    }
92}