datadog_workflow_lib/
workflow.rs1use crate::database::DbContext;
2use crate::datadog::Api;
3use crate::errors::Error;
4use alfred::Item;
5use std::str;
6
7pub struct Workflow<'a> {
8 api_key: &'a str,
9 application_key: &'a str,
10 api_url: &'a str,
11 db: DbContext,
12 subdomain: &'a str,
13}
14
15impl<'a> Workflow<'a> {
16 #[inline]
21 pub fn new(
22 api_key: &'a str,
23 application_key: &'a str,
24 database_url: &str,
25 api_url: &'a str,
26 subdomain: &'a str,
27 ) -> Result<Self, Error> {
28 let db = DbContext::new(database_url, subdomain.to_owned())?;
29 Ok(Workflow {
30 api_key,
31 application_key,
32 api_url,
33 db,
34 subdomain,
35 })
36 }
37
38 pub fn refresh_cache(&mut self) -> Result<(), Error> {
43 let datadog_api = Api::new(
44 self.api_key,
45 self.application_key,
46 self.api_url,
47 self.subdomain,
48 );
49 self.db.run_migrations()?;
50 self.refresh_timeboards(&datadog_api)?;
51 self.refresh_screenboards(&datadog_api)?;
52 self.refresh_monitors(&datadog_api)?;
53
54 Ok(self.db.optimize()?)
56 }
57
58 fn refresh_timeboards(&mut self, datadog_api: &Api) -> Result<(), Error> {
59 let mut db = self.db.timeboards();
60 db.delete_all()?;
61 let results = datadog_api.get_timeboards()?;
62 db.insert(&results)?;
63 Ok(())
64 }
65
66 fn refresh_screenboards(&mut self, datadog_api: &Api) -> Result<(), Error> {
67 let mut db = self.db.screenboards();
68 db.delete_all()?;
69 let results = datadog_api.get_screenboards()?;
70 db.insert(&results)?;
71 Ok(())
72 }
73
74 fn refresh_monitors(&mut self, datadog_api: &Api) -> Result<(), Error> {
75 let mut db = self.db.monitors();
76 db.delete_all()?;
77 let results = datadog_api.get_monitors()?;
78 db.insert(&results)?;
79 Ok(())
80 }
81
82 pub fn query_timeboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
87 let results = self.db.timeboards().find(title, 10)?;
88 let items = results
89 .into_iter()
90 .map(|m| {
91 alfred::ItemBuilder::new(m.title.clone())
92 .subtitle(m.description)
93 .autocomplete(m.title)
94 .arg(format!("open {}", m.url))
95 .into_item()
96 })
97 .collect();
98 Ok(items)
99 }
100
101 pub fn query_screenboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
106 let results = self.db.screenboards().find(title, 10)?;
107 let items = results
108 .into_iter()
109 .map(|m| {
110 alfred::ItemBuilder::new(m.title.clone())
111 .subtitle(m.description)
112 .autocomplete(m.title)
113 .arg(format!("open {}", m.url))
114 .into_item()
115 })
116 .collect();
117 Ok(items)
118 }
119
120 pub fn query_dashboards<'items>(&self, title: &str) -> Result<Vec<Item<'items>>, Error> {
125 let results = self.db.find_dashboard(title, 10)?;
126 let items = results
127 .into_iter()
128 .map(|m| {
129 alfred::ItemBuilder::new(m.title.clone())
130 .subtitle(m.description)
131 .autocomplete(m.title)
132 .arg(format!("open {}", m.url))
133 .into_item()
134 })
135 .collect();
136 Ok(items)
137 }
138
139 pub fn query_monitors<'items>(
144 &mut self,
145 name: &str,
146 tag: Option<&str>,
147 ) -> Result<Vec<Item<'items>>, Error> {
148 let results = self.db.monitors().find(name, tag, 10)?;
149 let items = results
150 .into_iter()
151 .map(|m| {
152 alfred::ItemBuilder::new(m.name.clone())
153 .subtitle(m.name.clone())
154 .autocomplete(m.name)
155 .arg(format!("open {}", m.url))
156 .into_item()
157 })
158 .collect();
159 Ok(items)
160 }
161}