diff --git a/Cargo.lock b/Cargo.lock index 5f6f8d5..14908bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -927,11 +927,12 @@ dependencies = [ "http", "hyper", "hyper-util", - "rustls", + "rustls 0.23.11", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", + "webpki-roots 0.26.3", ] [[package]] @@ -1534,6 +1535,52 @@ dependencies = [ "winapi", ] +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.11", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls 0.23.11", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +dependencies = [ + "libc", + "once_cell", + "socket2", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.36" @@ -1636,7 +1683,10 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "quinn", + "rustls 0.23.11", + "rustls-pemfile 2.1.2", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", @@ -1644,11 +1694,13 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots 0.26.3", "winreg", ] @@ -1751,6 +1803,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustix" version = "0.38.34" @@ -1764,6 +1822,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "ring", + "rustls-webpki 0.101.7", + "sct", +] + [[package]] name = "rustls" version = "0.23.11" @@ -1771,12 +1840,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" dependencies = [ "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.102.5", "subtle", "zeroize", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + [[package]] name = "rustls-pemfile" version = "2.1.2" @@ -1793,6 +1872,16 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustls-webpki" version = "0.102.5" @@ -1831,6 +1920,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "security-framework" version = "2.11.1" @@ -2122,6 +2221,8 @@ dependencies = [ "once_cell", "paste", "percent-encoding", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha2", @@ -2132,6 +2233,7 @@ dependencies = [ "tokio-stream", "tracing", "url", + "webpki-roots 0.25.4", ] [[package]] @@ -2446,7 +2548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "toggl-2" +name = "toggl-bridge" version = "0.1.0" dependencies = [ "axum", @@ -2520,7 +2622,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls", + "rustls 0.23.11", "rustls-pki-types", "tokio", ] @@ -2845,6 +2947,21 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "whoami" version = "1.5.1" diff --git a/Cargo.toml b/Cargo.toml index f20da1d..6a2e935 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "toggl-2" +name = "toggl-bridge" version = "0.1.0" edition = "2021" @@ -7,7 +7,7 @@ edition = "2021" axum = "0.7.5" chrono = { version = "0.4.38", features = ["serde"] } governor = "0.6.3" -reqwest = { version = "0.12.5", features = ["json"] } +reqwest = { version = "0.12.5", features = ["json", "rustls-tls"] } reqwest-ratelimit = "0.2.0" reqwest-middleware = { version = "0.3", features = ["json"] } reqwest-retry = "0.6" @@ -19,7 +19,7 @@ serde_json = "1.0.120" serde_json_path_to_error = "0.1.4" url = "2.5.2" serde_with = "3.9.0" -sqlx = { version = "0.7.4", features = ["postgres", "runtime-tokio", "macros", "chrono"] } +sqlx = { version = "0.7.4", features = ["postgres", "macros", "chrono", "runtime-tokio-rustls"] } futures = "0.3.30" tracing = "0.1.40" tracing-subscriber = "0.3.18" diff --git a/src/main.rs b/src/main.rs index 61854fa..7004971 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,9 +42,9 @@ struct TableSummary { tag_ids: Vec, } +use chrono::TimeDelta; use clap::{Parser, Subcommand}; use std::net::IpAddr; -use chrono::TimeDelta; #[derive(Parser)] #[command(author, version, about, long_about = None)] @@ -77,7 +77,6 @@ enum Commands { Sync, } - #[tokio::main] async fn main() { dotenvy::dotenv().expect("Failed to load .env file"); @@ -102,9 +101,13 @@ async fn main() { let worker = Worker { db, toggl_api }; if let Commands::Server { ip, port } = cli.command { - server::serve(worker, ip, port).await.expect("Failed to start server"); + server::serve(worker, ip, port) + .await + .expect("Failed to start server"); } else { - worker.update(TimeDelta::days(30)) - .await.expect("Failed to update worker"); + worker + .update(TimeDelta::days(30)) + .await + .expect("Failed to update worker"); } } diff --git a/src/server.rs b/src/server.rs index 5be6e0f..d9ed639 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,4 +1,3 @@ -use std::net::IpAddr; use axum::response::IntoResponse; use axum::{ http::StatusCode, @@ -6,6 +5,7 @@ use axum::{ Extension, Json, Router, }; use chrono::TimeDelta; +use std::net::IpAddr; use crate::worker::Worker; use crate::AppError; diff --git a/src/worker.rs b/src/worker.rs index c8043b9..e607365 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -111,6 +111,7 @@ impl Worker { .iter() .map(|entry| entry.workspace_id) .filter(|workspace_id| !existing_ids.workspace_ids.contains(&workspace_id)) + .unique() .collect::>(); let fetch_projects = time_entries @@ -184,6 +185,7 @@ impl Worker { Ok(()) } + #[tracing::instrument(skip(self))] async fn update_workspaces(&self, workspace_ids: &[u64]) -> Result<(), AppError> { let workspaces = workspace_ids .iter()