Add /me/time_entries

This commit is contained in:
Joshua Coles 2024-07-16 08:16:01 +01:00
parent 9c20dc09ec
commit c1b8636407
4 changed files with 45 additions and 2 deletions

1
Cargo.lock generated
View File

@ -1464,6 +1464,7 @@ dependencies = [
"serde_json_path_to_error", "serde_json_path_to_error",
"thiserror", "thiserror",
"tokio", "tokio",
"url",
] ]
[[package]] [[package]]

View File

@ -17,3 +17,4 @@ base64 = "0.22.1"
serde = { version = "1.0.204", features = ["derive"] } serde = { version = "1.0.204", features = ["derive"] }
serde_json = "1.0.120" serde_json = "1.0.120"
serde_json_path_to_error = "0.1.4" serde_json_path_to_error = "0.1.4"
url = "2.5.2"

View File

@ -1,3 +1,5 @@
use std::ops::Sub;
use chrono::{TimeDelta, Utc};
use toggl::TogglApi; use toggl::TogglApi;
mod toggl; mod toggl;
@ -10,5 +12,8 @@ async fn main() {
sensitive::WORKSPACE_ID, sensitive::WORKSPACE_ID,
); );
dbg!(api.get_tags().await); dbg!(api.get_time_user_entries_between(
Utc::now().sub(TimeDelta::days(2)),
Utc::now(),
).await);
} }

View File

@ -9,7 +9,8 @@ use governor::clock::DefaultClock;
use reqwest::header::{HeaderMap, HeaderValue}; use reqwest::header::{HeaderMap, HeaderValue};
use base64::engine::general_purpose::STANDARD; use base64::engine::general_purpose::STANDARD;
use base64::Engine; use base64::Engine;
use reqwest::Response; use chrono::{DateTime, SecondsFormat, Utc};
use reqwest::{Response, Url};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
struct ReqwestRateLimiter { struct ReqwestRateLimiter {
@ -72,6 +73,38 @@ impl TogglApi {
headers headers
} }
/// Fetches all time entries for this user from Toggl that have been modified since the given
/// date.
pub async fn get_time_entries_for_user_modified_since(&self, since: DateTime<Utc>) -> Result<Vec<types::TimeEntry>, TogglError> {
let url = format!(
"{base_url}/me/time_entries?since={since}",
base_url = BASE_URL,
since = since.timestamp()
);
Self::parse(self.client.get(&url)
.headers(self.headers.clone())
.send().await?).await
}
/// Fetches all time entries for this user from Toggl that have a start time between the given
/// start and end times.
pub async fn get_time_user_entries_between(&self, start: DateTime<Utc>, until: DateTime<Utc>) -> Result<Vec<types::TimeEntry>, TogglError> {
let url = format!(
"{base_url}/me/time_entries",
base_url = BASE_URL,
);
let mut url = Url::parse(&url).unwrap();
url.query_pairs_mut()
.append_pair("start_date", &start.to_rfc3339_opts(SecondsFormat::Secs, true))
.append_pair("end_date", &until.to_rfc3339_opts(SecondsFormat::Secs, true));
Self::parse(self.client.get(url)
.headers(self.headers.clone())
.send().await?).await
}
pub async fn get_current_time_entry(&self) -> Result<Option<types::TimeEntry>, TogglError> { pub async fn get_current_time_entry(&self) -> Result<Option<types::TimeEntry>, TogglError> {
let url = format!( let url = format!(
"{base_url}/me/time_entries/current", "{base_url}/me/time_entries/current",
@ -268,6 +301,9 @@ mod types {
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum TogglError { pub enum TogglError {
#[error("Toggl returned error: {0}")]
TogglError(serde_json::Value),
#[error("Reqwest error: {0}")] #[error("Reqwest error: {0}")]
ReqwestError(#[from] reqwest_middleware::Error), ReqwestError(#[from] reqwest_middleware::Error),