umami-api 0.0.2

Easily interact with the Umami API (self-hosted instances)
Documentation
use crate::{Filters, Timestamps, Umami, UmamiError, website_stats::StatsWithComparison};

pub struct GetStatsRequestBuilder<'a> {
  client: &'a Umami,
  website_id: String,
  timestamps: Timestamps,
  filters: Filters,
}

impl<'a> GetStatsRequestBuilder<'a> {
  pub fn new(client: &'a Umami, website_id: String, timestamps: Timestamps) -> Self {
    Self { client, website_id, timestamps, filters: Filters::default() }
  }

  /// Set the filters to use
  pub fn filters(mut self, filters: Filters) -> Self {
    self.filters = filters;
    self
  }

  pub async fn fetch(self) -> Result<StatsWithComparison, UmamiError> {
    let url = format!("websites/{}/stats", self.website_id);

    let mut filters = self.filters.as_parameters();
    let timestamps: Vec<_> = vec![
      ("startAt", self.timestamps.start_at.timestamp_millis().to_string()),
      ("endAt", self.timestamps.end_at.timestamp_millis().to_string()),
    ];
    filters.extend(timestamps);

    self.client.request::<StatsWithComparison, _>("get", &url, filters).await
  }
}

// TODO proper tests
// #[cfg(test)]
// mod tests {
//   use super::*;
//   use std::env;
//   use chrono::{Days, Utc};
//   use dotenv::dotenv;
//
//   #[tokio::test]
//   async fn good() {
//     dotenv().ok();
//     let instance = env::var("INSTANCE").expect("INSTANCE has to be set");
//     let username = env::var("USERNAME").expect("USERNAME has to be set");
//     let password = env::var("PASSWORD").expect("PASSWORD has to be set");
//
//     let api = Umami::new(instance, username, password).await.unwrap();
//     let request = api.get_stats("02d78ab3-89d2-463a-8a2c-a4552dfea57a", Timestamps {
//       start_at: Utc::now().checked_sub_days(Days::new(7)).unwrap(),
//       end_at: Utc::now(),
//     });
//     let stats = request
//       .filters(Filters {
//         country: Some("SG"),
//         ..Filters::default()
//       })
//       .fetch()
//       .await
//       .inspect_err(|err| eprintln!("Error spotted: {}", err));
//
//     assert!(stats.is_ok());
//     assert!(stats.unwrap().base.pageviews >= 1);
//   }
// }