dune_api/matviews/
api.rs

1//! Materialized Views API implementation
2
3use super::types::*;
4use crate::client::Client;
5use crate::error::{self, Error, Result};
6
7/// Materialized Views API
8pub struct MatviewsApi<'a> {
9    client: &'a Client,
10}
11
12impl<'a> MatviewsApi<'a> {
13    pub(crate) fn new(client: &'a Client) -> Self {
14        Self { client }
15    }
16
17    /// Create or update a materialized view
18    pub async fn upsert(&self, request: &UpsertMatviewRequest) -> Result<UpsertMatviewResponse> {
19        let url = format!("{}/v1/materialized-views", self.client.base_url());
20        let response = self.client.http().post(&url).json(request).send().await?;
21
22        if response.status().is_success() {
23            Ok(response.json().await?)
24        } else {
25            let status = response.status().as_u16();
26            let message = response.text().await.unwrap_or_default();
27            Err(Error::api(status, message))
28        }
29    }
30
31    /// Get a materialized view by name
32    pub async fn get(&self, name: &str) -> Result<Matview> {
33        let url = format!("{}/v1/materialized-views/{}", self.client.base_url(), name);
34        let response = self.client.http().get(&url).send().await?;
35
36        if response.status().is_success() {
37            Ok(response.json().await?)
38        } else if response.status() == 404 {
39            Err(error::not_found(format!("Matview {}", name)))
40        } else {
41            let status = response.status().as_u16();
42            let message = response.text().await.unwrap_or_default();
43            Err(Error::api(status, message))
44        }
45    }
46
47    /// List all materialized views
48    pub async fn list(&self) -> Result<ListMatviewsResponse> {
49        self.list_with_options(&ListMatviewsOptions::default())
50            .await
51    }
52
53    /// List materialized views with options
54    pub async fn list_with_options(
55        &self,
56        options: &ListMatviewsOptions,
57    ) -> Result<ListMatviewsResponse> {
58        let url = format!(
59            "{}/v1/materialized-views{}",
60            self.client.base_url(),
61            options.to_query_string()
62        );
63        let response = self.client.http().get(&url).send().await?;
64
65        if response.status().is_success() {
66            Ok(response.json().await?)
67        } else {
68            let status = response.status().as_u16();
69            let message = response.text().await.unwrap_or_default();
70            Err(Error::api(status, message))
71        }
72    }
73
74    /// Refresh a materialized view
75    pub async fn refresh(&self, name: &str) -> Result<RefreshMatviewResponse> {
76        self.refresh_with_options(name, &RefreshMatviewRequest::default())
77            .await
78    }
79
80    /// Refresh a materialized view with options
81    pub async fn refresh_with_options(
82        &self,
83        name: &str,
84        request: &RefreshMatviewRequest,
85    ) -> Result<RefreshMatviewResponse> {
86        let url = format!(
87            "{}/v1/materialized-views/{}/refresh",
88            self.client.base_url(),
89            name
90        );
91        let response = self.client.http().post(&url).json(request).send().await?;
92
93        if response.status().is_success() {
94            Ok(response.json().await?)
95        } else if response.status() == 404 {
96            Err(error::not_found(format!("Matview {}", name)))
97        } else {
98            let status = response.status().as_u16();
99            let message = response.text().await.unwrap_or_default();
100            Err(Error::api(status, message))
101        }
102    }
103
104    /// Delete a materialized view
105    pub async fn delete(&self, name: &str) -> Result<DeleteMatviewResponse> {
106        let url = format!("{}/v1/materialized-views/{}", self.client.base_url(), name);
107        let response = self.client.http().delete(&url).send().await?;
108
109        if response.status().is_success() {
110            Ok(response.json().await?)
111        } else if response.status() == 404 {
112            Err(error::not_found(format!("Matview {}", name)))
113        } else {
114            let status = response.status().as_u16();
115            let message = response.text().await.unwrap_or_default();
116            Err(Error::api(status, message))
117        }
118    }
119}