Skip to main content

pocketbase_sdk/
logs.rs

1use crate::client::{Auth, Client};
2use crate::httpc::Httpc;
3use anyhow::Result;
4use serde::Deserialize;
5use std::collections::HashMap;
6
7pub struct LogsManager<'a> {
8    pub client: &'a Client<Auth>,
9}
10
11#[derive(Debug, Clone)]
12pub struct LogListRequestBuilder<'a> {
13    pub client: &'a Client<Auth>,
14    pub page: i32,
15    pub per_page: i32,
16    pub sort: Option<&'a str>,
17    pub filter: Option<&'a str>,
18}
19
20#[derive(Debug, Clone)]
21pub struct LogViewRequestBuilder<'a> {
22    pub client: &'a Client<Auth>,
23    pub id: &'a str,
24}
25
26#[derive(Debug, Clone)]
27pub struct LogStatisticsRequestBuilder<'a> {
28    pub client: &'a Client<Auth>,
29    pub filter: Option<&'a str>,
30}
31
32#[derive(Debug, Clone, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct LogListItem {
35    pub id: String,
36    pub created: String,
37    pub updated: String,
38    pub url: String,
39    pub method: String,
40    pub status: i32,
41    pub ip: Option<String>,
42    pub referer: String,
43    pub user_agent: String,
44    pub meta: HashMap<String, String>,
45}
46
47#[derive(Debug, Clone, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct LogList {
50    pub page: i32,
51    pub per_page: i32,
52    pub total_items: i32,
53    pub items: Vec<LogListItem>,
54}
55
56#[derive(Debug, Clone, Deserialize)]
57pub struct LogStatDataPoint {
58    pub total: i32,
59    pub date: String,
60}
61
62impl<'a> LogStatisticsRequestBuilder<'a> {
63    pub fn filter(&self, filter_query: &'a str) -> Self {
64        Self {
65            filter: Some(filter_query),
66            ..self.clone()
67        }
68    }
69
70    pub fn call(&self) -> Result<Vec<LogStatDataPoint>> {
71        let url = format!("{}/api/logs/requests/stats", self.client.base_url);
72        let mut build_opts = Vec::new();
73        if let Some(filter_opts) = &self.filter {
74            build_opts.push(("filter", filter_opts.to_owned()));
75        }
76
77        match Httpc::get(self.client, &url, Some(build_opts)) {
78            Ok(result) => {
79                let response = result.into_json::<Vec<LogStatDataPoint>>()?;
80                Ok(response)
81            }
82            Err(e) => Err(e),
83        }
84    }
85}
86
87impl<'a> LogViewRequestBuilder<'a> {
88    pub fn call(&self) -> Result<LogListItem> {
89        let url = format!("{}/api/logs/requests/{}", self.client.base_url, self.id);
90        match Httpc::get(self.client, &url, None) {
91            Ok(result) => {
92                let response = result.into_json::<LogListItem>()?;
93                Ok(response)
94            }
95            Err(e) => Err(e),
96        }
97    }
98}
99
100impl<'a> LogListRequestBuilder<'a> {
101    pub fn page(&self, page_count: i32) -> Self {
102        LogListRequestBuilder {
103            page: page_count,
104            ..self.clone()
105        }
106    }
107
108    pub fn per_page(&self, per_page_count: i32) -> Self {
109        LogListRequestBuilder {
110            per_page: per_page_count,
111            ..self.clone()
112        }
113    }
114
115    pub fn filter(&self, filter_opts: &'a str) -> Self {
116        LogListRequestBuilder {
117            filter: Some(filter_opts),
118            ..self.clone()
119        }
120    }
121
122    pub fn sort(&self, sort_opts: &'a str) -> Self {
123        LogListRequestBuilder {
124            sort: Some(sort_opts),
125            ..self.clone()
126        }
127    }
128
129    pub fn call(&self) -> Result<LogList> {
130        let url = format!("{}/api/logs/requests", self.client.base_url);
131        let mut build_opts = Vec::new();
132
133        if let Some(sort_opts) = &self.sort { build_opts.push(("sort", sort_opts.to_owned())) }
134        if let Some(filter_opts) = &self.filter { build_opts.push(("filter", filter_opts.to_owned())) }
135        let per_page_opts = self.per_page.to_string();
136        let page_opts = self.page.to_string();
137        build_opts.push(("per_page", per_page_opts.as_str()));
138        build_opts.push(("page", page_opts.as_str()));
139
140        match Httpc::get(self.client, &url, Some(build_opts)) {
141            Ok(result) => {
142                let response = result.into_json::<LogList>()?;
143                Ok(response)
144            }
145            Err(e) => Err(e),
146        }
147    }
148}
149
150impl<'a> LogsManager<'a> {
151    pub fn list(&self) -> LogListRequestBuilder<'a> {
152        LogListRequestBuilder {
153            client: self.client,
154            page: 1,
155            per_page: 100,
156            sort: None,
157            filter: None,
158        }
159    }
160
161    pub fn view(&self, id: &'a str) -> LogViewRequestBuilder<'a> {
162        LogViewRequestBuilder {
163            client: self.client,
164            id,
165        }
166    }
167
168    pub fn statistics(&self) -> LogStatisticsRequestBuilder<'a> {
169        LogStatisticsRequestBuilder { client: self.client, filter: None } 
170    }
171}