datadog_workflow_lib/
workflow.rs1use crate::database::DbContext;
2use crate::datadog::DatadogAPI;
3use alfred::Item;
4use failure::Error;
5use std::str;
6
7pub struct DatadogWorkflow<'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> DatadogWorkflow<'a> {
16 #[inline]
17 pub fn new(
18 api_key: &'a str,
19 application_key: &'a str,
20 database_url: &str,
21 api_url: &'a str,
22 subdomain: &'a str,
23 ) -> Result<Self, Error> {
24 let db = DbContext::new(database_url, subdomain.to_owned())?;
25 Ok(DatadogWorkflow {
26 api_key,
27 application_key,
28 db,
29 api_url,
30 subdomain,
31 })
32 }
33
34 pub fn refresh_cache(&mut self) -> Result<(), Error> {
35 let datadog_api = DatadogAPI::new(
36 self.api_key,
37 self.application_key,
38 self.api_url,
39 self.subdomain,
40 );
41 self.db.run_migrations()?;
42 self.refresh_timeboards(&datadog_api)?;
43 self.refresh_screenboards(&datadog_api)?;
44 self.refresh_monitors(&datadog_api)?;
45
46 self.db.optimize()
48 }
49
50 fn refresh_timeboards(&mut self, datadog_api: &DatadogAPI) -> Result<(), Error> {
51 let mut db = self.db.timeboards();
52 db.delete_all()?;
53 let results = datadog_api.get_timeboards()?;
54 db.insert(&results)?;
55 Ok(())
56 }
57
58 fn refresh_screenboards(&mut self, datadog_api: &DatadogAPI) -> Result<(), Error> {
59 let mut db = self.db.screenboards();
60 db.delete_all()?;
61 let results = datadog_api.get_screenboards()?;
62 db.insert(&results)?;
63 Ok(())
64 }
65
66 fn refresh_monitors(&mut self, datadog_api: &DatadogAPI) -> Result<(), Error> {
67 let mut db = self.db.monitors();
68 db.delete_all()?;
69 let results = datadog_api.get_monitors()?;
70 db.insert(&results)?;
71 Ok(())
72 }
73
74 pub fn query_timeboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
75 let results = self.db.timeboards().find(title, 10)?;
76 let items = results
77 .into_iter()
78 .map(|m| {
79 alfred::ItemBuilder::new(m.title.clone())
80 .subtitle(m.description)
81 .autocomplete(m.title)
82 .arg(format!("open {}", m.url))
83 .into_item()
84 })
85 .collect();
86 Ok(items)
87 }
88
89 pub fn query_screenboards<'items>(&mut self, title: &str) -> Result<Vec<Item<'items>>, Error> {
90 let results = self.db.screenboards().find(title, 10)?;
91 let items = results
92 .into_iter()
93 .map(|m| {
94 alfred::ItemBuilder::new(m.title.clone())
95 .subtitle(m.description)
96 .autocomplete(m.title)
97 .arg(format!("open {}", m.url))
98 .into_item()
99 })
100 .collect();
101 Ok(items)
102 }
103
104 pub fn query_dashboards<'items>(&self, title: &str) -> Result<Vec<Item<'items>>, Error> {
105 let results = self.db.find_dashboard(title, 10)?;
106 let items = results
107 .into_iter()
108 .map(|m| {
109 alfred::ItemBuilder::new(m.title.clone())
110 .subtitle(m.description)
111 .autocomplete(m.title)
112 .arg(format!("open {}", m.url))
113 .into_item()
114 })
115 .collect();
116 Ok(items)
117 }
118
119 pub fn query_monitors<'items>(
120 &mut self,
121 name: &str,
122 tag: Option<&str>,
123 ) -> Result<Vec<Item<'items>>, Error> {
124 let results = self.db.monitors().find(name, tag, 10)?;
125 let items = results
126 .into_iter()
127 .map(|m| {
128 alfred::ItemBuilder::new(m.name.clone())
129 .subtitle(m.name.clone())
130 .autocomplete(m.name)
131 .arg(format!("open {}", m.url))
132 .into_item()
133 })
134 .collect();
135 Ok(items)
136 }
137}