Allow zero time_entries
This commit is contained in:
parent
a72acbc42f
commit
3f17c45297
10
src/main.rs
10
src/main.rs
@ -53,13 +53,14 @@ impl Worker {
|
|||||||
}
|
}
|
||||||
async fn update(&mut self, default_look_back: TimeDelta) -> Result<(), AppError> {
|
async fn update(&mut self, default_look_back: TimeDelta) -> Result<(), AppError> {
|
||||||
let result = sqlx::query!("select max(updated_at) as last_updated_at from time_entries")
|
let result = sqlx::query!("select max(updated_at) as last_updated_at from time_entries")
|
||||||
.fetch_one(&mut self.db)
|
.fetch_optional(&mut self.db)
|
||||||
.await
|
.await
|
||||||
.expect("Could not fetch max updated_at from time_entries");
|
.expect("Could not fetch max updated_at from time_entries");
|
||||||
|
|
||||||
let existing_ids = self.get_ids().await?;
|
let existing_ids = self.get_ids().await?;
|
||||||
|
|
||||||
let fetch_since = result.last_updated_at
|
let fetch_since = result
|
||||||
|
.and_then(|record| record.last_updated_at)
|
||||||
.unwrap_or_else(|| Utc::now() - default_look_back);
|
.unwrap_or_else(|| Utc::now() - default_look_back);
|
||||||
|
|
||||||
let time_entries = self.toggl_api
|
let time_entries = self.toggl_api
|
||||||
@ -291,6 +292,9 @@ async fn main() {
|
|||||||
dotenv::dotenv()
|
dotenv::dotenv()
|
||||||
.expect("Failed to load .env file");
|
.expect("Failed to load .env file");
|
||||||
|
|
||||||
|
// Init tracing
|
||||||
|
tracing_subscriber::fmt::init();
|
||||||
|
|
||||||
let api = TogglApi::new(
|
let api = TogglApi::new(
|
||||||
sensitive::API_TOKEN,
|
sensitive::API_TOKEN,
|
||||||
sensitive::WORKSPACE_ID,
|
sensitive::WORKSPACE_ID,
|
||||||
@ -304,7 +308,7 @@ async fn main() {
|
|||||||
toggl_api: api,
|
toggl_api: api,
|
||||||
};
|
};
|
||||||
|
|
||||||
worker.update(TimeDelta::days(7))
|
worker.update(TimeDelta::days(90))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,8 @@ impl ReqwestRateLimiter {
|
|||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl reqwest_ratelimit::RateLimiter for ReqwestRateLimiter {
|
impl reqwest_ratelimit::RateLimiter for ReqwestRateLimiter {
|
||||||
async fn acquire_permit(&self) {
|
async fn acquire_permit(&self) {
|
||||||
|
// We don't need to introduce jitter here as that is handled by the retry_request
|
||||||
|
// middleware.
|
||||||
self.rate_limiter.until_ready().await;
|
self.rate_limiter.until_ready().await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,6 +76,7 @@ impl TogglApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get the workspaces that a user is a part of
|
/// Get the workspaces that a user is a part of
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
async fn get_users_workspaces(
|
async fn get_users_workspaces(
|
||||||
&self
|
&self
|
||||||
) -> Result<Vec<types::Workspace>, TogglError> {
|
) -> Result<Vec<types::Workspace>, TogglError> {
|
||||||
@ -90,6 +93,7 @@ impl TogglApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get a specific workspace by its ID
|
/// Get a specific workspace by its ID
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn get_workspace(&self, id: u64) -> Result<types::Workspace, TogglError> {
|
pub async fn get_workspace(&self, id: u64) -> Result<types::Workspace, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/workspaces/{id}",
|
"{base_url}/workspaces/{id}",
|
||||||
@ -104,6 +108,7 @@ impl TogglApi {
|
|||||||
|
|
||||||
/// Fetches all time entries for this user from Toggl that have been modified since the given
|
/// Fetches all time entries for this user from Toggl that have been modified since the given
|
||||||
/// date.
|
/// date.
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn get_time_entries_for_user_modified_since(&self, since: DateTime<Utc>) -> Result<Vec<types::TimeEntry>, TogglError> {
|
pub async fn get_time_entries_for_user_modified_since(&self, since: DateTime<Utc>) -> Result<Vec<types::TimeEntry>, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/me/time_entries?since={since}",
|
"{base_url}/me/time_entries?since={since}",
|
||||||
@ -118,6 +123,7 @@ impl TogglApi {
|
|||||||
|
|
||||||
/// Fetches all time entries for this user from Toggl that have a start time between the given
|
/// Fetches all time entries for this user from Toggl that have a start time between the given
|
||||||
/// start and end times.
|
/// start and end times.
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn get_time_user_entries_between(&self, start: DateTime<Utc>, until: DateTime<Utc>) -> Result<Vec<types::TimeEntry>, TogglError> {
|
pub async fn get_time_user_entries_between(&self, start: DateTime<Utc>, until: DateTime<Utc>) -> Result<Vec<types::TimeEntry>, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/me/time_entries",
|
"{base_url}/me/time_entries",
|
||||||
@ -133,6 +139,7 @@ impl TogglApi {
|
|||||||
.send().await?).await
|
.send().await?).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
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",
|
||||||
@ -146,6 +153,7 @@ impl TogglApi {
|
|||||||
.json().await?)
|
.json().await?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn get_projects(&self) -> Result<Vec<types::Project>, TogglError> {
|
pub async fn get_projects(&self) -> Result<Vec<types::Project>, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/workspaces/{workspace_id}/projects",
|
"{base_url}/workspaces/{workspace_id}/projects",
|
||||||
@ -158,6 +166,7 @@ impl TogglApi {
|
|||||||
.send().await?).await
|
.send().await?).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn get_clients(&self) -> Result<Vec<types::TrackingClient>, TogglError> {
|
pub async fn get_clients(&self) -> Result<Vec<types::TrackingClient>, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/workspaces/{workspace_id}/clients",
|
"{base_url}/workspaces/{workspace_id}/clients",
|
||||||
@ -183,6 +192,7 @@ impl TogglApi {
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn get_tags(&self) -> Result<Vec<types::Tag>, TogglError> {
|
pub async fn get_tags(&self) -> Result<Vec<types::Tag>, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/workspaces/{workspace_id}/tags",
|
"{base_url}/workspaces/{workspace_id}/tags",
|
||||||
@ -201,6 +211,7 @@ impl TogglApi {
|
|||||||
filters
|
filters
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
pub async fn search(&self, filters: types::TogglReportFilters) -> Result<Vec<types::ReportEntry>, TogglError> {
|
pub async fn search(&self, filters: types::TogglReportFilters) -> Result<Vec<types::ReportEntry>, TogglError> {
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{base_url}/workspace/{workspace_id}/search/time_entries",
|
"{base_url}/workspace/{workspace_id}/search/time_entries",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user