From 720eceeab06eba1784a637912b1ed6be6e191773 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sun, 24 Mar 2024 21:08:23 +0100 Subject: [PATCH 01/59] feat(database)!: implement sqlite support Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- diesel.toml | 9 +++++++++ migrations/.keep | 0 2 files changed, 9 insertions(+) create mode 100644 diesel.toml create mode 100644 migrations/.keep diff --git a/diesel.toml b/diesel.toml new file mode 100644 index 00000000..c028f4a6 --- /dev/null +++ b/diesel.toml @@ -0,0 +1,9 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/schema.rs" +custom_type_derives = ["diesel::query_builder::QueryId"] + +[migrations_directory] +dir = "migrations" diff --git a/migrations/.keep b/migrations/.keep new file mode 100644 index 00000000..e69de29b From 092e657969f57b2dc2d07e6d7a7740fd4a7156f0 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sun, 24 Mar 2024 21:24:39 +0100 Subject: [PATCH 02/59] add initial migration Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .../2024-03-24-201233_create_activities/down.sql | 2 ++ .../2024-03-24-201233_create_activities/up.sql | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 migrations/2024-03-24-201233_create_activities/down.sql create mode 100644 migrations/2024-03-24-201233_create_activities/up.sql diff --git a/migrations/2024-03-24-201233_create_activities/down.sql b/migrations/2024-03-24-201233_create_activities/down.sql new file mode 100644 index 00000000..9d102141 --- /dev/null +++ b/migrations/2024-03-24-201233_create_activities/down.sql @@ -0,0 +1,2 @@ +-- This file should undo anything in `up.sql` +DROP TABLE activities; \ No newline at end of file diff --git a/migrations/2024-03-24-201233_create_activities/up.sql b/migrations/2024-03-24-201233_create_activities/up.sql new file mode 100644 index 00000000..44e985ce --- /dev/null +++ b/migrations/2024-03-24-201233_create_activities/up.sql @@ -0,0 +1,14 @@ +-- Migration script for creating the activities table in SQLite + +CREATE TABLE activities ( + id TEXT PRIMARY KEY, + category TEXT NOT NULL, + description TEXT NOT NULL, + begin TEXT NOT NULL, + end TEXT NOT NULL, + duration INTEGER NOT NULL, + kind TEXT NOT NULL, + status TEXT NOT NULL, + parent_id INTEGER, + FOREIGN KEY (parent_id) REFERENCES activities(id) +); From a0daab8cc0c956203e902e3fcc69f8a5376be067 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sun, 24 Mar 2024 21:32:07 +0100 Subject: [PATCH 03/59] add newline Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- migrations/2024-03-24-201233_create_activities/down.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/2024-03-24-201233_create_activities/down.sql b/migrations/2024-03-24-201233_create_activities/down.sql index 9d102141..78d9457c 100644 --- a/migrations/2024-03-24-201233_create_activities/down.sql +++ b/migrations/2024-03-24-201233_create_activities/down.sql @@ -1,2 +1,2 @@ -- This file should undo anything in `up.sql` -DROP TABLE activities; \ No newline at end of file +DROP TABLE activities; From 197ac5e05ef220915ccf8def789424d546964abc Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:44:19 +0100 Subject: [PATCH 04/59] switch to rusqlite and dbmate for migrations Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 91 +++++++++++++++++- Cargo.toml | 4 +- crates/core/Cargo.toml | 7 +- crates/core/src/error.rs | 40 +++++--- crates/core/src/storage.rs | 6 +- crates/core/src/storage/sqlite.rs | 34 ++++++- db/README.md | 57 +++++++++++ .../20240325143710_create_activities.sql | 12 ++- db/pace.sqlite3 | Bin 0 -> 20480 bytes db/schema.sql | 16 +++ migrations/.keep | 0 .../down.sql | 2 - 12 files changed, 230 insertions(+), 39 deletions(-) create mode 100644 db/README.md rename migrations/2024-03-24-201233_create_activities/up.sql => db/migrations/20240325143710_create_activities.sql (63%) create mode 100644 db/pace.sqlite3 create mode 100644 db/schema.sql delete mode 100644 migrations/.keep delete mode 100644 migrations/2024-03-24-201233_create_activities/down.sql diff --git a/Cargo.lock b/Cargo.lock index b2937ff2..7d14c96b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -65,6 +77,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -478,7 +496,6 @@ version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" dependencies = [ - "chrono", "diesel_derives", "libsqlite3-sys", "time", @@ -559,6 +576,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "either" version = "1.10.0" @@ -609,6 +632,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.0.2" @@ -825,6 +860,19 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692eaaf7f7607518dd3cef090f1474b61edc5301d8012f09579920df68b725ee" +dependencies = [ + "hashbrown", +] [[package]] name = "heck" @@ -1038,9 +1086,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" dependencies = [ "cc", "pkg-config", @@ -1304,9 +1352,9 @@ dependencies = [ "chrono", "chrono-tz", "clap", - "diesel", "directories", "displaydoc", + "dotenvy", "enum_dispatch", "eyre", "getset", @@ -1321,6 +1369,7 @@ dependencies = [ "parking_lot", "rayon", "rstest", + "rusqlite", "serde", "serde_derive", "serde_json", @@ -1764,6 +1813,20 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rusqlite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +dependencies = [ + "bitflags 2.5.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2782,6 +2845,26 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "zeroize" version = "1.7.0" diff --git a/Cargo.toml b/Cargo.toml index e5d2e17f..3be5f968 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ dialoguer = "0.11.0" diesel = "2.1.5" directories = "5.0.1" displaydoc = "0.2.4" +dotenvy = "0.15.7" enum_dispatch = "0.3.12" eyre = "0.6.12" getset = "0.1.2" @@ -37,7 +38,7 @@ humantime = "2.1.0" insta = "1.36.1" insta-cmd = "0.5.0" itertools = "0.12.1" -libsqlite3-sys = "0.27" +libsqlite3-sys = "0.28.0" merge = "0.1.0" miette = "7.2.0" once_cell = "1.19.0" @@ -49,6 +50,7 @@ parking_lot = "0.12.1" predicates = "3.1.0" rayon = "1.10.0" rstest = "0.18.2" +rusqlite = "0.31.0" serde = "1.0.197" serde_derive = "1.0.197" serde_json = "1.0.114" diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 81b2d328..4e541ec6 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -19,21 +19,19 @@ include = [ "Cargo.toml", ] -# TODO!: Use features for adding optional dependencies for testing and merging etc. [features] default = ["cli"] cli = ["clap"] -sqlite = ["dep:diesel", "dep:libsqlite3-sys"] +sqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] clap = ["dep:clap"] -# testing = ["dep:arbitrary"] [dependencies] chrono = { workspace = true, features = ["serde"] } chrono-tz = { workspace = true, features = ["serde"] } clap = { workspace = true, optional = true, features = ["env", "wrap_help", "derive"] } -diesel = { workspace = true, features = ["sqlite", "chrono"], optional = true } directories = { workspace = true } displaydoc = { workspace = true } +dotenvy = { workspace = true } enum_dispatch = { workspace = true } getset = { workspace = true } itertools = { workspace = true } @@ -45,6 +43,7 @@ open = { workspace = true } pace_time = { workspace = true } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } +rusqlite = { workspace = true, optional = true, features = ["bundled"] } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs index 9582667d..70df4e6c 100644 --- a/crates/core/src/error.rs +++ b/crates/core/src/error.rs @@ -109,39 +109,35 @@ pub enum PaceErrorKind { #[error(transparent)] StdIo(#[from] std::io::Error), - /// Serialization to TOML failed: `{0}` + /// Serialization to TOML failed: {0} #[error(transparent)] SerializationToTomlFailed(#[from] toml::ser::Error), - /// Deserialization from TOML failed: `{0}` + /// Deserialization from TOML failed: {0} #[error(transparent)] DeserializationFromTomlFailed(#[from] toml::de::Error), - /// Activity store error: `{0}` + /// Activity store error: {0} #[error(transparent)] ActivityStore(#[from] ActivityStoreErrorKind), - /// Activity log error: `{0}` + /// Activity log error: {0} #[error(transparent)] ActivityLog(#[from] ActivityLogErrorKind), - /// Time related error: `{0}` + /// Time related error: {0} #[error(transparent)] PaceTime(#[from] PaceTimeErrorKind), - /// JSON error: `{0}` + /// JSON error: {0} #[error(transparent)] Json(#[from] serde_json::Error), - // /// SQLite error: {0} - // #[error(transparent)] - // #[cfg(feature = "sqlite")] - // SQLite(#[from] diesel::ConnectionError), - /// Chrono parse error: `{0}` + /// Chrono parse error: {0} #[error(transparent)] ChronoParse(#[from] chrono::ParseError), - /// Time chosen is not valid, because it lays before the current activity's beginning: `{0}` + /// Time chosen is not valid, because it lays before the current activity's beginning: {0} #[error(transparent)] ChronoDurationIsNegative(#[from] chrono::OutOfRangeError), @@ -163,9 +159,14 @@ pub enum PaceErrorKind { /// There is no path available to store the activity log NoPathAvailable, - /// {0} + /// Templating error: {0} #[error(transparent)] Template(#[from] TemplatingErrorKind), + + /// SQLite database error: {0} + #[error(transparent)] + #[cfg(feature = "sqlite")] + SQLite(#[from] SqliteDatabaseStoreErrorKind), } /// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log. @@ -303,19 +304,28 @@ pub enum ActivityStoreErrorKind { MissingCategoryForActivity(ActivityGuid), } +/// [`SqliteDatabaseStoreErrorKind`] describes the errors that can happen while dealing with the SQLite database. +#[non_exhaustive] +#[cfg(feature = "sqlite")] +#[derive(Error, Debug, Display)] +pub enum SqliteDatabaseStoreErrorKind { + /// Error connecting to database: {0} + ConnectionFailed(String), +} + trait PaceErrorMarker: Error {} impl PaceErrorMarker for std::io::Error {} impl PaceErrorMarker for toml::de::Error {} impl PaceErrorMarker for toml::ser::Error {} impl PaceErrorMarker for serde_json::Error {} -#[cfg(feature = "sqlite")] -impl PaceErrorMarker for diesel::ConnectionError {} impl PaceErrorMarker for chrono::ParseError {} impl PaceErrorMarker for chrono::OutOfRangeError {} impl PaceErrorMarker for ActivityLogErrorKind {} impl PaceErrorMarker for PaceTimeErrorKind {} impl PaceErrorMarker for ActivityStoreErrorKind {} +#[cfg(feature = "sqlite")] +impl PaceErrorMarker for SqliteDatabaseStoreErrorKind {} impl PaceErrorMarker for TemplatingErrorKind {} impl From for PaceError diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 91d41d62..7f0a3432 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -26,9 +26,9 @@ pub mod file; /// An in-memory storage backend for activities. pub mod in_memory; -// TODO: Implement conversion FromSQL and ToSQL -// #[cfg(feature = "sqlite")] -// pub mod sqlite; + +#[cfg(feature = "sqlite")] +pub mod sqlite; /// Get the storage backend from the configuration. /// diff --git a/crates/core/src/storage/sqlite.rs b/crates/core/src/storage/sqlite.rs index e6c252c1..c1e1b9e5 100644 --- a/crates/core/src/storage/sqlite.rs +++ b/crates/core/src/storage/sqlite.rs @@ -1,11 +1,35 @@ -use serde::{Deserialize, Serialize}; - use crate::{ - domain::activity::{Activity, ActivityId, ActivityLog}, - error::PaceResult, + domain::activity::Activity, + error::{PaceResult, SqliteDatabaseStoreErrorKind}, storage::ActivityStorage, }; +use rusqlite::{Connection, Result}; + +use serde::{Deserialize, Serialize}; +use std::env; struct SqliteActivityStorage { - conn: Connection, + connection: Connection, +} + +impl SqliteActivityStorage { + pub fn new(connection_string: String) -> PaceResult { + let connection = Connection::open(connection_string.as_str()).map_err( + SqliteDatabaseStoreErrorKind::ConnectionFailed(connection_string), + )?; + + Ok(Self { connection }) + } +} + +impl ActivityStorage for SqliteActivityStorage { + fn setup_storage(&self) -> PaceResult<()> { + // TODO!: Check if the needed tables are existing or if we + // are dealing with a fresh database, so we need to create + // the tables + + // + + Ok(()) + } } diff --git a/db/README.md b/db/README.md new file mode 100644 index 00000000..2d6f465e --- /dev/null +++ b/db/README.md @@ -0,0 +1,57 @@ +# Database + +This directory contains the database schema and migrations for the application. +It also contains the development database used for testing and development. + +## Migrations + +This directory contains all the migrations for the database. Migrations are used +to manage the database schema and are run in order to update the database to the +latest schema version. + +## Creating a Migration + +To create a new migration, run the following command: + +```console +dbmate new +``` + +This will create a new migration file in the `migrations` directory with the +name `_.sql`. + +## Running Migrations + +To run all pending migrations, run the following command: + +```console +dbmate up +``` + +To rollback the last migration, run the following command: + +```console +dbmate down +``` + +To rollback all migrations, run the following command: + +```console +dbmate drop +``` + +For more information on the `dbmate` CLI, run the following command: + +```console +dbmate help +``` + +## Database Connection + +The database connection string is read from the `DATABASE_URL` environment +variable. This variable should be set to the connection string for the database. +For example: + +```console +export DATABASE_URL="sqlite:./db/db.sqlite3" +``` diff --git a/migrations/2024-03-24-201233_create_activities/up.sql b/db/migrations/20240325143710_create_activities.sql similarity index 63% rename from migrations/2024-03-24-201233_create_activities/up.sql rename to db/migrations/20240325143710_create_activities.sql index 44e985ce..9bebb38b 100644 --- a/migrations/2024-03-24-201233_create_activities/up.sql +++ b/db/migrations/20240325143710_create_activities.sql @@ -1,14 +1,16 @@ --- Migration script for creating the activities table in SQLite - +-- migrate:up CREATE TABLE activities ( id TEXT PRIMARY KEY, category TEXT NOT NULL, description TEXT NOT NULL, begin TEXT NOT NULL, - end TEXT NOT NULL, - duration INTEGER NOT NULL, + end TEXT NULL, + duration INTEGER NULL, kind TEXT NOT NULL, status TEXT NOT NULL, - parent_id INTEGER, + parent_id TEXT NULL, FOREIGN KEY (parent_id) REFERENCES activities(id) ); + +-- migrate:down +DROP TABLE activities; diff --git a/db/pace.sqlite3 b/db/pace.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..3aaf697d623c6d1ec12106d4fa43d2ba8549fedb GIT binary patch literal 20480 zcmeI(O>f#T7zc0%(sn~b>9hk^(^Dc%gFvV4xU6y!8cVk{mD*F}f=8{Emn8__5V@E1MKaJu6SF}m?iD8g8loCQrU3YZN zN_w5vtQcA2fp3$%nEotVe~4MWBbI0VD&JX89vF`h1Rwwb2tWV=5P$##AOHafWCGvM zi+h!7)%fvM@yi>*yGl-_k|N1l=25`BkkQb4+hH{Cr*?_zB6~Ds=OO(NwBLKd1%1aZ zp3eeZu0($n-_FDSNl5*(PG=tLiKH9Lv67?Vrtqcc%Z&jsT&%V<)g$q=Fpl^{jb_(T?ijgwdnY#bDz%#N?b&QQlJ1ol@Ms|W^Bj}4j>5|3 z9IV9;s67>Nk~&X$+`Zzl?KWOJbR5e8*L!mqgh6jNG-ZqJEqnrH@ou zSHt>E^alk35P$##AOHafKmY;|fB*y_0D-L#*f$DJquw~IHybbA!{#fuUebBt{J#~O zizFZb0SG_<0uX=z1Rwwb2tWV=3xTIa=ke Date: Mon, 25 Mar 2024 20:17:54 +0100 Subject: [PATCH 05/59] implement activity traits I Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 35 +- Cargo.toml | 6 +- crates/core/Cargo.toml | 9 +- crates/core/README.md | 5 +- crates/core/src/config.rs | 9 +- crates/core/src/domain/activity.rs | 19 + crates/core/src/domain/status.rs | 17 +- crates/core/src/error.rs | 45 +- crates/core/src/storage.rs | 44 +- crates/core/src/storage/sqlite.rs | 443 +++++++++++++++++- crates/time/Cargo.toml | 5 +- crates/time/README.md | 6 + crates/time/src/lib.rs | 2 + crates/time/src/rusqlite.rs | 39 ++ .../20240325143710_create_activities.sql | 7 +- 15 files changed, 615 insertions(+), 76 deletions(-) create mode 100644 crates/time/src/rusqlite.rs diff --git a/Cargo.lock b/Cargo.lock index 7d14c96b..72b767c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -490,38 +490,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "diesel" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" -dependencies = [ - "diesel_derives", - "libsqlite3-sys", - "time", -] - -[[package]] -name = "diesel_derives" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" -dependencies = [ - "diesel_table_macro_syntax", - "proc-macro2", - "quote", - "syn 2.0.55", -] - -[[package]] -name = "diesel_table_macro_syntax" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" -dependencies = [ - "syn 2.0.55", -] - [[package]] name = "difflib" version = "0.4.0" @@ -1312,7 +1280,6 @@ dependencies = [ "clap_complete", "clap_complete_nushell", "dialoguer", - "diesel", "directories", "eyre", "human-panic", @@ -1404,6 +1371,7 @@ dependencies = [ "getset", "humantime", "rstest", + "rusqlite", "serde", "serde_derive", "thiserror", @@ -1820,6 +1788,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" dependencies = [ "bitflags 2.5.0", + "chrono", "fallible-iterator", "fallible-streaming-iterator", "hashlink", diff --git a/Cargo.toml b/Cargo.toml index 3be5f968..379fe552 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,6 @@ clap_complete = "4.5.1" clap_complete_nushell = "4.5.1" derive_more = { version = "0.99.17", default-features = false } dialoguer = "0.11.0" -diesel = "2.1.5" directories = "5.0.1" displaydoc = "0.2.4" dotenvy = "0.15.7" @@ -102,13 +101,12 @@ clap = { workspace = true, features = ["env", "wrap_help", "derive"] } clap_complete = { workspace = true } clap_complete_nushell = { workspace = true } dialoguer = { workspace = true, features = ["history", "fuzzy-select"] } -diesel = { workspace = true, features = ["sqlite"] } directories = { workspace = true } eyre = { workspace = true } human-panic = { workspace = true } pace_cli = { workspace = true } -pace_core = { workspace = true, features = ["cli"] } -pace_time = { workspace = true, features = ["cli"] } +pace_core = { workspace = true, features = ["cli", "db"] } +pace_time = { workspace = true, features = ["cli", "db"] } serde = { workspace = true } serde_derive = { workspace = true } thiserror = { workspace = true } diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 4e541ec6..62627969 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -20,9 +20,10 @@ include = [ ] [features] -default = ["cli"] +default = ["cli", "db"] cli = ["clap"] -sqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] +db = ["rusqlite"] +rusqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] clap = ["dep:clap"] [dependencies] @@ -40,10 +41,10 @@ merge = { workspace = true } miette = { workspace = true, features = ["fancy"] } once_cell = { workspace = true } open = { workspace = true } -pace_time = { workspace = true } +pace_time = { workspace = true, features = ["rusqlite"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } -rusqlite = { workspace = true, optional = true, features = ["bundled"] } +rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } diff --git a/crates/core/README.md b/crates/core/README.md index 82260d40..75faa48c 100644 --- a/crates/core/README.md +++ b/crates/core/README.md @@ -42,9 +42,8 @@ This crate exposes a few features for controlling dependency usage: - **cli** - Enables support for CLI features by enabling `merge` and `clap` features. *This feature is enabled by default*. -- **sqlite** - Enables a dependency on the `rusqlite` crate and enables - persistence to a SQLite database. *This feature is disabled by default as it's - not yet implemented*. +- **rusqlite** - Enables a dependency on the `rusqlite` crate and enables + persistence to a SQLite database. *This feature is enabled by default*. ## Examples diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index 3f212f12..fa687eac 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -195,14 +195,21 @@ pub struct ExportConfig { /// Default: `sqlite` /// /// Options: `sqlite`, `postgres`, `mysql`, `sql-server` -#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default)] +#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, displaydoc::Display, EnumString)] #[serde(rename_all = "kebab-case")] #[non_exhaustive] pub enum DatabaseEngineKind { #[default] + /// SQLite Sqlite, + + /// Postgres Postgres, + + /// MySQL Mysql, + + /// SQL Server SqlServer, } diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index 6899fe13..9537e74f 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -8,6 +8,7 @@ use pace_time::{ date_time::PaceDateTime, duration::{calculate_duration, duration_to_str, PaceDuration}, }; + use serde_derive::{Deserialize, Serialize}; use std::{collections::HashSet, fmt::Display}; use strum_macros::EnumString; @@ -81,8 +82,10 @@ impl From<(ActivityGuid, Activity)> for ActivityItem { PartialOrd, Ord, EnumString, + strum::Display, )] #[serde(rename_all = "kebab-case")] +#[strum(serialize_all = "kebab-case")] // #[serde(untagged)] pub enum ActivityKind { /// A generic activity @@ -270,6 +273,10 @@ impl ActivityEndOptions { pub const fn new(end: PaceDateTime, duration: PaceDuration) -> Self { Self { end, duration } } + + pub fn as_tuple(&self) -> (PaceDateTime, PaceDuration) { + (self.end, self.duration) + } } #[derive( @@ -307,6 +314,18 @@ impl ActivityKindOptions { #[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] pub struct ActivityGuid(Ulid); +impl ActivityGuid { + #[must_use] + pub fn new() -> Self { + Self(Ulid::new()) + } + + #[must_use] + pub fn with_id(id: Ulid) -> Self { + Self(id) + } +} + impl Display for ActivityGuid { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { self.0.fmt(f) diff --git a/crates/core/src/domain/status.rs b/crates/core/src/domain/status.rs index 8e4383b9..4675a8f5 100644 --- a/crates/core/src/domain/status.rs +++ b/crates/core/src/domain/status.rs @@ -1,4 +1,5 @@ use serde_derive::{Deserialize, Serialize}; +use strum::EnumString; #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "kebab-case")] @@ -16,8 +17,22 @@ pub enum TaskStatus { Waiting, } -#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[derive( + Debug, + Clone, + Copy, + Default, + Serialize, + Deserialize, + PartialEq, + Eq, + PartialOrd, + Ord, + EnumString, + strum::Display, +)] #[serde(rename_all = "kebab-case")] +#[strum(serialize_all = "kebab-case")] pub enum ActivityStatusKind { /// The initial state of an activity once it's created in the system but not yet started. #[default] diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs index 70df4e6c..915b6e43 100644 --- a/crates/core/src/error.rs +++ b/crates/core/src/error.rs @@ -6,7 +6,10 @@ use pace_time::error::PaceTimeErrorKind; use std::{error::Error, io, path::PathBuf}; use thiserror::Error; -use crate::domain::activity::{Activity, ActivityGuid}; +use crate::{ + config::DatabaseEngineKind, + domain::activity::{Activity, ActivityGuid}, +}; /// Result type that is being returned from test functions and methods that can fail and thus have errors. pub type TestResult = Result>; @@ -163,10 +166,17 @@ pub enum PaceErrorKind { #[error(transparent)] Template(#[from] TemplatingErrorKind), - /// SQLite database error: {0} + /// SQLite error: {0} #[error(transparent)] - #[cfg(feature = "sqlite")] - SQLite(#[from] SqliteDatabaseStoreErrorKind), + #[cfg(feature = "rusqlite")] + SQLite(#[from] rusqlite::Error), + + /// Database error: {0} + #[error(transparent)] + Database(#[from] DatabaseErrorKind), + + /// Database storage not configured + DatabaseStorageNotConfigured, } /// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log. @@ -306,11 +316,25 @@ pub enum ActivityStoreErrorKind { /// [`SqliteDatabaseStoreErrorKind`] describes the errors that can happen while dealing with the SQLite database. #[non_exhaustive] -#[cfg(feature = "sqlite")] #[derive(Error, Debug, Display)] -pub enum SqliteDatabaseStoreErrorKind { - /// Error connecting to database: {0} - ConnectionFailed(String), +pub enum DatabaseErrorKind { + /// Error connecting to database: {0} - {1} + ConnectionFailed(String, String), + + /// No connection string provided + NoConnectionString, + + /// No configuration settings provided in configuration file, please set them up with `pace setup config` + NoConfigSettings, + + /// This database engine is currently not supported: {0} + UnsupportedDatabaseEngine(DatabaseEngineKind), + + /// Activity with id {0} not found + ActivityNotFound(ActivityGuid), + + /// Failed to create activity: {0} + ActivityCreationFailed(Activity), } trait PaceErrorMarker: Error {} @@ -321,11 +345,12 @@ impl PaceErrorMarker for toml::ser::Error {} impl PaceErrorMarker for serde_json::Error {} impl PaceErrorMarker for chrono::ParseError {} impl PaceErrorMarker for chrono::OutOfRangeError {} +#[cfg(feature = "rusqlite")] +impl PaceErrorMarker for rusqlite::Error {} impl PaceErrorMarker for ActivityLogErrorKind {} impl PaceErrorMarker for PaceTimeErrorKind {} impl PaceErrorMarker for ActivityStoreErrorKind {} -#[cfg(feature = "sqlite")] -impl PaceErrorMarker for SqliteDatabaseStoreErrorKind {} +impl PaceErrorMarker for DatabaseErrorKind {} impl PaceErrorMarker for TemplatingErrorKind {} impl From for PaceError diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 7f0a3432..e85cfbb1 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -10,15 +10,18 @@ use crate::{ hold::HoldOptions, resume::ResumeOptions, DeleteOptions, EndOptions, KeywordOptions, UpdateOptions, }, - config::{ActivityLogStorageKind, PaceConfig}, + config::{ActivityLogStorageKind, DatabaseEngineKind, PaceConfig}, domain::{ activity::{Activity, ActivityGuid, ActivityItem, ActivityKind}, filter::{ActivityFilterKind, FilteredActivities}, status::ActivityStatusKind, }, - error::{PaceErrorKind, PaceOptResult, PaceResult}, + error::{DatabaseErrorKind, PaceErrorKind, PaceOptResult, PaceResult}, service::activity_store::ActivityStore, - storage::{file::TomlActivityStorage, in_memory::InMemoryActivityStorage}, + storage::{ + file::TomlActivityStorage, in_memory::InMemoryActivityStorage, + sqlite::SqliteActivityStorage, + }, }; /// A type of storage that can be synced to a persistent medium - a file @@ -27,9 +30,10 @@ pub mod file; /// An in-memory storage backend for activities. pub mod in_memory; -#[cfg(feature = "sqlite")] +#[cfg(feature = "rusqlite")] pub mod sqlite; + /// Get the storage backend from the configuration. /// /// # Arguments @@ -49,7 +53,35 @@ pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult { - return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()) + if config.database().is_some() { + let Some(db_config) = config.database() else { + return Err(DatabaseErrorKind::NoConfigSettings.into()); + }; + + match db_config.engine() { + DatabaseEngineKind::Sqlite => { + #[cfg(feature = "rusqlite")] + { + let connection_string = config + .database() + .as_ref() + .ok_or(DatabaseErrorKind::NoConnectionString)? + .connection_string(); + + debug!("Connecting to database: {}", &connection_string); + + SqliteActivityStorage::new(connection_string.clone())?.into() + } + #[cfg(not(feature = "rusqlite"))] + return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); + } + engine => { + return Err(DatabaseErrorKind::UnsupportedDatabaseEngine(*engine).into()) + } + } + } + + return Err(PaceErrorKind::DatabaseStorageNotConfigured.into()); } #[cfg(test)] ActivityLogStorageKind::InMemory => InMemoryActivityStorage::new().into(), @@ -65,6 +97,7 @@ pub enum StorageKind { ActivityStore, InMemoryActivityStorage, TomlActivityStorage, + SqliteActivityStorage, } impl Display for StorageKind { @@ -75,6 +108,7 @@ impl Display for StorageKind { write!(f, "StorageKind: InMemoryActivityStorage") } Self::TomlActivityStorage(_) => write!(f, "StorageKind: TomlActivityStorage"), + Self::SqliteActivityStorage(_) => write!(f, "StorageKind: SqliteActivityStorage"), } } } diff --git a/crates/core/src/storage/sqlite.rs b/crates/core/src/storage/sqlite.rs index c1e1b9e5..c21e15d3 100644 --- a/crates/core/src/storage/sqlite.rs +++ b/crates/core/src/storage/sqlite.rs @@ -1,22 +1,41 @@ +use std::collections::BTreeMap; + +use itertools::Itertools; +use rusqlite::Connection; + +use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; +use tracing::debug; + use crate::{ domain::activity::Activity, - error::{PaceResult, SqliteDatabaseStoreErrorKind}, - storage::ActivityStorage, + error::{DatabaseErrorKind, PaceResult}, + prelude::{ + ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityStatusKind, + DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceOptResult, + ResumeOptions, UpdateOptions, + }, + storage::{ + ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, + ActivityWriteOps, SyncStorage, + }, }; -use rusqlite::{Connection, Result}; -use serde::{Deserialize, Serialize}; -use std::env; +pub trait FromRow { + fn from_row(row: &rusqlite::Row<'_>) -> PaceResult + where + Self: Sized; +} -struct SqliteActivityStorage { +#[derive(Debug)] +pub struct SqliteActivityStorage { connection: Connection, } impl SqliteActivityStorage { pub fn new(connection_string: String) -> PaceResult { - let connection = Connection::open(connection_string.as_str()).map_err( - SqliteDatabaseStoreErrorKind::ConnectionFailed(connection_string), - )?; + let connection = Connection::open(connection_string.as_str()).map_err(|err| { + DatabaseErrorKind::ConnectionFailed(connection_string, err.to_string()) + })?; Ok(Self { connection }) } @@ -26,10 +45,412 @@ impl ActivityStorage for SqliteActivityStorage { fn setup_storage(&self) -> PaceResult<()> { // TODO!: Check if the needed tables are existing or if we // are dealing with a fresh database, so we need to create - // the tables + // the tables. + + Ok(()) + } +} - // +impl SyncStorage for SqliteActivityStorage { + fn sync(&self) -> PaceResult<()> { + // TODO!: Sync the activities to the database Ok(()) } } + +impl ActivityReadOps for SqliteActivityStorage { + #[tracing::instrument] + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + let mut stmt = self + .connection + .prepare("SELECT * FROM activities WHERE id = ?1")?; + + let activity_item_iter = + stmt.query_map(&[&activity_id], |row| Ok(ActivityItem::from_row(&row)))?; + + let activity_item = activity_item_iter + .filter_map_ok(|item| item.ok()) + .next() + .transpose()? + .ok_or(DatabaseErrorKind::ActivityNotFound(activity_id))?; + + debug!("Read activity: {:?}", activity_item); + + Ok(activity_item) + } + + #[tracing::instrument] + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + let mut stmt = self.connection.prepare(filter.to_sql_statement())?; + + let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; + + let activities = activity_item_iter + .filter_map_ok(|item| item.ok()) + .collect::, _>>()?; + + debug!("Listed activities: {:?}", activities); + + if activities.is_empty() { + return Ok(None); + } + + let activities = match filter { + ActivityFilterKind::Everything => FilteredActivities::Everything(activities), + ActivityFilterKind::OnlyActivities => FilteredActivities::OnlyActivities(activities), + ActivityFilterKind::Active => FilteredActivities::Active(activities), + ActivityFilterKind::ActiveIntermission => { + FilteredActivities::ActiveIntermission(activities) + } + ActivityFilterKind::Archived => FilteredActivities::Archived(activities), + ActivityFilterKind::Ended => FilteredActivities::Ended(activities), + ActivityFilterKind::Held => FilteredActivities::Held(activities), + ActivityFilterKind::Intermission => FilteredActivities::Intermission(activities), + ActivityFilterKind::TimeRange(_) => FilteredActivities::TimeRange(activities), + }; + + Ok(Some(activities)) + } +} + +impl ActivityWriteOps for SqliteActivityStorage { + fn create_activity(&self, activity: Activity) -> PaceResult { + let mut stmt = self + .connection + .prepare(activity.to_sql_prepare_statement())?; + + let (guid, params) = activity.to_sql_execute_statement()?; + + if stmt.execute(params.as_slice())? > 0 { + return Ok(ActivityItem::from((guid, activity))); + } + + return Err(DatabaseErrorKind::ActivityCreationFailed(activity).into()); + } + + fn update_activity( + &self, + activity_id: ActivityGuid, + updated_activity: Activity, + update_opts: UpdateOptions, + ) -> PaceResult { + todo!() + } + + fn delete_activity( + &self, + activity_id: ActivityGuid, + delete_opts: DeleteOptions, + ) -> PaceResult { + todo!() + } +} +impl ActivityStateManagement for SqliteActivityStorage { + fn hold_activity( + &self, + activity_id: ActivityGuid, + hold_opts: HoldOptions, + ) -> PaceResult { + todo!() + } + + fn resume_activity( + &self, + activity_id: ActivityGuid, + resume_opts: ResumeOptions, + ) -> PaceResult { + todo!() + } + + fn resume_most_recent_activity( + &self, + resume_opts: ResumeOptions, + ) -> PaceOptResult { + todo!() + } + + fn end_activity( + &self, + activity_id: ActivityGuid, + end_opts: EndOptions, + ) -> PaceResult { + todo!() + } + + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + todo!() + } + + fn end_all_active_intermissions( + &self, + end_opts: EndOptions, + ) -> PaceOptResult> { + todo!() + } + + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + todo!() + } + + fn hold_most_recent_active_activity( + &self, + hold_opts: HoldOptions, + ) -> PaceOptResult { + todo!() + } +} +impl ActivityQuerying for SqliteActivityStorage { + fn group_activities_by_duration_range( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn group_activities_by_start_date( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn list_activities_with_intermissions( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn group_activities_by_keywords( + &self, + keyword_opts: KeywordOptions, + ) -> PaceOptResult>> { + todo!() + } + + fn group_activities_by_kind(&self) -> PaceOptResult>> { + todo!() + } + + fn list_activities_by_time_range( + &self, + time_range_opts: TimeRangeOptions, + ) -> PaceOptResult> { + todo!() + } + + fn group_activities_by_status( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn list_activities_by_id(&self) -> PaceOptResult> { + todo!() + } +} + +pub mod sql_conversion { + use std::{collections::HashSet, str::FromStr}; + + use pace_time::date_time::PaceDateTime; + use rusqlite::{types::FromSql, Row, ToSql}; + use ulid::Ulid; + + // use pace_time::rusqlite::*; + + use crate::{ + prelude::{ + Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, + ActivityKind, ActivityKindOptions, ActivityStatusKind, PaceResult, + }, + storage::sqlite::FromRow, + }; + + impl Activity { + pub fn to_sql_prepare_statement(&self) -> &'static str { + "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" + } + + pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { + let category = if let Some(category) = self.category() { + category.to_sql()? + } else { + "NULL".to_sql()? + }; + + let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { + let (end, duration) = end_opts.as_tuple(); + (end.to_sql()?, duration.to_sql()?) + } else { + ("NULL".to_sql()?, "NULL".to_sql()?) + }; + + let parent_id = if let Some(parent_id) = self.parent_id() { + parent_id.to_sql()? + } else { + "NULL".to_sql()? + }; + + let tags = if let Some(tags) = self.tags() { + let tags = tags + .iter() + .map(|tag| tag.to_string()) + .collect::>(); + + tags.join(",").to_sql()? + } else { + "NULL".to_sql()? + }; + + let guid = ActivityGuid::new(); + + Ok(( + guid, + vec![ + // TODO: We create a new ID here, that should probably happen + // TODO: somewhere else and needs a refactoring + &guid, + &category, + &self.description(), + &self.begin(), + &end, + &duration, + &self.kind(), + &self.status(), + &tags, + &parent_id, + ], + )) + } + } + + impl ActivityFilterKind { + pub fn to_sql_statement(&self) -> &'static str { + match self { + Self::Everything => "SELECT * FROM activities", + ActivityFilterKind::OnlyActivities => todo!(), + ActivityFilterKind::Active => { + "SELECT * FROM activities WHERE status = 'in-progress'" + } + ActivityFilterKind::ActiveIntermission => todo!(), + ActivityFilterKind::Archived => { + "SELECT * FROM activities WHERE status = 'archived'" + } + ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", + ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", + ActivityFilterKind::Intermission => todo!(), + ActivityFilterKind::TimeRange(opts) => todo!(), + } + } + } + + impl FromRow for ActivityEndOptions { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(Self::new(row.get("end")?, row.get("duration")?)) + } + } + + impl FromRow for ActivityKindOptions { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(Self::with_parent_id(row.get("parent_id")?)) + } + } + + impl FromRow for Activity { + fn from_row(row: &Row<'_>) -> PaceResult { + let begin_time: PaceDateTime = row.get("begin")?; + + let description: String = row.get("description")?; + + let tags_string: String = row.get("tags")?; + + let tags = tags_string + .split(',') + .map(|tag| tag.to_string()) + .collect::>(); + + Ok(Activity::builder() + .category(Some(row.get("category")?)) // TODO: Check for None + .description(description) + .begin(begin_time) + .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None + .kind(row.get("kind")?) + .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None + .tags(tags) + .status(row.get("status")?) + .build()) + } + } + + impl FromRow for ActivityGuid { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(row.get("guid")?) + } + } + + impl FromRow for ActivityItem { + fn from_row(row: &Row<'_>) -> PaceResult { + let activity_end_opts = ActivityEndOptions::from_row(row)?; + + let activity_kind_opts = ActivityKindOptions::from_row(row)?; + + let activity = Activity::from_row(row)?; + + let guid = ActivityGuid::from_row(row)?; + + Ok(Self::builder().guid(guid).activity(activity).build()) + } + } + + impl ToSql for ActivityGuid { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } + } + + impl FromSql for ActivityGuid { + fn column_result( + value: rusqlite::types::ValueRef<'_>, + ) -> rusqlite::types::FromSqlResult { + Ok(ActivityGuid::with_id( + Ulid::from_string(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, + )) + } + } + + impl ToSql for ActivityKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } + } + + impl FromSql for ActivityKind { + fn column_result( + value: rusqlite::types::ValueRef<'_>, + ) -> rusqlite::types::FromSqlResult { + Ok(ActivityKind::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) + } + } + + impl ToSql for ActivityStatusKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } + } + + impl FromSql for ActivityStatusKind { + fn column_result( + value: rusqlite::types::ValueRef<'_>, + ) -> rusqlite::types::FromSqlResult { + Ok(ActivityStatusKind::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) + } + } +} diff --git a/crates/time/Cargo.toml b/crates/time/Cargo.toml index d8fa4146..a3d13be6 100644 --- a/crates/time/Cargo.toml +++ b/crates/time/Cargo.toml @@ -12,9 +12,11 @@ rust-version = { workspace = true } description = "pace-time - a library for handling date times, ranges, and durations for pace" [features] -default = ["cli"] +default = ["cli", "db"] cli = ["clap"] +db = ["rusqlite"] clap = ["dep:clap"] +rusqlite = ["dep:rusqlite"] [dependencies] chrono = { workspace = true, features = ["serde"] } @@ -24,6 +26,7 @@ derive_more = { workspace = true, features = ["add", "add_assign"] } displaydoc = { workspace = true } getset = { workspace = true } humantime = { workspace = true } +rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } serde = { workspace = true } serde_derive = { workspace = true } thiserror = { workspace = true } diff --git a/crates/time/README.md b/crates/time/README.md index 99bd5652..ea72193a 100644 --- a/crates/time/README.md +++ b/crates/time/README.md @@ -42,6 +42,12 @@ This crate exposes a few features for controlling dependency usage: - **cli** - Enables support for CLI features by enabling `merge` and `clap` features. *This feature is enabled by default*. +- **db** - Enables support for database features by enabling `rusqlite` features. + *This feature is enabled by default*. + +- **rusqlite** - Enables a dependency on the `rusqlite` crate and enables + database support. *This feature is enabled by default*. + ## Examples TODO! diff --git a/crates/time/src/lib.rs b/crates/time/src/lib.rs index 50b84ab1..230c1dee 100644 --- a/crates/time/src/lib.rs +++ b/crates/time/src/lib.rs @@ -3,6 +3,8 @@ pub mod date_time; pub mod duration; pub mod error; pub mod flags; +#[cfg(feature = "rusqlite")] +pub mod rusqlite; pub mod time; pub mod time_frame; pub mod time_range; diff --git a/crates/time/src/rusqlite.rs b/crates/time/src/rusqlite.rs new file mode 100644 index 00000000..d30eee0f --- /dev/null +++ b/crates/time/src/rusqlite.rs @@ -0,0 +1,39 @@ +use rusqlite::{types::FromSql, ToSql}; + +use crate::{date_time::PaceDateTime, duration::PaceDuration}; + +impl ToSql for PaceDateTime { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for PaceDateTime { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + value + .as_str()? + .parse::() + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} + +impl ToSql for PaceDuration { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Integer( + i64::try_from(self.inner()) + .map_err(|err| rusqlite::Error::ToSqlConversionFailure(Box::new(err)))?, + ), + )) + } +} + +impl FromSql for PaceDuration { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::new(u64::try_from(value.as_i64()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} diff --git a/db/migrations/20240325143710_create_activities.sql b/db/migrations/20240325143710_create_activities.sql index 9bebb38b..f08d2503 100644 --- a/db/migrations/20240325143710_create_activities.sql +++ b/db/migrations/20240325143710_create_activities.sql @@ -1,6 +1,6 @@ -- migrate:up CREATE TABLE activities ( - id TEXT PRIMARY KEY, + guid TEXT PRIMARY KEY, category TEXT NOT NULL, description TEXT NOT NULL, begin TEXT NOT NULL, @@ -8,8 +8,9 @@ CREATE TABLE activities ( duration INTEGER NULL, kind TEXT NOT NULL, status TEXT NOT NULL, - parent_id TEXT NULL, - FOREIGN KEY (parent_id) REFERENCES activities(id) + tags TEXT NULL, + parent_guid TEXT NULL, + FOREIGN KEY (parent_id) REFERENCES activities(guid) ); -- migrate:down From c590e1c767aeed4565312e3504177976c13174d5 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Mon, 25 Mar 2024 20:46:56 +0100 Subject: [PATCH 06/59] transaction Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/error.rs | 3 +++ crates/core/src/storage.rs | 1 - crates/core/src/storage/sqlite.rs | 19 +++++++++++++++---- crates/time/README.md | 4 ++-- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs index 915b6e43..8f3479b6 100644 --- a/crates/core/src/error.rs +++ b/crates/core/src/error.rs @@ -335,6 +335,9 @@ pub enum DatabaseErrorKind { /// Failed to create activity: {0} ActivityCreationFailed(Activity), + + /// Failed to delete activity: {0} + ActivityDeletionFailed(ActivityGuid), } trait PaceErrorMarker: Error {} diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index e85cfbb1..b82b576b 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -33,7 +33,6 @@ pub mod in_memory; #[cfg(feature = "rusqlite")] pub mod sqlite; - /// Get the storage backend from the configuration. /// /// # Arguments diff --git a/crates/core/src/storage/sqlite.rs b/crates/core/src/storage/sqlite.rs index c21e15d3..e043c43e 100644 --- a/crates/core/src/storage/sqlite.rs +++ b/crates/core/src/storage/sqlite.rs @@ -116,13 +116,14 @@ impl ActivityReadOps for SqliteActivityStorage { impl ActivityWriteOps for SqliteActivityStorage { fn create_activity(&self, activity: Activity) -> PaceResult { - let mut stmt = self - .connection - .prepare(activity.to_sql_prepare_statement())?; + let tx = self.connection.transaction()?; + + let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; let (guid, params) = activity.to_sql_execute_statement()?; if stmt.execute(params.as_slice())? > 0 { + tx.commit()?; return Ok(ActivityItem::from((guid, activity))); } @@ -143,7 +144,17 @@ impl ActivityWriteOps for SqliteActivityStorage { activity_id: ActivityGuid, delete_opts: DeleteOptions, ) -> PaceResult { - todo!() + let activity = self.read_activity(activity_id)?; + + let tx = self.connection.transaction()?; + let mut stmt = tx.prepare("DELETE FROM activities WHERE id = ?1 LIMIT = 1")?; + + if stmt.execute(&[&activity_id])? == 1 { + tx.commit()?; + return Ok(activity); + } + + Err(DatabaseErrorKind::ActivityDeletionFailed(activity_id).into()) } } impl ActivityStateManagement for SqliteActivityStorage { diff --git a/crates/time/README.md b/crates/time/README.md index ea72193a..a02246c6 100644 --- a/crates/time/README.md +++ b/crates/time/README.md @@ -42,8 +42,8 @@ This crate exposes a few features for controlling dependency usage: - **cli** - Enables support for CLI features by enabling `merge` and `clap` features. *This feature is enabled by default*. -- **db** - Enables support for database features by enabling `rusqlite` features. - *This feature is enabled by default*. +- **db** - Enables support for database features by enabling `rusqlite` + features. *This feature is enabled by default*. - **rusqlite** - Enables a dependency on the `rusqlite` crate and enables database support. *This feature is enabled by default*. From 6438712035d89fe0478a46955091926652dbb9c9 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:05:48 +0100 Subject: [PATCH 07/59] add migrations Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .gitignore | 2 +- .../20240325143710_create_activities.sql | 5 +- .../20240326124253_create_activity_kinds.sql | 8 +++ db/migrations/20240326125555_create_tags.sql | 8 +++ .../20240326125630_create_activities_tags.sql | 11 ++++ .../20240326125819_create_activity_status.sql | 8 +++ .../20240326125937_create_categories.sql | 9 ++++ ...326130013_create_activities_categories.sql | 11 ++++ db/pace.sqlite3 | Bin 20480 -> 0 bytes db/schema.sql | 47 ++++++++++++++++-- 10 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 db/migrations/20240326124253_create_activity_kinds.sql create mode 100644 db/migrations/20240326125555_create_tags.sql create mode 100644 db/migrations/20240326125630_create_activities_tags.sql create mode 100644 db/migrations/20240326125819_create_activity_status.sql create mode 100644 db/migrations/20240326125937_create_categories.sql create mode 100644 db/migrations/20240326130013_create_activities_categories.sql delete mode 100644 db/pace.sqlite3 diff --git a/.gitignore b/.gitignore index d255760e..55b481fa 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,4 @@ logs/* .cargo/config.toml # Database -data/pace.sqlite3 +db/activities.pace.sqlite3 diff --git a/db/migrations/20240325143710_create_activities.sql b/db/migrations/20240325143710_create_activities.sql index f08d2503..7693e4d9 100644 --- a/db/migrations/20240325143710_create_activities.sql +++ b/db/migrations/20240325143710_create_activities.sql @@ -8,9 +8,10 @@ CREATE TABLE activities ( duration INTEGER NULL, kind TEXT NOT NULL, status TEXT NOT NULL, - tags TEXT NULL, parent_guid TEXT NULL, - FOREIGN KEY (parent_id) REFERENCES activities(guid) + FOREIGN KEY (kind) REFERENCES activity_kinds(guid), + FOREIGN KEY (status) REFERENCES activity_status(guid), + FOREIGN KEY (parent_guid) REFERENCES activities(guid) ); -- migrate:down diff --git a/db/migrations/20240326124253_create_activity_kinds.sql b/db/migrations/20240326124253_create_activity_kinds.sql new file mode 100644 index 00000000..8f9ad66c --- /dev/null +++ b/db/migrations/20240326124253_create_activity_kinds.sql @@ -0,0 +1,8 @@ +-- migrate:up +CREATE TABLE activity_kinds ( + guid TEXT PRIMARY KEY, + kind TEXT NOT NULL +); + +-- migrate:down +DROP TABLE activity_kinds; \ No newline at end of file diff --git a/db/migrations/20240326125555_create_tags.sql b/db/migrations/20240326125555_create_tags.sql new file mode 100644 index 00000000..7d6d2d85 --- /dev/null +++ b/db/migrations/20240326125555_create_tags.sql @@ -0,0 +1,8 @@ +-- migrate:up +CREATE TABLE tags ( + guid TEXT PRIMARY KEY, + tag TEXT NOT NULL +); + +-- migrate:down +DROP TABLE tags; \ No newline at end of file diff --git a/db/migrations/20240326125630_create_activities_tags.sql b/db/migrations/20240326125630_create_activities_tags.sql new file mode 100644 index 00000000..54f46b90 --- /dev/null +++ b/db/migrations/20240326125630_create_activities_tags.sql @@ -0,0 +1,11 @@ +-- migrate:up +CREATE TABLE activities_tags ( + guid TEXT PRIMARY KEY, + tag_guid TEXT NOT NULL, + activity_guid TEXT NOT NULL, + FOREIGN KEY (tag_guid) REFERENCES tags(guid), + FOREIGN KEY (activity_guid) REFERENCES activities(guid) +); + +-- migrate:down +DROP TABLE activities_tags; diff --git a/db/migrations/20240326125819_create_activity_status.sql b/db/migrations/20240326125819_create_activity_status.sql new file mode 100644 index 00000000..ff5e42ac --- /dev/null +++ b/db/migrations/20240326125819_create_activity_status.sql @@ -0,0 +1,8 @@ +-- migrate:up +CREATE TABLE activity_status ( + guid TEXT PRIMARY KEY, + status TEXT NOT NULL +); + +-- migrate:down +DROP TABLE activity_status; diff --git a/db/migrations/20240326125937_create_categories.sql b/db/migrations/20240326125937_create_categories.sql new file mode 100644 index 00000000..e23234fd --- /dev/null +++ b/db/migrations/20240326125937_create_categories.sql @@ -0,0 +1,9 @@ +-- migrate:up +CREATE TABLE categories ( + guid TEXT PRIMARY KEY, + category TEXT NOT NULL, + description TEXT NULL +); + +-- migrate:down +DROP TABLE categories; diff --git a/db/migrations/20240326130013_create_activities_categories.sql b/db/migrations/20240326130013_create_activities_categories.sql new file mode 100644 index 00000000..6515095b --- /dev/null +++ b/db/migrations/20240326130013_create_activities_categories.sql @@ -0,0 +1,11 @@ +-- migrate:up +CREATE TABLE activities_categories ( + guid TEXT PRIMARY KEY, + category_guid TEXT NOT NULL, + activity_guid TEXT NOT NULL, + FOREIGN KEY (category_guid) REFERENCES categories(guid), + FOREIGN KEY (activity_guid) REFERENCES activities(guid) +); + +-- migrate:down +DROP TABLE activities_categories; diff --git a/db/pace.sqlite3 b/db/pace.sqlite3 deleted file mode 100644 index 3aaf697d623c6d1ec12106d4fa43d2ba8549fedb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI(O>f#T7zc0%(sn~b>9hk^(^Dc%gFvV4xU6y!8cVk{mD*F}f=8{Emn8__5V@E1MKaJu6SF}m?iD8g8loCQrU3YZN zN_w5vtQcA2fp3$%nEotVe~4MWBbI0VD&JX89vF`h1Rwwb2tWV=5P$##AOHafWCGvM zi+h!7)%fvM@yi>*yGl-_k|N1l=25`BkkQb4+hH{Cr*?_zB6~Ds=OO(NwBLKd1%1aZ zp3eeZu0($n-_FDSNl5*(PG=tLiKH9Lv67?Vrtqcc%Z&jsT&%V<)g$q=Fpl^{jb_(T?ijgwdnY#bDz%#N?b&QQlJ1ol@Ms|W^Bj}4j>5|3 z9IV9;s67>Nk~&X$+`Zzl?KWOJbR5e8*L!mqgh6jNG-ZqJEqnrH@ou zSHt>E^alk35P$##AOHafKmY;|fB*y_0D-L#*f$DJquw~IHybbA!{#fuUebBt{J#~O zizFZb0SG_<0uX=z1Rwwb2tWV=3xTIa=ke Date: Tue, 26 Mar 2024 14:11:34 +0100 Subject: [PATCH 08/59] add ER Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- db/Entity-Relationship.png | Bin 0 -> 22198 bytes .../20240325143710_create_activities.sql | 2 +- .../20240326124253_create_activity_kinds.sql | 2 +- db/migrations/20240326125555_create_tags.sql | 2 +- .../20240326125630_create_activities_tags.sql | 2 +- .../20240326125819_create_activity_status.sql | 2 +- .../20240326125937_create_categories.sql | 2 +- ...40326130013_create_activities_categories.sql | 2 +- 8 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 db/Entity-Relationship.png diff --git a/db/Entity-Relationship.png b/db/Entity-Relationship.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc119f020b8c38b0b48a4fce7f555d78931e2b0 GIT binary patch literal 22198 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 literal 0 HcmV?d00001 diff --git a/db/migrations/20240325143710_create_activities.sql b/db/migrations/20240325143710_create_activities.sql index 7693e4d9..609b5631 100644 --- a/db/migrations/20240325143710_create_activities.sql +++ b/db/migrations/20240325143710_create_activities.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE activities ( +CREATE TABLE IF NOT EXISTS activities ( guid TEXT PRIMARY KEY, category TEXT NOT NULL, description TEXT NOT NULL, diff --git a/db/migrations/20240326124253_create_activity_kinds.sql b/db/migrations/20240326124253_create_activity_kinds.sql index 8f9ad66c..ca7bd7ad 100644 --- a/db/migrations/20240326124253_create_activity_kinds.sql +++ b/db/migrations/20240326124253_create_activity_kinds.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE activity_kinds ( +CREATE TABLE IF NOT EXISTS activity_kinds ( guid TEXT PRIMARY KEY, kind TEXT NOT NULL ); diff --git a/db/migrations/20240326125555_create_tags.sql b/db/migrations/20240326125555_create_tags.sql index 7d6d2d85..738d4ba1 100644 --- a/db/migrations/20240326125555_create_tags.sql +++ b/db/migrations/20240326125555_create_tags.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE tags ( +CREATE TABLE IF NOT EXISTS tags ( guid TEXT PRIMARY KEY, tag TEXT NOT NULL ); diff --git a/db/migrations/20240326125630_create_activities_tags.sql b/db/migrations/20240326125630_create_activities_tags.sql index 54f46b90..1e145396 100644 --- a/db/migrations/20240326125630_create_activities_tags.sql +++ b/db/migrations/20240326125630_create_activities_tags.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE activities_tags ( +CREATE TABLE IF NOT EXISTS activities_tags ( guid TEXT PRIMARY KEY, tag_guid TEXT NOT NULL, activity_guid TEXT NOT NULL, diff --git a/db/migrations/20240326125819_create_activity_status.sql b/db/migrations/20240326125819_create_activity_status.sql index ff5e42ac..10532bb8 100644 --- a/db/migrations/20240326125819_create_activity_status.sql +++ b/db/migrations/20240326125819_create_activity_status.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE activity_status ( +CREATE TABLE IF NOT EXISTS activity_status ( guid TEXT PRIMARY KEY, status TEXT NOT NULL ); diff --git a/db/migrations/20240326125937_create_categories.sql b/db/migrations/20240326125937_create_categories.sql index e23234fd..dfdcbc1c 100644 --- a/db/migrations/20240326125937_create_categories.sql +++ b/db/migrations/20240326125937_create_categories.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE categories ( +CREATE TABLE IF NOT EXISTS categories ( guid TEXT PRIMARY KEY, category TEXT NOT NULL, description TEXT NULL diff --git a/db/migrations/20240326130013_create_activities_categories.sql b/db/migrations/20240326130013_create_activities_categories.sql index 6515095b..f15e8106 100644 --- a/db/migrations/20240326130013_create_activities_categories.sql +++ b/db/migrations/20240326130013_create_activities_categories.sql @@ -1,5 +1,5 @@ -- migrate:up -CREATE TABLE activities_categories ( +CREATE TABLE IF NOT EXISTS activities_categories ( guid TEXT PRIMARY KEY, category_guid TEXT NOT NULL, activity_guid TEXT NOT NULL, From cb3ee7c7e882c96f1aed7e391c57ab4a8ed0fae4 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 09:56:52 +0100 Subject: [PATCH 09/59] factor out pace_storage --- Cargo.lock | 126 +- Cargo.toml | 5 +- crates/core/Cargo.toml | 7 +- crates/core/src/commands/adjust.rs | 13 +- crates/core/src/commands/begin.rs | 13 +- crates/core/src/commands/end.rs | 13 +- crates/core/src/commands/hold.rs | 13 +- crates/core/src/commands/now.rs | 13 +- crates/core/src/commands/reflect.rs | 12 +- crates/core/src/domain/activity.rs | 5 +- crates/core/src/error.rs | 46 +- crates/core/src/lib.rs | 12 +- crates/core/src/service/activity_store.rs | 27 +- crates/core/src/storage.rs | 132 +- crates/core/src/storage/file.rs | 291 --- crates/core/src/storage/in_memory.rs | 1777 ----------------- crates/core/src/storage/sqlite.rs | 467 ----- crates/time/Cargo.toml | 10 +- .../integration/activity_store.rs | 0 .../integration/activity_tracker.rs | 0 .../integration/find_configs.rs | 0 .../core/tests => tests}/integration/main.rs | 0 .../core/tests => tests}/integration/util.rs | 2 +- tests/{ => journey}/cli.rs | 0 .../tests => tests}/journey/hold_resume.rs | 0 {crates/core/tests => tests}/journey/main.rs | 1 + .../cli__adjust_activity_snapshot_passes.snap | 0 .../snapshots/cli__begin_snapshot_passes.snap | 0 ..._with_active_activity_snapshot_passes.snap | 0 ..._with_active_activity_snapshot_passes.snap | 0 ...li__now_no_activities_snapshot_passes.snap | 0 ..._with_active_activity_snapshot_passes.snap | 0 ...reflect_current_month_snapshot_passes.snap | 0 ..._reflect_current_week_snapshot_passes.snap | 0 .../cli__reflect_date_snapshot_passes.snap | 0 ...tegory_case_sensitive_snapshot_passes.snap | 0 ..._filter_category_full_snapshot_passes.snap | 0 ...b_back_case_sensitive_snapshot_passes.snap | 0 ...er_category_glob_back_snapshot_passes.snap | 0 ...r_category_glob_front_snapshot_passes.snap | 0 .../cli__reflect_from_to_snapshot_passes.snap | 0 .../cli__reflect_today_snapshot_passes.snap | 0 ...me_with_held_activity_snapshot_passes.snap | 0 .../cli__version_snapshot_passes.snap | 0 .../start_finish_different_time_zone.rs | 0 45 files changed, 171 insertions(+), 2814 deletions(-) delete mode 100644 crates/core/src/storage/file.rs delete mode 100644 crates/core/src/storage/in_memory.rs delete mode 100644 crates/core/src/storage/sqlite.rs rename {crates/core/tests => tests}/integration/activity_store.rs (100%) rename {crates/core/tests => tests}/integration/activity_tracker.rs (100%) rename {crates/core/tests => tests}/integration/find_configs.rs (100%) rename {crates/core/tests => tests}/integration/main.rs (100%) rename {crates/core/tests => tests}/integration/util.rs (98%) rename tests/{ => journey}/cli.rs (100%) rename {crates/core/tests => tests}/journey/hold_resume.rs (100%) rename {crates/core/tests => tests}/journey/main.rs (97%) rename tests/{ => journey}/snapshots/cli__adjust_activity_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__begin_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__end_with_active_activity_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__hold_with_active_activity_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__now_no_activities_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__now_with_active_activity_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_current_month_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_current_week_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_date_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_from_to_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__reflect_today_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__resume_with_held_activity_snapshot_passes.snap (100%) rename tests/{ => journey}/snapshots/cli__version_snapshot_passes.snap (100%) rename {crates/core/tests => tests}/journey/start_finish_different_time_zone.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 72b767c3..b2937ff2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,18 +56,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -77,12 +65,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - [[package]] name = "android-tzdata" version = "0.1.1" @@ -490,6 +472,39 @@ dependencies = [ "zeroize", ] +[[package]] +name = "diesel" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" +dependencies = [ + "chrono", + "diesel_derives", + "libsqlite3-sys", + "time", +] + +[[package]] +name = "diesel_derives" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" +dependencies = [ + "diesel_table_macro_syntax", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" +dependencies = [ + "syn 2.0.55", +] + [[package]] name = "difflib" version = "0.4.0" @@ -544,12 +559,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - [[package]] name = "either" version = "1.10.0" @@ -600,18 +609,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - [[package]] name = "fastrand" version = "2.0.2" @@ -828,19 +825,6 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692eaaf7f7607518dd3cef090f1474b61edc5301d8012f09579920df68b725ee" -dependencies = [ - "hashbrown", -] [[package]] name = "heck" @@ -1054,9 +1038,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.28.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", "pkg-config", @@ -1280,6 +1264,7 @@ dependencies = [ "clap_complete", "clap_complete_nushell", "dialoguer", + "diesel", "directories", "eyre", "human-panic", @@ -1319,9 +1304,9 @@ dependencies = [ "chrono", "chrono-tz", "clap", + "diesel", "directories", "displaydoc", - "dotenvy", "enum_dispatch", "eyre", "getset", @@ -1336,7 +1321,6 @@ dependencies = [ "parking_lot", "rayon", "rstest", - "rusqlite", "serde", "serde_derive", "serde_json", @@ -1371,7 +1355,6 @@ dependencies = [ "getset", "humantime", "rstest", - "rusqlite", "serde", "serde_derive", "thiserror", @@ -1781,21 +1764,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "rusqlite" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" -dependencies = [ - "bitflags 2.5.0", - "chrono", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2814,26 +2782,6 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "zerocopy" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.55", -] - [[package]] name = "zeroize" version = "1.7.0" diff --git a/Cargo.toml b/Cargo.toml index 379fe552..1501449c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "crates/cli", "crates/core", "crates/server", + "crates/storage", "crates/time", ] @@ -44,6 +45,7 @@ once_cell = "1.19.0" open = "5.1.2" pace_cli = { path = "crates/cli", version = "0" } pace_core = { path = "crates/core", version = "0" } +pace_storage = { path = "crates/storage", version = "0" } pace_time = { path = "crates/time", version = "0" } parking_lot = "0.12.1" predicates = "3.1.0" @@ -105,7 +107,8 @@ directories = { workspace = true } eyre = { workspace = true } human-panic = { workspace = true } pace_cli = { workspace = true } -pace_core = { workspace = true, features = ["cli", "db"] } +pace_core = { workspace = true, features = ["cli"] } +pace_storage = { workspace = true, features = ["db"] } pace_time = { workspace = true, features = ["cli", "db"] } serde = { workspace = true } serde_derive = { workspace = true } diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 62627969..773b9221 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -20,10 +20,8 @@ include = [ ] [features] -default = ["cli", "db"] +default = ["cli"] cli = ["clap"] -db = ["rusqlite"] -rusqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] clap = ["dep:clap"] [dependencies] @@ -33,10 +31,8 @@ clap = { workspace = true, optional = true, features = ["env", "wrap_help", "der directories = { workspace = true } displaydoc = { workspace = true } dotenvy = { workspace = true } -enum_dispatch = { workspace = true } getset = { workspace = true } itertools = { workspace = true } -libsqlite3-sys = { workspace = true, features = ["bundled"], optional = true } merge = { workspace = true } miette = { workspace = true, features = ["fancy"] } once_cell = { workspace = true } @@ -44,7 +40,6 @@ open = { workspace = true } pace_time = { workspace = true, features = ["rusqlite"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } -rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } diff --git a/crates/core/src/commands/adjust.rs b/crates/core/src/commands/adjust.rs index 9ee3b58f..0c1149b8 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/core/src/commands/adjust.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::{collections::HashSet, sync::Arc}; use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; @@ -13,8 +13,9 @@ use crate::{ commands::UpdateOptions, config::PaceConfig, error::{ActivityLogErrorKind, PaceResult, UserMessage}, + prelude::ActivityStorage, service::activity_store::ActivityStore, - storage::{get_storage_from_config, ActivityQuerying, ActivityWriteOps, SyncStorage}, + storage::{ActivityQuerying, ActivityWriteOps, SyncStorage}, }; /// `adjust` subcommand options @@ -138,7 +139,11 @@ impl AdjustCommandOptions { /// A `UserMessage` to be printed to the user indicating the result of the operation and /// some additional information #[tracing::instrument(skip(self))] - pub fn handle_adjust(&self, config: &PaceConfig) -> PaceResult { + pub fn handle_adjust( + &self, + config: &PaceConfig, + storage: Arc, + ) -> PaceResult { let Self { category, description, @@ -160,7 +165,7 @@ impl AdjustCommandOptions { debug!("Parsed time: {date_time:?}"); - let activity_store = ActivityStore::with_storage(get_storage_from_config(config)?)?; + let activity_store = ActivityStore::with_storage(storage)?; let activity_item = activity_store .most_recent_active_activity()? diff --git a/crates/core/src/commands/begin.rs b/crates/core/src/commands/begin.rs index f71f8e80..ff235469 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/core/src/commands/begin.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::{collections::HashSet, sync::Arc}; use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; @@ -12,8 +12,9 @@ use crate::{ config::PaceConfig, domain::activity::{Activity, ActivityKind}, error::{PaceResult, UserMessage}, + prelude::ActivityStorage, service::activity_store::ActivityStore, - storage::{get_storage_from_config, ActivityStateManagement, SyncStorage}, + storage::{ActivityStateManagement, SyncStorage}, }; /// `begin` subcommand options @@ -102,7 +103,11 @@ impl BeginCommandOptions { /// Returns a `UserMessage` with the information about the started activity /// that can be displayed to the user #[tracing::instrument(skip(self))] - pub fn handle_begin(&self, config: &PaceConfig) -> PaceResult { + pub fn handle_begin( + &self, + config: &PaceConfig, + storage: Arc, + ) -> PaceResult { let Self { category, at, @@ -139,7 +144,7 @@ impl BeginCommandOptions { .tags(tags) .build(); - let activity_store = ActivityStore::with_storage(get_storage_from_config(config)?)?; + let activity_store = ActivityStore::with_storage(storage)?; let activity_item = activity_store.begin_activity(activity)?; diff --git a/crates/core/src/commands/end.rs b/crates/core/src/commands/end.rs index 3e4304e0..f1c3a96b 100644 --- a/crates/core/src/commands/end.rs +++ b/crates/core/src/commands/end.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; #[cfg(feature = "clap")] @@ -11,8 +13,9 @@ use crate::{ commands::EndOptions, config::PaceConfig, error::{PaceResult, UserMessage}, + prelude::ActivityStorage, service::activity_store::ActivityStore, - storage::{get_storage_from_config, ActivityStateManagement, SyncStorage}, + storage::{ActivityStateManagement, SyncStorage}, }; /// `end` subcommand options @@ -73,7 +76,11 @@ impl EndCommandOptions { /// Returns a `UserMessage` with the information about the ended activity /// that can be displayed to the user #[tracing::instrument(skip(self))] - pub fn handle_end(&self, config: &PaceConfig) -> PaceResult { + pub fn handle_end( + &self, + config: &PaceConfig, + storage: Arc, + ) -> PaceResult { let Self { at, time_zone, @@ -91,7 +98,7 @@ impl EndCommandOptions { debug!("Parsed date time: {:?}", date_time); - let activity_store = ActivityStore::with_storage(get_storage_from_config(config)?)?; + let activity_store = ActivityStore::with_storage(storage)?; let end_opts = EndOptions::builder().end_time(date_time).build(); diff --git a/crates/core/src/commands/hold.rs b/crates/core/src/commands/hold.rs index f2dbb510..10b737ab 100644 --- a/crates/core/src/commands/hold.rs +++ b/crates/core/src/commands/hold.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; #[cfg(feature = "clap")] @@ -12,8 +14,9 @@ use crate::{ config::PaceConfig, domain::intermission::IntermissionAction, error::{PaceResult, UserMessage}, + prelude::ActivityStorage, service::activity_store::ActivityStore, - storage::{get_storage_from_config, ActivityStateManagement, SyncStorage}, + storage::{ActivityStateManagement, SyncStorage}, }; /// `hold` subcommand options @@ -81,7 +84,11 @@ impl HoldCommandOptions { /// /// A `UserMessage` with the information about the held activity that can be displayed to the user #[tracing::instrument(skip(self))] - pub fn handle_hold(&self, config: &PaceConfig) -> PaceResult { + pub fn handle_hold( + &self, + config: &PaceConfig, + storage: Arc, + ) -> PaceResult { let Self { pause_at, reason, @@ -112,7 +119,7 @@ impl HoldCommandOptions { debug!("Hold options: {hold_opts:?}"); - let activity_store = ActivityStore::with_storage(get_storage_from_config(config)?)?; + let activity_store = ActivityStore::with_storage(storage)?; let user_message = if let Some(activity) = activity_store.hold_most_recent_active_activity(hold_opts)? { diff --git a/crates/core/src/commands/now.rs b/crates/core/src/commands/now.rs index 9c91d41b..e435ae5b 100644 --- a/crates/core/src/commands/now.rs +++ b/crates/core/src/commands/now.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + #[cfg(feature = "clap")] use clap::Parser; use tracing::debug; @@ -6,8 +8,9 @@ use crate::{ config::PaceConfig, domain::{activity::ActivityItem, filter::ActivityFilterKind}, error::{PaceResult, UserMessage}, + prelude::ActivityStorage, service::activity_store::ActivityStore, - storage::{get_storage_from_config, ActivityQuerying, ActivityReadOps}, + storage::{ActivityQuerying, ActivityReadOps}, }; /// `now` subcommand options @@ -30,8 +33,12 @@ impl NowCommandOptions { /// /// Returns a `UserMessage` with the information about the current activities that can be displayed to the user #[tracing::instrument(skip(self))] - pub fn handle_now(&self, config: &PaceConfig) -> PaceResult { - let activity_store = ActivityStore::with_storage(get_storage_from_config(config)?)?; + pub fn handle_now( + &self, + config: &PaceConfig, + storage: Arc, + ) -> PaceResult { + let activity_store = ActivityStore::with_storage(storage)?; let user_message = (activity_store.list_current_activities(ActivityFilterKind::Active)?) .map_or_else( diff --git a/crates/core/src/commands/reflect.rs b/crates/core/src/commands/reflect.rs index f3fda45d..363c58ec 100644 --- a/crates/core/src/commands/reflect.rs +++ b/crates/core/src/commands/reflect.rs @@ -7,7 +7,7 @@ use pace_time::{ time_zone::PaceTimeZoneKind, }; use serde_derive::Serialize; -use std::path::PathBuf; +use std::{path::PathBuf, sync::Arc}; use tracing::debug; use typed_builder::TypedBuilder; @@ -15,8 +15,8 @@ use crate::{ config::PaceConfig, domain::{activity::ActivityKind, filter::FilterOptions, reflection::ReflectionsFormatKind}, error::{PaceResult, TemplatingErrorKind, UserMessage}, + prelude::ActivityStorage, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, - storage::get_storage_from_config, template::{PaceReflectionTemplate, TEMPLATES}, }; @@ -123,7 +123,11 @@ pub struct ReflectCommandOptions { impl ReflectCommandOptions { #[tracing::instrument(skip(self))] - pub fn handle_reflect(&self, config: &PaceConfig) -> PaceResult { + pub fn handle_reflect( + &self, + config: &PaceConfig, + storage: Arc, + ) -> PaceResult { let Self { export_file, time_flags, @@ -143,7 +147,7 @@ impl ReflectCommandOptions { PaceTimeZoneKind::NotSet, ))?; - let activity_store = ActivityStore::with_storage(get_storage_from_config(config)?)?; + let activity_store = ActivityStore::with_storage(storage)?; let activity_tracker = ActivityTracker::with_activity_store(activity_store); diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index 9537e74f..c469a8f9 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -274,7 +274,8 @@ impl ActivityEndOptions { Self { end, duration } } - pub fn as_tuple(&self) -> (PaceDateTime, PaceDuration) { + #[must_use] + pub const fn as_tuple(&self) -> (PaceDateTime, PaceDuration) { (self.end, self.duration) } } @@ -321,7 +322,7 @@ impl ActivityGuid { } #[must_use] - pub fn with_id(id: Ulid) -> Self { + pub const fn with_id(id: Ulid) -> Self { Self(id) } } diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs index 8f3479b6..882f308e 100644 --- a/crates/core/src/error.rs +++ b/crates/core/src/error.rs @@ -6,10 +6,7 @@ use pace_time::error::PaceTimeErrorKind; use std::{error::Error, io, path::PathBuf}; use thiserror::Error; -use crate::{ - config::DatabaseEngineKind, - domain::activity::{Activity, ActivityGuid}, -}; +use crate::domain::activity::{Activity, ActivityGuid}; /// Result type that is being returned from test functions and methods that can fail and thus have errors. pub type TestResult = Result>; @@ -165,18 +162,6 @@ pub enum PaceErrorKind { /// Templating error: {0} #[error(transparent)] Template(#[from] TemplatingErrorKind), - - /// SQLite error: {0} - #[error(transparent)] - #[cfg(feature = "rusqlite")] - SQLite(#[from] rusqlite::Error), - - /// Database error: {0} - #[error(transparent)] - Database(#[from] DatabaseErrorKind), - - /// Database storage not configured - DatabaseStorageNotConfigured, } /// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log. @@ -314,32 +299,6 @@ pub enum ActivityStoreErrorKind { MissingCategoryForActivity(ActivityGuid), } -/// [`SqliteDatabaseStoreErrorKind`] describes the errors that can happen while dealing with the SQLite database. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum DatabaseErrorKind { - /// Error connecting to database: {0} - {1} - ConnectionFailed(String, String), - - /// No connection string provided - NoConnectionString, - - /// No configuration settings provided in configuration file, please set them up with `pace setup config` - NoConfigSettings, - - /// This database engine is currently not supported: {0} - UnsupportedDatabaseEngine(DatabaseEngineKind), - - /// Activity with id {0} not found - ActivityNotFound(ActivityGuid), - - /// Failed to create activity: {0} - ActivityCreationFailed(Activity), - - /// Failed to delete activity: {0} - ActivityDeletionFailed(ActivityGuid), -} - trait PaceErrorMarker: Error {} impl PaceErrorMarker for std::io::Error {} @@ -348,12 +307,9 @@ impl PaceErrorMarker for toml::ser::Error {} impl PaceErrorMarker for serde_json::Error {} impl PaceErrorMarker for chrono::ParseError {} impl PaceErrorMarker for chrono::OutOfRangeError {} -#[cfg(feature = "rusqlite")] -impl PaceErrorMarker for rusqlite::Error {} impl PaceErrorMarker for ActivityLogErrorKind {} impl PaceErrorMarker for PaceTimeErrorKind {} impl PaceErrorMarker for ActivityStoreErrorKind {} -impl PaceErrorMarker for DatabaseErrorKind {} impl PaceErrorMarker for TemplatingErrorKind {} impl From for PaceError diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 1ff8e1a5..f8c2cd76 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -43,8 +43,8 @@ pub mod prelude { find_root_config_file_path, find_root_project_file, get_activity_log_paths, get_config_paths, get_home_activity_log_path, get_home_config_path, ActivityLogFormatKind, ActivityLogStorageKind, AutoArchivalConfig, DatabaseConfig, - ExportConfig, GeneralConfig, InboxConfig, PaceConfig, PomodoroConfig, - ReflectionsConfig, + DatabaseEngineKind, ExportConfig, GeneralConfig, InboxConfig, PaceConfig, + PomodoroConfig, ReflectionsConfig, }, domain::{ activity::{ @@ -61,12 +61,14 @@ pub mod prelude { }, status::ActivityStatusKind, }, - error::{PaceError, PaceErrorKind, PaceOptResult, PaceResult, TestResult, UserMessage}, + error::{ + ActivityLogErrorKind, PaceError, PaceErrorKind, PaceOptResult, PaceResult, TestResult, + UserMessage, + }, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, storage::{ - file::TomlActivityStorage, get_storage_from_config, in_memory::InMemoryActivityStorage, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, - ActivityWriteOps, StorageKind, SyncStorage, + ActivityWriteOps, SyncStorage, }, util::overwrite_left_with_right, }; diff --git a/crates/core/src/service/activity_store.rs b/crates/core/src/service/activity_store.rs index fe642ac4..3918dbf3 100644 --- a/crates/core/src/service/activity_store.rs +++ b/crates/core/src/service/activity_store.rs @@ -27,7 +27,7 @@ use crate::{ error::{ActivityStoreErrorKind, PaceOptResult, PaceResult}, storage::{ ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, - ActivityWriteOps, StorageKind, SyncStorage, + ActivityWriteOps, SyncStorage, }, }; @@ -39,7 +39,7 @@ pub struct ActivityStore { cache: ActivityStoreCache, /// The storage backend - storage: Arc, + storage: Arc, } #[derive(Debug, TypedBuilder, Getters, Setters, MutGetters, Clone, Eq, PartialEq, Default)] @@ -69,15 +69,18 @@ impl ActivityStore { /// /// This method returns a new `ActivityStore` if the storage backend /// was successfully created - pub fn with_storage(storage: Arc) -> PaceResult { - debug!("Creating activity store with storage: {}", storage); + pub fn with_storage(storage: Arc) -> PaceResult { + debug!( + "Creating activity store with storage: {}", + storage.identify() + ); let mut store = Self { cache: ActivityStoreCache::default(), storage, }; - store.setup_storage()?; + store.setup()?; store.populate_caches()?; @@ -210,8 +213,18 @@ impl ActivityStore { impl ActivityStorage for ActivityStore { #[tracing::instrument(skip(self))] - fn setup_storage(&self) -> PaceResult<()> { - self.storage.setup_storage() + fn setup(&self) -> PaceResult<()> { + self.storage.setup() + } + + #[tracing::instrument(skip(self))] + fn identify(&self) -> String { + self.storage.identify() + } + + #[tracing::instrument(skip(self))] + fn teardown(&self) -> PaceResult<()> { + self.storage.teardown() } } diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index b82b576b..731ad9d0 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -1,6 +1,8 @@ -use std::{collections::BTreeMap, fmt::Display, sync::Arc}; +use std::{ + collections::BTreeMap, + fmt::{self, Debug, Formatter}, +}; -use enum_dispatch::enum_dispatch; use itertools::Itertools; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use tracing::debug; @@ -10,112 +12,23 @@ use crate::{ hold::HoldOptions, resume::ResumeOptions, DeleteOptions, EndOptions, KeywordOptions, UpdateOptions, }, - config::{ActivityLogStorageKind, DatabaseEngineKind, PaceConfig}, domain::{ activity::{Activity, ActivityGuid, ActivityItem, ActivityKind}, filter::{ActivityFilterKind, FilteredActivities}, status::ActivityStatusKind, }, - error::{DatabaseErrorKind, PaceErrorKind, PaceOptResult, PaceResult}, - service::activity_store::ActivityStore, - storage::{ - file::TomlActivityStorage, in_memory::InMemoryActivityStorage, - sqlite::SqliteActivityStorage, - }, + error::{PaceOptResult, PaceResult}, }; -/// A type of storage that can be synced to a persistent medium - a file -pub mod file; - -/// An in-memory storage backend for activities. -pub mod in_memory; - -#[cfg(feature = "rusqlite")] -pub mod sqlite; - -/// Get the storage backend from the configuration. -/// -/// # Arguments -/// -/// * `config` - The application configuration. -/// -/// # Errors -/// -/// This function should return an error if the storage backend cannot be created or is not supported. -/// -/// # Returns -/// -/// The storage backend. -pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { - let storage: StorageKind = match config.general().activity_log_options().storage_kind() { - ActivityLogStorageKind::File => { - TomlActivityStorage::new(config.general().activity_log_options().path())?.into() - } - ActivityLogStorageKind::Database => { - if config.database().is_some() { - let Some(db_config) = config.database() else { - return Err(DatabaseErrorKind::NoConfigSettings.into()); - }; - - match db_config.engine() { - DatabaseEngineKind::Sqlite => { - #[cfg(feature = "rusqlite")] - { - let connection_string = config - .database() - .as_ref() - .ok_or(DatabaseErrorKind::NoConnectionString)? - .connection_string(); - - debug!("Connecting to database: {}", &connection_string); - - SqliteActivityStorage::new(connection_string.clone())?.into() - } - #[cfg(not(feature = "rusqlite"))] - return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); - } - engine => { - return Err(DatabaseErrorKind::UnsupportedDatabaseEngine(*engine).into()) - } - } - } - - return Err(PaceErrorKind::DatabaseStorageNotConfigured.into()); - } - #[cfg(test)] - ActivityLogStorageKind::InMemory => InMemoryActivityStorage::new().into(), - }; - - debug!("Using storage backend: {}", storage); - - Ok(Arc::new(storage)) -} - -#[enum_dispatch] -pub enum StorageKind { - ActivityStore, - InMemoryActivityStorage, - TomlActivityStorage, - SqliteActivityStorage, -} - -impl Display for StorageKind { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::ActivityStore(_) => write!(f, "StorageKind: ActivityStore"), - Self::InMemoryActivityStorage(_) => { - write!(f, "StorageKind: InMemoryActivityStorage") - } - Self::TomlActivityStorage(_) => write!(f, "StorageKind: TomlActivityStorage"), - Self::SqliteActivityStorage(_) => write!(f, "StorageKind: SqliteActivityStorage"), - } +impl Debug for dyn ActivityStorage { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "ActivityStorage: {}", self.identify()) } } /// A type of storage that can be synced to a persistent medium. /// /// This is useful for in-memory storage that needs to be persisted to disk or a database. -#[enum_dispatch(StorageKind)] pub trait SyncStorage { /// Sync the storage to a persistent medium. /// @@ -134,7 +47,6 @@ pub trait SyncStorage { /// /// Storage backends can be in-memory, on-disk, or in a database. They can be any kind of /// persistent storage that can be used to store activities. -#[enum_dispatch(StorageKind)] pub trait ActivityStorage: ActivityReadOps + ActivityWriteOps + ActivityStateManagement + SyncStorage + ActivityQuerying // TODO!: Implement other traits @@ -153,7 +65,29 @@ pub trait ActivityStorage: /// # Errors /// /// This function should return an error if the storage backend cannot be setup. - fn setup_storage(&self) -> PaceResult<()>; + fn setup(&self) -> PaceResult<()>; + + /// Teardown the storage backend. This is called once when the application stops. + /// + /// This is where you would close the database connection, save the file, etc. + /// + /// # Errors + /// + /// This function should return an error if the storage backend cannot be torn down. + /// + /// # Returns + /// + /// If the storage backend was torn down successfully it should return `Ok(())`. + fn teardown(&self) -> PaceResult<()>; + + /// Identify the storage backend. + /// + /// This is useful for logging and debugging purposes. + /// + /// # Returns + /// + /// The identifier of the storage backend. + fn identify(&self) -> String; } /// Basic Read Operations for Activities in the storage backend. @@ -161,7 +95,6 @@ pub trait ActivityStorage: /// Read operations are essential for loading activities from the storage backend. /// These operations are used to get activities by their ID, list all activities, or filter activities by a specific criterion. /// They are also used to get the current state of activities, such as the currently active activities. -#[enum_dispatch(StorageKind)] pub trait ActivityReadOps { /// Read an activity from the storage backend. /// @@ -198,7 +131,6 @@ pub trait ActivityReadOps { /// /// CUD stands for Create, Update, and Delete. These are the basic operations that can be performed on activities. /// These operations are essential for managing activities in the storage backend. -#[enum_dispatch(StorageKind)] pub trait ActivityWriteOps: ActivityReadOps { /// Create an activity in the storage backend. /// @@ -271,7 +203,6 @@ pub trait ActivityWriteOps: ActivityReadOps { /// This is useful for keeping track of the current state of activities and making sure they are properly managed. /// /// For example, you might want to start a new activity, end an activity that is currently running, or hold an activity temporarily. -#[enum_dispatch(StorageKind)] pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + ActivityQuerying { /// Begin an activity in the storage backend. This makes the activity active. /// @@ -456,7 +387,6 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// /// For example, you might want to list all activities that are currently active, /// find all activities within a specific date range, or get a specific activity by its ID. -#[enum_dispatch(StorageKind)] pub trait ActivityQuerying: ActivityReadOps { /// Group activities by predefined duration ranges (e.g., short, medium, long). /// diff --git a/crates/core/src/storage/file.rs b/crates/core/src/storage/file.rs deleted file mode 100644 index 2e59b58b..00000000 --- a/crates/core/src/storage/file.rs +++ /dev/null @@ -1,291 +0,0 @@ -use std::{ - collections::BTreeMap, - fs::{create_dir_all, write, OpenOptions}, - io::Write, - path::{Path, PathBuf}, -}; - -use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; - -use crate::{ - commands::{ - hold::HoldOptions, resume::ResumeOptions, DeleteOptions, EndOptions, KeywordOptions, - UpdateOptions, - }, - domain::{ - activity::{Activity, ActivityGuid, ActivityItem, ActivityKind}, - activity_log::ActivityLog, - filter::{ActivityFilterKind, FilteredActivities}, - status::ActivityStatusKind, - }, - error::{PaceErrorKind, PaceOptResult, PaceResult}, - storage::{ - in_memory::InMemoryActivityStorage, ActivityQuerying, ActivityReadOps, - ActivityStateManagement, ActivityStorage, ActivityWriteOps, SyncStorage, - }, -}; - -/// In-memory backed TOML activity storage -/// -/// This storage is backed by an in-memory cache and a TOML file on disk for persistence. -pub struct TomlActivityStorage { - /// The in-memory cache - cache: InMemoryActivityStorage, - - /// The path to the TOML file - path: PathBuf, -} - -impl SyncStorage for TomlActivityStorage { - fn sync(&self) -> PaceResult<()> { - self.sync_to_file() - } -} - -impl TomlActivityStorage { - /// Create a new `TomlActivityStorage` - /// - /// # Arguments - /// - /// * `path` - The path to the TOML file - /// - /// # Errors - /// - /// Returns an error if the path is not a valid file path. - /// - /// # Returns - /// - /// Returns a new `TomlActivityStorage` - pub fn new(path: impl AsRef) -> PaceResult { - let mut storage = Self { - cache: InMemoryActivityStorage::new(), - path: path.as_ref().to_path_buf(), - }; - - storage.load()?; - - Ok(storage) - } - - /// Load the TOML file into the in-memory cache - /// - /// This will read the TOML file from disk and load it into the in-memory cache - /// - /// # Errors - /// - /// Returns an error if the file cannot be read or the data cannot be deserialized - /// - /// # Returns - /// - /// Returns `Ok(())` if the data is loaded successfully - #[tracing::instrument(skip(self))] - fn load(&mut self) -> PaceResult<()> { - let data = std::fs::read_to_string(&self.path)?; - self.cache = InMemoryActivityStorage::from(toml::from_str::(&data)?); - - Ok(()) - } - - /// Sync the in-memory cache to the TOML file - /// - /// This will write the in-memory cache to the TOML file on disk - /// - /// # Errors - /// - /// Returns an error if the cache cannot be written to the file - /// - /// # Returns - /// - /// Returns `Ok(())` if the cache is written successfully - #[tracing::instrument(skip(self))] - pub fn sync_to_file(&self) -> PaceResult<()> { - let data = toml::to_string(&self.cache.get_activity_log())?; - write(&self.path, data)?; - Ok(()) - } -} - -impl ActivityStorage for TomlActivityStorage { - #[tracing::instrument(skip(self))] - fn setup_storage(&self) -> PaceResult<()> { - if !self.path.exists() { - create_dir_all( - self.path - .parent() - .ok_or(PaceErrorKind::ParentDirNotFound(self.path.clone()))?, - )?; - - let mut file = OpenOptions::new() - .write(true) - .create(true) - .truncate(true) - .open(&self.path)?; - - file.write_all(b"")?; - } - Ok(()) - } -} - -impl ActivityReadOps for TomlActivityStorage { - #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { - self.cache.read_activity(activity_id) - } - - #[tracing::instrument(skip(self))] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { - self.cache.list_activities(filter) - } -} - -impl ActivityStateManagement for TomlActivityStorage { - #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { - self.cache.end_all_activities(end_opts) - } - - #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { - self.cache.end_last_unfinished_activity(end_opts) - } - - #[tracing::instrument(skip(self))] - fn end_activity( - &self, - activity_id: ActivityGuid, - end_opts: EndOptions, - ) -> PaceResult { - self.cache.end_activity(activity_id, end_opts) - } - - #[tracing::instrument(skip(self))] - fn hold_most_recent_active_activity( - &self, - hold_opts: HoldOptions, - ) -> PaceOptResult { - self.cache.hold_most_recent_active_activity(hold_opts) - } - - #[tracing::instrument(skip(self))] - fn end_all_active_intermissions( - &self, - end_opts: EndOptions, - ) -> PaceOptResult> { - self.cache.end_all_active_intermissions(end_opts) - } - - #[tracing::instrument(skip(self))] - fn resume_activity( - &self, - activity_id: ActivityGuid, - resume_opts: ResumeOptions, - ) -> PaceResult { - self.cache.resume_activity(activity_id, resume_opts) - } - - #[tracing::instrument(skip(self))] - fn hold_activity( - &self, - activity_id: ActivityGuid, - hold_opts: HoldOptions, - ) -> PaceResult { - self.cache.hold_activity(activity_id, hold_opts) - } - - #[tracing::instrument(skip(self))] - fn resume_most_recent_activity( - &self, - resume_opts: ResumeOptions, - ) -> PaceOptResult { - self.cache.resume_most_recent_activity(resume_opts) - } -} - -impl ActivityWriteOps for TomlActivityStorage { - #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceResult { - self.cache.create_activity(activity) - } - - #[tracing::instrument(skip(self))] - fn update_activity( - &self, - activity_id: ActivityGuid, - updated_activity: Activity, - update_opts: UpdateOptions, - ) -> PaceResult { - self.cache - .update_activity(activity_id, updated_activity, update_opts) - } - - #[tracing::instrument(skip(self))] - fn delete_activity( - &self, - activity_id: ActivityGuid, - delete_opts: DeleteOptions, - ) -> PaceResult { - self.cache.delete_activity(activity_id, delete_opts) - } -} - -impl ActivityQuerying for TomlActivityStorage { - #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceOptResult> { - self.cache.list_activities_by_id() - } - - #[tracing::instrument(skip(self))] - fn most_recent_active_activity(&self) -> PaceOptResult { - self.cache.most_recent_active_activity() - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_duration_range( - &self, - ) -> PaceOptResult>> { - self.cache.group_activities_by_duration_range() - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_start_date( - &self, - ) -> PaceOptResult>> { - self.cache.group_activities_by_start_date() - } - - #[tracing::instrument(skip(self))] - fn list_activities_with_intermissions( - &self, - ) -> PaceOptResult>> { - self.cache.list_activities_with_intermissions() - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_keywords( - &self, - keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { - self.cache.group_activities_by_keywords(keyword_opts) - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_kind(&self) -> PaceOptResult>> { - self.cache.group_activities_by_kind() - } - - #[tracing::instrument(skip(self))] - fn list_activities_by_time_range( - &self, - time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { - self.cache.list_activities_by_time_range(time_range_opts) - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_status( - &self, - ) -> PaceOptResult>> { - self.cache.group_activities_by_status() - } -} diff --git a/crates/core/src/storage/in_memory.rs b/crates/core/src/storage/in_memory.rs deleted file mode 100644 index e78ea361..00000000 --- a/crates/core/src/storage/in_memory.rs +++ /dev/null @@ -1,1777 +0,0 @@ -use std::{collections::BTreeMap, sync::Arc}; - -use pace_time::{ - date::PaceDate, - duration::{calculate_duration, PaceDurationRange}, - time_range::TimeRangeOptions, -}; -use parking_lot::RwLock; - -use merge::Merge; -use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; -use tracing::debug; - -use crate::{ - commands::{ - hold::HoldOptions, resume::ResumeOptions, DeleteOptions, EndOptions, KeywordOptions, - UpdateOptions, - }, - domain::{ - activity::{ - Activity, ActivityEndOptions, ActivityGuid, ActivityItem, ActivityKind, - ActivityKindOptions, - }, - activity_log::ActivityLog, - filter::{ActivityFilterKind, FilteredActivities}, - status::ActivityStatusKind, - }, - error::{ActivityLogErrorKind, PaceOptResult, PaceResult}, - storage::{ - ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, - ActivityWriteOps, SyncStorage, - }, -}; - -/// Type for shared `ActivityLog` -type SharedActivityLog = Arc>; - -/// In-memory storage for activities -#[derive(Debug, Clone)] -pub struct InMemoryActivityStorage { - log: SharedActivityLog, -} - -impl From for InMemoryActivityStorage { - fn from(activities: ActivityLog) -> Self { - Self::new_with_activity_log(activities) - } -} - -impl InMemoryActivityStorage { - /// Create a new `InMemoryActivityStorage` - #[must_use] - pub fn new() -> Self { - Self { - log: Arc::new(RwLock::new(ActivityLog::default())), - } - } - - /// Creates a new `InMemoryActivityStorage` from an `ActivityLog` - /// - /// # Arguments - /// - /// * `activity_log` - The `ActivityLog` to use - /// - /// # Returns - /// - /// A new `InMemoryActivityStorage` with the given `ActivityLog` - #[must_use] - pub fn new_with_activity_log(activity_log: ActivityLog) -> Self { - Self { - log: Arc::new(RwLock::new(activity_log)), - } - } - - /// Try to convert the `InMemoryActivityStorage` into an `ActivityLog` - pub fn get_activity_log(&self) -> ActivityLog { - let activity_log = self.log.read(); - - debug!("Got activity log"); - - activity_log.clone() - } -} - -impl Default for InMemoryActivityStorage { - fn default() -> Self { - Self::new() - } -} - -impl ActivityStorage for InMemoryActivityStorage { - fn setup_storage(&self) -> PaceResult<()> { - debug!("Setting up in-memory storage"); - Ok(()) - } -} - -impl SyncStorage for InMemoryActivityStorage { - fn sync(&self) -> PaceResult<()> { - debug!("Syncing in-memory storage"); - - Ok(()) - } -} - -impl ActivityReadOps for InMemoryActivityStorage { - #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { - let activities = self.log.read(); - - let activity = activities - .get(&activity_id) - .cloned() - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; - - drop(activities); - - debug!("Activity with id {:?} found: {:?}", activity_id, activity); - - Ok((activity_id, activity).into()) - } - - #[tracing::instrument(skip(self))] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { - let activity_log = self.log.read(); - - let filtered = activity_log - .par_iter() - .filter(|(_, activity)| match filter { - ActivityFilterKind::Everything => true, - ActivityFilterKind::OnlyActivities => activity.kind().is_activity(), - ActivityFilterKind::Active => activity.is_in_progress(), - ActivityFilterKind::ActiveIntermission => activity.is_active_intermission(), - ActivityFilterKind::Ended => activity.is_completed(), - ActivityFilterKind::Archived => activity.is_archived(), - ActivityFilterKind::Held => activity.is_paused(), - ActivityFilterKind::Intermission => activity.kind().is_intermission(), - ActivityFilterKind::TimeRange(time_range_opts) => { - // TODO: When adding Pomodoro support, we should also check for Pomodoro activities - time_range_opts.is_in_range(*activity.begin()) && activity.kind().is_activity() - } - }) - .map(|(activity_id, _)| activity_id) - .cloned() - .collect::>(); - - drop(activity_log); - - debug!("Filtered activities: {:?}", filtered); - - if filtered.is_empty() { - return Ok(None); - } - - match filter { - ActivityFilterKind::Everything => Ok(Some(FilteredActivities::Everything(filtered))), - ActivityFilterKind::OnlyActivities => { - Ok(Some(FilteredActivities::OnlyActivities(filtered))) - } - ActivityFilterKind::Active => Ok(Some(FilteredActivities::Active(filtered))), - ActivityFilterKind::ActiveIntermission => { - Ok(Some(FilteredActivities::ActiveIntermission(filtered))) - } - ActivityFilterKind::Archived => Ok(Some(FilteredActivities::Archived(filtered))), - ActivityFilterKind::Ended => Ok(Some(FilteredActivities::Ended(filtered))), - ActivityFilterKind::Held => Ok(Some(FilteredActivities::Held(filtered))), - ActivityFilterKind::Intermission => { - Ok(Some(FilteredActivities::Intermission(filtered))) - } - ActivityFilterKind::TimeRange(_) => Ok(Some(FilteredActivities::TimeRange(filtered))), - } - } -} - -impl ActivityWriteOps for InMemoryActivityStorage { - #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceResult { - let activities = self.log.read(); - - let activity_item = ActivityItem::from(activity); - - // Search for the activity in the list of activities to see if the ID is already in use. - // We use a ULID as the ID for the activity, so it should be unique and not collide with - // other activities. But still, let's check if the ID is already in use. If so, let's return - // an error. - // FIXME: We could essentially handle the case where the ID is already in use by creating a - // new ID and trying to insert the activity again. But for now, let's just return an error as - // it's not expected to happen. - if activities.contains_key(activity_item.guid()) { - debug!("Activity ID already in use: {:?}", activity_item.guid()); - return Err(ActivityLogErrorKind::ActivityIdAlreadyInUse(*activity_item.guid()).into()); - } - - drop(activities); - - let mut activities = self.log.write(); - - // We don't check for None here, because we know that the ID was not existing in the list of - // activities. - _ = activities - .activities_mut() - .insert(*activity_item.guid(), activity_item.activity().clone()); - - drop(activities); - - Ok(activity_item) - } - - #[tracing::instrument(skip(self))] - fn update_activity( - &self, - activity_id: ActivityGuid, - updated_activity: Activity, - update_opts: UpdateOptions, - ) -> PaceResult { - let activities = self.log.read(); - - let original_activity = activities - .get(&activity_id) - .cloned() - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; - - debug!("Original activity: {:?}", original_activity); - - drop(activities); - - let mut activities = self.log.write(); - - let _ = activities.entry(activity_id).and_modify(|activity| { - debug!("Updating activity: {:?}", activity); - activity.merge(updated_activity); - }); - - drop(activities); - - Ok((activity_id, original_activity).into()) - } - - #[tracing::instrument(skip(self))] - fn delete_activity( - &self, - activity_id: ActivityGuid, - delete_opts: DeleteOptions, - ) -> PaceResult { - let mut activities = self.log.write(); - - let activity = activities - .remove(&activity_id) - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; - - drop(activities); - - Ok((activity_id, activity).into()) - } -} - -impl ActivityStateManagement for InMemoryActivityStorage { - #[tracing::instrument(skip(self))] - fn end_activity( - &self, - activity_id: ActivityGuid, - end_opts: EndOptions, - ) -> PaceResult { - let activities = self.log.read(); - - let begin_time = *activities - .get(&activity_id) - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))? - .begin(); - - drop(activities); - - let end_opts = ActivityEndOptions::new( - *end_opts.end_time(), - calculate_duration(&begin_time, end_opts.end_time())?, - ); - - debug!("End options: {:?}", end_opts); - - let mut activities = self.log.write(); - - let _ = activities - .entry(activity_id) - .and_modify(|activity| activity.end_activity(end_opts)); - - drop(activities); - - self.read_activity(activity_id) - } - - #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { - let Some(most_recent) = self.most_recent_active_activity()? else { - debug!("No active activity found."); - return Ok(None); - }; - - debug!("Most recent activity: {:?}", most_recent); - - let activity = self.end_activity(*most_recent.guid(), end_opts)?; - - Ok(Some(activity)) - } - - #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { - let activities = self.log.read(); - - let endable_activities = activities - .par_iter() - .filter_map(|(activity_id, activity)| { - if activity.is_completable() { - Some(*activity_id) - } else { - None - } - }) - .collect::>(); - - drop(activities); - - debug!("Endable activities: {:?}", endable_activities); - - // There are no active activities - if endable_activities.is_empty() { - debug!("No active activities found."); - return Ok(None); - } - - let ended_activities = endable_activities - .par_iter() - .map(|activity_id| -> PaceResult { - self.end_activity(*activity_id, end_opts.clone()) - }) - .collect::>>()?; - - debug!("Ended activities: {:?}", ended_activities); - - if ended_activities.len() != endable_activities.len() { - debug!("Not all activities were ended."); - - // This is weird, we should return an error about it - return Err(ActivityLogErrorKind::ActivityNotEnded.into()); - } - - Ok(Some(ended_activities)) - } - - #[tracing::instrument(skip(self))] - fn hold_most_recent_active_activity( - &self, - hold_opts: HoldOptions, - ) -> PaceOptResult { - // Get id from last activity that is not ended - let Some(active_activity) = self.most_recent_active_activity()? else { - debug!("No active activity found."); - - // There are no active activities - return Ok(None); - }; - - Some(self.hold_activity(*active_activity.guid(), hold_opts)).transpose() - } - - #[tracing::instrument(skip(self))] - fn end_all_active_intermissions( - &self, - end_opts: EndOptions, - ) -> PaceOptResult> { - let Some(active_intermissions) = self.list_active_intermissions()? else { - debug!("No active intermissions found."); - - // There are no active intermissions - return Ok(None); - }; - - let ended_intermissions = active_intermissions - .par_iter() - .map(|activity_id| -> PaceResult { - let _ = self.end_activity(*activity_id, end_opts.clone())?; - Ok(*activity_id) - }) - .collect::>>()?; - - debug!("Ended intermissions: {:?}", ended_intermissions); - - if ended_intermissions.len() != active_intermissions.len() { - debug!("Not all intermissions were ended."); - - // This is weird, we should return an error about it - return Err(ActivityLogErrorKind::ActivityNotEnded.into()); - } - - Ok(Some(ended_intermissions)) - } - - #[tracing::instrument(skip(self))] - fn resume_activity( - &self, - activity_id: ActivityGuid, - resume_opts: ResumeOptions, - ) -> PaceResult { - let resumable_activity = self.read_activity(activity_id)?; - - debug!("Resumable activity: {:?}", resumable_activity); - - // If the activity is active, return early with an error - if resumable_activity.activity().is_in_progress() { - debug!("Activity is already active."); - return Err(ActivityLogErrorKind::ActiveActivityFound(activity_id).into()); - } else if resumable_activity.activity().is_completed() { - debug!("Activity has ended."); - return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id).into()); - } else if resumable_activity.activity().is_archived() { - debug!("Activity is archived."); - return Err(ActivityLogErrorKind::ActivityAlreadyArchived(activity_id).into()); - } else if !resumable_activity.activity().is_paused() { - debug!("Activity is not held."); - return Err(ActivityLogErrorKind::NoHeldActivityFound(activity_id).into()); - }; - - // If there are active intermissions for any activity, end the intermissions - // because the user wants to resume from an intermission and time is limited, - // so you can't have multiple intermissions at once, only one at a time. - let ended_intermission_ids = self.end_all_active_intermissions(resume_opts.into())?; - - debug!("Ended intermission ids: {:?}", ended_intermission_ids); - - // Update the activity to be active again - let mut editable_activity = resumable_activity.clone(); - - let updated_activity = editable_activity - .activity_mut() - .set_status(ActivityStatusKind::InProgress) - .clone(); - - debug!("Updated activity: {:?}", updated_activity); - - let _ = self.update_activity( - *resumable_activity.guid(), - updated_activity, - UpdateOptions::default(), - )?; - - Ok(resumable_activity) - } - - #[tracing::instrument(skip(self))] - fn hold_activity( - &self, - activity_id: ActivityGuid, - hold_opts: HoldOptions, - ) -> PaceResult { - // Get ActivityItem for activity that - let active_activity = self.read_activity(activity_id)?; - - debug!("Active activity: {:?}", active_activity); - - // make sure, the activity is not already ended or archived - if !active_activity.activity().is_in_progress() { - debug!("Activity is not active."); - return Err(ActivityLogErrorKind::NoActiveActivityFound(activity_id).into()); - } else if active_activity.activity().is_completed() { - debug!("Activity has ended."); - return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id).into()); - } else if active_activity.activity().is_archived() { - debug!("Activity is archived."); - return Err(ActivityLogErrorKind::ActivityAlreadyArchived(activity_id).into()); - }; - - // Check if the latest active activity is already having an intermission - if let Some(intermissions) = - self.list_active_intermissions_for_activity_id(*active_activity.guid())? - { - debug!("Active intermissions: {:?}", intermissions); - - // TODO!: What if there are any other intermissions ongoing for other activities? - // TODO!: Should we end them as well? Or should we just end the intermission for the active activity? - - // If there are active intermissions and we want to extend return early with the active activity - // - // Handles the case, if someone wants to create an intermission for an - // activity that already has an intermission, but hasn't set that we should - // create a new intermission. In this case we don't want to create - // another intermission, but return with the active activity. - if !intermissions.is_empty() && hold_opts.action().is_extend() { - debug!("Active intermission(s) found and action is extend."); - - return Ok(active_activity); - } - }; - - // If there are active intermissions for any activity, end the intermissions - // because the user wants to create a new intermission and time is limited, - // so you can't have multiple intermissions at once, only one at a time. - let active_intermission_ids = - self.end_all_active_intermissions(hold_opts.clone().into())?; - - debug!( - "Ended active intermission ids: {:?}", - active_intermission_ids - ); - - // Create a new intermission for the active activity - let activity_kind_opts = ActivityKindOptions::with_parent_id(*active_activity.guid()); - - let description = hold_opts - .reason() - .clone() - .unwrap_or_else(|| active_activity.activity().description().clone()); - - let intermission = Activity::builder() - .begin(*hold_opts.begin_time()) - .kind(ActivityKind::Intermission) - .status(ActivityStatusKind::InProgress) - .description(description) - .category(active_activity.activity().category().clone()) - .activity_kind_options(Some(activity_kind_opts)) - .build(); - - let created_intermission_item = self.begin_activity(intermission)?; - - debug!("Created intermission: {:?}", created_intermission_item); - - // Update the active activity to be held - let mut editable_activity = active_activity.clone(); - - let updated_activity = editable_activity - .activity_mut() - .set_status(ActivityStatusKind::Paused) - .clone(); - - debug!("Updated activity: {:?}", updated_activity); - - let _ = self.update_activity( - *active_activity.guid(), - updated_activity.clone(), - UpdateOptions::default(), - )?; - - Ok((*active_activity.guid(), updated_activity).into()) - } - - #[tracing::instrument(skip(self))] - fn resume_most_recent_activity( - &self, - resume_opts: ResumeOptions, - ) -> PaceOptResult { - // Get id from last activity that is not ended - let Some(active_activity) = self.most_recent_held_activity()? else { - debug!("No held activity found."); - - // There are no active activities - return Ok(None); - }; - - // TODO!: Check how applicable that is! - // - If there are active intermissions for any activity, end the intermissions - // and resume the activity with the same id as the most recent intermission's parent_id - // - If there are no active intermissions, but there are active activities, return the last active activity - // - If there are no active intermissions, resume the activity with the given id or the last active activity - - Some(self.resume_activity(*active_activity.guid(), resume_opts)).transpose() - } -} - -impl ActivityQuerying for InMemoryActivityStorage { - #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceOptResult> { - let activities = self.log.read(); - - let activities_by_id = activities.activities().clone(); - - drop(activities); - - debug!("Activities by id: {:?}", activities_by_id.keys()); - - if activities_by_id.is_empty() { - debug!("No activities found."); - - return Ok(None); - } - - Ok(Some(activities_by_id)) - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_duration_range( - &self, - ) -> PaceOptResult>> { - todo!("Implement grouping activities by duration range") - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_start_date( - &self, - ) -> PaceOptResult>> { - let activities = self.log.read(); - - Some(activities.activities().iter().try_fold( - BTreeMap::new(), - |mut acc: BTreeMap>, (activity_id, activity)| { - let begin_date = activity.begin().date_naive(); - - debug!("Begin date: {:?}", begin_date); - - acc.entry(begin_date) - .or_default() - .push(ActivityItem::from((*activity_id, activity.clone()))); - - Ok(acc) - }, - )) - .transpose() - } - - #[tracing::instrument(skip(self))] - fn list_activities_with_intermissions( - &self, - ) -> PaceOptResult>> { - let Some(intermissions) = self - .list_activities(ActivityFilterKind::Intermission)? - .map(FilteredActivities::into_vec) - else { - debug!("No intermissions found."); - - return Ok(None); - }; - - debug!("Intermissions: {:?}", intermissions); - - Some(intermissions.into_iter().try_fold( - BTreeMap::new(), - |mut acc: BTreeMap>, intermission_id| { - let intermission = self.read_activity(intermission_id)?; - - debug!("Intermission: {:?}", intermission); - - let parent_id = intermission - .activity() - .activity_kind_options() - .as_ref() - .ok_or(ActivityLogErrorKind::ActivityKindOptionsNotFound( - intermission_id, - ))? - .parent_id() - .ok_or(ActivityLogErrorKind::ParentIdNotSet(intermission_id))?; - - debug!("Parent id: {:?}", parent_id); - - let parent_activity = self.read_activity(parent_id)?; - - debug!("Parent activity: {:?}", parent_activity); - - acc.entry(parent_id).or_default().push(parent_activity); - - Ok(acc) - }, - )) - .transpose() - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_keywords( - &self, - keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { - let activities = self.log.read(); - - Some(activities.activities().iter().try_fold( - BTreeMap::new(), - |mut acc: BTreeMap>, (activity_id, activity)| { - // Group by category - if let Some(category) = keyword_opts.category() { - let category = category.to_lowercase(); - - debug!("Category: {:?}", category); - - if activity - .category() - .as_ref() - .ok_or(ActivityLogErrorKind::CategoryNotSet(*activity_id))? - .to_lowercase() - .contains(category.as_str()) - { - acc.entry(category) - .or_default() - .push(ActivityItem::from((*activity_id, activity.clone()))); - } - } else { - // Use the existing activity category as the keyword - - debug!("No category specified. Using 'Uncategorized' as the category."); - - acc.entry( - activity - .category() - .as_ref() - .unwrap_or(&"Uncategorized".to_string()) - .to_string(), - ) - .or_default() - .push(ActivityItem::from((*activity_id, activity.clone()))); - } - - Ok(acc) - }, - )) - .transpose() - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_kind(&self) -> PaceOptResult>> { - let activities = self.log.read(); - - Some(activities.activities().iter().try_fold( - BTreeMap::new(), - |mut acc: BTreeMap>, (activity_id, activity)| { - debug!( - "Activity kind: {:?} for item {:?} with id {:?}", - activity.kind(), - activity, - activity_id - ); - - acc.entry(*activity.kind()) - .or_default() - .push(ActivityItem::from((*activity_id, activity.clone()))); - - Ok(acc) - }, - )) - .transpose() - } - - #[tracing::instrument(skip(self))] - fn group_activities_by_status( - &self, - ) -> PaceOptResult>> { - let activities = self.log.read(); - - Some(activities.activities().iter().try_fold( - BTreeMap::new(), - |mut acc: BTreeMap>, (activity_id, activity)| { - debug!( - "Activity status: {:?} for item {:?} with id {:?}", - activity.status(), - activity, - activity_id - ); - - acc.entry(*activity.status()) - .or_default() - .push(ActivityItem::from((*activity_id, activity.clone()))); - - Ok(acc) - }, - )) - .transpose() - } - - #[tracing::instrument(skip(self))] - fn list_activities_by_time_range( - &self, - time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { - let Some(filtered_activities) = self - .list_activities(ActivityFilterKind::TimeRange(time_range_opts))? - .map(FilteredActivities::into_vec) - else { - debug!( - "No activities found in time range between {} and {}.", - time_range_opts.start(), - time_range_opts.end() - ); - - return Ok(None); - }; - - if filtered_activities.is_empty() { - debug!( - "No activities found in time range between {} and {}.", - time_range_opts.start(), - time_range_opts.end() - ); - - return Ok(None); - } - - Ok(Some(filtered_activities)) - } -} - -#[cfg(test)] -mod tests { - - use super::*; - use crate::error::TestResult; - use chrono::Local; - use pace_time::date_time::PaceDateTime; - use std::collections::HashSet; - - #[test] - fn test_in_memory_activity_storage_passes() { - let storage = InMemoryActivityStorage::new(); - - assert_eq!( - storage.get_activity_log().activities().len(), - 0, - "Activity log is not empty." - ); - } - - #[test] - fn test_in_memory_activity_storage_from_activity_log_passes() { - let activity_log = ActivityLog::default(); - let storage = InMemoryActivityStorage::from(activity_log); - - assert_eq!( - storage.get_activity_log().activities().len(), - 0, - "Activity log is not empty." - ); - } - - #[test] - fn test_create_read_activity_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - - let begin = Local::now().fixed_offset(); - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let item = storage.create_activity(activity.clone())?; - - assert_eq!( - storage.get_activity_log().activities().len(), - 1, - "Activity was not created." - ); - - let stored_activity = storage.read_activity(*item.guid())?; - - assert_eq!( - activity, - *stored_activity.activity(), - "Stored activity is not the same as the original activity." - ); - - Ok(()) - } - - #[test] - fn test_list_activities_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - - let begin = Local::now().fixed_offset(); - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let _activity_item = storage.create_activity(activity.clone())?; - - let filtered_activities = storage - .list_activities(ActivityFilterKind::Everything)? - .ok_or("No activities found.")? - .into_vec(); - - assert_eq!( - filtered_activities.len(), - 1, - "Amount of activities is not the same as the amount of created activities." - ); - - let stored_activity = storage.read_activity(filtered_activities[0])?; - - assert_eq!( - activity, - *stored_activity.activity(), - "Filtered activities are not the same as the original activity." - ); - - Ok(()) - } - - #[test] - fn test_update_activity_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - - let begin = Local::now().fixed_offset(); - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let og_activity = Activity::builder() - .begin(begin) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let activity_item = storage.create_activity(og_activity.clone())?; - - let read_activity = storage.read_activity(*activity_item.guid())?; - - assert_eq!( - og_activity, - *read_activity.activity(), - "Stored activity is not the same as the original activity." - ); - - let new_description = "Updated description"; - - let tags = vec!["bla".to_string(), "test".to_string()] - .into_iter() - .collect::>(); - - let new_begin = PaceDateTime::from( - begin + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?, - ); - - let updated_activity = Activity::builder() - .begin(new_begin) - .kind(ActivityKind::PomodoroWork) - .status(ActivityStatusKind::InProgress) - .description(new_description) - .tags(tags.clone()) - .build(); - - let old_activity = storage.update_activity( - *activity_item.guid(), - updated_activity, - UpdateOptions::default(), - )?; - - assert_eq!( - og_activity, - *old_activity.activity(), - "Stored activity is not the same as the original activity." - ); - - let new_stored_activity = storage.read_activity(*activity_item.guid())?; - - assert_eq!( - old_activity.guid(), - new_stored_activity.guid(), - "ID was updated, but shouldn't." - ); - - assert_eq!( - new_stored_activity.activity().description(), - new_description, - "Description was not updated." - ); - - assert_eq!( - *new_stored_activity.activity().tags(), - Some(tags), - "Tags were not updated, but should." - ); - - assert_eq!( - old_activity.activity().kind(), - new_stored_activity.activity().kind(), - "Kind was updated, but shouldn't." - ); - - assert_eq!( - &new_begin, - new_stored_activity.activity().begin(), - "Begin time was not updated, but should." - ); - - assert!( - new_stored_activity.activity().is_in_progress(), - "Activity should be active now, but was not updated." - ); - - Ok(()) - } - - #[test] - fn test_crud_activity_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - - // Create activity - let begin = Local::now().fixed_offset(); - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let mut activity = Activity::builder() - .begin(begin) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - assert_eq!( - storage.get_activity_log().activities().len(), - 0, - "Activity log is not empty." - ); - - let activity_item = storage.begin_activity(activity.clone())?; - - assert_eq!( - storage.get_activity_log().activities().len(), - 1, - "Activity was not created." - ); - - // Read activity - let stored_activity = storage.read_activity(*activity_item.guid())?; - - // Make sure the activity is active now, as begin_activity should make it active automatically - activity.make_active(); - - assert_eq!( - activity, - *stored_activity.activity(), - "Stored activity is not the same as the original activity." - ); - - assert_eq!( - *stored_activity.activity().status(), - ActivityStatusKind::InProgress, - "Activity is not active." - ); - - // Update activity - let new_description = "Updated description"; - - let tags = vec!["bla".to_string(), "test".to_string()] - .into_iter() - .collect::>(); - - let new_begin = PaceDateTime::from( - begin + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?, - ); - - let updated_activity = Activity::builder() - .begin(new_begin) - .kind(ActivityKind::PomodoroWork) - .status(ActivityStatusKind::Created) - .description(new_description) - .tags(tags.clone()) - .build(); - - let _ = storage.update_activity( - *activity_item.guid(), - updated_activity, - UpdateOptions::default(), - )?; - - let new_stored_activity = storage.read_activity(*activity_item.guid())?; - - assert_eq!( - new_stored_activity.activity().description(), - new_description, - "Description was not updated." - ); - - assert_eq!( - stored_activity.activity().kind(), - new_stored_activity.activity().kind(), - "Kind was updated, but shouldn't." - ); - - assert_eq!( - Some(tags), - *new_stored_activity.activity().tags(), - "Tags were not updated, but should." - ); - - assert_eq!( - &new_begin, - new_stored_activity.activity().begin(), - "Begin time was not updated, but should." - ); - - assert!( - new_stored_activity.activity().is_inactive(), - "Activity should be active now, but was not updated." - ); - - // Delete activity - let deleted_activity = - storage.delete_activity(*activity_item.guid(), DeleteOptions::default())?; - - assert_eq!( - storage.get_activity_log().activities().len(), - 0, - "Activity was not deleted." - ); - - assert_eq!( - deleted_activity, new_stored_activity, - "Deleted activity is not the same as the updated activity." - ); - - // Try to read the deleted activity - - let read_deleted_activity_result = storage.read_activity(*activity_item.guid()); - - assert!( - read_deleted_activity_result.is_err(), - "Deleted activity was read." - ); - - Ok(()) - } - - #[test] - fn test_end_single_activity_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let end_time = now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let activity_item = storage.begin_activity(activity.clone())?; - - let end_opts = EndOptions::builder().end_time(end_time).build(); - - let ended_activity = storage.end_activity(*activity_item.guid(), end_opts)?; - - assert_ne!( - activity_item, ended_activity, - "Activities do match, although they should be different." - ); - - assert!(ended_activity.activity().activity_end_options().is_some()); - - let ended_activity = storage.read_activity(*activity_item.guid())?; - - assert!( - ended_activity.activity().is_completed(), - "Activity has not ended, but should have." - ); - - assert_eq!( - activity.tags().as_ref().ok_or("Tags not set.")?, - ended_activity - .activity() - .tags() - .as_ref() - .ok_or("Tags not set.")?, - "Tags were updated, but shouldn't." - ); - - assert_eq!( - ended_activity - .activity() - .activity_end_options() - .as_ref() - .ok_or("End options not set.")? - .end(), - &PaceDateTime::from(end_time), - "End time was not set." - ); - - Ok(()) - } - - #[test] - fn test_end_last_unfinished_activity_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let activity_item = storage.begin_activity(activity.clone())?; - - let ended_activity = storage - .end_last_unfinished_activity(EndOptions::builder().end_time(now).build())? - .ok_or("Activity was not ended.")?; - - assert_eq!( - ended_activity.guid(), - activity_item.guid(), - "Activity IDs do not match." - ); - - assert!( - ended_activity.activity().is_completed(), - "Activity has not ended, but should have." - ); - - assert_eq!( - activity.tags().as_ref().ok_or("Tags not set.")?, - ended_activity - .activity() - .tags() - .as_ref() - .ok_or("Tags not set.")?, - "Tags were updated, but shouldn't." - ); - - assert_eq!( - ended_activity - .activity() - .activity_end_options() - .as_ref() - .ok_or("End options not set.")? - .end(), - &PaceDateTime::from(now), - "End time was not set." - ); - - Ok(()) - } - - #[test] - fn test_begin_and_auto_end_for_multiple_activities_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .tags(tags.clone()) - .build(); - - // Begin the first activity - let activity_item = storage.begin_activity(activity)?; - - let begin_time = now - chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?; - let kind = ActivityKind::Activity; - let description = "Test activity 2"; - - let activity2 = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - // Begin the second activity, the first one should be ended automatically now - let activity_item2 = storage.begin_activity(activity2)?; - - let ended_activity = storage.read_activity(*activity_item.guid())?; - - assert!( - ended_activity.activity().is_completed(), - "Activity has not ended, but should have." - ); - - assert_eq!( - ended_activity - .activity() - .activity_end_options() - .as_ref() - .ok_or("End options not set.")? - .end(), - &PaceDateTime::from(now), - "End time was not set." - ); - - let ended_activity2 = storage.read_activity(*activity_item2.guid())?; - - assert!( - ended_activity2.activity().is_in_progress(), - "Activity has not ended, but should have." - ); - - assert!( - ended_activity2.activity().activity_end_options().is_none(), - "End time should not be set." - ); - - Ok(()) - } - - #[test] - fn test_hold_most_recent_active_activity_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let activity_item = storage.begin_activity(activity.clone())?; - - let hold_time = now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; - - let hold_opts = HoldOptions::builder().begin_time(hold_time).build(); - - let held_activity = storage - .hold_most_recent_active_activity(hold_opts)? - .ok_or("Activity was not held.")?; - - assert_eq!( - held_activity.guid(), - activity_item.guid(), - "Activity IDs do not match." - ); - - assert_eq!( - activity.tags().as_ref().ok_or("Tags not set.")?, - held_activity - .activity() - .tags() - .as_ref() - .ok_or("Tags not set.")?, - "Tags were updated, but shouldn't." - ); - - let intermission_guids = storage - .list_active_intermissions_for_activity_id(*activity_item.guid())? - .ok_or("Intermission was not created.")?; - - assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); - - let intermission_item = storage.read_activity(intermission_guids[0])?; - - assert_eq!( - *intermission_item.activity().kind(), - ActivityKind::Intermission, - "Intermission was not created." - ); - - assert_eq!( - intermission_item - .activity() - .activity_kind_options() - .as_ref() - .ok_or("Activity kind options not set.")? - .parent_id() - .ok_or("Parent ID not set.")?, - *activity_item.guid(), - "Parent ID is not set." - ); - - Ok(()) - } - - #[test] - fn test_hold_last_unfinished_activity_with_existing_intermission_does_nothing_passes( - ) -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - let tags = vec!["test".to_string(), "activity".to_string()] - .into_iter() - .collect::>(); - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .tags(tags) - .build(); - - let active_activity_item = storage.begin_activity(activity)?; - - let hold_opts = HoldOptions::builder() - .begin_time(now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?) - .build(); - - let _held_item = storage - .hold_most_recent_active_activity(hold_opts)? - .ok_or("Activity was not held.")?; - - let held_activity = storage.read_activity(*active_activity_item.guid())?; - - assert_eq!( - *held_activity.activity().status(), - ActivityStatusKind::Paused, - "Activity was not held." - ); - - let intermission_guids = storage - .list_active_intermissions_for_activity_id(*active_activity_item.guid())? - .ok_or("Intermission was not created.")?; - - assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); - - let hold_opts = HoldOptions::builder() - .begin_time(now + chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?) - .build(); - - assert!( - storage - .hold_most_recent_active_activity(hold_opts)? - .is_none(), - "Activity was held again." - ); - - let intermission_guids = storage - .list_active_intermissions_for_activity_id(*active_activity_item.guid())? - .ok_or("Intermission was not created.")?; - - assert_eq!( - intermission_guids.len(), - 1, - "Intermission was created again." - ); - - let intermission_item = storage.read_activity(intermission_guids[0])?; - - assert_eq!( - *intermission_item.activity().kind(), - ActivityKind::Intermission, - "Intermission was not created." - ); - - assert!( - intermission_item.activity().tags().is_none(), - "Intermission has tags, but shouldn't." - ); - - Ok(()) - } - - #[test] - fn test_end_all_active_intermissions_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; - let end_time = now + chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .build(); - - let active_activity_item = storage.begin_activity(activity)?; - - let hold_opts = HoldOptions::builder() - .begin_time(now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?) - .build(); - - let _ = storage.hold_most_recent_active_activity(hold_opts)?; - - let intermission_guids = storage - .list_active_intermissions_for_activity_id(*active_activity_item.guid())? - .ok_or("Intermission was not created.")?; - - assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); - - let end_opts = EndOptions::builder().end_time(end_time).build(); - - let ended_intermissions = storage - .end_all_active_intermissions(end_opts)? - .ok_or("Intermissions were not ended.")?; - - assert_eq!( - ended_intermissions.len(), - 1, - "Not all intermissions were ended." - ); - - let ended_intermission = storage.read_activity(intermission_guids[0])?; - - assert!( - ended_intermission.activity().is_completed(), - "Intermission has not ended, but should have." - ); - - assert_eq!( - ended_intermission - .activity() - .activity_end_options() - .as_ref() - .ok_or("End options not set.")? - .end(), - &PaceDateTime::from(end_time), - "End time was not set." - ); - - Ok(()) - } - - #[test] - fn test_group_activities_by_keywords_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .category("Project::Test".to_string()) - .build(); - - let activity_item = storage.begin_activity(activity)?; - - let keyword_opts = KeywordOptions::builder().category("Test").build(); - - let grouped_activities = storage.group_activities_by_keywords(keyword_opts)?.ok_or( - "Grouped activities by keywords returned None, but should have returned Some.", - )?; - - assert_eq!( - grouped_activities.len(), - 1, - "Grouped activities do not match the amount of created activities." - ); - - let grouped_activity = grouped_activities - .values() - .next() - .ok_or("Grouped activities are empty.")? - .first() - .ok_or("Grouped activities are empty.")? - .clone(); - - assert_eq!( - *grouped_activity.guid(), - *activity_item.guid(), - "Grouped activity is not the same as the original activity." - ); - - Ok(()) - } - - #[test] - fn test_group_activities_by_kind_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .build(); - - let activity_item = storage.begin_activity(activity)?; - - let grouped_activities = storage - .group_activities_by_kind()? - .ok_or("Grouped activities by kind returned None, but should have returned Some.")?; - - assert_eq!( - grouped_activities.len(), - 1, - "Grouped activities do not match the amount of created activities." - ); - - let grouped_activity = grouped_activities - .values() - .next() - .ok_or("Grouped activities are empty.")? - .first() - .ok_or("Grouped activities are empty.")? - .clone(); - - assert_eq!( - *grouped_activity.guid(), - *activity_item.guid(), - "Grouped activity is not the same as the original activity." - ); - - assert_eq!( - *grouped_activity.activity().kind(), - kind, - "Grouped activity kind is not the same as the original activity kind." - ); - - assert_eq!( - *grouped_activity.activity().description(), - description, - "Grouped activity description is not the same as the original activity description." - ); - - Ok(()) - } - - #[test] - fn test_group_activities_by_status_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .build(); - - let activity_item = storage.begin_activity(activity)?; - - let grouped_activities = storage - .group_activities_by_status()? - .ok_or("Grouped activities by status returned None, but should have returned Some.")?; - - assert_eq!( - grouped_activities.len(), - 1, - "Grouped activities do not match the amount of created activities." - ); - - let grouped_activity = grouped_activities - .values() - .next() - .ok_or("Grouped activities are empty.")? - .first() - .ok_or("Grouped activities are empty.")? - .clone(); - - assert_eq!( - *grouped_activity.guid(), - *activity_item.guid(), - "Grouped activity is not the same as the original activity." - ); - - assert_eq!( - *grouped_activity.activity().status(), - ActivityStatusKind::InProgress, - "Grouped activity status is not the same as the original activity status." - ); - - assert_eq!( - *grouped_activity.activity().kind(), - kind, - "Grouped activity kind is not the same as the original activity kind." - ); - - assert_eq!( - *grouped_activity.activity().description(), - description, - "Grouped activity description is not the same as the original activity description." - ); - - Ok(()) - } - - #[test] - fn test_group_activities_by_start_date_passes() -> TestResult<()> { - let storage = InMemoryActivityStorage::new(); - let now = Local::now().fixed_offset(); - let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; - let kind = ActivityKind::Activity; - let description = "Test activity"; - - let activity = Activity::builder() - .begin(begin_time) - .kind(kind) - .description(description) - .build(); - - let activity_item = storage.begin_activity(activity)?; - - let grouped_activities = storage.group_activities_by_start_date()?.ok_or( - "Grouped activities by start date returned None, but should have returned Some.", - )?; - - assert_eq!( - grouped_activities.len(), - 1, - "Grouped activities do not match the amount of created activities." - ); - - let grouped_activity = grouped_activities - .values() - .next() - .ok_or("Grouped activities are empty?")? - .first() - .ok_or("Grouped activities are empty?")? - .clone(); - - assert_eq!( - *grouped_activity.guid(), - *activity_item.guid(), - "Grouped activity is not the same as the original activity." - ); - - assert_eq!( - grouped_activity.activity().begin().date_naive(), - PaceDate::new(begin_time.date_naive()), - "Grouped activity date is not the same as the original activity date." - ); - - assert_eq!( - *grouped_activity.activity().kind(), - kind, - "Grouped activity kind is not the same as the original activity kind." - ); - - assert_eq!( - *grouped_activity.activity().description(), - description, - "Grouped activity description is not the same as the original activity description." - ); - - Ok(()) - } - - // TODO!: Implement the following tests - // #[test] - // fn test_group_multiple_activities_by_status_passes() { - // } - - // #[test] - // fn test_group_multiple_activities_by_kind_passes() { - // } - - // #[test] - // fn test_group_multiple_activities_by_keywords_passes() { - // } -} diff --git a/crates/core/src/storage/sqlite.rs b/crates/core/src/storage/sqlite.rs deleted file mode 100644 index e043c43e..00000000 --- a/crates/core/src/storage/sqlite.rs +++ /dev/null @@ -1,467 +0,0 @@ -use std::collections::BTreeMap; - -use itertools::Itertools; -use rusqlite::Connection; - -use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use tracing::debug; - -use crate::{ - domain::activity::Activity, - error::{DatabaseErrorKind, PaceResult}, - prelude::{ - ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityStatusKind, - DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceOptResult, - ResumeOptions, UpdateOptions, - }, - storage::{ - ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, - ActivityWriteOps, SyncStorage, - }, -}; - -pub trait FromRow { - fn from_row(row: &rusqlite::Row<'_>) -> PaceResult - where - Self: Sized; -} - -#[derive(Debug)] -pub struct SqliteActivityStorage { - connection: Connection, -} - -impl SqliteActivityStorage { - pub fn new(connection_string: String) -> PaceResult { - let connection = Connection::open(connection_string.as_str()).map_err(|err| { - DatabaseErrorKind::ConnectionFailed(connection_string, err.to_string()) - })?; - - Ok(Self { connection }) - } -} - -impl ActivityStorage for SqliteActivityStorage { - fn setup_storage(&self) -> PaceResult<()> { - // TODO!: Check if the needed tables are existing or if we - // are dealing with a fresh database, so we need to create - // the tables. - - Ok(()) - } -} - -impl SyncStorage for SqliteActivityStorage { - fn sync(&self) -> PaceResult<()> { - // TODO!: Sync the activities to the database - - Ok(()) - } -} - -impl ActivityReadOps for SqliteActivityStorage { - #[tracing::instrument] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { - let mut stmt = self - .connection - .prepare("SELECT * FROM activities WHERE id = ?1")?; - - let activity_item_iter = - stmt.query_map(&[&activity_id], |row| Ok(ActivityItem::from_row(&row)))?; - - let activity_item = activity_item_iter - .filter_map_ok(|item| item.ok()) - .next() - .transpose()? - .ok_or(DatabaseErrorKind::ActivityNotFound(activity_id))?; - - debug!("Read activity: {:?}", activity_item); - - Ok(activity_item) - } - - #[tracing::instrument] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { - let mut stmt = self.connection.prepare(filter.to_sql_statement())?; - - let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; - - let activities = activity_item_iter - .filter_map_ok(|item| item.ok()) - .collect::, _>>()?; - - debug!("Listed activities: {:?}", activities); - - if activities.is_empty() { - return Ok(None); - } - - let activities = match filter { - ActivityFilterKind::Everything => FilteredActivities::Everything(activities), - ActivityFilterKind::OnlyActivities => FilteredActivities::OnlyActivities(activities), - ActivityFilterKind::Active => FilteredActivities::Active(activities), - ActivityFilterKind::ActiveIntermission => { - FilteredActivities::ActiveIntermission(activities) - } - ActivityFilterKind::Archived => FilteredActivities::Archived(activities), - ActivityFilterKind::Ended => FilteredActivities::Ended(activities), - ActivityFilterKind::Held => FilteredActivities::Held(activities), - ActivityFilterKind::Intermission => FilteredActivities::Intermission(activities), - ActivityFilterKind::TimeRange(_) => FilteredActivities::TimeRange(activities), - }; - - Ok(Some(activities)) - } -} - -impl ActivityWriteOps for SqliteActivityStorage { - fn create_activity(&self, activity: Activity) -> PaceResult { - let tx = self.connection.transaction()?; - - let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; - - let (guid, params) = activity.to_sql_execute_statement()?; - - if stmt.execute(params.as_slice())? > 0 { - tx.commit()?; - return Ok(ActivityItem::from((guid, activity))); - } - - return Err(DatabaseErrorKind::ActivityCreationFailed(activity).into()); - } - - fn update_activity( - &self, - activity_id: ActivityGuid, - updated_activity: Activity, - update_opts: UpdateOptions, - ) -> PaceResult { - todo!() - } - - fn delete_activity( - &self, - activity_id: ActivityGuid, - delete_opts: DeleteOptions, - ) -> PaceResult { - let activity = self.read_activity(activity_id)?; - - let tx = self.connection.transaction()?; - let mut stmt = tx.prepare("DELETE FROM activities WHERE id = ?1 LIMIT = 1")?; - - if stmt.execute(&[&activity_id])? == 1 { - tx.commit()?; - return Ok(activity); - } - - Err(DatabaseErrorKind::ActivityDeletionFailed(activity_id).into()) - } -} -impl ActivityStateManagement for SqliteActivityStorage { - fn hold_activity( - &self, - activity_id: ActivityGuid, - hold_opts: HoldOptions, - ) -> PaceResult { - todo!() - } - - fn resume_activity( - &self, - activity_id: ActivityGuid, - resume_opts: ResumeOptions, - ) -> PaceResult { - todo!() - } - - fn resume_most_recent_activity( - &self, - resume_opts: ResumeOptions, - ) -> PaceOptResult { - todo!() - } - - fn end_activity( - &self, - activity_id: ActivityGuid, - end_opts: EndOptions, - ) -> PaceResult { - todo!() - } - - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { - todo!() - } - - fn end_all_active_intermissions( - &self, - end_opts: EndOptions, - ) -> PaceOptResult> { - todo!() - } - - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { - todo!() - } - - fn hold_most_recent_active_activity( - &self, - hold_opts: HoldOptions, - ) -> PaceOptResult { - todo!() - } -} -impl ActivityQuerying for SqliteActivityStorage { - fn group_activities_by_duration_range( - &self, - ) -> PaceOptResult>> { - todo!() - } - - fn group_activities_by_start_date( - &self, - ) -> PaceOptResult>> { - todo!() - } - - fn list_activities_with_intermissions( - &self, - ) -> PaceOptResult>> { - todo!() - } - - fn group_activities_by_keywords( - &self, - keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { - todo!() - } - - fn group_activities_by_kind(&self) -> PaceOptResult>> { - todo!() - } - - fn list_activities_by_time_range( - &self, - time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { - todo!() - } - - fn group_activities_by_status( - &self, - ) -> PaceOptResult>> { - todo!() - } - - fn list_activities_by_id(&self) -> PaceOptResult> { - todo!() - } -} - -pub mod sql_conversion { - use std::{collections::HashSet, str::FromStr}; - - use pace_time::date_time::PaceDateTime; - use rusqlite::{types::FromSql, Row, ToSql}; - use ulid::Ulid; - - // use pace_time::rusqlite::*; - - use crate::{ - prelude::{ - Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, - ActivityKind, ActivityKindOptions, ActivityStatusKind, PaceResult, - }, - storage::sqlite::FromRow, - }; - - impl Activity { - pub fn to_sql_prepare_statement(&self) -> &'static str { - "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" - } - - pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { - let category = if let Some(category) = self.category() { - category.to_sql()? - } else { - "NULL".to_sql()? - }; - - let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { - let (end, duration) = end_opts.as_tuple(); - (end.to_sql()?, duration.to_sql()?) - } else { - ("NULL".to_sql()?, "NULL".to_sql()?) - }; - - let parent_id = if let Some(parent_id) = self.parent_id() { - parent_id.to_sql()? - } else { - "NULL".to_sql()? - }; - - let tags = if let Some(tags) = self.tags() { - let tags = tags - .iter() - .map(|tag| tag.to_string()) - .collect::>(); - - tags.join(",").to_sql()? - } else { - "NULL".to_sql()? - }; - - let guid = ActivityGuid::new(); - - Ok(( - guid, - vec![ - // TODO: We create a new ID here, that should probably happen - // TODO: somewhere else and needs a refactoring - &guid, - &category, - &self.description(), - &self.begin(), - &end, - &duration, - &self.kind(), - &self.status(), - &tags, - &parent_id, - ], - )) - } - } - - impl ActivityFilterKind { - pub fn to_sql_statement(&self) -> &'static str { - match self { - Self::Everything => "SELECT * FROM activities", - ActivityFilterKind::OnlyActivities => todo!(), - ActivityFilterKind::Active => { - "SELECT * FROM activities WHERE status = 'in-progress'" - } - ActivityFilterKind::ActiveIntermission => todo!(), - ActivityFilterKind::Archived => { - "SELECT * FROM activities WHERE status = 'archived'" - } - ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", - ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", - ActivityFilterKind::Intermission => todo!(), - ActivityFilterKind::TimeRange(opts) => todo!(), - } - } - } - - impl FromRow for ActivityEndOptions { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(Self::new(row.get("end")?, row.get("duration")?)) - } - } - - impl FromRow for ActivityKindOptions { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(Self::with_parent_id(row.get("parent_id")?)) - } - } - - impl FromRow for Activity { - fn from_row(row: &Row<'_>) -> PaceResult { - let begin_time: PaceDateTime = row.get("begin")?; - - let description: String = row.get("description")?; - - let tags_string: String = row.get("tags")?; - - let tags = tags_string - .split(',') - .map(|tag| tag.to_string()) - .collect::>(); - - Ok(Activity::builder() - .category(Some(row.get("category")?)) // TODO: Check for None - .description(description) - .begin(begin_time) - .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None - .kind(row.get("kind")?) - .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None - .tags(tags) - .status(row.get("status")?) - .build()) - } - } - - impl FromRow for ActivityGuid { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(row.get("guid")?) - } - } - - impl FromRow for ActivityItem { - fn from_row(row: &Row<'_>) -> PaceResult { - let activity_end_opts = ActivityEndOptions::from_row(row)?; - - let activity_kind_opts = ActivityKindOptions::from_row(row)?; - - let activity = Activity::from_row(row)?; - - let guid = ActivityGuid::from_row(row)?; - - Ok(Self::builder().guid(guid).activity(activity).build()) - } - } - - impl ToSql for ActivityGuid { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } - } - - impl FromSql for ActivityGuid { - fn column_result( - value: rusqlite::types::ValueRef<'_>, - ) -> rusqlite::types::FromSqlResult { - Ok(ActivityGuid::with_id( - Ulid::from_string(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, - )) - } - } - - impl ToSql for ActivityKind { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } - } - - impl FromSql for ActivityKind { - fn column_result( - value: rusqlite::types::ValueRef<'_>, - ) -> rusqlite::types::FromSqlResult { - Ok(ActivityKind::from_str(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) - } - } - - impl ToSql for ActivityStatusKind { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } - } - - impl FromSql for ActivityStatusKind { - fn column_result( - value: rusqlite::types::ValueRef<'_>, - ) -> rusqlite::types::FromSqlResult { - Ok(ActivityStatusKind::from_str(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) - } - } -} diff --git a/crates/time/Cargo.toml b/crates/time/Cargo.toml index a3d13be6..a70cc854 100644 --- a/crates/time/Cargo.toml +++ b/crates/time/Cargo.toml @@ -9,7 +9,15 @@ keywords = { workspace = true } license = { workspace = true } repository = { workspace = true } rust-version = { workspace = true } -description = "pace-time - a library for handling date times, ranges, and durations for pace" +description = "pace-time - a library handling date times, ranges, and durations for pace" + +include = [ + "LICENSE", + "README.md", + "CHANGELOG.md", + "src/**/*", + "Cargo.toml", +] [features] default = ["cli", "db"] diff --git a/crates/core/tests/integration/activity_store.rs b/tests/integration/activity_store.rs similarity index 100% rename from crates/core/tests/integration/activity_store.rs rename to tests/integration/activity_store.rs diff --git a/crates/core/tests/integration/activity_tracker.rs b/tests/integration/activity_tracker.rs similarity index 100% rename from crates/core/tests/integration/activity_tracker.rs rename to tests/integration/activity_tracker.rs diff --git a/crates/core/tests/integration/find_configs.rs b/tests/integration/find_configs.rs similarity index 100% rename from crates/core/tests/integration/find_configs.rs rename to tests/integration/find_configs.rs diff --git a/crates/core/tests/integration/main.rs b/tests/integration/main.rs similarity index 100% rename from crates/core/tests/integration/main.rs rename to tests/integration/main.rs diff --git a/crates/core/tests/integration/util.rs b/tests/integration/util.rs similarity index 98% rename from crates/core/tests/integration/util.rs rename to tests/integration/util.rs index 36a666c7..b98f1752 100644 --- a/crates/core/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -4,7 +4,7 @@ use chrono::Local; use pace_core::prelude::{ Activity, ActivityGuid, ActivityItem, ActivityKind, ActivityKindOptions, ActivityLog, - ActivityStatusKind, ActivityStore, InMemoryActivityStorage, TestResult, TomlActivityStorage, + ActivityStatusKind, ActivityStore, TestResult, }; use rstest::fixture; diff --git a/tests/cli.rs b/tests/journey/cli.rs similarity index 100% rename from tests/cli.rs rename to tests/journey/cli.rs diff --git a/crates/core/tests/journey/hold_resume.rs b/tests/journey/hold_resume.rs similarity index 100% rename from crates/core/tests/journey/hold_resume.rs rename to tests/journey/hold_resume.rs diff --git a/crates/core/tests/journey/main.rs b/tests/journey/main.rs similarity index 97% rename from crates/core/tests/journey/main.rs rename to tests/journey/main.rs index 5156a1aa..5dc606e5 100644 --- a/crates/core/tests/journey/main.rs +++ b/tests/journey/main.rs @@ -1,5 +1,6 @@ mod hold_resume; mod start_finish_different_time_zone; +mod cli; // DEBUGGING: To make life easier, you can import SimpleLogger from simplelog crate // diff --git a/tests/snapshots/cli__adjust_activity_snapshot_passes.snap b/tests/journey/snapshots/cli__adjust_activity_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__adjust_activity_snapshot_passes.snap rename to tests/journey/snapshots/cli__adjust_activity_snapshot_passes.snap diff --git a/tests/snapshots/cli__begin_snapshot_passes.snap b/tests/journey/snapshots/cli__begin_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__begin_snapshot_passes.snap rename to tests/journey/snapshots/cli__begin_snapshot_passes.snap diff --git a/tests/snapshots/cli__end_with_active_activity_snapshot_passes.snap b/tests/journey/snapshots/cli__end_with_active_activity_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__end_with_active_activity_snapshot_passes.snap rename to tests/journey/snapshots/cli__end_with_active_activity_snapshot_passes.snap diff --git a/tests/snapshots/cli__hold_with_active_activity_snapshot_passes.snap b/tests/journey/snapshots/cli__hold_with_active_activity_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__hold_with_active_activity_snapshot_passes.snap rename to tests/journey/snapshots/cli__hold_with_active_activity_snapshot_passes.snap diff --git a/tests/snapshots/cli__now_no_activities_snapshot_passes.snap b/tests/journey/snapshots/cli__now_no_activities_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__now_no_activities_snapshot_passes.snap rename to tests/journey/snapshots/cli__now_no_activities_snapshot_passes.snap diff --git a/tests/snapshots/cli__now_with_active_activity_snapshot_passes.snap b/tests/journey/snapshots/cli__now_with_active_activity_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__now_with_active_activity_snapshot_passes.snap rename to tests/journey/snapshots/cli__now_with_active_activity_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_current_month_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_current_month_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_current_month_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_current_month_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_current_week_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_current_week_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_current_week_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_current_week_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_date_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_date_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_date_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_date_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_from_to_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_from_to_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_from_to_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_from_to_snapshot_passes.snap diff --git a/tests/snapshots/cli__reflect_today_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_today_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__reflect_today_snapshot_passes.snap rename to tests/journey/snapshots/cli__reflect_today_snapshot_passes.snap diff --git a/tests/snapshots/cli__resume_with_held_activity_snapshot_passes.snap b/tests/journey/snapshots/cli__resume_with_held_activity_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__resume_with_held_activity_snapshot_passes.snap rename to tests/journey/snapshots/cli__resume_with_held_activity_snapshot_passes.snap diff --git a/tests/snapshots/cli__version_snapshot_passes.snap b/tests/journey/snapshots/cli__version_snapshot_passes.snap similarity index 100% rename from tests/snapshots/cli__version_snapshot_passes.snap rename to tests/journey/snapshots/cli__version_snapshot_passes.snap diff --git a/crates/core/tests/journey/start_finish_different_time_zone.rs b/tests/journey/start_finish_different_time_zone.rs similarity index 100% rename from crates/core/tests/journey/start_finish_different_time_zone.rs rename to tests/journey/start_finish_different_time_zone.rs From 817623e9d47cb8734b84db196146a850e9a838f2 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 26 Mar 2024 15:31:47 +0100 Subject: [PATCH 10/59] factor out pace_storage crate Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2937ff2..a041b51f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -571,18 +571,6 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" -[[package]] -name = "enum_dispatch" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.55", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -1273,6 +1261,7 @@ dependencies = [ "once_cell", "pace_cli", "pace_core", + "pace_storage", "pace_time", "predicates", "serde", @@ -1307,12 +1296,11 @@ dependencies = [ "diesel", "directories", "displaydoc", - "enum_dispatch", + "dotenvy", "eyre", "getset", "insta", "itertools", - "libsqlite3-sys", "merge", "miette", "once_cell", @@ -1342,6 +1330,26 @@ dependencies = [ name = "pace_server" version = "0.1.3" +[[package]] +name = "pace_storage" +version = "0.1.0" +dependencies = [ + "chrono", + "displaydoc", + "itertools", + "libsqlite3-sys", + "merge", + "pace_core", + "pace_time", + "parking_lot", + "rayon", + "rusqlite", + "thiserror", + "toml 0.8.12", + "tracing", + "ulid", +] + [[package]] name = "pace_time" version = "0.1.2" From 8114ffb79bb6c72d4c0a29d5794f1482a8658b4a Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 26 Mar 2024 15:34:23 +0100 Subject: [PATCH 11/59] remove diesel.toml Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- diesel.toml | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 diesel.toml diff --git a/diesel.toml b/diesel.toml deleted file mode 100644 index c028f4a6..00000000 --- a/diesel.toml +++ /dev/null @@ -1,9 +0,0 @@ -# For documentation on how to configure this file, -# see https://diesel.rs/guides/configuring-diesel-cli - -[print_schema] -file = "src/schema.rs" -custom_type_derives = ["diesel::query_builder::QueryId"] - -[migrations_directory] -dir = "migrations" From b0e8fb4a907102a8e5b053302efc0bfc7fe1c49d Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 26 Mar 2024 15:36:13 +0100 Subject: [PATCH 12/59] add pace_storage Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/Cargo.toml | 46 + crates/storage/LICENSE | 661 ++++++++++++ crates/storage/src/error.rs | 62 ++ crates/storage/src/file.rs | 290 +++++ crates/storage/src/in_memory.rs | 1773 +++++++++++++++++++++++++++++++ crates/storage/src/lib.rs | 82 ++ crates/storage/src/sqlite.rs | 472 ++++++++ 7 files changed, 3386 insertions(+) create mode 100644 crates/storage/Cargo.toml create mode 100644 crates/storage/LICENSE create mode 100644 crates/storage/src/error.rs create mode 100644 crates/storage/src/file.rs create mode 100644 crates/storage/src/in_memory.rs create mode 100644 crates/storage/src/lib.rs create mode 100644 crates/storage/src/sqlite.rs diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml new file mode 100644 index 00000000..77032ae0 --- /dev/null +++ b/crates/storage/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "pace_storage" +version = "0.1.0" +authors = { workspace = true } +categories = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +keywords = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } +description = "pace-storage - a library handling storage engines for pace" + +include = [ + "LICENSE", + "README.md", + "CHANGELOG.md", + "src/**/*", + "Cargo.toml", +] + +[features] +default = ["db"] +db = ["rusqlite"] +rusqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] + +[dependencies] +displaydoc = { workspace = true } +itertools = { workspace = true } +libsqlite3-sys = { workspace = true, features = ["bundled"], optional = true } +merge = { workspace = true } +pace_core = { workspace = true } +pace_time = { workspace = true, features = ["db"] } +parking_lot = { workspace = true, features = ["deadlock_detection"] } +rayon = { workspace = true } +rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } +thiserror = { workspace = true } +toml = { workspace = true, features = ["indexmap", "preserve_order"] } +tracing = { workspace = true } +ulid = { workspace = true, features = ["serde"] } + +[dev-dependencies] +chrono = { workspace = true, features = ["serde"] } + +[lints] +workspace = true diff --git a/crates/storage/LICENSE b/crates/storage/LICENSE new file mode 100644 index 00000000..0ad25db4 --- /dev/null +++ b/crates/storage/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/crates/storage/src/error.rs b/crates/storage/src/error.rs new file mode 100644 index 00000000..e39b18bb --- /dev/null +++ b/crates/storage/src/error.rs @@ -0,0 +1,62 @@ +use std::path::PathBuf; + +use displaydoc::Display; +use pace_core::prelude::{Activity, ActivityGuid, DatabaseEngineKind}; +use thiserror::Error; + +pub type PaceStorageResult = Result; + +/// [`PaceTimeErrorKind`] describes the errors that can happen while dealing with time. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum PaceStorageErrorKind { + /// SQLite error: {0} + #[error(transparent)] + #[cfg(feature = "rusqlite")] + SQLite(#[from] rusqlite::Error), + + /// Database error: {0} + #[error(transparent)] + Database(#[from] DatabaseStorageErrorKind), + + /// Toml file error: {0} + #[error(transparent)] + TomlFile(#[from] TomlFileStorageErrorKind), + + /// Database storage not configured + DatabaseStorageNotConfigured, +} + +/// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the SQLite database. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum DatabaseStorageErrorKind { + /// Error connecting to database: {0} - {1} + ConnectionFailed(String, String), + + /// No connection string provided + NoConnectionString, + + /// No configuration settings provided in configuration file, please set them up with `pace setup config` + NoConfigSettings, + + /// This database engine is currently not supported: {0} + UnsupportedDatabaseEngine(DatabaseEngineKind), + + /// Activity with id {0} not found + ActivityNotFound(ActivityGuid), + + /// Failed to create activity: {0} + ActivityCreationFailed(Activity), + + /// Failed to delete activity: {0} + ActivityDeletionFailed(ActivityGuid), +} + +/// [`TomlFileStorageErrorKind`] describes the errors that can happen while dealing with the Toml file storage. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum TomlFileStorageErrorKind { + /// Parent directory not found: {0} + ParentDirNotFound(PathBuf), +} diff --git a/crates/storage/src/file.rs b/crates/storage/src/file.rs new file mode 100644 index 00000000..0b677305 --- /dev/null +++ b/crates/storage/src/file.rs @@ -0,0 +1,290 @@ +use std::{ + collections::BTreeMap, + fs::{create_dir_all, write, OpenOptions}, + io::Write, + path::{Path, PathBuf}, +}; + +use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; + +use pace_core::prelude::{ + Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityLog, + ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, + ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, + KeywordOptions, PaceOptResult, PaceResult, ResumeOptions, SyncStorage, UpdateOptions, +}; + +use crate::{error::TomlFileStorageErrorKind, in_memory::InMemoryActivityStorage}; + +/// In-memory backed TOML activity storage +/// +/// This storage is backed by an in-memory cache and a TOML file on disk for persistence. +pub struct TomlActivityStorage { + /// The in-memory cache + cache: InMemoryActivityStorage, + + /// The path to the TOML file + path: PathBuf, +} + +impl SyncStorage for TomlActivityStorage { + fn sync(&self) -> PaceResult<()> { + self.sync_to_file() + } +} + +impl TomlActivityStorage { + /// Create a new `TomlActivityStorage` + /// + /// # Arguments + /// + /// * `path` - The path to the TOML file + /// + /// # Errors + /// + /// Returns an error if the path is not a valid file path. + /// + /// # Returns + /// + /// Returns a new `TomlActivityStorage` + pub fn new(path: impl AsRef) -> PaceResult { + let mut storage = Self { + cache: InMemoryActivityStorage::new(), + path: path.as_ref().to_path_buf(), + }; + + storage.load()?; + + Ok(storage) + } + + /// Load the TOML file into the in-memory cache + /// + /// This will read the TOML file from disk and load it into the in-memory cache + /// + /// # Errors + /// + /// Returns an error if the file cannot be read or the data cannot be deserialized + /// + /// # Returns + /// + /// Returns `Ok(())` if the data is loaded successfully + #[tracing::instrument(skip(self))] + fn load(&mut self) -> PaceResult<()> { + let data = std::fs::read_to_string(&self.path)?; + self.cache = InMemoryActivityStorage::from(toml::from_str::(&data)?); + + Ok(()) + } + + /// Sync the in-memory cache to the TOML file + /// + /// This will write the in-memory cache to the TOML file on disk + /// + /// # Errors + /// + /// Returns an error if the cache cannot be written to the file + /// + /// # Returns + /// + /// Returns `Ok(())` if the cache is written successfully + #[tracing::instrument(skip(self))] + pub fn sync_to_file(&self) -> PaceResult<()> { + let data = toml::to_string(&self.cache.get_activity_log())?; + write(&self.path, data)?; + Ok(()) + } +} + +impl ActivityStorage for TomlActivityStorage { + #[tracing::instrument(skip(self))] + fn setup(&self) -> PaceResult<()> { + if !self.path.exists() { + create_dir_all(self.path.parent().ok_or( + TomlFileStorageErrorKind::ParentDirNotFound(self.path.clone()), + )?)?; + + let mut file = OpenOptions::new() + .write(true) + .create(true) + .truncate(true) + .open(&self.path)?; + + file.write_all(b"")?; + } + Ok(()) + } + + #[tracing::instrument(skip(self))] + fn teardown(&self) -> PaceResult<()> { + self.sync_to_file() + } + + #[tracing::instrument(skip(self))] + fn identify(&self) -> String { + format!("TOML file storage: {}", self.path.display()) + } +} + +impl ActivityReadOps for TomlActivityStorage { + #[tracing::instrument(skip(self))] + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + self.cache.read_activity(activity_id) + } + + #[tracing::instrument(skip(self))] + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + self.cache.list_activities(filter) + } +} + +impl ActivityStateManagement for TomlActivityStorage { + #[tracing::instrument(skip(self))] + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + self.cache.end_all_activities(end_opts) + } + + #[tracing::instrument(skip(self))] + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + self.cache.end_last_unfinished_activity(end_opts) + } + + #[tracing::instrument(skip(self))] + fn end_activity( + &self, + activity_id: ActivityGuid, + end_opts: EndOptions, + ) -> PaceResult { + self.cache.end_activity(activity_id, end_opts) + } + + #[tracing::instrument(skip(self))] + fn hold_most_recent_active_activity( + &self, + hold_opts: HoldOptions, + ) -> PaceOptResult { + self.cache.hold_most_recent_active_activity(hold_opts) + } + + #[tracing::instrument(skip(self))] + fn end_all_active_intermissions( + &self, + end_opts: EndOptions, + ) -> PaceOptResult> { + self.cache.end_all_active_intermissions(end_opts) + } + + #[tracing::instrument(skip(self))] + fn resume_activity( + &self, + activity_id: ActivityGuid, + resume_opts: ResumeOptions, + ) -> PaceResult { + self.cache.resume_activity(activity_id, resume_opts) + } + + #[tracing::instrument(skip(self))] + fn hold_activity( + &self, + activity_id: ActivityGuid, + hold_opts: HoldOptions, + ) -> PaceResult { + self.cache.hold_activity(activity_id, hold_opts) + } + + #[tracing::instrument(skip(self))] + fn resume_most_recent_activity( + &self, + resume_opts: ResumeOptions, + ) -> PaceOptResult { + self.cache.resume_most_recent_activity(resume_opts) + } +} + +impl ActivityWriteOps for TomlActivityStorage { + #[tracing::instrument(skip(self))] + fn create_activity(&self, activity: Activity) -> PaceResult { + self.cache.create_activity(activity) + } + + #[tracing::instrument(skip(self))] + fn update_activity( + &self, + activity_id: ActivityGuid, + updated_activity: Activity, + update_opts: UpdateOptions, + ) -> PaceResult { + self.cache + .update_activity(activity_id, updated_activity, update_opts) + } + + #[tracing::instrument(skip(self))] + fn delete_activity( + &self, + activity_id: ActivityGuid, + delete_opts: DeleteOptions, + ) -> PaceResult { + self.cache.delete_activity(activity_id, delete_opts) + } +} + +impl ActivityQuerying for TomlActivityStorage { + #[tracing::instrument(skip(self))] + fn list_activities_by_id(&self) -> PaceOptResult> { + self.cache.list_activities_by_id() + } + + #[tracing::instrument(skip(self))] + fn most_recent_active_activity(&self) -> PaceOptResult { + self.cache.most_recent_active_activity() + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_duration_range( + &self, + ) -> PaceOptResult>> { + self.cache.group_activities_by_duration_range() + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_start_date( + &self, + ) -> PaceOptResult>> { + self.cache.group_activities_by_start_date() + } + + #[tracing::instrument(skip(self))] + fn list_activities_with_intermissions( + &self, + ) -> PaceOptResult>> { + self.cache.list_activities_with_intermissions() + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_keywords( + &self, + keyword_opts: KeywordOptions, + ) -> PaceOptResult>> { + self.cache.group_activities_by_keywords(keyword_opts) + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_kind(&self) -> PaceOptResult>> { + self.cache.group_activities_by_kind() + } + + #[tracing::instrument(skip(self))] + fn list_activities_by_time_range( + &self, + time_range_opts: TimeRangeOptions, + ) -> PaceOptResult> { + self.cache.list_activities_by_time_range(time_range_opts) + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_status( + &self, + ) -> PaceOptResult>> { + self.cache.group_activities_by_status() + } +} diff --git a/crates/storage/src/in_memory.rs b/crates/storage/src/in_memory.rs new file mode 100644 index 00000000..5b4cafde --- /dev/null +++ b/crates/storage/src/in_memory.rs @@ -0,0 +1,1773 @@ +use std::{collections::BTreeMap, sync::Arc}; + +use pace_time::{ + date::PaceDate, + duration::{calculate_duration, PaceDurationRange}, + time_range::TimeRangeOptions, +}; +use parking_lot::RwLock; + +use merge::Merge; +use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; +use tracing::debug; + +use pace_core::prelude::{ + Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, + ActivityKindOptions, ActivityLog, ActivityLogErrorKind, ActivityQuerying, ActivityReadOps, + ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, + EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceOptResult, PaceResult, + ResumeOptions, SyncStorage, UpdateOptions, +}; + +/// Type for shared `ActivityLog` +type SharedActivityLog = Arc>; + +/// In-memory storage for activities +#[derive(Debug, Clone)] +pub struct InMemoryActivityStorage { + log: SharedActivityLog, +} + +impl From for InMemoryActivityStorage { + fn from(activities: ActivityLog) -> Self { + Self::new_with_activity_log(activities) + } +} + +impl InMemoryActivityStorage { + /// Create a new `InMemoryActivityStorage` + #[must_use] + pub fn new() -> Self { + Self { + log: Arc::new(RwLock::new(ActivityLog::default())), + } + } + + /// Creates a new `InMemoryActivityStorage` from an `ActivityLog` + /// + /// # Arguments + /// + /// * `activity_log` - The `ActivityLog` to use + /// + /// # Returns + /// + /// A new `InMemoryActivityStorage` with the given `ActivityLog` + #[must_use] + pub fn new_with_activity_log(activity_log: ActivityLog) -> Self { + Self { + log: Arc::new(RwLock::new(activity_log)), + } + } + + /// Try to convert the `InMemoryActivityStorage` into an `ActivityLog` + pub fn get_activity_log(&self) -> ActivityLog { + let activity_log = self.log.read(); + + debug!("Got activity log"); + + activity_log.clone() + } +} + +impl Default for InMemoryActivityStorage { + fn default() -> Self { + Self::new() + } +} + +impl ActivityStorage for InMemoryActivityStorage { + fn setup(&self) -> PaceResult<()> { + debug!("Setting up in-memory storage"); + Ok(()) + } + + fn teardown(&self) -> PaceResult<()> { + debug!("Tearing down in-memory storage"); + Ok(()) + } + + fn identify(&self) -> String { + "In-memory storage".to_string() + } +} + +impl SyncStorage for InMemoryActivityStorage { + fn sync(&self) -> PaceResult<()> { + debug!("Syncing in-memory storage"); + + Ok(()) + } +} + +impl ActivityReadOps for InMemoryActivityStorage { + #[tracing::instrument(skip(self))] + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + let activities = self.log.read(); + + let activity = activities + .get(&activity_id) + .cloned() + .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; + + drop(activities); + + debug!("Activity with id {:?} found: {:?}", activity_id, activity); + + Ok((activity_id, activity).into()) + } + + #[tracing::instrument(skip(self))] + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + let activity_log = self.log.read(); + + let filtered = activity_log + .par_iter() + .filter(|(_, activity)| match filter { + ActivityFilterKind::Everything => true, + ActivityFilterKind::OnlyActivities => activity.kind().is_activity(), + ActivityFilterKind::Active => activity.is_in_progress(), + ActivityFilterKind::ActiveIntermission => activity.is_active_intermission(), + ActivityFilterKind::Ended => activity.is_completed(), + ActivityFilterKind::Archived => activity.is_archived(), + ActivityFilterKind::Held => activity.is_paused(), + ActivityFilterKind::Intermission => activity.kind().is_intermission(), + ActivityFilterKind::TimeRange(time_range_opts) => { + // TODO: When adding Pomodoro support, we should also check for Pomodoro activities + time_range_opts.is_in_range(*activity.begin()) && activity.kind().is_activity() + } + }) + .map(|(activity_id, _)| activity_id) + .cloned() + .collect::>(); + + drop(activity_log); + + debug!("Filtered activities: {:?}", filtered); + + if filtered.is_empty() { + return Ok(None); + } + + match filter { + ActivityFilterKind::Everything => Ok(Some(FilteredActivities::Everything(filtered))), + ActivityFilterKind::OnlyActivities => { + Ok(Some(FilteredActivities::OnlyActivities(filtered))) + } + ActivityFilterKind::Active => Ok(Some(FilteredActivities::Active(filtered))), + ActivityFilterKind::ActiveIntermission => { + Ok(Some(FilteredActivities::ActiveIntermission(filtered))) + } + ActivityFilterKind::Archived => Ok(Some(FilteredActivities::Archived(filtered))), + ActivityFilterKind::Ended => Ok(Some(FilteredActivities::Ended(filtered))), + ActivityFilterKind::Held => Ok(Some(FilteredActivities::Held(filtered))), + ActivityFilterKind::Intermission => { + Ok(Some(FilteredActivities::Intermission(filtered))) + } + ActivityFilterKind::TimeRange(_) => Ok(Some(FilteredActivities::TimeRange(filtered))), + } + } +} + +impl ActivityWriteOps for InMemoryActivityStorage { + #[tracing::instrument(skip(self))] + fn create_activity(&self, activity: Activity) -> PaceResult { + let activities = self.log.read(); + + let activity_item = ActivityItem::from(activity); + + // Search for the activity in the list of activities to see if the ID is already in use. + // We use a ULID as the ID for the activity, so it should be unique and not collide with + // other activities. But still, let's check if the ID is already in use. If so, let's return + // an error. + // FIXME: We could essentially handle the case where the ID is already in use by creating a + // new ID and trying to insert the activity again. But for now, let's just return an error as + // it's not expected to happen. + if activities.contains_key(activity_item.guid()) { + debug!("Activity ID already in use: {:?}", activity_item.guid()); + return Err(ActivityLogErrorKind::ActivityIdAlreadyInUse(*activity_item.guid()).into()); + } + + drop(activities); + + let mut activities = self.log.write(); + + // We don't check for None here, because we know that the ID was not existing in the list of + // activities. + _ = activities + .activities_mut() + .insert(*activity_item.guid(), activity_item.activity().clone()); + + drop(activities); + + Ok(activity_item) + } + + #[tracing::instrument(skip(self))] + fn update_activity( + &self, + activity_id: ActivityGuid, + updated_activity: Activity, + update_opts: UpdateOptions, + ) -> PaceResult { + let activities = self.log.read(); + + let original_activity = activities + .get(&activity_id) + .cloned() + .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; + + debug!("Original activity: {:?}", original_activity); + + drop(activities); + + let mut activities = self.log.write(); + + let _ = activities.entry(activity_id).and_modify(|activity| { + debug!("Updating activity: {:?}", activity); + activity.merge(updated_activity); + }); + + drop(activities); + + Ok((activity_id, original_activity).into()) + } + + #[tracing::instrument(skip(self))] + fn delete_activity( + &self, + activity_id: ActivityGuid, + delete_opts: DeleteOptions, + ) -> PaceResult { + let mut activities = self.log.write(); + + let activity = activities + .remove(&activity_id) + .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; + + drop(activities); + + Ok((activity_id, activity).into()) + } +} + +impl ActivityStateManagement for InMemoryActivityStorage { + #[tracing::instrument(skip(self))] + fn end_activity( + &self, + activity_id: ActivityGuid, + end_opts: EndOptions, + ) -> PaceResult { + let activities = self.log.read(); + + let begin_time = *activities + .get(&activity_id) + .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))? + .begin(); + + drop(activities); + + let end_opts = ActivityEndOptions::new( + *end_opts.end_time(), + calculate_duration(&begin_time, end_opts.end_time())?, + ); + + debug!("End options: {:?}", end_opts); + + let mut activities = self.log.write(); + + let _ = activities + .entry(activity_id) + .and_modify(|activity| activity.end_activity(end_opts)); + + drop(activities); + + self.read_activity(activity_id) + } + + #[tracing::instrument(skip(self))] + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + let Some(most_recent) = self.most_recent_active_activity()? else { + debug!("No active activity found."); + return Ok(None); + }; + + debug!("Most recent activity: {:?}", most_recent); + + let activity = self.end_activity(*most_recent.guid(), end_opts)?; + + Ok(Some(activity)) + } + + #[tracing::instrument(skip(self))] + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + let activities = self.log.read(); + + let endable_activities = activities + .par_iter() + .filter_map(|(activity_id, activity)| { + if activity.is_completable() { + Some(*activity_id) + } else { + None + } + }) + .collect::>(); + + drop(activities); + + debug!("Endable activities: {:?}", endable_activities); + + // There are no active activities + if endable_activities.is_empty() { + debug!("No active activities found."); + return Ok(None); + } + + let ended_activities = endable_activities + .par_iter() + .map(|activity_id| -> PaceResult { + self.end_activity(*activity_id, end_opts.clone()) + }) + .collect::>>()?; + + debug!("Ended activities: {:?}", ended_activities); + + if ended_activities.len() != endable_activities.len() { + debug!("Not all activities were ended."); + + // This is weird, we should return an error about it + return Err(ActivityLogErrorKind::ActivityNotEnded.into()); + } + + Ok(Some(ended_activities)) + } + + #[tracing::instrument(skip(self))] + fn hold_most_recent_active_activity( + &self, + hold_opts: HoldOptions, + ) -> PaceOptResult { + // Get id from last activity that is not ended + let Some(active_activity) = self.most_recent_active_activity()? else { + debug!("No active activity found."); + + // There are no active activities + return Ok(None); + }; + + Some(self.hold_activity(*active_activity.guid(), hold_opts)).transpose() + } + + #[tracing::instrument(skip(self))] + fn end_all_active_intermissions( + &self, + end_opts: EndOptions, + ) -> PaceOptResult> { + let Some(active_intermissions) = self.list_active_intermissions()? else { + debug!("No active intermissions found."); + + // There are no active intermissions + return Ok(None); + }; + + let ended_intermissions = active_intermissions + .par_iter() + .map(|activity_id| -> PaceResult { + let _ = self.end_activity(*activity_id, end_opts.clone())?; + Ok(*activity_id) + }) + .collect::>>()?; + + debug!("Ended intermissions: {:?}", ended_intermissions); + + if ended_intermissions.len() != active_intermissions.len() { + debug!("Not all intermissions were ended."); + + // This is weird, we should return an error about it + return Err(ActivityLogErrorKind::ActivityNotEnded.into()); + } + + Ok(Some(ended_intermissions)) + } + + #[tracing::instrument(skip(self))] + fn resume_activity( + &self, + activity_id: ActivityGuid, + resume_opts: ResumeOptions, + ) -> PaceResult { + let resumable_activity = self.read_activity(activity_id)?; + + debug!("Resumable activity: {:?}", resumable_activity); + + // If the activity is active, return early with an error + if resumable_activity.activity().is_in_progress() { + debug!("Activity is already active."); + return Err(ActivityLogErrorKind::ActiveActivityFound(activity_id).into()); + } else if resumable_activity.activity().is_completed() { + debug!("Activity has ended."); + return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id).into()); + } else if resumable_activity.activity().is_archived() { + debug!("Activity is archived."); + return Err(ActivityLogErrorKind::ActivityAlreadyArchived(activity_id).into()); + } else if !resumable_activity.activity().is_paused() { + debug!("Activity is not held."); + return Err(ActivityLogErrorKind::NoHeldActivityFound(activity_id).into()); + }; + + // If there are active intermissions for any activity, end the intermissions + // because the user wants to resume from an intermission and time is limited, + // so you can't have multiple intermissions at once, only one at a time. + let ended_intermission_ids = self.end_all_active_intermissions(resume_opts.into())?; + + debug!("Ended intermission ids: {:?}", ended_intermission_ids); + + // Update the activity to be active again + let mut editable_activity = resumable_activity.clone(); + + let updated_activity = editable_activity + .activity_mut() + .set_status(ActivityStatusKind::InProgress) + .clone(); + + debug!("Updated activity: {:?}", updated_activity); + + let _ = self.update_activity( + *resumable_activity.guid(), + updated_activity, + UpdateOptions::default(), + )?; + + Ok(resumable_activity) + } + + #[tracing::instrument(skip(self))] + fn hold_activity( + &self, + activity_id: ActivityGuid, + hold_opts: HoldOptions, + ) -> PaceResult { + // Get ActivityItem for activity that + let active_activity = self.read_activity(activity_id)?; + + debug!("Active activity: {:?}", active_activity); + + // make sure, the activity is not already ended or archived + if !active_activity.activity().is_in_progress() { + debug!("Activity is not active."); + return Err(ActivityLogErrorKind::NoActiveActivityFound(activity_id).into()); + } else if active_activity.activity().is_completed() { + debug!("Activity has ended."); + return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id).into()); + } else if active_activity.activity().is_archived() { + debug!("Activity is archived."); + return Err(ActivityLogErrorKind::ActivityAlreadyArchived(activity_id).into()); + }; + + // Check if the latest active activity is already having an intermission + if let Some(intermissions) = + self.list_active_intermissions_for_activity_id(*active_activity.guid())? + { + debug!("Active intermissions: {:?}", intermissions); + + // TODO!: What if there are any other intermissions ongoing for other activities? + // TODO!: Should we end them as well? Or should we just end the intermission for the active activity? + + // If there are active intermissions and we want to extend return early with the active activity + // + // Handles the case, if someone wants to create an intermission for an + // activity that already has an intermission, but hasn't set that we should + // create a new intermission. In this case we don't want to create + // another intermission, but return with the active activity. + if !intermissions.is_empty() && hold_opts.action().is_extend() { + debug!("Active intermission(s) found and action is extend."); + + return Ok(active_activity); + } + }; + + // If there are active intermissions for any activity, end the intermissions + // because the user wants to create a new intermission and time is limited, + // so you can't have multiple intermissions at once, only one at a time. + let active_intermission_ids = + self.end_all_active_intermissions(hold_opts.clone().into())?; + + debug!( + "Ended active intermission ids: {:?}", + active_intermission_ids + ); + + // Create a new intermission for the active activity + let activity_kind_opts = ActivityKindOptions::with_parent_id(*active_activity.guid()); + + let description = hold_opts + .reason() + .clone() + .unwrap_or_else(|| active_activity.activity().description().clone()); + + let intermission = Activity::builder() + .begin(*hold_opts.begin_time()) + .kind(ActivityKind::Intermission) + .status(ActivityStatusKind::InProgress) + .description(description) + .category(active_activity.activity().category().clone()) + .activity_kind_options(Some(activity_kind_opts)) + .build(); + + let created_intermission_item = self.begin_activity(intermission)?; + + debug!("Created intermission: {:?}", created_intermission_item); + + // Update the active activity to be held + let mut editable_activity = active_activity.clone(); + + let updated_activity = editable_activity + .activity_mut() + .set_status(ActivityStatusKind::Paused) + .clone(); + + debug!("Updated activity: {:?}", updated_activity); + + let _ = self.update_activity( + *active_activity.guid(), + updated_activity.clone(), + UpdateOptions::default(), + )?; + + Ok((*active_activity.guid(), updated_activity).into()) + } + + #[tracing::instrument(skip(self))] + fn resume_most_recent_activity( + &self, + resume_opts: ResumeOptions, + ) -> PaceOptResult { + // Get id from last activity that is not ended + let Some(active_activity) = self.most_recent_held_activity()? else { + debug!("No held activity found."); + + // There are no active activities + return Ok(None); + }; + + // TODO!: Check how applicable that is! + // - If there are active intermissions for any activity, end the intermissions + // and resume the activity with the same id as the most recent intermission's parent_id + // - If there are no active intermissions, but there are active activities, return the last active activity + // - If there are no active intermissions, resume the activity with the given id or the last active activity + + Some(self.resume_activity(*active_activity.guid(), resume_opts)).transpose() + } +} + +impl ActivityQuerying for InMemoryActivityStorage { + #[tracing::instrument(skip(self))] + fn list_activities_by_id(&self) -> PaceOptResult> { + let activities = self.log.read(); + + let activities_by_id = activities.activities().clone(); + + drop(activities); + + debug!("Activities by id: {:?}", activities_by_id.keys()); + + if activities_by_id.is_empty() { + debug!("No activities found."); + + return Ok(None); + } + + Ok(Some(activities_by_id)) + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_duration_range( + &self, + ) -> PaceOptResult>> { + todo!("Implement grouping activities by duration range") + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_start_date( + &self, + ) -> PaceOptResult>> { + let activities = self.log.read(); + + Some(activities.activities().iter().try_fold( + BTreeMap::new(), + |mut acc: BTreeMap>, (activity_id, activity)| { + let begin_date = activity.begin().date_naive(); + + debug!("Begin date: {:?}", begin_date); + + acc.entry(begin_date) + .or_default() + .push(ActivityItem::from((*activity_id, activity.clone()))); + + Ok(acc) + }, + )) + .transpose() + } + + #[tracing::instrument(skip(self))] + fn list_activities_with_intermissions( + &self, + ) -> PaceOptResult>> { + let Some(intermissions) = self + .list_activities(ActivityFilterKind::Intermission)? + .map(FilteredActivities::into_vec) + else { + debug!("No intermissions found."); + + return Ok(None); + }; + + debug!("Intermissions: {:?}", intermissions); + + Some(intermissions.into_iter().try_fold( + BTreeMap::new(), + |mut acc: BTreeMap>, intermission_id| { + let intermission = self.read_activity(intermission_id)?; + + debug!("Intermission: {:?}", intermission); + + let parent_id = intermission + .activity() + .activity_kind_options() + .as_ref() + .ok_or(ActivityLogErrorKind::ActivityKindOptionsNotFound( + intermission_id, + ))? + .parent_id() + .ok_or(ActivityLogErrorKind::ParentIdNotSet(intermission_id))?; + + debug!("Parent id: {:?}", parent_id); + + let parent_activity = self.read_activity(parent_id)?; + + debug!("Parent activity: {:?}", parent_activity); + + acc.entry(parent_id).or_default().push(parent_activity); + + Ok(acc) + }, + )) + .transpose() + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_keywords( + &self, + keyword_opts: KeywordOptions, + ) -> PaceOptResult>> { + let activities = self.log.read(); + + Some(activities.activities().iter().try_fold( + BTreeMap::new(), + |mut acc: BTreeMap>, (activity_id, activity)| { + // Group by category + if let Some(category) = keyword_opts.category() { + let category = category.to_lowercase(); + + debug!("Category: {:?}", category); + + if activity + .category() + .as_ref() + .ok_or(ActivityLogErrorKind::CategoryNotSet(*activity_id))? + .to_lowercase() + .contains(category.as_str()) + { + acc.entry(category) + .or_default() + .push(ActivityItem::from((*activity_id, activity.clone()))); + } + } else { + // Use the existing activity category as the keyword + + debug!("No category specified. Using 'Uncategorized' as the category."); + + acc.entry( + activity + .category() + .as_ref() + .unwrap_or(&"Uncategorized".to_string()) + .to_string(), + ) + .or_default() + .push(ActivityItem::from((*activity_id, activity.clone()))); + } + + Ok(acc) + }, + )) + .transpose() + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_kind(&self) -> PaceOptResult>> { + let activities = self.log.read(); + + Some(activities.activities().iter().try_fold( + BTreeMap::new(), + |mut acc: BTreeMap>, (activity_id, activity)| { + debug!( + "Activity kind: {:?} for item {:?} with id {:?}", + activity.kind(), + activity, + activity_id + ); + + acc.entry(*activity.kind()) + .or_default() + .push(ActivityItem::from((*activity_id, activity.clone()))); + + Ok(acc) + }, + )) + .transpose() + } + + #[tracing::instrument(skip(self))] + fn group_activities_by_status( + &self, + ) -> PaceOptResult>> { + let activities = self.log.read(); + + Some(activities.activities().iter().try_fold( + BTreeMap::new(), + |mut acc: BTreeMap>, (activity_id, activity)| { + debug!( + "Activity status: {:?} for item {:?} with id {:?}", + activity.status(), + activity, + activity_id + ); + + acc.entry(*activity.status()) + .or_default() + .push(ActivityItem::from((*activity_id, activity.clone()))); + + Ok(acc) + }, + )) + .transpose() + } + + #[tracing::instrument(skip(self))] + fn list_activities_by_time_range( + &self, + time_range_opts: TimeRangeOptions, + ) -> PaceOptResult> { + let Some(filtered_activities) = self + .list_activities(ActivityFilterKind::TimeRange(time_range_opts))? + .map(FilteredActivities::into_vec) + else { + debug!( + "No activities found in time range between {} and {}.", + time_range_opts.start(), + time_range_opts.end() + ); + + return Ok(None); + }; + + if filtered_activities.is_empty() { + debug!( + "No activities found in time range between {} and {}.", + time_range_opts.start(), + time_range_opts.end() + ); + + return Ok(None); + } + + Ok(Some(filtered_activities)) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + use chrono::Local; + use pace_core::prelude::TestResult; + use pace_time::date_time::PaceDateTime; + use std::collections::HashSet; + + #[test] + fn test_in_memory_activity_storage_passes() { + let storage = InMemoryActivityStorage::new(); + + assert_eq!( + storage.get_activity_log().activities().len(), + 0, + "Activity log is not empty." + ); + } + + #[test] + fn test_in_memory_activity_storage_from_activity_log_passes() { + let activity_log = ActivityLog::default(); + let storage = InMemoryActivityStorage::from(activity_log); + + assert_eq!( + storage.get_activity_log().activities().len(), + 0, + "Activity log is not empty." + ); + } + + #[test] + fn test_create_read_activity_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + + let begin = Local::now().fixed_offset(); + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let item = storage.create_activity(activity.clone())?; + + assert_eq!( + storage.get_activity_log().activities().len(), + 1, + "Activity was not created." + ); + + let stored_activity = storage.read_activity(*item.guid())?; + + assert_eq!( + activity, + *stored_activity.activity(), + "Stored activity is not the same as the original activity." + ); + + Ok(()) + } + + #[test] + fn test_list_activities_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + + let begin = Local::now().fixed_offset(); + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let _activity_item = storage.create_activity(activity.clone())?; + + let filtered_activities = storage + .list_activities(ActivityFilterKind::Everything)? + .ok_or("No activities found.")? + .into_vec(); + + assert_eq!( + filtered_activities.len(), + 1, + "Amount of activities is not the same as the amount of created activities." + ); + + let stored_activity = storage.read_activity(filtered_activities[0])?; + + assert_eq!( + activity, + *stored_activity.activity(), + "Filtered activities are not the same as the original activity." + ); + + Ok(()) + } + + #[test] + fn test_update_activity_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + + let begin = Local::now().fixed_offset(); + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let og_activity = Activity::builder() + .begin(begin) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let activity_item = storage.create_activity(og_activity.clone())?; + + let read_activity = storage.read_activity(*activity_item.guid())?; + + assert_eq!( + og_activity, + *read_activity.activity(), + "Stored activity is not the same as the original activity." + ); + + let new_description = "Updated description"; + + let tags = vec!["bla".to_string(), "test".to_string()] + .into_iter() + .collect::>(); + + let new_begin = PaceDateTime::from( + begin + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?, + ); + + let updated_activity = Activity::builder() + .begin(new_begin) + .kind(ActivityKind::PomodoroWork) + .status(ActivityStatusKind::InProgress) + .description(new_description) + .tags(tags.clone()) + .build(); + + let old_activity = storage.update_activity( + *activity_item.guid(), + updated_activity, + UpdateOptions::default(), + )?; + + assert_eq!( + og_activity, + *old_activity.activity(), + "Stored activity is not the same as the original activity." + ); + + let new_stored_activity = storage.read_activity(*activity_item.guid())?; + + assert_eq!( + old_activity.guid(), + new_stored_activity.guid(), + "ID was updated, but shouldn't." + ); + + assert_eq!( + new_stored_activity.activity().description(), + new_description, + "Description was not updated." + ); + + assert_eq!( + *new_stored_activity.activity().tags(), + Some(tags), + "Tags were not updated, but should." + ); + + assert_eq!( + old_activity.activity().kind(), + new_stored_activity.activity().kind(), + "Kind was updated, but shouldn't." + ); + + assert_eq!( + &new_begin, + new_stored_activity.activity().begin(), + "Begin time was not updated, but should." + ); + + assert!( + new_stored_activity.activity().is_in_progress(), + "Activity should be active now, but was not updated." + ); + + Ok(()) + } + + #[test] + fn test_crud_activity_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + + // Create activity + let begin = Local::now().fixed_offset(); + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let mut activity = Activity::builder() + .begin(begin) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + assert_eq!( + storage.get_activity_log().activities().len(), + 0, + "Activity log is not empty." + ); + + let activity_item = storage.begin_activity(activity.clone())?; + + assert_eq!( + storage.get_activity_log().activities().len(), + 1, + "Activity was not created." + ); + + // Read activity + let stored_activity = storage.read_activity(*activity_item.guid())?; + + // Make sure the activity is active now, as begin_activity should make it active automatically + activity.make_active(); + + assert_eq!( + activity, + *stored_activity.activity(), + "Stored activity is not the same as the original activity." + ); + + assert_eq!( + *stored_activity.activity().status(), + ActivityStatusKind::InProgress, + "Activity is not active." + ); + + // Update activity + let new_description = "Updated description"; + + let tags = vec!["bla".to_string(), "test".to_string()] + .into_iter() + .collect::>(); + + let new_begin = PaceDateTime::from( + begin + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?, + ); + + let updated_activity = Activity::builder() + .begin(new_begin) + .kind(ActivityKind::PomodoroWork) + .status(ActivityStatusKind::Created) + .description(new_description) + .tags(tags.clone()) + .build(); + + let _ = storage.update_activity( + *activity_item.guid(), + updated_activity, + UpdateOptions::default(), + )?; + + let new_stored_activity = storage.read_activity(*activity_item.guid())?; + + assert_eq!( + new_stored_activity.activity().description(), + new_description, + "Description was not updated." + ); + + assert_eq!( + stored_activity.activity().kind(), + new_stored_activity.activity().kind(), + "Kind was updated, but shouldn't." + ); + + assert_eq!( + Some(tags), + *new_stored_activity.activity().tags(), + "Tags were not updated, but should." + ); + + assert_eq!( + &new_begin, + new_stored_activity.activity().begin(), + "Begin time was not updated, but should." + ); + + assert!( + new_stored_activity.activity().is_inactive(), + "Activity should be active now, but was not updated." + ); + + // Delete activity + let deleted_activity = + storage.delete_activity(*activity_item.guid(), DeleteOptions::default())?; + + assert_eq!( + storage.get_activity_log().activities().len(), + 0, + "Activity was not deleted." + ); + + assert_eq!( + deleted_activity, new_stored_activity, + "Deleted activity is not the same as the updated activity." + ); + + // Try to read the deleted activity + + let read_deleted_activity_result = storage.read_activity(*activity_item.guid()); + + assert!( + read_deleted_activity_result.is_err(), + "Deleted activity was read." + ); + + Ok(()) + } + + #[test] + fn test_end_single_activity_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let end_time = now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let activity_item = storage.begin_activity(activity.clone())?; + + let end_opts = EndOptions::builder().end_time(end_time).build(); + + let ended_activity = storage.end_activity(*activity_item.guid(), end_opts)?; + + assert_ne!( + activity_item, ended_activity, + "Activities do match, although they should be different." + ); + + assert!(ended_activity.activity().activity_end_options().is_some()); + + let ended_activity = storage.read_activity(*activity_item.guid())?; + + assert!( + ended_activity.activity().is_completed(), + "Activity has not ended, but should have." + ); + + assert_eq!( + activity.tags().as_ref().ok_or("Tags not set.")?, + ended_activity + .activity() + .tags() + .as_ref() + .ok_or("Tags not set.")?, + "Tags were updated, but shouldn't." + ); + + assert_eq!( + ended_activity + .activity() + .activity_end_options() + .as_ref() + .ok_or("End options not set.")? + .end(), + &PaceDateTime::from(end_time), + "End time was not set." + ); + + Ok(()) + } + + #[test] + fn test_end_last_unfinished_activity_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let activity_item = storage.begin_activity(activity.clone())?; + + let ended_activity = storage + .end_last_unfinished_activity(EndOptions::builder().end_time(now).build())? + .ok_or("Activity was not ended.")?; + + assert_eq!( + ended_activity.guid(), + activity_item.guid(), + "Activity IDs do not match." + ); + + assert!( + ended_activity.activity().is_completed(), + "Activity has not ended, but should have." + ); + + assert_eq!( + activity.tags().as_ref().ok_or("Tags not set.")?, + ended_activity + .activity() + .tags() + .as_ref() + .ok_or("Tags not set.")?, + "Tags were updated, but shouldn't." + ); + + assert_eq!( + ended_activity + .activity() + .activity_end_options() + .as_ref() + .ok_or("End options not set.")? + .end(), + &PaceDateTime::from(now), + "End time was not set." + ); + + Ok(()) + } + + #[test] + fn test_begin_and_auto_end_for_multiple_activities_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .tags(tags.clone()) + .build(); + + // Begin the first activity + let activity_item = storage.begin_activity(activity)?; + + let begin_time = now - chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?; + let kind = ActivityKind::Activity; + let description = "Test activity 2"; + + let activity2 = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + // Begin the second activity, the first one should be ended automatically now + let activity_item2 = storage.begin_activity(activity2)?; + + let ended_activity = storage.read_activity(*activity_item.guid())?; + + assert!( + ended_activity.activity().is_completed(), + "Activity has not ended, but should have." + ); + + assert_eq!( + ended_activity + .activity() + .activity_end_options() + .as_ref() + .ok_or("End options not set.")? + .end(), + &PaceDateTime::from(now), + "End time was not set." + ); + + let ended_activity2 = storage.read_activity(*activity_item2.guid())?; + + assert!( + ended_activity2.activity().is_in_progress(), + "Activity has not ended, but should have." + ); + + assert!( + ended_activity2.activity().activity_end_options().is_none(), + "End time should not be set." + ); + + Ok(()) + } + + #[test] + fn test_hold_most_recent_active_activity_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let activity_item = storage.begin_activity(activity.clone())?; + + let hold_time = now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; + + let hold_opts = HoldOptions::builder().begin_time(hold_time).build(); + + let held_activity = storage + .hold_most_recent_active_activity(hold_opts)? + .ok_or("Activity was not held.")?; + + assert_eq!( + held_activity.guid(), + activity_item.guid(), + "Activity IDs do not match." + ); + + assert_eq!( + activity.tags().as_ref().ok_or("Tags not set.")?, + held_activity + .activity() + .tags() + .as_ref() + .ok_or("Tags not set.")?, + "Tags were updated, but shouldn't." + ); + + let intermission_guids = storage + .list_active_intermissions_for_activity_id(*activity_item.guid())? + .ok_or("Intermission was not created.")?; + + assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); + + let intermission_item = storage.read_activity(intermission_guids[0])?; + + assert_eq!( + *intermission_item.activity().kind(), + ActivityKind::Intermission, + "Intermission was not created." + ); + + assert_eq!( + intermission_item + .activity() + .activity_kind_options() + .as_ref() + .ok_or("Activity kind options not set.")? + .parent_id() + .ok_or("Parent ID not set.")?, + *activity_item.guid(), + "Parent ID is not set." + ); + + Ok(()) + } + + #[test] + fn test_hold_last_unfinished_activity_with_existing_intermission_does_nothing_passes( + ) -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + let tags = vec!["test".to_string(), "activity".to_string()] + .into_iter() + .collect::>(); + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .tags(tags) + .build(); + + let active_activity_item = storage.begin_activity(activity)?; + + let hold_opts = HoldOptions::builder() + .begin_time(now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?) + .build(); + + let _held_item = storage + .hold_most_recent_active_activity(hold_opts)? + .ok_or("Activity was not held.")?; + + let held_activity = storage.read_activity(*active_activity_item.guid())?; + + assert_eq!( + *held_activity.activity().status(), + ActivityStatusKind::Paused, + "Activity was not held." + ); + + let intermission_guids = storage + .list_active_intermissions_for_activity_id(*active_activity_item.guid())? + .ok_or("Intermission was not created.")?; + + assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); + + let hold_opts = HoldOptions::builder() + .begin_time(now + chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?) + .build(); + + assert!( + storage + .hold_most_recent_active_activity(hold_opts)? + .is_none(), + "Activity was held again." + ); + + let intermission_guids = storage + .list_active_intermissions_for_activity_id(*active_activity_item.guid())? + .ok_or("Intermission was not created.")?; + + assert_eq!( + intermission_guids.len(), + 1, + "Intermission was created again." + ); + + let intermission_item = storage.read_activity(intermission_guids[0])?; + + assert_eq!( + *intermission_item.activity().kind(), + ActivityKind::Intermission, + "Intermission was not created." + ); + + assert!( + intermission_item.activity().tags().is_none(), + "Intermission has tags, but shouldn't." + ); + + Ok(()) + } + + #[test] + fn test_end_all_active_intermissions_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; + let end_time = now + chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .build(); + + let active_activity_item = storage.begin_activity(activity)?; + + let hold_opts = HoldOptions::builder() + .begin_time(now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?) + .build(); + + let _ = storage.hold_most_recent_active_activity(hold_opts)?; + + let intermission_guids = storage + .list_active_intermissions_for_activity_id(*active_activity_item.guid())? + .ok_or("Intermission was not created.")?; + + assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); + + let end_opts = EndOptions::builder().end_time(end_time).build(); + + let ended_intermissions = storage + .end_all_active_intermissions(end_opts)? + .ok_or("Intermissions were not ended.")?; + + assert_eq!( + ended_intermissions.len(), + 1, + "Not all intermissions were ended." + ); + + let ended_intermission = storage.read_activity(intermission_guids[0])?; + + assert!( + ended_intermission.activity().is_completed(), + "Intermission has not ended, but should have." + ); + + assert_eq!( + ended_intermission + .activity() + .activity_end_options() + .as_ref() + .ok_or("End options not set.")? + .end(), + &PaceDateTime::from(end_time), + "End time was not set." + ); + + Ok(()) + } + + #[test] + fn test_group_activities_by_keywords_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .category("Project::Test".to_string()) + .build(); + + let activity_item = storage.begin_activity(activity)?; + + let keyword_opts = KeywordOptions::builder().category("Test").build(); + + let grouped_activities = storage.group_activities_by_keywords(keyword_opts)?.ok_or( + "Grouped activities by keywords returned None, but should have returned Some.", + )?; + + assert_eq!( + grouped_activities.len(), + 1, + "Grouped activities do not match the amount of created activities." + ); + + let grouped_activity = grouped_activities + .values() + .next() + .ok_or("Grouped activities are empty.")? + .first() + .ok_or("Grouped activities are empty.")? + .clone(); + + assert_eq!( + *grouped_activity.guid(), + *activity_item.guid(), + "Grouped activity is not the same as the original activity." + ); + + Ok(()) + } + + #[test] + fn test_group_activities_by_kind_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .build(); + + let activity_item = storage.begin_activity(activity)?; + + let grouped_activities = storage + .group_activities_by_kind()? + .ok_or("Grouped activities by kind returned None, but should have returned Some.")?; + + assert_eq!( + grouped_activities.len(), + 1, + "Grouped activities do not match the amount of created activities." + ); + + let grouped_activity = grouped_activities + .values() + .next() + .ok_or("Grouped activities are empty.")? + .first() + .ok_or("Grouped activities are empty.")? + .clone(); + + assert_eq!( + *grouped_activity.guid(), + *activity_item.guid(), + "Grouped activity is not the same as the original activity." + ); + + assert_eq!( + *grouped_activity.activity().kind(), + kind, + "Grouped activity kind is not the same as the original activity kind." + ); + + assert_eq!( + *grouped_activity.activity().description(), + description, + "Grouped activity description is not the same as the original activity description." + ); + + Ok(()) + } + + #[test] + fn test_group_activities_by_status_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .build(); + + let activity_item = storage.begin_activity(activity)?; + + let grouped_activities = storage + .group_activities_by_status()? + .ok_or("Grouped activities by status returned None, but should have returned Some.")?; + + assert_eq!( + grouped_activities.len(), + 1, + "Grouped activities do not match the amount of created activities." + ); + + let grouped_activity = grouped_activities + .values() + .next() + .ok_or("Grouped activities are empty.")? + .first() + .ok_or("Grouped activities are empty.")? + .clone(); + + assert_eq!( + *grouped_activity.guid(), + *activity_item.guid(), + "Grouped activity is not the same as the original activity." + ); + + assert_eq!( + *grouped_activity.activity().status(), + ActivityStatusKind::InProgress, + "Grouped activity status is not the same as the original activity status." + ); + + assert_eq!( + *grouped_activity.activity().kind(), + kind, + "Grouped activity kind is not the same as the original activity kind." + ); + + assert_eq!( + *grouped_activity.activity().description(), + description, + "Grouped activity description is not the same as the original activity description." + ); + + Ok(()) + } + + #[test] + fn test_group_activities_by_start_date_passes() -> TestResult<()> { + let storage = InMemoryActivityStorage::new(); + let now = Local::now().fixed_offset(); + let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; + let kind = ActivityKind::Activity; + let description = "Test activity"; + + let activity = Activity::builder() + .begin(begin_time) + .kind(kind) + .description(description) + .build(); + + let activity_item = storage.begin_activity(activity)?; + + let grouped_activities = storage.group_activities_by_start_date()?.ok_or( + "Grouped activities by start date returned None, but should have returned Some.", + )?; + + assert_eq!( + grouped_activities.len(), + 1, + "Grouped activities do not match the amount of created activities." + ); + + let grouped_activity = grouped_activities + .values() + .next() + .ok_or("Grouped activities are empty?")? + .first() + .ok_or("Grouped activities are empty?")? + .clone(); + + assert_eq!( + *grouped_activity.guid(), + *activity_item.guid(), + "Grouped activity is not the same as the original activity." + ); + + assert_eq!( + grouped_activity.activity().begin().date_naive(), + PaceDate::new(begin_time.date_naive()), + "Grouped activity date is not the same as the original activity date." + ); + + assert_eq!( + *grouped_activity.activity().kind(), + kind, + "Grouped activity kind is not the same as the original activity kind." + ); + + assert_eq!( + *grouped_activity.activity().description(), + description, + "Grouped activity description is not the same as the original activity description." + ); + + Ok(()) + } + + // TODO!: Implement the following tests + // #[test] + // fn test_group_multiple_activities_by_status_passes() { + // } + + // #[test] + // fn test_group_multiple_activities_by_kind_passes() { + // } + + // #[test] + // fn test_group_multiple_activities_by_keywords_passes() { + // } +} diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs new file mode 100644 index 00000000..af19872d --- /dev/null +++ b/crates/storage/src/lib.rs @@ -0,0 +1,82 @@ +use std::sync::Arc; + +use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; +use tracing::debug; + +use crate::{ + error::{DatabaseStorageErrorKind, PaceStorageErrorKind, PaceStorageResult}, + file::TomlActivityStorage, + in_memory::InMemoryActivityStorage, + sqlite::SqliteActivityStorage, +}; + +pub mod error; + +/// A type of storage that can be synced to a persistent medium - a file +pub mod file; + +/// An in-memory storage backend for activities. +pub mod in_memory; + +#[cfg(feature = "rusqlite")] +pub mod sqlite; + +/// Get the storage backend from the configuration. +/// +/// # Arguments +/// +/// * `config` - The application configuration. +/// +/// # Errors +/// +/// This function should return an error if the storage backend cannot be created or is not supported. +/// +/// # Returns +/// +/// The storage backend. +pub fn get_storage_from_config(config: &PaceConfig) -> PaceStorageResult> { + let storage: dyn ActivityStorage = match config.general().activity_log_options().storage_kind() + { + ActivityLogStorageKind::File => { + TomlActivityStorage::new(config.general().activity_log_options().path())?.into() + } + ActivityLogStorageKind::Database => { + if config.database().is_some() { + let Some(db_config) = config.database() else { + return Err(DatabaseStorageErrorKind::NoConfigSettings.into()); + }; + + match db_config.engine() { + DatabaseEngineKind::Sqlite => { + #[cfg(feature = "rusqlite")] + { + let connection_string = config + .database() + .as_ref() + .ok_or(DatabaseStorageErrorKind::NoConnectionString)? + .connection_string(); + + debug!("Connecting to database: {}", &connection_string); + + SqliteActivityStorage::new(connection_string.clone())?.into() + } + #[cfg(not(feature = "rusqlite"))] + return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); + } + engine => { + return Err( + DatabaseStorageErrorKind::UnsupportedDatabaseEngine(*engine).into() + ) + } + } + } + + return Err(PaceStorageErrorKind::DatabaseStorageNotConfigured.into()); + } + ActivityLogStorageKind::InMemory => InMemoryActivityStorage::new().into(), + }; + + debug!("Using storage backend: {}", storage); + + Ok(Arc::new(storage)) +} diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/sqlite.rs new file mode 100644 index 00000000..5805351f --- /dev/null +++ b/crates/storage/src/sqlite.rs @@ -0,0 +1,472 @@ +use std::collections::BTreeMap; + +use itertools::Itertools; +use rusqlite::Connection; + +use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; +use tracing::debug; + +use pace_core::prelude::{ + Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityQuerying, + ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, + ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, + PaceOptResult, PaceResult, ResumeOptions, SyncStorage, UpdateOptions, +}; + +use crate::error::{DatabaseStorageErrorKind, PaceStorageResult}; + +pub trait FromRow { + fn from_row(row: &rusqlite::Row<'_>) -> PaceStorageResult + where + Self: Sized; +} + +#[derive(Debug)] +pub struct SqliteActivityStorage { + connection: Connection, +} + +impl SqliteActivityStorage { + pub fn new(connection_string: String) -> PaceStorageResult { + let connection = Connection::open(connection_string.as_str()).map_err(|err| { + DatabaseStorageErrorKind::ConnectionFailed(connection_string, err.to_string()) + })?; + + Ok(Self { connection }) + } +} + +impl ActivityStorage for SqliteActivityStorage { + fn setup(&self) -> PaceResult<()> { + // we embed `db/schema.sql` and run it against the database + // as a setup step + let schema = include_str!("../../../db/schema.sql"); + + self.connection.execute_batch(schema)?; + + Ok(()) + } + + fn teardown(&self) -> PaceResult<()> { + Ok(()) + } + + fn identify(&self) -> String { + "sqlite".to_string() + } +} + +impl SyncStorage for SqliteActivityStorage { + fn sync(&self) -> PaceResult<()> { + // We sync activities to the database in each operation + // so we don't need to do anything here + + Ok(()) + } +} + +impl ActivityReadOps for SqliteActivityStorage { + #[tracing::instrument] + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + let mut stmt = self + .connection + .prepare("SELECT * FROM activities WHERE id = ?1")?; + + let activity_item_iter = + stmt.query_map(&[&activity_id], |row| Ok(ActivityItem::from_row(&row)))?; + + let activity_item = activity_item_iter + .filter_map_ok(|item| item.ok()) + .next() + .transpose()? + .ok_or(DatabaseStorageErrorKind::ActivityNotFound(activity_id))?; + + debug!("Read activity: {:?}", activity_item); + + Ok(activity_item) + } + + #[tracing::instrument] + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + let mut stmt = self.connection.prepare(filter.to_sql_statement())?; + + let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; + + let activities = activity_item_iter + .filter_map_ok(|item| item.ok()) + .collect::, _>>()?; + + debug!("Listed activities: {:?}", activities); + + if activities.is_empty() { + return Ok(None); + } + + let filtered_activities = match filter { + ActivityFilterKind::Everything => FilteredActivities::Everything(activities), + ActivityFilterKind::OnlyActivities => FilteredActivities::OnlyActivities(activities), + ActivityFilterKind::Active => FilteredActivities::Active(activities), + ActivityFilterKind::ActiveIntermission => { + FilteredActivities::ActiveIntermission(activities) + } + ActivityFilterKind::Archived => FilteredActivities::Archived(activities), + ActivityFilterKind::Ended => FilteredActivities::Ended(activities), + ActivityFilterKind::Held => FilteredActivities::Held(activities), + ActivityFilterKind::Intermission => FilteredActivities::Intermission(activities), + ActivityFilterKind::TimeRange(_) => FilteredActivities::TimeRange(activities), + }; + + Ok(Some(filtered_activities)) + } +} + +impl ActivityWriteOps for SqliteActivityStorage { + fn create_activity(&self, activity: Activity) -> PaceResult { + let tx = self.connection.transaction()?; + + let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; + + let (guid, params) = activity.to_sql_execute_statement()?; + + if stmt.execute(params.as_slice())? > 0 { + tx.commit()?; + return Ok(ActivityItem::from((guid, activity))); + } + + return Err(DatabaseStorageErrorKind::ActivityCreationFailed(activity).into()); + } + + fn update_activity( + &self, + activity_id: ActivityGuid, + updated_activity: Activity, + update_opts: UpdateOptions, + ) -> PaceResult { + todo!() + } + + fn delete_activity( + &self, + activity_id: ActivityGuid, + delete_opts: DeleteOptions, + ) -> PaceResult { + let activity = self.read_activity(activity_id)?; + + let tx = self.connection.transaction()?; + let mut stmt = tx.prepare("DELETE FROM activities WHERE id = ?1 LIMIT = 1")?; + + if stmt.execute(&[&activity_id])? == 1 { + tx.commit()?; + return Ok(activity); + } + + Err(DatabaseStorageErrorKind::ActivityDeletionFailed(activity_id).into()) + } +} +impl ActivityStateManagement for SqliteActivityStorage { + fn hold_activity( + &self, + activity_id: ActivityGuid, + hold_opts: HoldOptions, + ) -> PaceResult { + todo!() + } + + fn resume_activity( + &self, + activity_id: ActivityGuid, + resume_opts: ResumeOptions, + ) -> PaceResult { + todo!() + } + + fn resume_most_recent_activity( + &self, + resume_opts: ResumeOptions, + ) -> PaceOptResult { + todo!() + } + + fn end_activity( + &self, + activity_id: ActivityGuid, + end_opts: EndOptions, + ) -> PaceResult { + todo!() + } + + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + todo!() + } + + fn end_all_active_intermissions( + &self, + end_opts: EndOptions, + ) -> PaceOptResult> { + todo!() + } + + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + todo!() + } + + fn hold_most_recent_active_activity( + &self, + hold_opts: HoldOptions, + ) -> PaceOptResult { + todo!() + } +} +impl ActivityQuerying for SqliteActivityStorage { + fn group_activities_by_duration_range( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn group_activities_by_start_date( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn list_activities_with_intermissions( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn group_activities_by_keywords( + &self, + keyword_opts: KeywordOptions, + ) -> PaceOptResult>> { + todo!() + } + + fn group_activities_by_kind(&self) -> PaceOptResult>> { + todo!() + } + + fn list_activities_by_time_range( + &self, + time_range_opts: TimeRangeOptions, + ) -> PaceOptResult> { + todo!() + } + + fn group_activities_by_status( + &self, + ) -> PaceOptResult>> { + todo!() + } + + fn list_activities_by_id(&self) -> PaceOptResult> { + todo!() + } +} + +pub mod sql_conversion { + use std::{collections::HashSet, str::FromStr}; + + use pace_time::date_time::PaceDateTime; + use rusqlite::{types::FromSql, Row, ToSql}; + use ulid::Ulid; + + // use pace_time::rusqlite::*; + + use pace_core::prelude::{ + Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, + ActivityKindOptions, ActivityStatusKind, PaceResult, + }; + + use super::FromRow; + + impl Activity { + pub fn to_sql_prepare_statement(&self) -> &'static str { + "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" + } + + pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { + let category = if let Some(category) = self.category() { + category.to_sql()? + } else { + "NULL".to_sql()? + }; + + let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { + let (end, duration) = end_opts.as_tuple(); + (end.to_sql()?, duration.to_sql()?) + } else { + ("NULL".to_sql()?, "NULL".to_sql()?) + }; + + let parent_id = if let Some(parent_id) = self.parent_id() { + parent_id.to_sql()? + } else { + "NULL".to_sql()? + }; + + let tags = if let Some(tags) = self.tags() { + let tags = tags + .iter() + .map(|tag| tag.to_string()) + .collect::>(); + + tags.join(",").to_sql()? + } else { + "NULL".to_sql()? + }; + + let guid = ActivityGuid::new(); + + Ok(( + guid, + vec![ + // TODO: We create a new ID here, that should probably happen + // TODO: somewhere else and needs a refactoring + &guid, + &category, + &self.description(), + &self.begin(), + &end, + &duration, + &self.kind(), + &self.status(), + &tags, + &parent_id, + ], + )) + } + } + + impl ActivityFilterKind { + pub fn to_sql_statement(&self) -> &'static str { + match self { + Self::Everything => "SELECT * FROM activities", + ActivityFilterKind::OnlyActivities => todo!(), + ActivityFilterKind::Active => { + "SELECT * FROM activities WHERE status = 'in-progress'" + } + ActivityFilterKind::ActiveIntermission => todo!(), + ActivityFilterKind::Archived => { + "SELECT * FROM activities WHERE status = 'archived'" + } + ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", + ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", + ActivityFilterKind::Intermission => todo!(), + ActivityFilterKind::TimeRange(opts) => todo!(), + } + } + } + + impl FromRow for ActivityEndOptions { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(Self::new(row.get("end")?, row.get("duration")?)) + } + } + + impl FromRow for ActivityKindOptions { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(Self::with_parent_id(row.get("parent_id")?)) + } + } + + impl FromRow for Activity { + fn from_row(row: &Row<'_>) -> PaceResult { + let begin_time: PaceDateTime = row.get("begin")?; + + let description: String = row.get("description")?; + + let tags_string: String = row.get("tags")?; + + let tags = tags_string + .split(',') + .map(|tag| tag.to_string()) + .collect::>(); + + Ok(Activity::builder() + .category(Some(row.get("category")?)) // TODO: Check for None + .description(description) + .begin(begin_time) + .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None + .kind(row.get("kind")?) + .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None + .tags(tags) + .status(row.get("status")?) + .build()) + } + } + + impl FromRow for ActivityGuid { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(row.get("guid")?) + } + } + + impl FromRow for ActivityItem { + fn from_row(row: &Row<'_>) -> PaceResult { + let activity_end_opts = ActivityEndOptions::from_row(row)?; + + let activity_kind_opts = ActivityKindOptions::from_row(row)?; + + let activity = Activity::from_row(row)?; + + let guid = ActivityGuid::from_row(row)?; + + Ok(Self::builder().guid(guid).activity(activity).build()) + } + } + + impl ToSql for ActivityGuid { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } + } + + impl FromSql for ActivityGuid { + fn column_result( + value: rusqlite::types::ValueRef<'_>, + ) -> rusqlite::types::FromSqlResult { + Ok(ActivityGuid::with_id( + Ulid::from_string(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, + )) + } + } + + impl ToSql for ActivityKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } + } + + impl FromSql for ActivityKind { + fn column_result( + value: rusqlite::types::ValueRef<'_>, + ) -> rusqlite::types::FromSqlResult { + Ok(ActivityKind::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) + } + } + + impl ToSql for ActivityStatusKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } + } + + impl FromSql for ActivityStatusKind { + fn column_result( + value: rusqlite::types::ValueRef<'_>, + ) -> rusqlite::types::FromSqlResult { + Ok(ActivityStatusKind::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) + } + } +} From f9ee382185c59f20f579a605aaa48d98a85bf20c Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 26 Mar 2024 15:40:20 +0100 Subject: [PATCH 13/59] style: fmt Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- tests/journey/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/journey/main.rs b/tests/journey/main.rs index 5dc606e5..ac8dea14 100644 --- a/tests/journey/main.rs +++ b/tests/journey/main.rs @@ -1,6 +1,6 @@ +mod cli; mod hold_resume; mod start_finish_different_time_zone; -mod cli; // DEBUGGING: To make life easier, you can import SimpleLogger from simplelog crate // From 3a7d995c81c31c149fb1ad9e4fda3d443915b694 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:43:26 +0100 Subject: [PATCH 14/59] refactoring storage Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 1 + crates/core/Cargo.toml | 1 + crates/core/src/commands/adjust.rs | 14 +- crates/core/src/commands/begin.rs | 11 +- crates/core/src/commands/end.rs | 12 +- crates/core/src/commands/hold.rs | 23 +- crates/core/src/commands/now.rs | 41 +-- crates/core/src/commands/reflect.rs | 10 +- crates/core/src/config.rs | 1 - crates/core/src/error.rs | 43 ++-- crates/core/src/lib.rs | 4 +- crates/core/src/service/activity_store.rs | 66 ++--- crates/core/src/service/activity_tracker.rs | 4 +- crates/core/src/storage.rs | 88 ++++--- crates/storage/Cargo.toml | 1 + crates/storage/src/error.rs | 14 +- crates/storage/src/file.rs | 67 ++--- crates/storage/src/in_memory.rs | 68 ++--- crates/storage/src/lib.rs | 91 ++++--- crates/storage/src/sqlite.rs | 266 +++----------------- crates/storage/src/storage_types.rs | 240 ++++++++++++++++++ 21 files changed, 594 insertions(+), 472 deletions(-) create mode 100644 crates/storage/src/storage_types.rs diff --git a/Cargo.lock b/Cargo.lock index a041b51f..822606c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1336,6 +1336,7 @@ version = "0.1.0" dependencies = [ "chrono", "displaydoc", + "eyre", "itertools", "libsqlite3-sys", "merge", diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 773b9221..74733e87 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -31,6 +31,7 @@ clap = { workspace = true, optional = true, features = ["env", "wrap_help", "der directories = { workspace = true } displaydoc = { workspace = true } dotenvy = { workspace = true } +eyre = { workspace = true } getset = { workspace = true } itertools = { workspace = true } merge = { workspace = true } diff --git a/crates/core/src/commands/adjust.rs b/crates/core/src/commands/adjust.rs index 0c1149b8..60e68c53 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/core/src/commands/adjust.rs @@ -13,7 +13,7 @@ use crate::{ commands::UpdateOptions, config::PaceConfig, error::{ActivityLogErrorKind, PaceResult, UserMessage}, - prelude::ActivityStorage, + prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, storage::{ActivityQuerying, ActivityWriteOps, SyncStorage}, }; @@ -165,10 +165,12 @@ impl AdjustCommandOptions { debug!("Parsed time: {date_time:?}"); - let activity_store = ActivityStore::with_storage(storage)?; + let activity_store = + ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; let activity_item = activity_store - .most_recent_active_activity()? + .most_recent_active_activity() + .map_err(PaceErrorKind::Storage)? .ok_or_else(|| ActivityLogErrorKind::NoActiveActivityToAdjust)?; debug!("Most recent active activity item: {:?}", activity_item); @@ -212,10 +214,12 @@ impl AdjustCommandOptions { } } - _ = activity_store.update_activity(guid, activity.clone(), UpdateOptions::default())?; + _ = activity_store + .update_activity(guid, activity.clone(), UpdateOptions::default()) + .map_err(PaceErrorKind::Storage)?; if activity_item.activity() != &activity { - activity_store.sync()?; + activity_store.sync().map_err(PaceErrorKind::Storage)?; return Ok(UserMessage::new(format!( "{} has been adjusted.", activity_item.activity() diff --git a/crates/core/src/commands/begin.rs b/crates/core/src/commands/begin.rs index ff235469..86181d0a 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/core/src/commands/begin.rs @@ -12,7 +12,7 @@ use crate::{ config::PaceConfig, domain::activity::{Activity, ActivityKind}, error::{PaceResult, UserMessage}, - prelude::ActivityStorage, + prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, storage::{ActivityStateManagement, SyncStorage}, }; @@ -144,13 +144,16 @@ impl BeginCommandOptions { .tags(tags) .build(); - let activity_store = ActivityStore::with_storage(storage)?; + let activity_store = + ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; - let activity_item = activity_store.begin_activity(activity)?; + let activity_item = activity_store + .begin_activity(activity) + .map_err(PaceErrorKind::Storage)?; debug!("Started Activity: {:?}", activity_item); - activity_store.sync()?; + activity_store.sync().map_err(PaceErrorKind::Storage)?; Ok(UserMessage::new(format!("{}", activity_item.activity()))) } diff --git a/crates/core/src/commands/end.rs b/crates/core/src/commands/end.rs index f1c3a96b..d9b7b85c 100644 --- a/crates/core/src/commands/end.rs +++ b/crates/core/src/commands/end.rs @@ -13,7 +13,7 @@ use crate::{ commands::EndOptions, config::PaceConfig, error::{PaceResult, UserMessage}, - prelude::ActivityStorage, + prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, storage::{ActivityStateManagement, SyncStorage}, }; @@ -98,11 +98,15 @@ impl EndCommandOptions { debug!("Parsed date time: {:?}", date_time); - let activity_store = ActivityStore::with_storage(storage)?; + let activity_store = + ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; let end_opts = EndOptions::builder().end_time(date_time).build(); - let user_message = (activity_store.end_all_activities(end_opts)?).map_or_else( + let user_message = (activity_store + .end_all_activities(end_opts) + .map_err(PaceErrorKind::Storage)?) + .map_or_else( || "No unfinished activities to end.".to_string(), |unfinished_activities| { let mut msgs = vec![]; @@ -116,7 +120,7 @@ impl EndCommandOptions { }, ); - activity_store.sync()?; + activity_store.sync().map_err(PaceErrorKind::Storage)?; Ok(UserMessage::new(user_message)) } diff --git a/crates/core/src/commands/hold.rs b/crates/core/src/commands/hold.rs index 10b737ab..508721d9 100644 --- a/crates/core/src/commands/hold.rs +++ b/crates/core/src/commands/hold.rs @@ -14,7 +14,7 @@ use crate::{ config::PaceConfig, domain::intermission::IntermissionAction, error::{PaceResult, UserMessage}, - prelude::ActivityStorage, + prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, storage::{ActivityStateManagement, SyncStorage}, }; @@ -119,18 +119,21 @@ impl HoldCommandOptions { debug!("Hold options: {hold_opts:?}"); - let activity_store = ActivityStore::with_storage(storage)?; + let activity_store = + ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; - let user_message = - if let Some(activity) = activity_store.hold_most_recent_active_activity(hold_opts)? { - debug!("Held {}", activity.activity()); + let user_message = if let Some(activity) = activity_store + .hold_most_recent_active_activity(hold_opts) + .map_err(PaceErrorKind::Storage)? + { + debug!("Held {}", activity.activity()); - activity_store.sync()?; + activity_store.sync().map_err(PaceErrorKind::Storage)?; - format!("Held {}", activity.activity()) - } else { - "No unfinished activities to hold.".to_string() - }; + format!("Held {}", activity.activity()) + } else { + "No unfinished activities to hold.".to_string() + }; Ok(UserMessage::new(user_message)) } diff --git a/crates/core/src/commands/now.rs b/crates/core/src/commands/now.rs index e435ae5b..686c75b2 100644 --- a/crates/core/src/commands/now.rs +++ b/crates/core/src/commands/now.rs @@ -8,7 +8,7 @@ use crate::{ config::PaceConfig, domain::{activity::ActivityItem, filter::ActivityFilterKind}, error::{PaceResult, UserMessage}, - prelude::ActivityStorage, + prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, storage::{ActivityQuerying, ActivityReadOps}, }; @@ -38,28 +38,31 @@ impl NowCommandOptions { config: &PaceConfig, storage: Arc, ) -> PaceResult { - let activity_store = ActivityStore::with_storage(storage)?; + let activity_store = + ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; - let user_message = (activity_store.list_current_activities(ActivityFilterKind::Active)?) - .map_or_else( - || "No activities are currently running.".to_string(), - |activities| { - debug!("Current Activities: {:?}", activities); + let user_message = (activity_store + .list_current_activities(ActivityFilterKind::Active) + .map_err(PaceErrorKind::Storage)?) + .map_or_else( + || "No activities are currently running.".to_string(), + |activities| { + debug!("Current Activities: {:?}", activities); - // Get the activity items - let activity_items = activities - .iter() - .flat_map(|activity_id| activity_store.read_activity(*activity_id)) - .collect::>(); + // Get the activity items + let activity_items = activities + .iter() + .flat_map(|activity_id| activity_store.read_activity(*activity_id)) + .collect::>(); - let mut msgs = vec![]; - for activity in &activity_items { - msgs.push(format!("{}", activity.activity())); - } + let mut msgs = vec![]; + for activity in &activity_items { + msgs.push(format!("{}", activity.activity())); + } - msgs.join("\n") - }, - ); + msgs.join("\n") + }, + ); Ok(UserMessage::new(user_message)) } diff --git a/crates/core/src/commands/reflect.rs b/crates/core/src/commands/reflect.rs index 363c58ec..f47dce29 100644 --- a/crates/core/src/commands/reflect.rs +++ b/crates/core/src/commands/reflect.rs @@ -15,7 +15,7 @@ use crate::{ config::PaceConfig, domain::{activity::ActivityKind, filter::FilterOptions, reflection::ReflectionsFormatKind}, error::{PaceResult, TemplatingErrorKind, UserMessage}, - prelude::ActivityStorage, + prelude::{ActivityStorage, PaceErrorKind}, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, template::{PaceReflectionTemplate, TEMPLATES}, }; @@ -147,14 +147,16 @@ impl ReflectCommandOptions { PaceTimeZoneKind::NotSet, ))?; - let activity_store = ActivityStore::with_storage(storage)?; + let activity_store = + ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; let activity_tracker = ActivityTracker::with_activity_store(activity_store); debug!("Displaying reflection for time frame: {}", time_frame); - let Some(reflection) = - activity_tracker.generate_reflection(FilterOptions::from(self), time_frame)? + let Some(reflection) = activity_tracker + .generate_reflection(FilterOptions::from(self), time_frame) + .map_err(PaceErrorKind::Storage)? else { return Ok(UserMessage::new( "No activities found for the specified time frame", diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index fa687eac..75a11ec9 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -148,7 +148,6 @@ pub enum ActivityLogStorageKind { #[default] File, Database, - #[cfg(test)] InMemory, } diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs index 882f308e..00bc7fd7 100644 --- a/crates/core/src/error.rs +++ b/crates/core/src/error.rs @@ -1,6 +1,7 @@ //! Error types and Result module. use displaydoc::Display; +use eyre::Result as EyreResult; use miette::Diagnostic; use pace_time::error::PaceTimeErrorKind; use std::{error::Error, io, path::PathBuf}; @@ -8,6 +9,12 @@ use thiserror::Error; use crate::domain::activity::{Activity, ActivityGuid}; +macro_rules! impl_pace_error_marker { + ($error:ty) => { + impl PaceErrorMarker for $error {} + }; +} + /// Result type that is being returned from test functions and methods that can fail and thus have errors. pub type TestResult = Result>; @@ -17,6 +24,9 @@ pub type PaceResult = Result; /// Result type that is being returned from methods that have optional return values and can fail thus having [`PaceError`]s. pub type PaceOptResult = PaceResult>; +pub type PaceStorageResult = EyreResult; +pub type PaceStorageOptResult = EyreResult>; + /// User message type that is being returned from methods that need to print a message to the user. #[derive(Debug, Clone, PartialEq, Eq)] pub struct UserMessage { @@ -102,9 +112,6 @@ impl PaceError { #[non_exhaustive] #[derive(Error, Debug, Display)] pub enum PaceErrorKind { - // /// [`CommandErrorKind`] describes the errors that can happen while executing a high-level command - // #[error(transparent)] - // Command(#[from] CommandErrorKind), /// [`std::io::Error`] #[error(transparent)] StdIo(#[from] std::io::Error), @@ -153,15 +160,16 @@ pub enum PaceErrorKind { /// Configuration file not found, please run `pace setup config` to initialize `pace` ParentDirNotFound(PathBuf), - /// Database storage not implemented, yet! - DatabaseStorageNotImplemented, - /// There is no path available to store the activity log NoPathAvailable, /// Templating error: {0} #[error(transparent)] Template(#[from] TemplatingErrorKind), + + /// Storage error: {0} + #[error(transparent)] + Storage(#[from] eyre::Report), } /// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log. @@ -297,20 +305,23 @@ pub enum ActivityStoreErrorKind { /// Missing category for activity: {0} MissingCategoryForActivity(ActivityGuid), + + /// Creating ActivityStore from storage failed + CreatingFromStorageFailed, } trait PaceErrorMarker: Error {} -impl PaceErrorMarker for std::io::Error {} -impl PaceErrorMarker for toml::de::Error {} -impl PaceErrorMarker for toml::ser::Error {} -impl PaceErrorMarker for serde_json::Error {} -impl PaceErrorMarker for chrono::ParseError {} -impl PaceErrorMarker for chrono::OutOfRangeError {} -impl PaceErrorMarker for ActivityLogErrorKind {} -impl PaceErrorMarker for PaceTimeErrorKind {} -impl PaceErrorMarker for ActivityStoreErrorKind {} -impl PaceErrorMarker for TemplatingErrorKind {} +impl_pace_error_marker!(std::io::Error); +impl_pace_error_marker!(toml::de::Error); +impl_pace_error_marker!(toml::ser::Error); +impl_pace_error_marker!(serde_json::Error); +impl_pace_error_marker!(chrono::ParseError); +impl_pace_error_marker!(chrono::OutOfRangeError); +impl_pace_error_marker!(ActivityLogErrorKind); +impl_pace_error_marker!(PaceTimeErrorKind); +impl_pace_error_marker!(ActivityStoreErrorKind); +impl_pace_error_marker!(TemplatingErrorKind); impl From for PaceError where diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index f8c2cd76..468425bc 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -62,8 +62,8 @@ pub mod prelude { status::ActivityStatusKind, }, error::{ - ActivityLogErrorKind, PaceError, PaceErrorKind, PaceOptResult, PaceResult, TestResult, - UserMessage, + ActivityLogErrorKind, PaceError, PaceErrorKind, PaceOptResult, PaceResult, + PaceStorageOptResult, PaceStorageResult, TestResult, UserMessage, }, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, storage::{ diff --git a/crates/core/src/service/activity_store.rs b/crates/core/src/service/activity_store.rs index 3918dbf3..61c26d2c 100644 --- a/crates/core/src/service/activity_store.rs +++ b/crates/core/src/service/activity_store.rs @@ -24,7 +24,7 @@ use crate::{ reflection::{SummaryActivityGroup, SummaryGroupByCategory}, status::ActivityStatusKind, }, - error::{ActivityStoreErrorKind, PaceOptResult, PaceResult}, + error::{ActivityStoreErrorKind, PaceStorageOptResult, PaceStorageResult}, storage::{ ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, ActivityWriteOps, SyncStorage, @@ -69,7 +69,7 @@ impl ActivityStore { /// /// This method returns a new `ActivityStore` if the storage backend /// was successfully created - pub fn with_storage(storage: Arc) -> PaceResult { + pub fn with_storage(storage: Arc) -> PaceStorageResult { debug!( "Creating activity store with storage: {}", storage.identify() @@ -98,7 +98,7 @@ impl ActivityStore { /// # Returns /// /// This method returns `Ok(())` if the cache was successfully populated - fn populate_caches(&mut self) -> PaceResult<()> { + fn populate_caches(&mut self) -> PaceStorageResult<()> { self.cache.by_start_date = self .storage .group_activities_by_start_date()? @@ -112,7 +112,7 @@ impl ActivityStore { &self, filter_opts: FilterOptions, time_range_opts: TimeRangeOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { let Some(activity_guids) = self.list_activities_by_time_range(time_range_opts)? else { debug!("No activities found for time range: {:?}", time_range_opts); @@ -213,7 +213,7 @@ impl ActivityStore { impl ActivityStorage for ActivityStore { #[tracing::instrument(skip(self))] - fn setup(&self) -> PaceResult<()> { + fn setup(&self) -> PaceStorageResult<()> { self.storage.setup() } @@ -223,33 +223,36 @@ impl ActivityStorage for ActivityStore { } #[tracing::instrument(skip(self))] - fn teardown(&self) -> PaceResult<()> { + fn teardown(&self) -> PaceStorageResult<()> { self.storage.teardown() } } impl SyncStorage for ActivityStore { #[tracing::instrument(skip(self))] - fn sync(&self) -> PaceResult<()> { + fn sync(&self) -> PaceStorageResult<()> { self.storage.sync() } } impl ActivityReadOps for ActivityStore { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { self.storage.read_activity(activity_id) } #[tracing::instrument(skip(self))] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + fn list_activities( + &self, + filter: ActivityFilterKind, + ) -> PaceStorageOptResult { self.storage.list_activities(filter) } } impl ActivityWriteOps for ActivityStore { #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceResult { + fn create_activity(&self, activity: Activity) -> PaceStorageResult { self.storage.create_activity(activity) } @@ -259,7 +262,7 @@ impl ActivityWriteOps for ActivityStore { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.storage .update_activity(activity_id, updated_activity, update_opts) } @@ -269,14 +272,14 @@ impl ActivityWriteOps for ActivityStore { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.storage.delete_activity(activity_id, delete_opts) } } impl ActivityStateManagement for ActivityStore { #[tracing::instrument(skip(self))] - fn begin_activity(&self, activity: Activity) -> PaceResult { + fn begin_activity(&self, activity: Activity) -> PaceStorageResult { self.storage.begin_activity(activity) } @@ -285,17 +288,20 @@ impl ActivityStateManagement for ActivityStore { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.storage.end_activity(activity_id, end_opts) } #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { self.storage.end_all_activities(end_opts) } #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + fn end_last_unfinished_activity( + &self, + end_opts: EndOptions, + ) -> PaceStorageOptResult { self.storage.end_last_unfinished_activity(end_opts) } @@ -303,7 +309,7 @@ impl ActivityStateManagement for ActivityStore { fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { self.storage.hold_most_recent_active_activity(hold_opts) } @@ -311,7 +317,7 @@ impl ActivityStateManagement for ActivityStore { fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { self.storage.end_all_active_intermissions(end_opts) } @@ -320,7 +326,7 @@ impl ActivityStateManagement for ActivityStore { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.storage.resume_activity(activity_id, resume_opts) } @@ -329,7 +335,7 @@ impl ActivityStateManagement for ActivityStore { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.storage.hold_activity(activity_id, hold_opts) } @@ -337,35 +343,35 @@ impl ActivityStateManagement for ActivityStore { fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { self.storage.resume_most_recent_activity(resume_opts) } } impl ActivityQuerying for ActivityStore { #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceOptResult> { + fn list_activities_by_id(&self) -> PaceStorageOptResult> { self.storage.list_activities_by_id() } #[tracing::instrument(skip(self))] fn group_activities_by_duration_range( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.storage.group_activities_by_duration_range() } #[tracing::instrument(skip(self))] fn group_activities_by_start_date( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.storage.group_activities_by_start_date() } #[tracing::instrument(skip(self))] fn list_activities_with_intermissions( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.storage.list_activities_with_intermissions() } @@ -373,12 +379,14 @@ impl ActivityQuerying for ActivityStore { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.storage.group_activities_by_keywords(keyword_opts) } #[tracing::instrument(skip(self))] - fn group_activities_by_kind(&self) -> PaceOptResult>> { + fn group_activities_by_kind( + &self, + ) -> PaceStorageOptResult>> { self.storage.group_activities_by_kind() } @@ -386,14 +394,14 @@ impl ActivityQuerying for ActivityStore { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { self.storage.list_activities_by_time_range(time_range_opts) } #[tracing::instrument(skip(self))] fn group_activities_by_status( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.storage.group_activities_by_status() } } diff --git a/crates/core/src/service/activity_tracker.rs b/crates/core/src/service/activity_tracker.rs index e96e8c26..c744ff4e 100644 --- a/crates/core/src/service/activity_tracker.rs +++ b/crates/core/src/service/activity_tracker.rs @@ -5,7 +5,7 @@ use tracing::debug; use crate::{ domain::{filter::FilterOptions, reflection::ReflectionSummary}, - error::PaceOptResult, + error::PaceStorageOptResult, service::activity_store::ActivityStore, }; @@ -32,7 +32,7 @@ impl ActivityTracker { &self, filter_opts: FilterOptions, time_frame: PaceTimeFrame, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { let time_range_opts = TimeRangeOptions::try_from(time_frame)?; let Some(summary_groups) = self diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 731ad9d0..728c4031 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -17,7 +17,7 @@ use crate::{ filter::{ActivityFilterKind, FilteredActivities}, status::ActivityStatusKind, }, - error::{PaceOptResult, PaceResult}, + error::{PaceStorageOptResult, PaceStorageResult}, }; impl Debug for dyn ActivityStorage { @@ -39,7 +39,7 @@ pub trait SyncStorage { /// # Returns /// /// If the storage was synced successfully it should return `Ok(())`. - fn sync(&self) -> PaceResult<()>; + fn sync(&self) -> PaceStorageResult<()>; } /// The trait that all storage backends must implement. This allows us to swap out the storage @@ -65,7 +65,7 @@ pub trait ActivityStorage: /// # Errors /// /// This function should return an error if the storage backend cannot be setup. - fn setup(&self) -> PaceResult<()>; + fn setup(&self) -> PaceStorageResult<()>; /// Teardown the storage backend. This is called once when the application stops. /// @@ -78,7 +78,7 @@ pub trait ActivityStorage: /// # Returns /// /// If the storage backend was torn down successfully it should return `Ok(())`. - fn teardown(&self) -> PaceResult<()>; + fn teardown(&self) -> PaceStorageResult<()>; /// Identify the storage backend. /// @@ -109,7 +109,7 @@ pub trait ActivityReadOps { /// # Returns /// /// The activity that was read from the storage backend. If no activity is found, it should return `Ok(None)`. - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult; + fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult; /// List activities from the storage backend. /// @@ -124,7 +124,10 @@ pub trait ActivityReadOps { /// # Returns /// /// A collection of the activities that were loaded from the storage backend. Returns Ok(None) if no activities are found. - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult; + fn list_activities( + &self, + filter: ActivityFilterKind, + ) -> PaceStorageOptResult; } /// Basic CUD Operations for Activities in the storage backend. @@ -145,7 +148,7 @@ pub trait ActivityWriteOps: ActivityReadOps { /// # Returns /// /// If the activity was created successfully it should return the ID of the created activity. - fn create_activity(&self, activity: Activity) -> PaceResult; + fn create_activity(&self, activity: Activity) -> PaceStorageResult; /// Update an existing activity in the storage backend. /// @@ -175,7 +178,7 @@ pub trait ActivityWriteOps: ActivityReadOps { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceResult; + ) -> PaceStorageResult; /// Delete an activity from the storage backend. /// @@ -194,7 +197,7 @@ pub trait ActivityWriteOps: ActivityReadOps { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceResult; + ) -> PaceStorageResult; } /// Managing Activity State @@ -217,7 +220,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// # Returns /// /// If the activity was started successfully it should return the ID of the started activity. - fn begin_activity(&self, mut activity: Activity) -> PaceResult { + fn begin_activity(&self, mut activity: Activity) -> PaceStorageResult { // End all unfinished activities before starting a new one, // we don't want to have multiple activities running at the same time let _ = self.end_all_activities(EndOptions::default())?; @@ -247,7 +250,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceResult; + ) -> PaceStorageResult; /// Resume an activity in the storage backend. /// @@ -267,7 +270,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceResult; + ) -> PaceStorageResult; /// Resume the most recent activity in the storage backend. /// @@ -285,7 +288,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceOptResult; + ) -> PaceStorageOptResult; /// End an activity in the storage backend. /// @@ -305,7 +308,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceResult; + ) -> PaceStorageResult; /// End all activities in the storage backend. /// @@ -320,7 +323,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// # Returns /// /// A collection of the activities that were ended. Returns Ok(None) if no activities were ended. - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult>; + fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult>; /// End all active intermissions in the storage backend. /// @@ -338,7 +341,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceOptResult>; + ) -> PaceStorageOptResult>; /// End the last unfinished activity in the storage backend. /// @@ -353,7 +356,10 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// # Returns /// /// The activity that was ended. Returns Ok(None) if no activity was ended. - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult; + fn end_last_unfinished_activity( + &self, + end_opts: EndOptions, + ) -> PaceStorageOptResult; /// Hold the most recent activity that is active in the storage backend. /// @@ -376,7 +382,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceOptResult; + ) -> PaceStorageOptResult; } /// Querying Activities @@ -405,7 +411,7 @@ pub trait ActivityQuerying: ActivityReadOps { // TODO!: This method requires defining what constitutes short, medium, and long durations. fn group_activities_by_duration_range( &self, - ) -> PaceOptResult>>; + ) -> PaceStorageOptResult>>; /// Group activities by their start date. This can help in analyzing how /// activities are distributed over time. @@ -423,7 +429,7 @@ pub trait ActivityQuerying: ActivityReadOps { // TODO!: for the groupings, so we can distinguish between start and end date groupings. fn group_activities_by_start_date( &self, - ) -> PaceOptResult>>; + ) -> PaceStorageOptResult>>; /// Retrieve activities that have one or more intermissions, useful for identifying /// potential inefficiencies or breaks. @@ -439,7 +445,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// If no activities are found, it should return `Ok(None)`. fn list_activities_with_intermissions( &self, - ) -> PaceOptResult>>; + ) -> PaceStorageOptResult>>; /// Group activities based on keywords, e.g., category, tags, etc. /// @@ -461,7 +467,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceOptResult>>; + ) -> PaceStorageOptResult>>; /// Group activities based on their kind (e.g., Task, Intermission). /// @@ -474,7 +480,9 @@ pub trait ActivityQuerying: ActivityReadOps { /// A collection of the activities with their kind. /// The key is the kind of the activity, and the value is a list of activities of that kind. /// If no activities are found, it should return `Ok(None)`. - fn group_activities_by_kind(&self) -> PaceOptResult>>; + fn group_activities_by_kind( + &self, + ) -> PaceStorageOptResult>>; /// List activities by time range from the storage backend. /// @@ -493,7 +501,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceOptResult>; + ) -> PaceStorageOptResult>; /// Group activities by their status from the storage backend. /// @@ -507,7 +515,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// If no activities are found, it should return `Ok(None)`. fn group_activities_by_status( &self, - ) -> PaceOptResult>>; + ) -> PaceStorageOptResult>>; /// List all current activities from the storage backend matching an `ActivityFilter`. /// @@ -522,7 +530,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_current_activities( &self, filter: ActivityFilterKind, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { Ok(self .list_activities(filter)? .map(FilteredActivities::into_vec)) @@ -538,7 +546,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// A collection of the activities that were loaded from the storage backend by their ID in a `BTreeMap`. /// If no activities are found, it should return `Ok(None)`. - fn list_activities_by_id(&self) -> PaceOptResult>; + fn list_activities_by_id(&self) -> PaceStorageOptResult>; /// List all active intermissions from the storage backend. /// @@ -550,7 +558,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// A collection of the activities that are currently active intermissions. /// If no activities are found, it should return `Ok(None)`. - fn list_active_intermissions(&self) -> PaceOptResult> { + fn list_active_intermissions(&self) -> PaceStorageOptResult> { Ok(self .list_activities(ActivityFilterKind::ActiveIntermission)? .map(FilteredActivities::into_vec)) @@ -570,7 +578,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// A collection of the most recent activities. /// If no activities are found, it should return `Ok(None)`. - fn list_most_recent_activities(&self, count: usize) -> PaceOptResult> { + fn list_most_recent_activities(&self, count: usize) -> PaceStorageOptResult> { let filtered = self .list_activities(ActivityFilterKind::OnlyActivities)? .map(FilteredActivities::into_vec); @@ -616,7 +624,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// # Returns /// /// If the activity is active, it should return `Ok(true)`. If it is not active, it should return `Ok(false)`. - fn is_activity_active(&self, activity_id: ActivityGuid) -> PaceResult { + fn is_activity_active(&self, activity_id: ActivityGuid) -> PaceStorageResult { let activity = self.read_activity(activity_id)?; debug!( @@ -649,7 +657,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_intermissions_for_activity_id( &self, activity_id: ActivityGuid, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { let Some(filtered) = self .list_activities(ActivityFilterKind::Intermission)? .map(FilteredActivities::into_vec) @@ -703,7 +711,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_active_intermissions_for_activity_id( &self, activity_id: ActivityGuid, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { let guids = self.list_active_intermissions()?.map(|log| { log.iter() .filter_map(|active_intermission_id| { @@ -742,7 +750,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// The latest active activity. /// If no activity is found, it should return `Ok(None)`. - fn most_recent_active_activity(&self) -> PaceOptResult { + fn most_recent_active_activity(&self) -> PaceStorageOptResult { let Some(current) = self.list_current_activities(ActivityFilterKind::Active)? else { debug!("No active activities found"); @@ -777,7 +785,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// The latest held activity. /// If no activity is found, it should return `Ok(None)`. - fn most_recent_held_activity(&self) -> PaceOptResult { + fn most_recent_held_activity(&self) -> PaceStorageOptResult { let Some(current) = self.list_current_activities(ActivityFilterKind::Held)? else { debug!("No held activities found"); @@ -823,7 +831,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the tag was added successfully it should return `Ok(())`. -// fn add_tag_to_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceResult<()>; +// fn add_tag_to_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceStorageResult<()>; // /// Remove a tag from an activity. // /// @@ -839,7 +847,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the tag was removed successfully it should return `Ok(())`. -// fn remove_tag_from_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceResult<()>; +// fn remove_tag_from_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceStorageResult<()>; // } // /// Archiving Activities @@ -863,7 +871,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the activity was archived successfully it should return `Ok(())`. -// fn archive_activity(&self, activity_id: ActivityGuid) -> PaceResult<()>; +// fn archive_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult<()>; // /// Unarchive an activity. // /// @@ -878,7 +886,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the activity was unarchived successfully it should return `Ok(())`. -// fn unarchive_activity(&self, activity_id: ActivityGuid) -> PaceResult<()>; +// fn unarchive_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult<()>; // } // /// Generate Statistics for Activities @@ -902,7 +910,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// A summary or statistics of activities within the specified time frame. -// fn generate_activity_statistics(&self, time_frame: TimeFrame) -> PaceResult; +// fn generate_activity_statistics(&self, time_frame: TimeFrame) -> PaceStorageResult; // } // /// Reviewing Activities @@ -931,5 +939,5 @@ pub trait ActivityQuerying: ActivityReadOps { // &self, // start: PaceDateTime, // end: PaceDateTime, -// ) -> PaceResult; +// ) -> PaceStorageResult; // } diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 77032ae0..25e52c0e 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -26,6 +26,7 @@ rusqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] [dependencies] displaydoc = { workspace = true } +eyre = { workspace = true } itertools = { workspace = true } libsqlite3-sys = { workspace = true, features = ["bundled"], optional = true } merge = { workspace = true } diff --git a/crates/storage/src/error.rs b/crates/storage/src/error.rs index e39b18bb..77da8f13 100644 --- a/crates/storage/src/error.rs +++ b/crates/storage/src/error.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use displaydoc::Display; -use pace_core::prelude::{Activity, ActivityGuid, DatabaseEngineKind}; +use pace_core::prelude::{Activity, ActivityGuid, DatabaseEngineKind, PaceError}; use thiserror::Error; pub type PaceStorageResult = Result; @@ -10,11 +10,14 @@ pub type PaceStorageResult = Result; #[non_exhaustive] #[derive(Error, Debug, Display)] pub enum PaceStorageErrorKind { - /// SQLite error: {0} + /// Pace error: {0} #[error(transparent)] - #[cfg(feature = "rusqlite")] - SQLite(#[from] rusqlite::Error), + PaceError(#[from] PaceError), + // /// SQLite error: {0} + // #[error(transparent)] + // #[cfg(feature = "rusqlite")] + // SQLite(#[from] rusqlite::Error), /// Database error: {0} #[error(transparent)] Database(#[from] DatabaseStorageErrorKind), @@ -25,6 +28,9 @@ pub enum PaceStorageErrorKind { /// Database storage not configured DatabaseStorageNotConfigured, + + /// Database storage not implemented, yet! + StorageNotImplemented, } /// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the SQLite database. diff --git a/crates/storage/src/file.rs b/crates/storage/src/file.rs index 0b677305..623f4768 100644 --- a/crates/storage/src/file.rs +++ b/crates/storage/src/file.rs @@ -11,7 +11,8 @@ use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityLog, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, - KeywordOptions, PaceOptResult, PaceResult, ResumeOptions, SyncStorage, UpdateOptions, + KeywordOptions, PaceStorageOptResult, PaceStorageResult, ResumeOptions, SyncStorage, + UpdateOptions, }; use crate::{error::TomlFileStorageErrorKind, in_memory::InMemoryActivityStorage}; @@ -28,7 +29,7 @@ pub struct TomlActivityStorage { } impl SyncStorage for TomlActivityStorage { - fn sync(&self) -> PaceResult<()> { + fn sync(&self) -> PaceStorageResult<()> { self.sync_to_file() } } @@ -47,7 +48,7 @@ impl TomlActivityStorage { /// # Returns /// /// Returns a new `TomlActivityStorage` - pub fn new(path: impl AsRef) -> PaceResult { + pub fn new(path: impl AsRef) -> PaceStorageResult { let mut storage = Self { cache: InMemoryActivityStorage::new(), path: path.as_ref().to_path_buf(), @@ -70,7 +71,7 @@ impl TomlActivityStorage { /// /// Returns `Ok(())` if the data is loaded successfully #[tracing::instrument(skip(self))] - fn load(&mut self) -> PaceResult<()> { + fn load(&mut self) -> PaceStorageResult<()> { let data = std::fs::read_to_string(&self.path)?; self.cache = InMemoryActivityStorage::from(toml::from_str::(&data)?); @@ -89,7 +90,7 @@ impl TomlActivityStorage { /// /// Returns `Ok(())` if the cache is written successfully #[tracing::instrument(skip(self))] - pub fn sync_to_file(&self) -> PaceResult<()> { + pub fn sync_to_file(&self) -> PaceStorageResult<()> { let data = toml::to_string(&self.cache.get_activity_log())?; write(&self.path, data)?; Ok(()) @@ -98,7 +99,7 @@ impl TomlActivityStorage { impl ActivityStorage for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn setup(&self) -> PaceResult<()> { + fn setup(&self) -> PaceStorageResult<()> { if !self.path.exists() { create_dir_all(self.path.parent().ok_or( TomlFileStorageErrorKind::ParentDirNotFound(self.path.clone()), @@ -116,7 +117,7 @@ impl ActivityStorage for TomlActivityStorage { } #[tracing::instrument(skip(self))] - fn teardown(&self) -> PaceResult<()> { + fn teardown(&self) -> PaceStorageResult<()> { self.sync_to_file() } @@ -128,24 +129,30 @@ impl ActivityStorage for TomlActivityStorage { impl ActivityReadOps for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { self.cache.read_activity(activity_id) } #[tracing::instrument(skip(self))] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + fn list_activities( + &self, + filter: ActivityFilterKind, + ) -> PaceStorageOptResult { self.cache.list_activities(filter) } } impl ActivityStateManagement for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { self.cache.end_all_activities(end_opts) } #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + fn end_last_unfinished_activity( + &self, + end_opts: EndOptions, + ) -> PaceStorageOptResult { self.cache.end_last_unfinished_activity(end_opts) } @@ -154,7 +161,7 @@ impl ActivityStateManagement for TomlActivityStorage { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.cache.end_activity(activity_id, end_opts) } @@ -162,7 +169,7 @@ impl ActivityStateManagement for TomlActivityStorage { fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { self.cache.hold_most_recent_active_activity(hold_opts) } @@ -170,7 +177,7 @@ impl ActivityStateManagement for TomlActivityStorage { fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { self.cache.end_all_active_intermissions(end_opts) } @@ -179,7 +186,7 @@ impl ActivityStateManagement for TomlActivityStorage { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.cache.resume_activity(activity_id, resume_opts) } @@ -188,7 +195,7 @@ impl ActivityStateManagement for TomlActivityStorage { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.cache.hold_activity(activity_id, hold_opts) } @@ -196,14 +203,14 @@ impl ActivityStateManagement for TomlActivityStorage { fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { self.cache.resume_most_recent_activity(resume_opts) } } impl ActivityWriteOps for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceResult { + fn create_activity(&self, activity: Activity) -> PaceStorageResult { self.cache.create_activity(activity) } @@ -213,7 +220,7 @@ impl ActivityWriteOps for TomlActivityStorage { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.cache .update_activity(activity_id, updated_activity, update_opts) } @@ -223,40 +230,40 @@ impl ActivityWriteOps for TomlActivityStorage { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceResult { + ) -> PaceStorageResult { self.cache.delete_activity(activity_id, delete_opts) } } impl ActivityQuerying for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceOptResult> { + fn list_activities_by_id(&self) -> PaceStorageOptResult> { self.cache.list_activities_by_id() } #[tracing::instrument(skip(self))] - fn most_recent_active_activity(&self) -> PaceOptResult { + fn most_recent_active_activity(&self) -> PaceStorageOptResult { self.cache.most_recent_active_activity() } #[tracing::instrument(skip(self))] fn group_activities_by_duration_range( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.cache.group_activities_by_duration_range() } #[tracing::instrument(skip(self))] fn group_activities_by_start_date( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.cache.group_activities_by_start_date() } #[tracing::instrument(skip(self))] fn list_activities_with_intermissions( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.cache.list_activities_with_intermissions() } @@ -264,12 +271,14 @@ impl ActivityQuerying for TomlActivityStorage { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.cache.group_activities_by_keywords(keyword_opts) } #[tracing::instrument(skip(self))] - fn group_activities_by_kind(&self) -> PaceOptResult>> { + fn group_activities_by_kind( + &self, + ) -> PaceStorageOptResult>> { self.cache.group_activities_by_kind() } @@ -277,14 +286,14 @@ impl ActivityQuerying for TomlActivityStorage { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { self.cache.list_activities_by_time_range(time_range_opts) } #[tracing::instrument(skip(self))] fn group_activities_by_status( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { self.cache.group_activities_by_status() } } diff --git a/crates/storage/src/in_memory.rs b/crates/storage/src/in_memory.rs index 5b4cafde..fba86101 100644 --- a/crates/storage/src/in_memory.rs +++ b/crates/storage/src/in_memory.rs @@ -15,8 +15,8 @@ use pace_core::prelude::{ Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityKindOptions, ActivityLog, ActivityLogErrorKind, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, - EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceOptResult, PaceResult, - ResumeOptions, SyncStorage, UpdateOptions, + EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceStorageOptResult, + PaceStorageResult, ResumeOptions, SyncStorage, UpdateOptions, }; /// Type for shared `ActivityLog` @@ -76,12 +76,12 @@ impl Default for InMemoryActivityStorage { } impl ActivityStorage for InMemoryActivityStorage { - fn setup(&self) -> PaceResult<()> { + fn setup(&self) -> PaceStorageResult<()> { debug!("Setting up in-memory storage"); Ok(()) } - fn teardown(&self) -> PaceResult<()> { + fn teardown(&self) -> PaceStorageResult<()> { debug!("Tearing down in-memory storage"); Ok(()) } @@ -92,7 +92,7 @@ impl ActivityStorage for InMemoryActivityStorage { } impl SyncStorage for InMemoryActivityStorage { - fn sync(&self) -> PaceResult<()> { + fn sync(&self) -> PaceStorageResult<()> { debug!("Syncing in-memory storage"); Ok(()) @@ -101,7 +101,7 @@ impl SyncStorage for InMemoryActivityStorage { impl ActivityReadOps for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { let activities = self.log.read(); let activity = activities @@ -117,7 +117,10 @@ impl ActivityReadOps for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + fn list_activities( + &self, + filter: ActivityFilterKind, + ) -> PaceStorageOptResult { let activity_log = self.log.read(); let filtered = activity_log @@ -170,7 +173,7 @@ impl ActivityReadOps for InMemoryActivityStorage { impl ActivityWriteOps for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceResult { + fn create_activity(&self, activity: Activity) -> PaceStorageResult { let activities = self.log.read(); let activity_item = ActivityItem::from(activity); @@ -208,7 +211,7 @@ impl ActivityWriteOps for InMemoryActivityStorage { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceResult { + ) -> PaceStorageResult { let activities = self.log.read(); let original_activity = activities @@ -237,7 +240,7 @@ impl ActivityWriteOps for InMemoryActivityStorage { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceResult { + ) -> PaceStorageResult { let mut activities = self.log.write(); let activity = activities @@ -256,7 +259,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceResult { + ) -> PaceStorageResult { let activities = self.log.read(); let begin_time = *activities @@ -285,7 +288,10 @@ impl ActivityStateManagement for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + fn end_last_unfinished_activity( + &self, + end_opts: EndOptions, + ) -> PaceStorageOptResult { let Some(most_recent) = self.most_recent_active_activity()? else { debug!("No active activity found."); return Ok(None); @@ -299,7 +305,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { let activities = self.log.read(); let endable_activities = activities @@ -325,10 +331,10 @@ impl ActivityStateManagement for InMemoryActivityStorage { let ended_activities = endable_activities .par_iter() - .map(|activity_id| -> PaceResult { + .map(|activity_id| -> PaceStorageResult { self.end_activity(*activity_id, end_opts.clone()) }) - .collect::>>()?; + .collect::>>()?; debug!("Ended activities: {:?}", ended_activities); @@ -346,7 +352,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { // Get id from last activity that is not ended let Some(active_activity) = self.most_recent_active_activity()? else { debug!("No active activity found."); @@ -362,7 +368,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { let Some(active_intermissions) = self.list_active_intermissions()? else { debug!("No active intermissions found."); @@ -372,11 +378,11 @@ impl ActivityStateManagement for InMemoryActivityStorage { let ended_intermissions = active_intermissions .par_iter() - .map(|activity_id| -> PaceResult { + .map(|activity_id| -> PaceStorageResult { let _ = self.end_activity(*activity_id, end_opts.clone())?; Ok(*activity_id) }) - .collect::>>()?; + .collect::>>()?; debug!("Ended intermissions: {:?}", ended_intermissions); @@ -395,7 +401,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceResult { + ) -> PaceStorageResult { let resumable_activity = self.read_activity(activity_id)?; debug!("Resumable activity: {:?}", resumable_activity); @@ -446,7 +452,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceResult { + ) -> PaceStorageResult { // Get ActivityItem for activity that let active_activity = self.read_activity(activity_id)?; @@ -541,7 +547,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { // Get id from last activity that is not ended let Some(active_activity) = self.most_recent_held_activity()? else { debug!("No held activity found."); @@ -562,7 +568,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceOptResult> { + fn list_activities_by_id(&self) -> PaceStorageOptResult> { let activities = self.log.read(); let activities_by_id = activities.activities().clone(); @@ -583,14 +589,14 @@ impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] fn group_activities_by_duration_range( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { todo!("Implement grouping activities by duration range") } #[tracing::instrument(skip(self))] fn group_activities_by_start_date( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -613,7 +619,7 @@ impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] fn list_activities_with_intermissions( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { let Some(intermissions) = self .list_activities(ActivityFilterKind::Intermission)? .map(FilteredActivities::into_vec) @@ -660,7 +666,7 @@ impl ActivityQuerying for InMemoryActivityStorage { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -706,7 +712,9 @@ impl ActivityQuerying for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn group_activities_by_kind(&self) -> PaceOptResult>> { + fn group_activities_by_kind( + &self, + ) -> PaceStorageOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -732,7 +740,7 @@ impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] fn group_activities_by_status( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -759,7 +767,7 @@ impl ActivityQuerying for InMemoryActivityStorage { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { let Some(filtered_activities) = self .list_activities(ActivityFilterKind::TimeRange(time_range_opts))? .map(FilteredActivities::into_vec) diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index af19872d..552b3a96 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,10 +1,12 @@ use std::sync::Arc; -use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; +use pace_core::prelude::{ + ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig, PaceStorageResult, +}; use tracing::debug; use crate::{ - error::{DatabaseStorageErrorKind, PaceStorageErrorKind, PaceStorageResult}, + error::{DatabaseStorageErrorKind, PaceStorageErrorKind}, file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SqliteActivityStorage, @@ -21,6 +23,8 @@ pub mod in_memory; #[cfg(feature = "rusqlite")] pub mod sqlite; +pub mod storage_types; + /// Get the storage backend from the configuration. /// /// # Arguments @@ -35,48 +39,53 @@ pub mod sqlite; /// /// The storage backend. pub fn get_storage_from_config(config: &PaceConfig) -> PaceStorageResult> { - let storage: dyn ActivityStorage = match config.general().activity_log_options().storage_kind() - { - ActivityLogStorageKind::File => { - TomlActivityStorage::new(config.general().activity_log_options().path())?.into() - } - ActivityLogStorageKind::Database => { - if config.database().is_some() { - let Some(db_config) = config.database() else { - return Err(DatabaseStorageErrorKind::NoConfigSettings.into()); - }; - - match db_config.engine() { - DatabaseEngineKind::Sqlite => { - #[cfg(feature = "rusqlite")] - { - let connection_string = config - .database() - .as_ref() - .ok_or(DatabaseStorageErrorKind::NoConnectionString)? - .connection_string(); - - debug!("Connecting to database: {}", &connection_string); - - SqliteActivityStorage::new(connection_string.clone())?.into() + let storage: Arc = + match config.general().activity_log_options().storage_kind() { + ActivityLogStorageKind::File => Arc::new(TomlActivityStorage::new( + config.general().activity_log_options().path(), + )?), + ActivityLogStorageKind::Database => { + if config.database().is_some() { + let Some(db_config) = config.database() else { + return Err(DatabaseStorageErrorKind::NoConfigSettings.into()); + }; + + let storage: Arc = match db_config.engine() { + DatabaseEngineKind::Sqlite => { + #[cfg(feature = "rusqlite")] + { + let connection_string = config + .database() + .as_ref() + .ok_or(DatabaseStorageErrorKind::NoConnectionString)? + .connection_string(); + + debug!("Connecting to database: {}", &connection_string); + + Arc::new(SqliteActivityStorage::new(connection_string.clone())?) + } + + #[cfg(not(feature = "rusqlite"))] + return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); + } + engine => { + return Err(DatabaseStorageErrorKind::UnsupportedDatabaseEngine( + *engine, + ) + .into()) } - #[cfg(not(feature = "rusqlite"))] - return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); - } - engine => { - return Err( - DatabaseStorageErrorKind::UnsupportedDatabaseEngine(*engine).into() - ) - } + }; + + storage } - } - return Err(PaceStorageErrorKind::DatabaseStorageNotConfigured.into()); - } - ActivityLogStorageKind::InMemory => InMemoryActivityStorage::new().into(), - }; + return Err(PaceStorageErrorKind::DatabaseStorageNotConfigured.into()); + } + ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), + _ => return Err(PaceStorageErrorKind::StorageNotImplemented.into()), + }; - debug!("Using storage backend: {}", storage); + debug!("Using storage backend: {:?}", storage); - Ok(Arc::new(storage)) + Ok(storage) } diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/sqlite.rs index 5805351f..dbb9ade7 100644 --- a/crates/storage/src/sqlite.rs +++ b/crates/storage/src/sqlite.rs @@ -10,10 +10,10 @@ use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, - PaceOptResult, PaceResult, ResumeOptions, SyncStorage, UpdateOptions, + PaceStorageOptResult, PaceStorageResult, ResumeOptions, SyncStorage, UpdateOptions, }; -use crate::error::{DatabaseStorageErrorKind, PaceStorageResult}; +use crate::error::DatabaseStorageErrorKind; pub trait FromRow { fn from_row(row: &rusqlite::Row<'_>) -> PaceStorageResult @@ -37,7 +37,7 @@ impl SqliteActivityStorage { } impl ActivityStorage for SqliteActivityStorage { - fn setup(&self) -> PaceResult<()> { + fn setup(&self) -> PaceStorageResult<()> { // we embed `db/schema.sql` and run it against the database // as a setup step let schema = include_str!("../../../db/schema.sql"); @@ -47,7 +47,7 @@ impl ActivityStorage for SqliteActivityStorage { Ok(()) } - fn teardown(&self) -> PaceResult<()> { + fn teardown(&self) -> PaceStorageResult<()> { Ok(()) } @@ -57,7 +57,7 @@ impl ActivityStorage for SqliteActivityStorage { } impl SyncStorage for SqliteActivityStorage { - fn sync(&self) -> PaceResult<()> { + fn sync(&self) -> PaceStorageResult<()> { // We sync activities to the database in each operation // so we don't need to do anything here @@ -67,7 +67,7 @@ impl SyncStorage for SqliteActivityStorage { impl ActivityReadOps for SqliteActivityStorage { #[tracing::instrument] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { let mut stmt = self .connection .prepare("SELECT * FROM activities WHERE id = ?1")?; @@ -87,7 +87,10 @@ impl ActivityReadOps for SqliteActivityStorage { } #[tracing::instrument] - fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { + fn list_activities( + &self, + filter: ActivityFilterKind, + ) -> PaceStorageOptResult { let mut stmt = self.connection.prepare(filter.to_sql_statement())?; let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; @@ -121,7 +124,7 @@ impl ActivityReadOps for SqliteActivityStorage { } impl ActivityWriteOps for SqliteActivityStorage { - fn create_activity(&self, activity: Activity) -> PaceResult { + fn create_activity(&self, activity: Activity) -> PaceStorageResult { let tx = self.connection.transaction()?; let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; @@ -141,7 +144,7 @@ impl ActivityWriteOps for SqliteActivityStorage { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceResult { + ) -> PaceStorageResult { todo!() } @@ -149,7 +152,7 @@ impl ActivityWriteOps for SqliteActivityStorage { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceResult { + ) -> PaceStorageResult { let activity = self.read_activity(activity_id)?; let tx = self.connection.transaction()?; @@ -168,7 +171,7 @@ impl ActivityStateManagement for SqliteActivityStorage { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceResult { + ) -> PaceStorageResult { todo!() } @@ -176,14 +179,14 @@ impl ActivityStateManagement for SqliteActivityStorage { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceResult { + ) -> PaceStorageResult { todo!() } fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { todo!() } @@ -191,282 +194,81 @@ impl ActivityStateManagement for SqliteActivityStorage { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceResult { + ) -> PaceStorageResult { todo!() } - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { todo!() } fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { todo!() } - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + fn end_last_unfinished_activity( + &self, + end_opts: EndOptions, + ) -> PaceStorageOptResult { todo!() } fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceOptResult { + ) -> PaceStorageOptResult { todo!() } } impl ActivityQuerying for SqliteActivityStorage { fn group_activities_by_duration_range( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { todo!() } fn group_activities_by_start_date( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { todo!() } fn list_activities_with_intermissions( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { todo!() } fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { todo!() } - fn group_activities_by_kind(&self) -> PaceOptResult>> { + fn group_activities_by_kind( + &self, + ) -> PaceStorageOptResult>> { todo!() } fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceOptResult> { + ) -> PaceStorageOptResult> { todo!() } fn group_activities_by_status( &self, - ) -> PaceOptResult>> { + ) -> PaceStorageOptResult>> { todo!() } - fn list_activities_by_id(&self) -> PaceOptResult> { + fn list_activities_by_id(&self) -> PaceStorageOptResult> { todo!() } } - -pub mod sql_conversion { - use std::{collections::HashSet, str::FromStr}; - - use pace_time::date_time::PaceDateTime; - use rusqlite::{types::FromSql, Row, ToSql}; - use ulid::Ulid; - - // use pace_time::rusqlite::*; - - use pace_core::prelude::{ - Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, - ActivityKindOptions, ActivityStatusKind, PaceResult, - }; - - use super::FromRow; - - impl Activity { - pub fn to_sql_prepare_statement(&self) -> &'static str { - "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" - } - - pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { - let category = if let Some(category) = self.category() { - category.to_sql()? - } else { - "NULL".to_sql()? - }; - - let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { - let (end, duration) = end_opts.as_tuple(); - (end.to_sql()?, duration.to_sql()?) - } else { - ("NULL".to_sql()?, "NULL".to_sql()?) - }; - - let parent_id = if let Some(parent_id) = self.parent_id() { - parent_id.to_sql()? - } else { - "NULL".to_sql()? - }; - - let tags = if let Some(tags) = self.tags() { - let tags = tags - .iter() - .map(|tag| tag.to_string()) - .collect::>(); - - tags.join(",").to_sql()? - } else { - "NULL".to_sql()? - }; - - let guid = ActivityGuid::new(); - - Ok(( - guid, - vec![ - // TODO: We create a new ID here, that should probably happen - // TODO: somewhere else and needs a refactoring - &guid, - &category, - &self.description(), - &self.begin(), - &end, - &duration, - &self.kind(), - &self.status(), - &tags, - &parent_id, - ], - )) - } - } - - impl ActivityFilterKind { - pub fn to_sql_statement(&self) -> &'static str { - match self { - Self::Everything => "SELECT * FROM activities", - ActivityFilterKind::OnlyActivities => todo!(), - ActivityFilterKind::Active => { - "SELECT * FROM activities WHERE status = 'in-progress'" - } - ActivityFilterKind::ActiveIntermission => todo!(), - ActivityFilterKind::Archived => { - "SELECT * FROM activities WHERE status = 'archived'" - } - ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", - ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", - ActivityFilterKind::Intermission => todo!(), - ActivityFilterKind::TimeRange(opts) => todo!(), - } - } - } - - impl FromRow for ActivityEndOptions { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(Self::new(row.get("end")?, row.get("duration")?)) - } - } - - impl FromRow for ActivityKindOptions { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(Self::with_parent_id(row.get("parent_id")?)) - } - } - - impl FromRow for Activity { - fn from_row(row: &Row<'_>) -> PaceResult { - let begin_time: PaceDateTime = row.get("begin")?; - - let description: String = row.get("description")?; - - let tags_string: String = row.get("tags")?; - - let tags = tags_string - .split(',') - .map(|tag| tag.to_string()) - .collect::>(); - - Ok(Activity::builder() - .category(Some(row.get("category")?)) // TODO: Check for None - .description(description) - .begin(begin_time) - .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None - .kind(row.get("kind")?) - .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None - .tags(tags) - .status(row.get("status")?) - .build()) - } - } - - impl FromRow for ActivityGuid { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(row.get("guid")?) - } - } - - impl FromRow for ActivityItem { - fn from_row(row: &Row<'_>) -> PaceResult { - let activity_end_opts = ActivityEndOptions::from_row(row)?; - - let activity_kind_opts = ActivityKindOptions::from_row(row)?; - - let activity = Activity::from_row(row)?; - - let guid = ActivityGuid::from_row(row)?; - - Ok(Self::builder().guid(guid).activity(activity).build()) - } - } - - impl ToSql for ActivityGuid { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } - } - - impl FromSql for ActivityGuid { - fn column_result( - value: rusqlite::types::ValueRef<'_>, - ) -> rusqlite::types::FromSqlResult { - Ok(ActivityGuid::with_id( - Ulid::from_string(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, - )) - } - } - - impl ToSql for ActivityKind { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } - } - - impl FromSql for ActivityKind { - fn column_result( - value: rusqlite::types::ValueRef<'_>, - ) -> rusqlite::types::FromSqlResult { - Ok(ActivityKind::from_str(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) - } - } - - impl ToSql for ActivityStatusKind { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } - } - - impl FromSql for ActivityStatusKind { - fn column_result( - value: rusqlite::types::ValueRef<'_>, - ) -> rusqlite::types::FromSqlResult { - Ok(ActivityStatusKind::from_str(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) - } - } -} diff --git a/crates/storage/src/storage_types.rs b/crates/storage/src/storage_types.rs new file mode 100644 index 00000000..a39fa7fc --- /dev/null +++ b/crates/storage/src/storage_types.rs @@ -0,0 +1,240 @@ +use std::{collections::HashSet, str::FromStr}; + +use pace_time::date_time::PaceDateTime; +use rusqlite::{types::FromSql, Row, ToSql}; +use ulid::Ulid; + +// use pace_time::rusqlite::*; + +use pace_core::prelude::{ + Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, + ActivityKindOptions, ActivityStatusKind, PaceResult, +}; + +use crate::sqlite::FromRow; + +pub struct SqliteActivity(Activity); + +impl std::ops::Deref for SqliteActivity { + type Target = Activity; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} +pub struct SqliteActivityFilterKind(ActivityFilterKind); + +impl std::ops::Deref for SqliteActivityFilterKind { + type Target = ActivityFilterKind; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +pub struct SqliteActivityGuid(ActivityGuid); + +impl std::ops::Deref for SqliteActivityGuid { + type Target = ActivityGuid; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} +pub struct SqliteActivityKind(ActivityKind); + +impl std::ops::Deref for SqliteActivityKind { + type Target = ActivityKind; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} +pub struct SqliteActivityStatusKind(ActivityStatusKind); + +impl std::ops::Deref for SqliteActivityStatusKind { + type Target = ActivityStatusKind; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl SqliteActivity { + pub fn to_sql_prepare_statement(&self) -> &'static str { + "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" + } + + pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { + let category = if let Some(category) = self.category() { + category.to_sql()? + } else { + "NULL".to_sql()? + }; + + let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { + let (end, duration) = end_opts.as_tuple(); + (end.to_sql()?, duration.to_sql()?) + } else { + ("NULL".to_sql()?, "NULL".to_sql()?) + }; + + let parent_id = if let Some(parent_id) = self.parent_id() { + parent_id.to_sql()? + } else { + "NULL".to_sql()? + }; + + let tags = if let Some(tags) = self.tags() { + let tags = tags + .iter() + .map(|tag| tag.to_string()) + .collect::>(); + + tags.join(",").to_sql()? + } else { + "NULL".to_sql()? + }; + + let guid = ActivityGuid::new(); + + Ok(( + guid, + vec![ + // TODO: We create a new ID here, that should probably happen + // TODO: somewhere else and needs a refactoring + &guid, + &category, + &self.description(), + &self.begin(), + &end, + &duration, + &self.kind(), + &self.status(), + &tags, + &parent_id, + ], + )) + } +} + +impl SqliteActivityFilterKind { + pub fn to_sql_statement(&self) -> &'static str { + match self { + Self::Everything => "SELECT * FROM activities", + ActivityFilterKind::OnlyActivities => todo!(), + ActivityFilterKind::Active => "SELECT * FROM activities WHERE status = 'in-progress'", + ActivityFilterKind::ActiveIntermission => todo!(), + ActivityFilterKind::Archived => "SELECT * FROM activities WHERE status = 'archived'", + ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", + ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", + ActivityFilterKind::Intermission => todo!(), + ActivityFilterKind::TimeRange(opts) => todo!(), + } + } +} + +impl FromRow for ActivityEndOptions { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(Self::new(row.get("end")?, row.get("duration")?)) + } +} + +impl FromRow for ActivityKindOptions { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(Self::with_parent_id(row.get("parent_id")?)) + } +} + +impl FromRow for Activity { + fn from_row(row: &Row<'_>) -> PaceResult { + let begin_time: PaceDateTime = row.get("begin")?; + + let description: String = row.get("description")?; + + let tags_string: String = row.get("tags")?; + + let tags = tags_string + .split(',') + .map(|tag| tag.to_string()) + .collect::>(); + + Ok(Activity::builder() + .category(Some(row.get("category")?)) // TODO: Check for None + .description(description) + .begin(begin_time) + .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None + .kind(row.get("kind")?) + .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None + .tags(tags) + .status(row.get("status")?) + .build()) + } +} + +impl FromRow for ActivityGuid { + fn from_row(row: &Row<'_>) -> PaceResult { + Ok(row.get("guid")?) + } +} + +impl FromRow for ActivityItem { + fn from_row(row: &Row<'_>) -> PaceResult { + let activity_end_opts = ActivityEndOptions::from_row(row)?; + + let activity_kind_opts = ActivityKindOptions::from_row(row)?; + + let activity = Activity::from_row(row)?; + + let guid = ActivityGuid::from_row(row)?; + + Ok(Self::builder().guid(guid).activity(activity).build()) + } +} + +impl ToSql for SqliteActivityGuid { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for SqliteActivityGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(ActivityGuid::with_id( + Ulid::from_string(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, + )) + } +} + +impl ToSql for SqliteActivityKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for SqliteActivityKind { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(ActivityKind::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) + } +} + +impl ToSql for SqliteActivityStatusKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for SqliteActivityStatusKind { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(ActivityStatusKind::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) + } +} From 685d5cb6c08516099a4baffc4dfd3a73d3c7c254 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 10:00:10 +0100 Subject: [PATCH 15/59] chore: update cargo lock Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 124 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 87 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 822606c7..a7c0d513 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,18 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -65,6 +77,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -472,39 +490,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "diesel" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc05c17098f21b89bc7d98fe1dd3cce2c11c2ad8e145f2a44fe08ed28eb559" -dependencies = [ - "chrono", - "diesel_derives", - "libsqlite3-sys", - "time", -] - -[[package]] -name = "diesel_derives" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d02eecb814ae714ffe61ddc2db2dd03e6c49a42e269b5001355500d431cce0c" -dependencies = [ - "diesel_table_macro_syntax", - "proc-macro2", - "quote", - "syn 2.0.55", -] - -[[package]] -name = "diesel_table_macro_syntax" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" -dependencies = [ - "syn 2.0.55", -] - [[package]] name = "difflib" version = "0.4.0" @@ -559,6 +544,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "either" version = "1.10.0" @@ -597,6 +588,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.0.2" @@ -813,6 +816,19 @@ name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692eaaf7f7607518dd3cef090f1474b61edc5301d8012f09579920df68b725ee" +dependencies = [ + "hashbrown", +] [[package]] name = "heck" @@ -1026,9 +1042,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" dependencies = [ "cc", "pkg-config", @@ -1252,7 +1268,6 @@ dependencies = [ "clap_complete", "clap_complete_nushell", "dialoguer", - "diesel", "directories", "eyre", "human-panic", @@ -1293,7 +1308,6 @@ dependencies = [ "chrono", "chrono-tz", "clap", - "diesel", "directories", "displaydoc", "dotenvy", @@ -1364,6 +1378,7 @@ dependencies = [ "getset", "humantime", "rstest", + "rusqlite", "serde", "serde_derive", "thiserror", @@ -1773,6 +1788,21 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rusqlite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +dependencies = [ + "bitflags 2.5.0", + "chrono", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -2791,6 +2821,26 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "zeroize" version = "1.7.0" From d3d94cec757c84b2bda90c1f9328482734410d1c Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 15:24:04 +0100 Subject: [PATCH 16/59] feat(migrations): implement migrations for pace_storage Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 116 ++++++++- Cargo.toml | 6 +- crates/storage/Cargo.toml | 10 +- crates/storage/src/entities.rs | 197 ++++++++++++++ crates/storage/src/entities/activities.rs | 60 +++++ .../src/entities/activities_categories.rs | 45 ++++ .../storage/src/entities/activities_tags.rs | 45 ++++ crates/storage/src/entities/activity_kinds.rs | 37 +++ .../storage/src/entities/activity_status.rs | 37 +++ crates/storage/src/entities/categories.rs | 39 +++ .../storage/src/entities/schema_migrations.rs | 37 +++ crates/storage/src/entities/tags.rs | 37 +++ crates/storage/src/lib.rs | 29 ++- crates/storage/src/migration.rs | 144 +++++++++++ .../create_activities_20240325143710.rs | 67 +++++ ...te_activities_categories_20240326130013.rs | 54 ++++ .../create_activities_tags_20240326125630.rs | 55 ++++ .../create_activity_kinds_20240326124253.rs | 31 +++ .../create_activity_status_20240326125819.rs | 31 +++ .../create_categories_20240326125937.rs | 32 +++ .../src/migration/create_schema_migrations.rs | 34 +++ .../migration/create_tags_20240326125555.rs | 31 +++ crates/storage/src/sqlite.rs | 19 +- crates/storage/src/storage.rs | 7 + crates/storage/src/storage_types.rs | 240 ------------------ db/README.md | 43 ---- .../20240325143710_create_activities.sql | 18 -- .../20240326124253_create_activity_kinds.sql | 8 - db/migrations/20240326125555_create_tags.sql | 8 - .../20240326125630_create_activities_tags.sql | 11 - .../20240326125819_create_activity_status.sql | 8 - .../20240326125937_create_categories.sql | 9 - ...326130013_create_activities_categories.sql | 11 - db/schema.sql | 55 ---- 34 files changed, 1163 insertions(+), 448 deletions(-) create mode 100644 crates/storage/src/entities.rs create mode 100644 crates/storage/src/entities/activities.rs create mode 100644 crates/storage/src/entities/activities_categories.rs create mode 100644 crates/storage/src/entities/activities_tags.rs create mode 100644 crates/storage/src/entities/activity_kinds.rs create mode 100644 crates/storage/src/entities/activity_status.rs create mode 100644 crates/storage/src/entities/categories.rs create mode 100644 crates/storage/src/entities/schema_migrations.rs create mode 100644 crates/storage/src/entities/tags.rs create mode 100644 crates/storage/src/migration.rs create mode 100644 crates/storage/src/migration/create_activities_20240325143710.rs create mode 100644 crates/storage/src/migration/create_activities_categories_20240326130013.rs create mode 100644 crates/storage/src/migration/create_activities_tags_20240326125630.rs create mode 100644 crates/storage/src/migration/create_activity_kinds_20240326124253.rs create mode 100644 crates/storage/src/migration/create_activity_status_20240326125819.rs create mode 100644 crates/storage/src/migration/create_categories_20240326125937.rs create mode 100644 crates/storage/src/migration/create_schema_migrations.rs create mode 100644 crates/storage/src/migration/create_tags_20240326125555.rs create mode 100644 crates/storage/src/storage.rs delete mode 100644 crates/storage/src/storage_types.rs delete mode 100644 db/migrations/20240325143710_create_activities.sql delete mode 100644 db/migrations/20240326124253_create_activity_kinds.sql delete mode 100644 db/migrations/20240326125555_create_tags.sql delete mode 100644 db/migrations/20240326125630_create_activities_tags.sql delete mode 100644 db/migrations/20240326125819_create_activity_status.sql delete mode 100644 db/migrations/20240326125937_create_categories.sql delete mode 100644 db/migrations/20240326130013_create_activities_categories.sql delete mode 100644 db/schema.sql diff --git a/Cargo.lock b/Cargo.lock index a7c0d513..894228c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -327,7 +327,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", "terminal_size", ] @@ -450,6 +450,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + [[package]] name = "deranged" version = "0.3.11" @@ -823,9 +858,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.9.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692eaaf7f7607518dd3cef090f1474b61edc5301d8012f09579920df68b725ee" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ "hashbrown", ] @@ -934,6 +969,17 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inherent" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "insta" version = "1.36.1" @@ -1042,9 +1088,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.28.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", "pkg-config", @@ -1359,6 +1405,9 @@ dependencies = [ "parking_lot", "rayon", "rusqlite", + "sea-query", + "sea-query-rusqlite", + "strum", "thiserror", "toml 0.8.12", "tracing", @@ -1790,9 +1839,9 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.31.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ "bitflags 2.5.0", "chrono", @@ -1858,6 +1907,53 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sea-query" +version = "0.30.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" +dependencies = [ + "chrono", + "inherent", + "sea-query-attr", + "sea-query-derive", +] + +[[package]] +name = "sea-query-attr" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878cf3d57f0e5bfacd425cdaccc58b4c06d68a7b71c63fc28710a20c88676808" +dependencies = [ + "darling", + "heck 0.4.1", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "sea-query-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a82fcb49253abcb45cdcb2adf92956060ec0928635eb21b4f7a6d8f25ab0bc" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.55", + "thiserror", +] + +[[package]] +name = "sea-query-rusqlite" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e74efa64c7ba4d62ed221bfd6bf8a685b1bbc37e29c51b1039405fc6c33a2dd" +dependencies = [ + "rusqlite", + "sea-query", +] + [[package]] name = "secrecy" version = "0.8.0" @@ -2012,6 +2108,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.0" diff --git a/Cargo.toml b/Cargo.toml index 1501449c..eee70f6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ humantime = "2.1.0" insta = "1.36.1" insta-cmd = "0.5.0" itertools = "0.12.1" -libsqlite3-sys = "0.28.0" +libsqlite3-sys = "0.27.0" merge = "0.1.0" miette = "7.2.0" once_cell = "1.19.0" @@ -51,7 +51,9 @@ parking_lot = "0.12.1" predicates = "3.1.0" rayon = "1.10.0" rstest = "0.18.2" -rusqlite = "0.31.0" +rusqlite = "0.30.0" +sea-query = "0.30.7" +sea-query-rusqlite = "0.5.0" serde = "1.0.197" serde_derive = "1.0.197" serde_json = "1.0.114" diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 25e52c0e..b59986da 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -22,7 +22,12 @@ include = [ [features] default = ["db"] db = ["rusqlite"] -rusqlite = ["dep:rusqlite", "dep:libsqlite3-sys"] +rusqlite = [ + "dep:rusqlite", + "dep:libsqlite3-sys", + "dep:sea-query", + "dep:sea-query-rusqlite", +] [dependencies] displaydoc = { workspace = true } @@ -35,6 +40,9 @@ pace_time = { workspace = true, features = ["db"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } +sea-query = { workspace = true, optional = true, no-default-features = true, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } +sea-query-rusqlite = { workspace = true, optional = true, features = ["with-chrono"] } +strum = { workspace = true } thiserror = { workspace = true } toml = { workspace = true, features = ["indexmap", "preserve_order"] } tracing = { workspace = true } diff --git a/crates/storage/src/entities.rs b/crates/storage/src/entities.rs new file mode 100644 index 00000000..ff000a6f --- /dev/null +++ b/crates/storage/src/entities.rs @@ -0,0 +1,197 @@ +pub mod activities; +pub mod activities_categories; +pub mod activities_tags; +pub mod activity_kinds; +pub mod activity_status; +pub mod categories; +pub mod schema_migrations; +pub mod tags; + +// impl SqliteActivity { +// pub fn to_sql_prepare_statement(&self) -> &'static str { +// "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" +// } + +// pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { +// let category = if let Some(category) = self.category() { +// category.to_sql()? +// } else { +// "NULL".to_sql()? +// }; + +// let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { +// let (end, duration) = end_opts.as_tuple(); +// (end.to_sql()?, duration.to_sql()?) +// } else { +// ("NULL".to_sql()?, "NULL".to_sql()?) +// }; + +// let parent_id = if let Some(parent_id) = self.parent_id() { +// parent_id.to_sql()? +// } else { +// "NULL".to_sql()? +// }; + +// let tags = if let Some(tags) = self.tags() { +// let tags = tags +// .iter() +// .map(|tag| tag.to_string()) +// .collect::>(); + +// tags.join(",").to_sql()? +// } else { +// "NULL".to_sql()? +// }; + +// let guid = ActivityGuid::new(); + +// Ok(( +// guid, +// vec![ +// // TODO: We create a new ID here, that should probably happen +// // TODO: somewhere else and needs a refactoring +// &guid, +// &category, +// &self.description(), +// &self.begin(), +// &end, +// &duration, +// &self.kind(), +// &self.status(), +// &tags, +// &parent_id, +// ], +// )) +// } +// } + +// impl SqliteActivityFilterKind { +// pub fn to_sql_statement(&self) -> &'static str { +// match self { +// Self::Everything => "SELECT * FROM activities", +// ActivityFilterKind::OnlyActivities => todo!(), +// ActivityFilterKind::Active => "SELECT * FROM activities WHERE status = 'in-progress'", +// ActivityFilterKind::ActiveIntermission => todo!(), +// ActivityFilterKind::Archived => "SELECT * FROM activities WHERE status = 'archived'", +// ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", +// ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", +// ActivityFilterKind::Intermission => todo!(), +// ActivityFilterKind::TimeRange(opts) => todo!(), +// } +// } +// } + +// impl TryFrom> for SqliteActivityEndOptions { +// type Error = rusqlite::Error; + +// fn try_from(row: &Row<'_>) -> Result { +// Ok(Self::new(row.get("end")?, row.get("duration")?)) +// } +// } + +// impl TryFrom> for SqliteActivityKindOptions { +// type Error = rusqlite::Error; + +// fn try_from(row: &Row<'_>) -> Result { +// Ok(Self::with_parent_id(row.get("parent_id")?)) +// } +// } + +// impl TryFrom> for SqliteActivity { +// type Error = rusqlite::Error; + +// fn try_from(row: &Row<'_>) -> Result { +// let begin_time: PaceDateTime = row.get("begin")?; + +// let description: String = row.get("description")?; + +// let tags_string: String = row.get("tags")?; + +// let tags = tags_string +// .split(',') +// .map(|tag| tag.to_string()) +// .collect::>(); + +// Ok(Activity::builder() +// .category(Some(row.get("category")?)) // TODO: Check for None +// .description(description) +// .begin(begin_time) +// .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None +// .kind(row.get("kind")?) +// .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None +// .tags(tags) +// .status(row.get("status")?) +// .build()) +// } +// } + +// impl TryFrom> for SqliteActivityGuid { +// type Error = rusqlite::Error; + +// fn try_from(row: &Row<'_>) -> Result { +// Ok(row.get("guid")?) +// } +// } + +// impl TryFrom> for SqliteActivityItem { +// type Error = rusqlite::Error; + +// fn try_from(row: &Row<'_>) -> Result { +// let activity_end_opts = ActivityEndOptions::from_row(row)?; + +// let activity_kind_opts = ActivityKindOptions::from_row(row)?; + +// let activity = Activity::from_row(row)?; + +// let guid = ActivityGuid::from_row(row)?; + +// Ok(Self::builder().guid(guid).activity(activity).build()) +// } +// } + +// impl ToSql for SqliteActivityGuid { +// fn to_sql(&self) -> rusqlite::Result> { +// Ok(rusqlite::types::ToSqlOutput::Owned( +// rusqlite::types::Value::Text(self.to_string()), +// )) +// } +// } + +// impl FromSql for SqliteActivityGuid { +// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { +// Ok(ActivityGuid::with_id( +// Ulid::from_string(value.as_str()?) +// .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, +// )) +// } +// } + +// impl ToSql for SqliteActivityKind { +// fn to_sql(&self) -> rusqlite::Result> { +// Ok(rusqlite::types::ToSqlOutput::Owned( +// rusqlite::types::Value::Text(self.to_string()), +// )) +// } +// } + +// impl FromSql for SqliteActivityKind { +// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { +// Ok(ActivityKind::from_str(value.as_str()?) +// .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) +// } +// } + +// impl ToSql for SqliteActivityStatusKind { +// fn to_sql(&self) -> rusqlite::Result> { +// Ok(rusqlite::types::ToSqlOutput::Owned( +// rusqlite::types::Value::Text(self.to_string()), +// )) +// } +// } + +// impl FromSql for SqliteActivityStatusKind { +// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { +// Ok(ActivityStatusKind::from_str(value.as_str()?) +// .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) +// } +// } diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs new file mode 100644 index 00000000..efdc5b6a --- /dev/null +++ b/crates/storage/src/entities/activities.rs @@ -0,0 +1,60 @@ +use rusqlite::{Error, Row}; +use sea_query::{ + enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, +}; +use strum::EnumIter; + +use crate::{ + entities::{activity_kinds::ActivityKindsIden, activity_status::ActivityStatusIden}, + storage::SQLiteEntity, +}; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct Activities { + pub guid: String, + pub category: String, + pub description: String, + pub begin: String, + pub end: Option, + pub duration: Option, + pub kind: String, + pub status: String, + pub parent_guid: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + SelfRef, + ActivitiesCategories, + ActivitiesTags, + ActivityKinds, + ActivityStatus, +} + +impl SQLiteEntity for Activities { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for Activities { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + category: row.get("category")?, + description: row.get("description")?, + begin: row.get("begin")?, + end: row.get("end")?, + duration: row.get("duration")?, + kind: row.get("kind")?, + status: row.get("status")?, + parent_guid: row.get("parent_guid")?, + }) + } +} diff --git a/crates/storage/src/entities/activities_categories.rs b/crates/storage/src/entities/activities_categories.rs new file mode 100644 index 00000000..0487457b --- /dev/null +++ b/crates/storage/src/entities/activities_categories.rs @@ -0,0 +1,45 @@ +use rusqlite::{Error, Row}; +use sea_query::{ + enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, +}; +use strum::EnumIter; + +use crate::{ + entities::{activities::ActivitiesIden, categories::CategoriesIden}, + storage::SQLiteEntity, +}; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct ActivitiesCategories { + pub guid: String, + pub category_guid: String, + pub activity_guid: String, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Activities, + Categories, +} + +impl SQLiteEntity for ActivitiesCategories { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for ActivitiesCategories { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + category_guid: row.get("category_guid")?, + activity_guid: row.get("activity_guid")?, + }) + } +} diff --git a/crates/storage/src/entities/activities_tags.rs b/crates/storage/src/entities/activities_tags.rs new file mode 100644 index 00000000..bdf81769 --- /dev/null +++ b/crates/storage/src/entities/activities_tags.rs @@ -0,0 +1,45 @@ +use rusqlite::{Error, Row}; +use sea_query::{ + enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, +}; +use strum::EnumIter; + +use crate::{ + entities::{activities::ActivitiesIden, tags::TagsIden}, + storage::SQLiteEntity, +}; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct ActivitiesTags { + pub guid: String, + pub tag_guid: String, + pub activity_guid: String, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Activities, + Tags, +} + +impl SQLiteEntity for ActivitiesTags { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for ActivitiesTags { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + tag_guid: row.get("tag_guid")?, + activity_guid: row.get("activity_guid")?, + }) + } +} diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs new file mode 100644 index 00000000..ec2f449d --- /dev/null +++ b/crates/storage/src/entities/activity_kinds.rs @@ -0,0 +1,37 @@ +use rusqlite::{Error, Row}; +use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use strum::EnumIter; + +use crate::storage::SQLiteEntity; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct ActivityKinds { + pub guid: String, + pub kind: String, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Activities, +} + +impl SQLiteEntity for ActivityKinds { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for ActivityKinds { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + kind: row.get("kind")?, + }) + } +} diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs new file mode 100644 index 00000000..92013c82 --- /dev/null +++ b/crates/storage/src/entities/activity_status.rs @@ -0,0 +1,37 @@ +use rusqlite::{Error, Row}; +use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use strum::EnumIter; + +use crate::storage::SQLiteEntity; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct ActivityStatus { + pub guid: String, + pub status: String, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Activities, +} + +impl SQLiteEntity for ActivityStatus { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for ActivityStatus { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + status: row.get("status")?, + }) + } +} diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs new file mode 100644 index 00000000..c9cf7cb1 --- /dev/null +++ b/crates/storage/src/entities/categories.rs @@ -0,0 +1,39 @@ +use rusqlite::{Error, Row}; +use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use strum::EnumIter; + +use crate::storage::SQLiteEntity; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct Categories { + pub guid: String, + pub category: String, + pub description: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + ActivitiesCategories, +} + +impl SQLiteEntity for Categories { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for Categories { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + category: row.get("category")?, + description: row.get("description")?, + }) + } +} diff --git a/crates/storage/src/entities/schema_migrations.rs b/crates/storage/src/entities/schema_migrations.rs new file mode 100644 index 00000000..0b29e4ee --- /dev/null +++ b/crates/storage/src/entities/schema_migrations.rs @@ -0,0 +1,37 @@ +use rusqlite::{Error, Row}; +use sea_query::{ + enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, +}; +use strum::EnumIter; + +use crate::{ + entities::{activity_kinds::ActivityKindsIden, activity_status::ActivityStatusIden}, + storage::SQLiteEntity, +}; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct SchemaMigrations { + pub guid: String, + pub version: i64, +} + +impl SQLiteEntity for SchemaMigrations { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for SchemaMigrations { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + version: row.get("version")?, + }) + } +} diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs new file mode 100644 index 00000000..7d0006bc --- /dev/null +++ b/crates/storage/src/entities/tags.rs @@ -0,0 +1,37 @@ +use rusqlite::{Error, Row}; +use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use strum::EnumIter; + +use crate::storage::SQLiteEntity; + +#[derive(Clone, Debug, PartialEq, Eq)] +#[enum_def] +pub struct Tags { + pub guid: String, + pub tag: String, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + ActivitiesTags, +} + +impl SQLiteEntity for Tags { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom> for Tags { + type Error = Error; + + fn try_from(row: Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + tag: row.get("tag")?, + }) + } +} diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 552b3a96..24096c80 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,3 +1,19 @@ +pub mod migration; +pub mod storage; + +pub mod error; + +/// A type of storage that can be synced to a persistent medium - a file +pub mod file; + +/// An in-memory storage backend for activities. +pub mod in_memory; + +#[cfg(feature = "rusqlite")] +pub mod sqlite; + +pub mod entities; + use std::sync::Arc; use pace_core::prelude::{ @@ -12,19 +28,6 @@ use crate::{ sqlite::SqliteActivityStorage, }; -pub mod error; - -/// A type of storage that can be synced to a persistent medium - a file -pub mod file; - -/// An in-memory storage backend for activities. -pub mod in_memory; - -#[cfg(feature = "rusqlite")] -pub mod sqlite; - -pub mod storage_types; - /// Get the storage backend from the configuration. /// /// # Arguments diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs new file mode 100644 index 00000000..0b4f6af5 --- /dev/null +++ b/crates/storage/src/migration.rs @@ -0,0 +1,144 @@ +pub mod create_activities_20240325143710; +pub mod create_activities_categories_20240326130013; +pub mod create_activities_tags_20240326125630; +pub mod create_activity_kinds_20240326124253; +pub mod create_activity_status_20240326125819; +pub mod create_categories_20240326125937; +pub mod create_schema_migrations; +pub mod create_tags_20240326125555; + +use eyre::OptionExt; +use rusqlite::Connection; +use sea_query::{Cond, Expr, Query, SqliteQueryBuilder}; +use std::collections::VecDeque; +use ulid::Ulid; + +use pace_core::prelude::PaceStorageResult; + +use crate::entities::schema_migrations::SchemaMigrationsIden; + +pub trait SQLiteMigration { + fn version(&self) -> String; + fn up(&self) -> String; + fn down(&self) -> String; +} + +pub struct SQLiteMigrator<'conn> { + iterator: Box>>, + applied: VecDeque>, + connection: &'conn Connection, +} + +impl<'conn> SQLiteMigrator<'conn> { + pub fn new(connection: &'conn Connection) -> PaceStorageResult { + let migrator = Self { + iterator: Self::load(), + applied: VecDeque::default(), + connection, + }; + + migrator.init()?; + + Ok(migrator) + } + + fn init(&self) -> PaceStorageResult<()> { + let migration = self.iterator.next().ok_or_eyre("No migrations found")?; + let query = migration.up(); + + self.connection.execute(&query, [])?; + + self.applied.push_back(migration); + + Ok(()) + } + + /// Load all migrations from the directory + /// + /// # Attention + /// + /// These are loaded in order, so make sure to keep the order correct. + /// The first migration should be the migration table creation. + fn load() -> Box>> { + let migrations: Vec> = vec![ + Box::new(create_schema_migrations::Migration), + Box::new(create_activities_20240325143710::Migration), + Box::new(create_activity_kinds_20240326124253::Migration), + Box::new(create_tags_20240326125555::Migration), + Box::new(create_activities_tags_20240326125630::Migration), + Box::new(create_activity_status_20240326125819::Migration), + Box::new(create_categories_20240326125937::Migration), + Box::new(create_activities_categories_20240326130013::Migration), + ]; + + Box::new(migrations.into_iter()) + } + + /// Push migration version to schema_migrations table + fn push_migration_version(&self, version: String) -> PaceStorageResult<()> { + let query = Query::insert() + .into_table(SchemaMigrationsIden::Table) + .columns([SchemaMigrationsIden::Guid, SchemaMigrationsIden::Version]) + .values([Ulid::new().to_string().into(), version.into()])? + .to_owned(); + + let query = query.to_string(SqliteQueryBuilder); + + self.connection.execute(&query, [])?; + + Ok(()) + } + + /// Remove migration version from schema_migrations table + fn remove_migration_version(&self, version: String) -> PaceStorageResult<()> { + let query = Query::delete() + .from_table(SchemaMigrationsIden::Table) + .cond_where(Cond::any().add(Expr::col(SchemaMigrationsIden::Version).eq(version))) + .to_owned(); + + let query = query.to_string(SqliteQueryBuilder); + + self.connection.execute(&query, [])?; + + Ok(()) + } + + /// Migrate to the latest version + pub fn up(&self) -> PaceStorageResult<()> { + while let Some(migration) = self.iterator.next() { + let query = migration.up(); + + self.connection.execute(&query, [])?; + + self.push_migration_version(migration.version())?; + + self.applied.push_back(migration); + } + + Ok(()) + } + + /// Rollback the most recent migration + pub fn down(&self) -> PaceStorageResult { + let migration = self + .applied + .pop_back() + .ok_or_eyre("No migrations to rollback")?; + + let query = migration.down(); + + self.connection.execute(&query, [])?; + + self.remove_migration_version(migration.version())?; + + Ok(migration.version()) + } + + /// List applied and pending migrations + pub fn status(&self) -> PaceStorageResult<(Vec, Vec)> { + let applied = self.applied.iter().map(|m| m.version()).collect(); + let pending = self.iterator.map(|m| m.version()).collect(); + + Ok((applied, pending)) + } +} diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs new file mode 100644 index 00000000..2f20b6e2 --- /dev/null +++ b/crates/storage/src/migration/create_activities_20240325143710.rs @@ -0,0 +1,67 @@ +use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; + +use crate::{ + entities::{ + activities::ActivitiesIden, activity_kinds::ActivityKindsIden, + activity_status::ActivityStatusIden, + }, + migration::SQLiteMigration, +}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240325143710".to_string() + } + + fn up(&self) -> String { + Table::create() + .table(ActivitiesIden::Table) + .if_not_exists() + .col( + ColumnDef::new(ActivitiesIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(ActivitiesIden::Category).text().not_null()) + .col( + ColumnDef::new(ActivitiesIden::Description) + .text() + .not_null(), + ) + .col(ColumnDef::new(ActivitiesIden::Begin).text().not_null()) + .col(ColumnDef::new(ActivitiesIden::End).text().null()) + .col(ColumnDef::new(ActivitiesIden::Duration).integer().null()) + .col(ColumnDef::new(ActivitiesIden::Kind).text().not_null()) + .col(ColumnDef::new(ActivitiesIden::Status).text().not_null()) + .col(ColumnDef::new(ActivitiesIden::ParentGuid).text().null()) + .foreign_key( + ForeignKey::create() + .name("fk_activities_parent_guid") + .from_col(ActivitiesIden::ParentGuid) + .to_col(ActivitiesIden::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_kind") + .from(ActivitiesIden::Table, ActivitiesIden::Kind) + .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_status") + .from(ActivitiesIden::Table, ActivitiesIden::Status) + .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), + ) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(ActivitiesIden::Table) + .if_exists() + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_activities_categories_20240326130013.rs b/crates/storage/src/migration/create_activities_categories_20240326130013.rs new file mode 100644 index 00000000..3ee374e7 --- /dev/null +++ b/crates/storage/src/migration/create_activities_categories_20240326130013.rs @@ -0,0 +1,54 @@ +use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; + +use crate::{ + entities::{ + activities::ActivitiesIden, activities_categories::ActivitiesCategoriesIden, + categories::CategoriesIden, + }, + migration::SQLiteMigration, +}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240326130013".to_string() + } + + fn up(&self) -> String { + Table::create() + .table(ActivitiesCategoriesIden::Table) + .if_not_exists() + .col( + ColumnDef::new(ActivitiesCategoriesIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_categories_category_guid") + .from( + ActivitiesCategoriesIden::Table, + ActivitiesCategoriesIden::CategoryGuid, + ) + .to(CategoriesIden::Table, CategoriesIden::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_categories_activity_guid") + .from( + ActivitiesCategoriesIden::Table, + ActivitiesCategoriesIden::ActivityGuid, + ) + .to(ActivitiesIden::Table, ActivitiesIden::Guid), + ) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(ActivitiesCategoriesIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_activities_tags_20240326125630.rs b/crates/storage/src/migration/create_activities_tags_20240326125630.rs new file mode 100644 index 00000000..432332bc --- /dev/null +++ b/crates/storage/src/migration/create_activities_tags_20240326125630.rs @@ -0,0 +1,55 @@ +use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; + +use crate::{ + entities::{activities::ActivitiesIden, activities_tags::ActivitiesTagsIden, tags::TagsIden}, + migration::SQLiteMigration, +}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240326125630".to_string() + } + + fn up(&self) -> String { + Table::create() + .if_not_exists() + .table(ActivitiesTagsIden::Table) + .col( + ColumnDef::new(ActivitiesTagsIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col( + ColumnDef::new(ActivitiesTagsIden::TagGuid) + .text() + .not_null(), + ) + .col( + ColumnDef::new(ActivitiesTagsIden::ActivityGuid) + .text() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_tags_tag_guid") + .from(ActivitiesTagsIden::Table, ActivitiesTagsIden::TagGuid) + .to(TagsIden::Table, TagsIden::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_tags_activity_guid") + .from(ActivitiesTagsIden::Table, ActivitiesTagsIden::ActivityGuid) + .to(ActivitiesIden::Table, ActivitiesIden::Guid), + ) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(ActivitiesTagsIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_activity_kinds_20240326124253.rs b/crates/storage/src/migration/create_activity_kinds_20240326124253.rs new file mode 100644 index 00000000..e3bf2bca --- /dev/null +++ b/crates/storage/src/migration/create_activity_kinds_20240326124253.rs @@ -0,0 +1,31 @@ +use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; + +use crate::{entities::activity_kinds::ActivityKindsIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240326124253".to_string() + } + + fn up(&self) -> String { + Table::create() + .if_not_exists() + .table(ActivityKindsIden::Table) + .col( + ColumnDef::new(ActivityKindsIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(ActivityKindsIden::Kind).text().not_null()) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(ActivityKindsIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_activity_status_20240326125819.rs b/crates/storage/src/migration/create_activity_status_20240326125819.rs new file mode 100644 index 00000000..34318ff5 --- /dev/null +++ b/crates/storage/src/migration/create_activity_status_20240326125819.rs @@ -0,0 +1,31 @@ +use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; + +use crate::{entities::activity_status::ActivityStatusIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240326125819".to_string() + } + + fn up(&self) -> String { + Table::create() + .if_not_exists() + .table(ActivityStatusIden::Table) + .col( + ColumnDef::new(ActivityStatusIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(ActivityStatusIden::Status).text().not_null()) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(ActivityStatusIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_categories_20240326125937.rs b/crates/storage/src/migration/create_categories_20240326125937.rs new file mode 100644 index 00000000..f15ac5ef --- /dev/null +++ b/crates/storage/src/migration/create_categories_20240326125937.rs @@ -0,0 +1,32 @@ +use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; + +use crate::{entities::categories::CategoriesIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240326125937".to_string() + } + + fn up(&self) -> String { + Table::create() + .if_not_exists() + .table(CategoriesIden::Table) + .col( + ColumnDef::new(CategoriesIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(CategoriesIden::Category).text().not_null()) + .col(ColumnDef::new(CategoriesIden::Description).text().null()) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(CategoriesIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_schema_migrations.rs b/crates/storage/src/migration/create_schema_migrations.rs new file mode 100644 index 00000000..da9fd018 --- /dev/null +++ b/crates/storage/src/migration/create_schema_migrations.rs @@ -0,0 +1,34 @@ +use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; + +use crate::{entities::schema_migrations::SchemaMigrationsIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "".to_string() + } + + fn up(&self) -> String { + Table::create() + .table(SchemaMigrationsIden::Table) + .col( + ColumnDef::new(SchemaMigrationsIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col( + ColumnDef::new(SchemaMigrationsIden::Version) + .integer() + .not_null(), + ) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(SchemaMigrationsIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_tags_20240326125555.rs b/crates/storage/src/migration/create_tags_20240326125555.rs new file mode 100644 index 00000000..c47c19b5 --- /dev/null +++ b/crates/storage/src/migration/create_tags_20240326125555.rs @@ -0,0 +1,31 @@ +use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; + +use crate::{entities::tags::TagsIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240326125555".to_string() + } + + fn up(&self) -> String { + Table::create() + .if_not_exists() + .table(TagsIden::Table) + .col( + ColumnDef::new(TagsIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(TagsIden::Tag).text().not_null()) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(TagsIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/sqlite.rs index dbb9ade7..d912d9c1 100644 --- a/crates/storage/src/sqlite.rs +++ b/crates/storage/src/sqlite.rs @@ -2,8 +2,6 @@ use std::collections::BTreeMap; use itertools::Itertools; use rusqlite::Connection; - -use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use tracing::debug; use pace_core::prelude::{ @@ -12,14 +10,9 @@ use pace_core::prelude::{ ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceStorageOptResult, PaceStorageResult, ResumeOptions, SyncStorage, UpdateOptions, }; +use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use crate::error::DatabaseStorageErrorKind; - -pub trait FromRow { - fn from_row(row: &rusqlite::Row<'_>) -> PaceStorageResult - where - Self: Sized; -} +use crate::{error::DatabaseStorageErrorKind, migration::SQLiteMigrator}; #[derive(Debug)] pub struct SqliteActivityStorage { @@ -38,17 +31,15 @@ impl SqliteActivityStorage { impl ActivityStorage for SqliteActivityStorage { fn setup(&self) -> PaceStorageResult<()> { - // we embed `db/schema.sql` and run it against the database - // as a setup step - let schema = include_str!("../../../db/schema.sql"); + let migrator = SQLiteMigrator::new(&self.connection)?; - self.connection.execute_batch(schema)?; + migrator.up()?; Ok(()) } fn teardown(&self) -> PaceStorageResult<()> { - Ok(()) + unimplemented!("teardown not implemented for sqlite storage") } fn identify(&self) -> String { diff --git a/crates/storage/src/storage.rs b/crates/storage/src/storage.rs new file mode 100644 index 00000000..dc837985 --- /dev/null +++ b/crates/storage/src/storage.rs @@ -0,0 +1,7 @@ +use rusqlite::{Error, Row}; + +pub trait SQLiteEntity { + fn from_row(row: Row<'_>) -> Result + where + Self: Sized; +} diff --git a/crates/storage/src/storage_types.rs b/crates/storage/src/storage_types.rs deleted file mode 100644 index a39fa7fc..00000000 --- a/crates/storage/src/storage_types.rs +++ /dev/null @@ -1,240 +0,0 @@ -use std::{collections::HashSet, str::FromStr}; - -use pace_time::date_time::PaceDateTime; -use rusqlite::{types::FromSql, Row, ToSql}; -use ulid::Ulid; - -// use pace_time::rusqlite::*; - -use pace_core::prelude::{ - Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, - ActivityKindOptions, ActivityStatusKind, PaceResult, -}; - -use crate::sqlite::FromRow; - -pub struct SqliteActivity(Activity); - -impl std::ops::Deref for SqliteActivity { - type Target = Activity; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} -pub struct SqliteActivityFilterKind(ActivityFilterKind); - -impl std::ops::Deref for SqliteActivityFilterKind { - type Target = ActivityFilterKind; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub struct SqliteActivityGuid(ActivityGuid); - -impl std::ops::Deref for SqliteActivityGuid { - type Target = ActivityGuid; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} -pub struct SqliteActivityKind(ActivityKind); - -impl std::ops::Deref for SqliteActivityKind { - type Target = ActivityKind; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} -pub struct SqliteActivityStatusKind(ActivityStatusKind); - -impl std::ops::Deref for SqliteActivityStatusKind { - type Target = ActivityStatusKind; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl SqliteActivity { - pub fn to_sql_prepare_statement(&self) -> &'static str { - "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" - } - - pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { - let category = if let Some(category) = self.category() { - category.to_sql()? - } else { - "NULL".to_sql()? - }; - - let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { - let (end, duration) = end_opts.as_tuple(); - (end.to_sql()?, duration.to_sql()?) - } else { - ("NULL".to_sql()?, "NULL".to_sql()?) - }; - - let parent_id = if let Some(parent_id) = self.parent_id() { - parent_id.to_sql()? - } else { - "NULL".to_sql()? - }; - - let tags = if let Some(tags) = self.tags() { - let tags = tags - .iter() - .map(|tag| tag.to_string()) - .collect::>(); - - tags.join(",").to_sql()? - } else { - "NULL".to_sql()? - }; - - let guid = ActivityGuid::new(); - - Ok(( - guid, - vec![ - // TODO: We create a new ID here, that should probably happen - // TODO: somewhere else and needs a refactoring - &guid, - &category, - &self.description(), - &self.begin(), - &end, - &duration, - &self.kind(), - &self.status(), - &tags, - &parent_id, - ], - )) - } -} - -impl SqliteActivityFilterKind { - pub fn to_sql_statement(&self) -> &'static str { - match self { - Self::Everything => "SELECT * FROM activities", - ActivityFilterKind::OnlyActivities => todo!(), - ActivityFilterKind::Active => "SELECT * FROM activities WHERE status = 'in-progress'", - ActivityFilterKind::ActiveIntermission => todo!(), - ActivityFilterKind::Archived => "SELECT * FROM activities WHERE status = 'archived'", - ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", - ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", - ActivityFilterKind::Intermission => todo!(), - ActivityFilterKind::TimeRange(opts) => todo!(), - } - } -} - -impl FromRow for ActivityEndOptions { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(Self::new(row.get("end")?, row.get("duration")?)) - } -} - -impl FromRow for ActivityKindOptions { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(Self::with_parent_id(row.get("parent_id")?)) - } -} - -impl FromRow for Activity { - fn from_row(row: &Row<'_>) -> PaceResult { - let begin_time: PaceDateTime = row.get("begin")?; - - let description: String = row.get("description")?; - - let tags_string: String = row.get("tags")?; - - let tags = tags_string - .split(',') - .map(|tag| tag.to_string()) - .collect::>(); - - Ok(Activity::builder() - .category(Some(row.get("category")?)) // TODO: Check for None - .description(description) - .begin(begin_time) - .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None - .kind(row.get("kind")?) - .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None - .tags(tags) - .status(row.get("status")?) - .build()) - } -} - -impl FromRow for ActivityGuid { - fn from_row(row: &Row<'_>) -> PaceResult { - Ok(row.get("guid")?) - } -} - -impl FromRow for ActivityItem { - fn from_row(row: &Row<'_>) -> PaceResult { - let activity_end_opts = ActivityEndOptions::from_row(row)?; - - let activity_kind_opts = ActivityKindOptions::from_row(row)?; - - let activity = Activity::from_row(row)?; - - let guid = ActivityGuid::from_row(row)?; - - Ok(Self::builder().guid(guid).activity(activity).build()) - } -} - -impl ToSql for SqliteActivityGuid { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } -} - -impl FromSql for SqliteActivityGuid { - fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { - Ok(ActivityGuid::with_id( - Ulid::from_string(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, - )) - } -} - -impl ToSql for SqliteActivityKind { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } -} - -impl FromSql for SqliteActivityKind { - fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { - Ok(ActivityKind::from_str(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) - } -} - -impl ToSql for SqliteActivityStatusKind { - fn to_sql(&self) -> rusqlite::Result> { - Ok(rusqlite::types::ToSqlOutput::Owned( - rusqlite::types::Value::Text(self.to_string()), - )) - } -} - -impl FromSql for SqliteActivityStatusKind { - fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { - Ok(ActivityStatusKind::from_str(value.as_str()?) - .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) - } -} diff --git a/db/README.md b/db/README.md index 2d6f465e..543970b4 100644 --- a/db/README.md +++ b/db/README.md @@ -3,49 +3,6 @@ This directory contains the database schema and migrations for the application. It also contains the development database used for testing and development. -## Migrations - -This directory contains all the migrations for the database. Migrations are used -to manage the database schema and are run in order to update the database to the -latest schema version. - -## Creating a Migration - -To create a new migration, run the following command: - -```console -dbmate new -``` - -This will create a new migration file in the `migrations` directory with the -name `_.sql`. - -## Running Migrations - -To run all pending migrations, run the following command: - -```console -dbmate up -``` - -To rollback the last migration, run the following command: - -```console -dbmate down -``` - -To rollback all migrations, run the following command: - -```console -dbmate drop -``` - -For more information on the `dbmate` CLI, run the following command: - -```console -dbmate help -``` - ## Database Connection The database connection string is read from the `DATABASE_URL` environment diff --git a/db/migrations/20240325143710_create_activities.sql b/db/migrations/20240325143710_create_activities.sql deleted file mode 100644 index 609b5631..00000000 --- a/db/migrations/20240325143710_create_activities.sql +++ /dev/null @@ -1,18 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS activities ( - guid TEXT PRIMARY KEY, - category TEXT NOT NULL, - description TEXT NOT NULL, - begin TEXT NOT NULL, - end TEXT NULL, - duration INTEGER NULL, - kind TEXT NOT NULL, - status TEXT NOT NULL, - parent_guid TEXT NULL, - FOREIGN KEY (kind) REFERENCES activity_kinds(guid), - FOREIGN KEY (status) REFERENCES activity_status(guid), - FOREIGN KEY (parent_guid) REFERENCES activities(guid) -); - --- migrate:down -DROP TABLE activities; diff --git a/db/migrations/20240326124253_create_activity_kinds.sql b/db/migrations/20240326124253_create_activity_kinds.sql deleted file mode 100644 index ca7bd7ad..00000000 --- a/db/migrations/20240326124253_create_activity_kinds.sql +++ /dev/null @@ -1,8 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS activity_kinds ( - guid TEXT PRIMARY KEY, - kind TEXT NOT NULL -); - --- migrate:down -DROP TABLE activity_kinds; \ No newline at end of file diff --git a/db/migrations/20240326125555_create_tags.sql b/db/migrations/20240326125555_create_tags.sql deleted file mode 100644 index 738d4ba1..00000000 --- a/db/migrations/20240326125555_create_tags.sql +++ /dev/null @@ -1,8 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS tags ( - guid TEXT PRIMARY KEY, - tag TEXT NOT NULL -); - --- migrate:down -DROP TABLE tags; \ No newline at end of file diff --git a/db/migrations/20240326125630_create_activities_tags.sql b/db/migrations/20240326125630_create_activities_tags.sql deleted file mode 100644 index 1e145396..00000000 --- a/db/migrations/20240326125630_create_activities_tags.sql +++ /dev/null @@ -1,11 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS activities_tags ( - guid TEXT PRIMARY KEY, - tag_guid TEXT NOT NULL, - activity_guid TEXT NOT NULL, - FOREIGN KEY (tag_guid) REFERENCES tags(guid), - FOREIGN KEY (activity_guid) REFERENCES activities(guid) -); - --- migrate:down -DROP TABLE activities_tags; diff --git a/db/migrations/20240326125819_create_activity_status.sql b/db/migrations/20240326125819_create_activity_status.sql deleted file mode 100644 index 10532bb8..00000000 --- a/db/migrations/20240326125819_create_activity_status.sql +++ /dev/null @@ -1,8 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS activity_status ( - guid TEXT PRIMARY KEY, - status TEXT NOT NULL -); - --- migrate:down -DROP TABLE activity_status; diff --git a/db/migrations/20240326125937_create_categories.sql b/db/migrations/20240326125937_create_categories.sql deleted file mode 100644 index dfdcbc1c..00000000 --- a/db/migrations/20240326125937_create_categories.sql +++ /dev/null @@ -1,9 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS categories ( - guid TEXT PRIMARY KEY, - category TEXT NOT NULL, - description TEXT NULL -); - --- migrate:down -DROP TABLE categories; diff --git a/db/migrations/20240326130013_create_activities_categories.sql b/db/migrations/20240326130013_create_activities_categories.sql deleted file mode 100644 index f15e8106..00000000 --- a/db/migrations/20240326130013_create_activities_categories.sql +++ /dev/null @@ -1,11 +0,0 @@ --- migrate:up -CREATE TABLE IF NOT EXISTS activities_categories ( - guid TEXT PRIMARY KEY, - category_guid TEXT NOT NULL, - activity_guid TEXT NOT NULL, - FOREIGN KEY (category_guid) REFERENCES categories(guid), - FOREIGN KEY (activity_guid) REFERENCES activities(guid) -); - --- migrate:down -DROP TABLE activities_categories; diff --git a/db/schema.sql b/db/schema.sql deleted file mode 100644 index 4d05384d..00000000 --- a/db/schema.sql +++ /dev/null @@ -1,55 +0,0 @@ -CREATE TABLE IF NOT EXISTS "schema_migrations" (version varchar(128) primary key); -CREATE TABLE activities ( - guid TEXT PRIMARY KEY, - category TEXT NOT NULL, - description TEXT NOT NULL, - begin TEXT NOT NULL, - end TEXT NULL, - duration INTEGER NULL, - kind TEXT NOT NULL, - status TEXT NOT NULL, - parent_guid TEXT NULL, - FOREIGN KEY (kind) REFERENCES activity_kinds(guid), - FOREIGN KEY (status) REFERENCES activity_status(guid), - FOREIGN KEY (parent_guid) REFERENCES activities(guid) -); -CREATE TABLE activity_kinds ( - guid TEXT PRIMARY KEY, - kind TEXT NOT NULL -); -CREATE TABLE tags ( - guid TEXT PRIMARY KEY, - tag TEXT NOT NULL -); -CREATE TABLE activities_tags ( - guid TEXT PRIMARY KEY, - tag_guid TEXT NOT NULL, - activity_guid TEXT NOT NULL, - FOREIGN KEY (tag_guid) REFERENCES tags(guid), - FOREIGN KEY (activity_guid) REFERENCES activities(guid) -); -CREATE TABLE activity_status ( - guid TEXT PRIMARY KEY, - status TEXT NOT NULL -); -CREATE TABLE categories ( - guid TEXT PRIMARY KEY, - category TEXT NOT NULL, - description TEXT NULL -); -CREATE TABLE activities_categories ( - guid TEXT PRIMARY KEY, - category_guid TEXT NOT NULL, - activity_guid TEXT NOT NULL, - FOREIGN KEY (category_guid) REFERENCES categories(guid), - FOREIGN KEY (activity_guid) REFERENCES activities(guid) -); --- Dbmate schema migrations -INSERT INTO "schema_migrations" (version) VALUES - ('20240325143710'), - ('20240326124253'), - ('20240326125555'), - ('20240326125630'), - ('20240326125819'), - ('20240326125937'), - ('20240326130013'); From bc38a5a31eadb9c275835380f8e667d45a8f7d7f Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 15:39:24 +0100 Subject: [PATCH 17/59] fix get_storage_from_config Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/src/error.rs | 3 --- crates/storage/src/lib.rs | 16 +++++----------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/crates/storage/src/error.rs b/crates/storage/src/error.rs index 77da8f13..af7ffe8f 100644 --- a/crates/storage/src/error.rs +++ b/crates/storage/src/error.rs @@ -43,9 +43,6 @@ pub enum DatabaseStorageErrorKind { /// No connection string provided NoConnectionString, - /// No configuration settings provided in configuration file, please set them up with `pace setup config` - NoConfigSettings, - /// This database engine is currently not supported: {0} UnsupportedDatabaseEngine(DatabaseEngineKind), diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 24096c80..98bb4483 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -48,12 +48,8 @@ pub fn get_storage_from_config(config: &PaceConfig) -> PaceStorageResult { - if config.database().is_some() { - let Some(db_config) = config.database() else { - return Err(DatabaseStorageErrorKind::NoConfigSettings.into()); - }; - - let storage: Arc = match db_config.engine() { + if let Some(db_config) = config.database() { + match db_config.engine() { DatabaseEngineKind::Sqlite => { #[cfg(feature = "rusqlite")] { @@ -77,12 +73,10 @@ pub fn get_storage_from_config(config: &PaceConfig) -> PaceStorageResult Arc::new(InMemoryActivityStorage::new()), _ => return Err(PaceStorageErrorKind::StorageNotImplemented.into()), From 2c343ba9f51c17debd8a880ded93bdf3c6decbbe Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 15:41:23 +0100 Subject: [PATCH 18/59] remove unused imports Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/src/entities/activities.rs | 9 ++------- crates/storage/src/entities/activities_categories.rs | 9 ++------- crates/storage/src/entities/activities_tags.rs | 9 ++------- crates/storage/src/entities/activity_kinds.rs | 2 +- crates/storage/src/entities/activity_status.rs | 2 +- crates/storage/src/entities/categories.rs | 2 +- crates/storage/src/entities/schema_migrations.rs | 10 ++-------- crates/storage/src/entities/tags.rs | 2 +- 8 files changed, 12 insertions(+), 33 deletions(-) diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs index efdc5b6a..a2293c50 100644 --- a/crates/storage/src/entities/activities.rs +++ b/crates/storage/src/entities/activities.rs @@ -1,13 +1,8 @@ use rusqlite::{Error, Row}; -use sea_query::{ - enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, -}; +use sea_query::enum_def; use strum::EnumIter; -use crate::{ - entities::{activity_kinds::ActivityKindsIden, activity_status::ActivityStatusIden}, - storage::SQLiteEntity, -}; +use crate::storage::SQLiteEntity; #[derive(Clone, Debug, PartialEq, Eq)] #[enum_def] diff --git a/crates/storage/src/entities/activities_categories.rs b/crates/storage/src/entities/activities_categories.rs index 0487457b..bee3d1e5 100644 --- a/crates/storage/src/entities/activities_categories.rs +++ b/crates/storage/src/entities/activities_categories.rs @@ -1,13 +1,8 @@ use rusqlite::{Error, Row}; -use sea_query::{ - enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, -}; +use sea_query::enum_def; use strum::EnumIter; -use crate::{ - entities::{activities::ActivitiesIden, categories::CategoriesIden}, - storage::SQLiteEntity, -}; +use crate::storage::SQLiteEntity; #[derive(Clone, Debug, PartialEq, Eq)] #[enum_def] diff --git a/crates/storage/src/entities/activities_tags.rs b/crates/storage/src/entities/activities_tags.rs index bdf81769..6aec968d 100644 --- a/crates/storage/src/entities/activities_tags.rs +++ b/crates/storage/src/entities/activities_tags.rs @@ -1,13 +1,8 @@ use rusqlite::{Error, Row}; -use sea_query::{ - enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, -}; +use sea_query::enum_def; use strum::EnumIter; -use crate::{ - entities::{activities::ActivitiesIden, tags::TagsIden}, - storage::SQLiteEntity, -}; +use crate::storage::SQLiteEntity; #[derive(Clone, Debug, PartialEq, Eq)] #[enum_def] diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs index ec2f449d..a3ad3c7f 100644 --- a/crates/storage/src/entities/activity_kinds.rs +++ b/crates/storage/src/entities/activity_kinds.rs @@ -1,5 +1,5 @@ use rusqlite::{Error, Row}; -use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use sea_query::enum_def; use strum::EnumIter; use crate::storage::SQLiteEntity; diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs index 92013c82..8945a9b2 100644 --- a/crates/storage/src/entities/activity_status.rs +++ b/crates/storage/src/entities/activity_status.rs @@ -1,5 +1,5 @@ use rusqlite::{Error, Row}; -use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use sea_query::enum_def; use strum::EnumIter; use crate::storage::SQLiteEntity; diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs index c9cf7cb1..4f3161f7 100644 --- a/crates/storage/src/entities/categories.rs +++ b/crates/storage/src/entities/categories.rs @@ -1,5 +1,5 @@ use rusqlite::{Error, Row}; -use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use sea_query::enum_def; use strum::EnumIter; use crate::storage::SQLiteEntity; diff --git a/crates/storage/src/entities/schema_migrations.rs b/crates/storage/src/entities/schema_migrations.rs index 0b29e4ee..5b1de416 100644 --- a/crates/storage/src/entities/schema_migrations.rs +++ b/crates/storage/src/entities/schema_migrations.rs @@ -1,13 +1,7 @@ use rusqlite::{Error, Row}; -use sea_query::{ - enum_def, ColumnDef, Expr, ForeignKey, Func, Iden, Order, Query, SqliteQueryBuilder, Table, -}; -use strum::EnumIter; +use sea_query::enum_def; -use crate::{ - entities::{activity_kinds::ActivityKindsIden, activity_status::ActivityStatusIden}, - storage::SQLiteEntity, -}; +use crate::storage::SQLiteEntity; #[derive(Clone, Debug, PartialEq, Eq)] #[enum_def] diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs index 7d0006bc..b907c02d 100644 --- a/crates/storage/src/entities/tags.rs +++ b/crates/storage/src/entities/tags.rs @@ -1,5 +1,5 @@ use rusqlite::{Error, Row}; -use sea_query::{enum_def, ColumnDef, Expr, Func, Iden, Order, Query, SqliteQueryBuilder, Table}; +use sea_query::enum_def; use strum::EnumIter; use crate::storage::SQLiteEntity; From fcf6ce2dc37be7e3c1db87aaabce32fd97953664 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:43:00 +0100 Subject: [PATCH 19/59] create based values for activity status and kind Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/domain/activity.rs | 2 + crates/core/src/domain/status.rs | 3 +- crates/storage/src/entities.rs | 21 +++++++++++ crates/storage/src/migration.rs | 20 ++++++---- ...ate_activity_kind_values_20240327162015.rs | 37 +++++++++++++++++++ ...e_activity_status_values_20240327163645.rs | 37 +++++++++++++++++++ 6 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 crates/storage/src/migration/create_activity_kind_values_20240327162015.rs create mode 100644 crates/storage/src/migration/create_activity_status_values_20240327163645.rs diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index c469a8f9..b8fe44ca 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -8,6 +8,7 @@ use pace_time::{ date_time::PaceDateTime, duration::{calculate_duration, duration_to_str, PaceDuration}, }; +use strum::EnumIter; use serde_derive::{Deserialize, Serialize}; use std::{collections::HashSet, fmt::Display}; @@ -82,6 +83,7 @@ impl From<(ActivityGuid, Activity)> for ActivityItem { PartialOrd, Ord, EnumString, + EnumIter, strum::Display, )] #[serde(rename_all = "kebab-case")] diff --git a/crates/core/src/domain/status.rs b/crates/core/src/domain/status.rs index 4675a8f5..7afe2e42 100644 --- a/crates/core/src/domain/status.rs +++ b/crates/core/src/domain/status.rs @@ -1,5 +1,5 @@ use serde_derive::{Deserialize, Serialize}; -use strum::EnumString; +use strum::{EnumIter, EnumString}; #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "kebab-case")] @@ -29,6 +29,7 @@ pub enum TaskStatus { PartialOrd, Ord, EnumString, + EnumIter, strum::Display, )] #[serde(rename_all = "kebab-case")] diff --git a/crates/storage/src/entities.rs b/crates/storage/src/entities.rs index ff000a6f..2df21d24 100644 --- a/crates/storage/src/entities.rs +++ b/crates/storage/src/entities.rs @@ -1,3 +1,7 @@ +use pace_core::prelude::{ + Activity, ActivityEndOptions, ActivityGuid, ActivityKind, ActivityStatusKind, +}; + pub mod activities; pub mod activities_categories; pub mod activities_tags; @@ -7,6 +11,23 @@ pub mod categories; pub mod schema_migrations; pub mod tags; +pub struct SQLiteActivity(Activity); + +pub struct SQLiteActivityGuid(ActivityGuid); + +pub struct SQLiteActivityItem { + guid: SQLiteActivityGuid, + activity: SQLiteActivity, +} + +pub struct SQLiteActivityKind(ActivityKind); + +pub struct SQLiteActivityStatusKind(ActivityStatusKind); + +pub struct SQLiteActivityEndOptions(ActivityEndOptions); + + + // impl SqliteActivity { // pub fn to_sql_prepare_statement(&self) -> &'static str { // "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 0b4f6af5..b87524c3 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -1,11 +1,13 @@ -pub mod create_activities_20240325143710; -pub mod create_activities_categories_20240326130013; -pub mod create_activities_tags_20240326125630; -pub mod create_activity_kinds_20240326124253; -pub mod create_activity_status_20240326125819; -pub mod create_categories_20240326125937; -pub mod create_schema_migrations; -pub mod create_tags_20240326125555; +mod create_activities_20240325143710; +mod create_activities_categories_20240326130013; +mod create_activities_tags_20240326125630; +mod create_activity_kind_values_20240327162015; +mod create_activity_kinds_20240326124253; +mod create_activity_status_20240326125819; +mod create_activity_status_values_20240327163645; +mod create_categories_20240326125937; +mod create_schema_migrations; +mod create_tags_20240326125555; use eyre::OptionExt; use rusqlite::Connection; @@ -69,6 +71,8 @@ impl<'conn> SQLiteMigrator<'conn> { Box::new(create_activity_status_20240326125819::Migration), Box::new(create_categories_20240326125937::Migration), Box::new(create_activities_categories_20240326130013::Migration), + Box::new(create_activity_kind_values_20240327162015::Migration), + Box::new(create_activity_status_values_20240327163645::Migration), ]; Box::new(migrations.into_iter()) diff --git a/crates/storage/src/migration/create_activity_kind_values_20240327162015.rs b/crates/storage/src/migration/create_activity_kind_values_20240327162015.rs new file mode 100644 index 00000000..22a34847 --- /dev/null +++ b/crates/storage/src/migration/create_activity_kind_values_20240327162015.rs @@ -0,0 +1,37 @@ +use itertools::Itertools; +use pace_core::prelude::ActivityKind; +use sea_query::{Query, SqliteQueryBuilder}; +use strum::IntoEnumIterator; +use ulid::Ulid; + +use crate::{entities::activity_kinds::ActivityKindsIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240327162015".to_string() + } + + fn up(&self) -> String { + let activity_kinds = ActivityKind::iter() + .map(|kind| { + Query::insert() + .into_table(ActivityKindsIden::Table) + .columns([ActivityKindsIden::Guid, ActivityKindsIden::Kind]) + .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) + .to_owned() + .to_string(SqliteQueryBuilder) + }) + .collect_vec(); + + activity_kinds.join("; ") + } + + fn down(&self) -> String { + Query::delete() + .from_table(ActivityKindsIden::Table) + .to_owned() + .to_string(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/migration/create_activity_status_values_20240327163645.rs b/crates/storage/src/migration/create_activity_status_values_20240327163645.rs new file mode 100644 index 00000000..4eb28a82 --- /dev/null +++ b/crates/storage/src/migration/create_activity_status_values_20240327163645.rs @@ -0,0 +1,37 @@ +use itertools::Itertools; +use pace_core::prelude::ActivityStatusKind; +use sea_query::{Query, SqliteQueryBuilder}; +use strum::IntoEnumIterator; +use ulid::Ulid; + +use crate::{entities::activity_status::ActivityStatusIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240327163645".to_string() + } + + fn up(&self) -> String { + let activity_kinds = ActivityStatusKind::iter() + .map(|kind| { + Query::insert() + .into_table(ActivityStatusIden::Table) + .columns([ActivityStatusIden::Guid, ActivityStatusIden::Status]) + .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) + .to_owned() + .to_string(SqliteQueryBuilder) + }) + .collect_vec(); + + activity_kinds.join("; ") + } + + fn down(&self) -> String { + Query::delete() + .from_table(ActivityStatusIden::Table) + .to_owned() + .to_string(SqliteQueryBuilder) + } +} From fb047ff93280be59c37403b120c2a488be32a205 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:55:56 +0100 Subject: [PATCH 20/59] fix some more issues Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/Cargo.toml | 2 +- crates/storage/src/error.rs | 2 +- crates/storage/src/file.rs | 8 +- crates/storage/src/migration.rs | 17 ++- .../src/migration/create_schema_migrations.rs | 2 +- crates/storage/src/sqlite.rs | 126 +++++++++--------- src/commands/adjust.rs | 20 ++- src/commands/begin.rs | 20 ++- src/commands/end.rs | 20 ++- src/commands/hold.rs | 20 ++- src/commands/now.rs | 20 ++- src/commands/reflect.rs | 20 ++- 12 files changed, 160 insertions(+), 117 deletions(-) diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index b59986da..4638ee6c 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -40,7 +40,7 @@ pace_time = { workspace = true, features = ["db"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } -sea-query = { workspace = true, optional = true, no-default-features = true, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } +sea-query = { workspace = true, optional = true, default-features = false, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } sea-query-rusqlite = { workspace = true, optional = true, features = ["with-chrono"] } strum = { workspace = true } thiserror = { workspace = true } diff --git a/crates/storage/src/error.rs b/crates/storage/src/error.rs index af7ffe8f..e9a3a07c 100644 --- a/crates/storage/src/error.rs +++ b/crates/storage/src/error.rs @@ -33,7 +33,7 @@ pub enum PaceStorageErrorKind { StorageNotImplemented, } -/// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the SQLite database. +/// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the `SQLite` database. #[non_exhaustive] #[derive(Error, Debug, Display)] pub enum DatabaseStorageErrorKind { diff --git a/crates/storage/src/file.rs b/crates/storage/src/file.rs index 623f4768..fafd596b 100644 --- a/crates/storage/src/file.rs +++ b/crates/storage/src/file.rs @@ -101,9 +101,11 @@ impl ActivityStorage for TomlActivityStorage { #[tracing::instrument(skip(self))] fn setup(&self) -> PaceStorageResult<()> { if !self.path.exists() { - create_dir_all(self.path.parent().ok_or( - TomlFileStorageErrorKind::ParentDirNotFound(self.path.clone()), - )?)?; + create_dir_all( + self.path.parent().ok_or_else(|| { + TomlFileStorageErrorKind::ParentDirNotFound(self.path.clone()) + })?, + )?; let mut file = OpenOptions::new() .write(true) diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index b87524c3..4865d73c 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -33,7 +33,7 @@ pub struct SQLiteMigrator<'conn> { impl<'conn> SQLiteMigrator<'conn> { pub fn new(connection: &'conn Connection) -> PaceStorageResult { - let migrator = Self { + let mut migrator = Self { iterator: Self::load(), applied: VecDeque::default(), connection, @@ -44,7 +44,7 @@ impl<'conn> SQLiteMigrator<'conn> { Ok(migrator) } - fn init(&self) -> PaceStorageResult<()> { + fn init(&mut self) -> PaceStorageResult<()> { let migration = self.iterator.next().ok_or_eyre("No migrations found")?; let query = migration.up(); @@ -108,7 +108,7 @@ impl<'conn> SQLiteMigrator<'conn> { } /// Migrate to the latest version - pub fn up(&self) -> PaceStorageResult<()> { + pub fn up(&mut self) -> PaceStorageResult<()> { while let Some(migration) = self.iterator.next() { let query = migration.up(); @@ -123,7 +123,7 @@ impl<'conn> SQLiteMigrator<'conn> { } /// Rollback the most recent migration - pub fn down(&self) -> PaceStorageResult { + pub fn down(&mut self) -> PaceStorageResult { let migration = self .applied .pop_back() @@ -131,18 +131,17 @@ impl<'conn> SQLiteMigrator<'conn> { let query = migration.down(); - self.connection.execute(&query, [])?; + _ = self.connection.execute(&query, [])?; self.remove_migration_version(migration.version())?; Ok(migration.version()) } - /// List applied and pending migrations - pub fn status(&self) -> PaceStorageResult<(Vec, Vec)> { + /// List applied migrations + pub fn status(&self) -> PaceStorageResult> { let applied = self.applied.iter().map(|m| m.version()).collect(); - let pending = self.iterator.map(|m| m.version()).collect(); - Ok((applied, pending)) + Ok(applied) } } diff --git a/crates/storage/src/migration/create_schema_migrations.rs b/crates/storage/src/migration/create_schema_migrations.rs index da9fd018..a3758951 100644 --- a/crates/storage/src/migration/create_schema_migrations.rs +++ b/crates/storage/src/migration/create_schema_migrations.rs @@ -6,7 +6,7 @@ pub struct Migration; impl SQLiteMigration for Migration { fn version(&self) -> String { - "".to_string() + String::default() } fn up(&self) -> String { diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/sqlite.rs index d912d9c1..9cf397f6 100644 --- a/crates/storage/src/sqlite.rs +++ b/crates/storage/src/sqlite.rs @@ -31,15 +31,16 @@ impl SqliteActivityStorage { impl ActivityStorage for SqliteActivityStorage { fn setup(&self) -> PaceStorageResult<()> { - let migrator = SQLiteMigrator::new(&self.connection)?; + let mut migrate = SQLiteMigrator::new(&self.connection)?; - migrator.up()?; + migrate.up()?; Ok(()) } fn teardown(&self) -> PaceStorageResult<()> { - unimplemented!("teardown not implemented for sqlite storage") + // TODO: Do we need a teardown for sqlite? + unimplemented!("teardown not yet implemented for sqlite storage") } fn identify(&self) -> String { @@ -59,22 +60,23 @@ impl SyncStorage for SqliteActivityStorage { impl ActivityReadOps for SqliteActivityStorage { #[tracing::instrument] fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { - let mut stmt = self - .connection - .prepare("SELECT * FROM activities WHERE id = ?1")?; + // let mut stmt = self + // .connection + // .prepare("SELECT * FROM activities WHERE id = ?1")?; - let activity_item_iter = - stmt.query_map(&[&activity_id], |row| Ok(ActivityItem::from_row(&row)))?; + // let activity_item_iter = + // stmt.query_map(&[&activity_id], |row| Ok(ActivityItem::from_row(&row)))?; - let activity_item = activity_item_iter - .filter_map_ok(|item| item.ok()) - .next() - .transpose()? - .ok_or(DatabaseStorageErrorKind::ActivityNotFound(activity_id))?; + // let activity_item = activity_item_iter + // .filter_map_ok(|item| item.ok()) + // .next() + // .transpose()? + // .ok_or(DatabaseStorageErrorKind::ActivityNotFound(activity_id))?; - debug!("Read activity: {:?}", activity_item); + // debug!("Read activity: {:?}", activity_item); - Ok(activity_item) + // Ok(activity_item) + todo!("implement read_activity for sqlite") } #[tracing::instrument] @@ -82,52 +84,55 @@ impl ActivityReadOps for SqliteActivityStorage { &self, filter: ActivityFilterKind, ) -> PaceStorageOptResult { - let mut stmt = self.connection.prepare(filter.to_sql_statement())?; - - let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; - - let activities = activity_item_iter - .filter_map_ok(|item| item.ok()) - .collect::, _>>()?; - - debug!("Listed activities: {:?}", activities); - - if activities.is_empty() { - return Ok(None); - } - - let filtered_activities = match filter { - ActivityFilterKind::Everything => FilteredActivities::Everything(activities), - ActivityFilterKind::OnlyActivities => FilteredActivities::OnlyActivities(activities), - ActivityFilterKind::Active => FilteredActivities::Active(activities), - ActivityFilterKind::ActiveIntermission => { - FilteredActivities::ActiveIntermission(activities) - } - ActivityFilterKind::Archived => FilteredActivities::Archived(activities), - ActivityFilterKind::Ended => FilteredActivities::Ended(activities), - ActivityFilterKind::Held => FilteredActivities::Held(activities), - ActivityFilterKind::Intermission => FilteredActivities::Intermission(activities), - ActivityFilterKind::TimeRange(_) => FilteredActivities::TimeRange(activities), - }; - - Ok(Some(filtered_activities)) + // let mut stmt = self.connection.prepare(filter.to_sql_statement())?; + + // let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; + + // let activities = activity_item_iter + // .filter_map_ok(|item| item.ok()) + // .collect::, _>>()?; + + // debug!("Listed activities: {:?}", activities); + + // if activities.is_empty() { + // return Ok(None); + // } + + // let filtered_activities = match filter { + // ActivityFilterKind::Everything => FilteredActivities::Everything(activities), + // ActivityFilterKind::OnlyActivities => FilteredActivities::OnlyActivities(activities), + // ActivityFilterKind::Active => FilteredActivities::Active(activities), + // ActivityFilterKind::ActiveIntermission => { + // FilteredActivities::ActiveIntermission(activities) + // } + // ActivityFilterKind::Archived => FilteredActivities::Archived(activities), + // ActivityFilterKind::Ended => FilteredActivities::Ended(activities), + // ActivityFilterKind::Held => FilteredActivities::Held(activities), + // ActivityFilterKind::Intermission => FilteredActivities::Intermission(activities), + // ActivityFilterKind::TimeRange(_) => FilteredActivities::TimeRange(activities), + // }; + + // Ok(Some(filtered_activities)) + + todo!("implement list_activities for sqlite") } } impl ActivityWriteOps for SqliteActivityStorage { fn create_activity(&self, activity: Activity) -> PaceStorageResult { - let tx = self.connection.transaction()?; + // let tx = self.connection.transaction()?; - let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; + // let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; - let (guid, params) = activity.to_sql_execute_statement()?; + // let (guid, params) = activity.to_sql_execute_statement()?; - if stmt.execute(params.as_slice())? > 0 { - tx.commit()?; - return Ok(ActivityItem::from((guid, activity))); - } + // if stmt.execute(params.as_slice())? > 0 { + // tx.commit()?; + // return Ok(ActivityItem::from((guid, activity))); + // } - return Err(DatabaseStorageErrorKind::ActivityCreationFailed(activity).into()); + // return Err(DatabaseStorageErrorKind::ActivityCreationFailed(activity).into()); + todo!("implement create_activity for sqlite") } fn update_activity( @@ -144,17 +149,18 @@ impl ActivityWriteOps for SqliteActivityStorage { activity_id: ActivityGuid, delete_opts: DeleteOptions, ) -> PaceStorageResult { - let activity = self.read_activity(activity_id)?; + // let activity = self.read_activity(activity_id)?; - let tx = self.connection.transaction()?; - let mut stmt = tx.prepare("DELETE FROM activities WHERE id = ?1 LIMIT = 1")?; + // let tx = self.connection.transaction()?; + // let mut stmt = tx.prepare("DELETE FROM activities WHERE id = ?1 LIMIT = 1")?; - if stmt.execute(&[&activity_id])? == 1 { - tx.commit()?; - return Ok(activity); - } + // if stmt.execute(&[&activity_id])? == 1 { + // tx.commit()?; + // return Ok(activity); + // } - Err(DatabaseStorageErrorKind::ActivityDeletionFailed(activity_id).into()) + // Err(DatabaseStorageErrorKind::ActivityDeletionFailed(activity_id).into()) + todo!("implement delete_activity for sqlite") } } impl ActivityStateManagement for SqliteActivityStorage { diff --git a/src/commands/adjust.rs b/src/commands/adjust.rs index 10453a01..066fe59b 100644 --- a/src/commands/adjust.rs +++ b/src/commands/adjust.rs @@ -2,6 +2,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; @@ -16,12 +17,17 @@ pub struct AdjustCmd { impl Runnable for AdjustCmd { fn run(&self) { - match self.adjust_opts.handle_adjust(&PACE_APP.config()) { - Ok(user_message) => user_message.display(), - Err(err) => { - status_err!("{}", err); - PACE_APP.shutdown(Shutdown::Crash); - } - }; + if let Ok(storage) = get_storage_from_config(&PACE_APP.config()) { + match self.adjust_opts.handle_adjust(&PACE_APP.config(), storage) { + Ok(user_message) => user_message.display(), + Err(err) => { + status_err!("{}", err); + PACE_APP.shutdown(Shutdown::Crash); + } + }; + } else { + status_err!("Failed to get storage from config"); + PACE_APP.shutdown(Shutdown::Crash); + } } } diff --git a/src/commands/begin.rs b/src/commands/begin.rs index 3443f97a..e964c45b 100644 --- a/src/commands/begin.rs +++ b/src/commands/begin.rs @@ -2,6 +2,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; @@ -16,12 +17,17 @@ pub struct BeginCmd { impl Runnable for BeginCmd { fn run(&self) { - match self.begin_opts.handle_begin(&PACE_APP.config()) { - Ok(user_message) => user_message.display(), - Err(err) => { - status_err!("{}", err); - PACE_APP.shutdown(Shutdown::Crash); - } - }; + if let Ok(storage) = get_storage_from_config(&PACE_APP.config()) { + match self.begin_opts.handle_begin(&PACE_APP.config(), storage) { + Ok(user_message) => user_message.display(), + Err(err) => { + status_err!("{}", err); + PACE_APP.shutdown(Shutdown::Crash); + } + }; + } else { + status_err!("Failed to get storage from config"); + PACE_APP.shutdown(Shutdown::Crash); + } } } diff --git a/src/commands/end.rs b/src/commands/end.rs index 6201c220..3fc99642 100644 --- a/src/commands/end.rs +++ b/src/commands/end.rs @@ -2,6 +2,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; @@ -16,12 +17,17 @@ pub struct EndCmd { impl Runnable for EndCmd { fn run(&self) { - match self.end_opts.handle_end(&PACE_APP.config()) { - Ok(user_message) => user_message.display(), - Err(err) => { - status_err!("{}", err); - PACE_APP.shutdown(Shutdown::Crash); - } - }; + if let Ok(storage) = get_storage_from_config(&PACE_APP.config()) { + match self.end_opts.handle_end(&PACE_APP.config(), storage) { + Ok(user_message) => user_message.display(), + Err(err) => { + status_err!("{}", err); + PACE_APP.shutdown(Shutdown::Crash); + } + }; + } else { + status_err!("Failed to get storage from config"); + PACE_APP.shutdown(Shutdown::Crash); + } } } diff --git a/src/commands/hold.rs b/src/commands/hold.rs index 6b5c64b2..45f986be 100644 --- a/src/commands/hold.rs +++ b/src/commands/hold.rs @@ -4,6 +4,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_core::prelude::HoldCommandOptions; +use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; @@ -16,12 +17,17 @@ pub struct HoldCmd { impl Runnable for HoldCmd { fn run(&self) { - match self.hold_opts.handle_hold(&PACE_APP.config()) { - Ok(user_message) => user_message.display(), - Err(err) => { - status_err!("{}", err); - PACE_APP.shutdown(Shutdown::Crash); - } - }; + if let Ok(storage) = get_storage_from_config(&PACE_APP.config()) { + match self.hold_opts.handle_hold(&PACE_APP.config(), storage) { + Ok(user_message) => user_message.display(), + Err(err) => { + status_err!("{}", err); + PACE_APP.shutdown(Shutdown::Crash); + } + }; + } else { + status_err!("Failed to get storage from config"); + PACE_APP.shutdown(Shutdown::Crash); + } } } diff --git a/src/commands/now.rs b/src/commands/now.rs index 89c5bd27..a6d4103c 100644 --- a/src/commands/now.rs +++ b/src/commands/now.rs @@ -2,6 +2,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; @@ -16,12 +17,17 @@ pub struct NowCmd { impl Runnable for NowCmd { fn run(&self) { - match self.now_opts.handle_now(&PACE_APP.config()) { - Ok(user_message) => user_message.display(), - Err(err) => { - status_err!("{}", err); - PACE_APP.shutdown(Shutdown::Crash); - } - }; + if let Ok(storage) = get_storage_from_config(&PACE_APP.config()) { + match self.now_opts.handle_now(&PACE_APP.config(), storage) { + Ok(user_message) => user_message.display(), + Err(err) => { + status_err!("{}", err); + PACE_APP.shutdown(Shutdown::Crash); + } + }; + } else { + status_err!("Failed to get storage from config"); + PACE_APP.shutdown(Shutdown::Crash); + } } } diff --git a/src/commands/reflect.rs b/src/commands/reflect.rs index 331f3f2d..bda04713 100644 --- a/src/commands/reflect.rs +++ b/src/commands/reflect.rs @@ -7,6 +7,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_core::prelude::ReflectCommandOptions; +use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; @@ -19,12 +20,17 @@ pub struct ReflectCmd { impl Runnable for ReflectCmd { fn run(&self) { - match self.review_opts.handle_reflect(&PACE_APP.config()) { - Ok(user_message) => user_message.display(), - Err(err) => { - status_err!("{}", err); - PACE_APP.shutdown(Shutdown::Crash); - } - }; + if let Ok(storage) = get_storage_from_config(&PACE_APP.config()) { + match self.review_opts.handle_reflect(&PACE_APP.config(), storage) { + Ok(user_message) => user_message.display(), + Err(err) => { + status_err!("{}", err); + PACE_APP.shutdown(Shutdown::Crash); + } + }; + } else { + status_err!("Failed to get storage from config"); + PACE_APP.shutdown(Shutdown::Crash); + } } } From 5beb92f0acc91c3fff0c9466b24f36ac62a0b0ca Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 19:07:48 +0100 Subject: [PATCH 21/59] factor out pace_error for easier error handling across the ecosystem Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 22 +- Cargo.toml | 3 + crates/core/Cargo.toml | 4 +- crates/core/src/commands/adjust.rs | 18 +- crates/core/src/commands/begin.rs | 15 +- crates/core/src/commands/docs.rs | 3 +- crates/core/src/commands/end.rs | 16 +- crates/core/src/commands/hold.rs | 27 +- crates/core/src/commands/now.rs | 45 ++- crates/core/src/commands/reflect.rs | 13 +- crates/core/src/config.rs | 9 +- crates/core/src/domain/activity.rs | 9 +- crates/core/src/domain/activity_log.rs | 2 +- crates/core/src/domain/project.rs | 2 +- crates/core/src/domain/task.rs | 2 +- crates/core/src/error.rs | 334 -------------------- crates/core/src/lib.rs | 5 - crates/core/src/service/activity_store.rs | 67 ++-- crates/core/src/service/activity_tracker.rs | 5 +- crates/core/src/storage.rs | 88 +++--- crates/storage/Cargo.toml | 4 +- crates/storage/src/error.rs | 65 ---- crates/storage/src/file.rs | 73 ++--- crates/storage/src/in_memory.rs | 144 +++++---- crates/storage/src/lib.rs | 20 +- crates/storage/src/migration.rs | 148 +++++++-- crates/storage/src/sqlite.rs | 63 ++-- crates/time/Cargo.toml | 1 + crates/time/src/date.rs | 15 +- crates/time/src/date_time.rs | 86 +++-- crates/time/src/duration.rs | 20 +- crates/time/src/error.rs | 77 ----- crates/time/src/lib.rs | 1 - crates/time/src/time_frame.rs | 23 +- crates/time/src/time_range.rs | 112 ++++--- crates/time/src/time_zone.rs | 6 +- src/commands/resume.rs | 6 +- 37 files changed, 564 insertions(+), 989 deletions(-) delete mode 100644 crates/core/src/error.rs delete mode 100644 crates/storage/src/error.rs delete mode 100644 crates/time/src/error.rs diff --git a/Cargo.lock b/Cargo.lock index 894228c1..4033e4cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1322,6 +1322,7 @@ dependencies = [ "once_cell", "pace_cli", "pace_core", + "pace_error", "pace_storage", "pace_time", "predicates", @@ -1362,9 +1363,9 @@ dependencies = [ "insta", "itertools", "merge", - "miette", "once_cell", "open", + "pace_error", "pace_time", "parking_lot", "rayon", @@ -1378,7 +1379,6 @@ dependencies = [ "strum_macros", "tabled", "tera", - "thiserror", "toml 0.8.12", "tracing", "typed-builder", @@ -1386,6 +1386,21 @@ dependencies = [ "wildmatch", ] +[[package]] +name = "pace_error" +version = "0.1.0" +dependencies = [ + "chrono", + "displaydoc", + "miette", + "rusqlite", + "sea-query", + "serde_json", + "tera", + "thiserror", + "toml 0.8.12", +] + [[package]] name = "pace_server" version = "0.1.3" @@ -1396,11 +1411,11 @@ version = "0.1.0" dependencies = [ "chrono", "displaydoc", - "eyre", "itertools", "libsqlite3-sys", "merge", "pace_core", + "pace_error", "pace_time", "parking_lot", "rayon", @@ -1426,6 +1441,7 @@ dependencies = [ "eyre", "getset", "humantime", + "pace_error", "rstest", "rusqlite", "serde", diff --git a/Cargo.toml b/Cargo.toml index eee70f6e..4056b3bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "crates/cli", "crates/core", + "crates/error", "crates/server", "crates/storage", "crates/time", @@ -45,6 +46,7 @@ once_cell = "1.19.0" open = "5.1.2" pace_cli = { path = "crates/cli", version = "0" } pace_core = { path = "crates/core", version = "0" } +pace_error = { path = "crates/error", version = "0" } pace_storage = { path = "crates/storage", version = "0" } pace_time = { path = "crates/time", version = "0" } parking_lot = "0.12.1" @@ -110,6 +112,7 @@ eyre = { workspace = true } human-panic = { workspace = true } pace_cli = { workspace = true } pace_core = { workspace = true, features = ["cli"] } +pace_error = { workspace = true } pace_storage = { workspace = true, features = ["db"] } pace_time = { workspace = true, features = ["cli", "db"] } serde = { workspace = true } diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 74733e87..cff3567d 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -31,13 +31,12 @@ clap = { workspace = true, optional = true, features = ["env", "wrap_help", "der directories = { workspace = true } displaydoc = { workspace = true } dotenvy = { workspace = true } -eyre = { workspace = true } getset = { workspace = true } itertools = { workspace = true } merge = { workspace = true } -miette = { workspace = true, features = ["fancy"] } once_cell = { workspace = true } open = { workspace = true } +pace_error = { workspace = true } pace_time = { workspace = true, features = ["rusqlite"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } @@ -48,7 +47,6 @@ strum = { workspace = true, features = ["derive"] } strum_macros = { workspace = true } tabled = { workspace = true } tera = { workspace = true } -thiserror = { workspace = true } toml = { workspace = true, features = ["indexmap", "preserve_order"] } tracing = { workspace = true } typed-builder = { workspace = true } diff --git a/crates/core/src/commands/adjust.rs b/crates/core/src/commands/adjust.rs index 60e68c53..1ed41a5d 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/core/src/commands/adjust.rs @@ -9,13 +9,13 @@ use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use tracing::debug; use typed_builder::TypedBuilder; +use pace_error::{ActivityLogErrorKind, PaceResult, UserMessage}; + use crate::{ commands::UpdateOptions, config::PaceConfig, - error::{ActivityLogErrorKind, PaceResult, UserMessage}, - prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, - storage::{ActivityQuerying, ActivityWriteOps, SyncStorage}, + storage::{ActivityQuerying, ActivityStorage, ActivityWriteOps, SyncStorage}, }; /// `adjust` subcommand options @@ -165,12 +165,10 @@ impl AdjustCommandOptions { debug!("Parsed time: {date_time:?}"); - let activity_store = - ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; + let activity_store = ActivityStore::with_storage(storage)?; let activity_item = activity_store - .most_recent_active_activity() - .map_err(PaceErrorKind::Storage)? + .most_recent_active_activity()? .ok_or_else(|| ActivityLogErrorKind::NoActiveActivityToAdjust)?; debug!("Most recent active activity item: {:?}", activity_item); @@ -214,12 +212,10 @@ impl AdjustCommandOptions { } } - _ = activity_store - .update_activity(guid, activity.clone(), UpdateOptions::default()) - .map_err(PaceErrorKind::Storage)?; + _ = activity_store.update_activity(guid, activity.clone(), UpdateOptions::default())?; if activity_item.activity() != &activity { - activity_store.sync().map_err(PaceErrorKind::Storage)?; + activity_store.sync()?; return Ok(UserMessage::new(format!( "{} has been adjusted.", activity_item.activity() diff --git a/crates/core/src/commands/begin.rs b/crates/core/src/commands/begin.rs index 86181d0a..770d93eb 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/core/src/commands/begin.rs @@ -11,12 +11,12 @@ use tracing::debug; use crate::{ config::PaceConfig, domain::activity::{Activity, ActivityKind}, - error::{PaceResult, UserMessage}, - prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, - storage::{ActivityStateManagement, SyncStorage}, + storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; +use pace_error::{PaceResult, UserMessage}; + /// `begin` subcommand options #[derive(Debug, Clone, PartialEq, Eq, Getters)] #[cfg_attr(feature = "clap", derive(Parser))] @@ -144,16 +144,13 @@ impl BeginCommandOptions { .tags(tags) .build(); - let activity_store = - ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; + let activity_store = ActivityStore::with_storage(storage)?; - let activity_item = activity_store - .begin_activity(activity) - .map_err(PaceErrorKind::Storage)?; + let activity_item = activity_store.begin_activity(activity)?; debug!("Started Activity: {:?}", activity_item); - activity_store.sync().map_err(PaceErrorKind::Storage)?; + activity_store.sync()?; Ok(UserMessage::new(format!("{}", activity_item.activity()))) } diff --git a/crates/core/src/commands/docs.rs b/crates/core/src/commands/docs.rs index af265f60..9924b6ab 100644 --- a/crates/core/src/commands/docs.rs +++ b/crates/core/src/commands/docs.rs @@ -4,9 +4,10 @@ use clap::Parser; use crate::{ constants::PACE_DOCS_URL, constants::{PACE_CONFIG_DOCS_URL, PACE_DEV_DOCS_URL}, - error::{PaceResult, UserMessage}, }; +use pace_error::{PaceResult, UserMessage}; + /// `docs` subcommand options #[derive(Debug, Clone)] #[cfg_attr(feature = "clap", derive(Parser))] diff --git a/crates/core/src/commands/end.rs b/crates/core/src/commands/end.rs index d9b7b85c..5e7bbd4a 100644 --- a/crates/core/src/commands/end.rs +++ b/crates/core/src/commands/end.rs @@ -12,12 +12,12 @@ use typed_builder::TypedBuilder; use crate::{ commands::EndOptions, config::PaceConfig, - error::{PaceResult, UserMessage}, - prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, - storage::{ActivityStateManagement, SyncStorage}, + storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; +use pace_error::{PaceResult, UserMessage}; + /// `end` subcommand options #[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] #[getset(get = "pub")] @@ -98,15 +98,11 @@ impl EndCommandOptions { debug!("Parsed date time: {:?}", date_time); - let activity_store = - ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; + let activity_store = ActivityStore::with_storage(storage)?; let end_opts = EndOptions::builder().end_time(date_time).build(); - let user_message = (activity_store - .end_all_activities(end_opts) - .map_err(PaceErrorKind::Storage)?) - .map_or_else( + let user_message = (activity_store.end_all_activities(end_opts)?).map_or_else( || "No unfinished activities to end.".to_string(), |unfinished_activities| { let mut msgs = vec![]; @@ -120,7 +116,7 @@ impl EndCommandOptions { }, ); - activity_store.sync().map_err(PaceErrorKind::Storage)?; + activity_store.sync()?; Ok(UserMessage::new(user_message)) } diff --git a/crates/core/src/commands/hold.rs b/crates/core/src/commands/hold.rs index 508721d9..c479c9e2 100644 --- a/crates/core/src/commands/hold.rs +++ b/crates/core/src/commands/hold.rs @@ -13,12 +13,12 @@ use typed_builder::TypedBuilder; use crate::{ config::PaceConfig, domain::intermission::IntermissionAction, - error::{PaceResult, UserMessage}, - prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, - storage::{ActivityStateManagement, SyncStorage}, + storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; +use pace_error::{PaceResult, UserMessage}; + /// `hold` subcommand options #[derive(Debug)] #[cfg_attr(feature = "clap", derive(Parser))] @@ -119,21 +119,18 @@ impl HoldCommandOptions { debug!("Hold options: {hold_opts:?}"); - let activity_store = - ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; + let activity_store = ActivityStore::with_storage(storage)?; - let user_message = if let Some(activity) = activity_store - .hold_most_recent_active_activity(hold_opts) - .map_err(PaceErrorKind::Storage)? - { - debug!("Held {}", activity.activity()); + let user_message = + if let Some(activity) = activity_store.hold_most_recent_active_activity(hold_opts)? { + debug!("Held {}", activity.activity()); - activity_store.sync().map_err(PaceErrorKind::Storage)?; + activity_store.sync()?; - format!("Held {}", activity.activity()) - } else { - "No unfinished activities to hold.".to_string() - }; + format!("Held {}", activity.activity()) + } else { + "No unfinished activities to hold.".to_string() + }; Ok(UserMessage::new(user_message)) } diff --git a/crates/core/src/commands/now.rs b/crates/core/src/commands/now.rs index 686c75b2..feb0b852 100644 --- a/crates/core/src/commands/now.rs +++ b/crates/core/src/commands/now.rs @@ -7,12 +7,12 @@ use tracing::debug; use crate::{ config::PaceConfig, domain::{activity::ActivityItem, filter::ActivityFilterKind}, - error::{PaceResult, UserMessage}, - prelude::{ActivityStorage, PaceErrorKind}, service::activity_store::ActivityStore, - storage::{ActivityQuerying, ActivityReadOps}, + storage::{ActivityQuerying, ActivityReadOps, ActivityStorage}, }; +use pace_error::{PaceResult, UserMessage}; + /// `now` subcommand options #[derive(Debug)] #[cfg_attr(feature = "clap", derive(Parser))] @@ -38,31 +38,28 @@ impl NowCommandOptions { config: &PaceConfig, storage: Arc, ) -> PaceResult { - let activity_store = - ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; + let activity_store = ActivityStore::with_storage(storage)?; - let user_message = (activity_store - .list_current_activities(ActivityFilterKind::Active) - .map_err(PaceErrorKind::Storage)?) - .map_or_else( - || "No activities are currently running.".to_string(), - |activities| { - debug!("Current Activities: {:?}", activities); + let user_message = (activity_store.list_current_activities(ActivityFilterKind::Active)?) + .map_or_else( + || "No activities are currently running.".to_string(), + |activities| { + debug!("Current Activities: {:?}", activities); - // Get the activity items - let activity_items = activities - .iter() - .flat_map(|activity_id| activity_store.read_activity(*activity_id)) - .collect::>(); + // Get the activity items + let activity_items = activities + .iter() + .flat_map(|activity_id| activity_store.read_activity(*activity_id)) + .collect::>(); - let mut msgs = vec![]; - for activity in &activity_items { - msgs.push(format!("{}", activity.activity())); - } + let mut msgs = vec![]; + for activity in &activity_items { + msgs.push(format!("{}", activity.activity())); + } - msgs.join("\n") - }, - ); + msgs.join("\n") + }, + ); Ok(UserMessage::new(user_message)) } diff --git a/crates/core/src/commands/reflect.rs b/crates/core/src/commands/reflect.rs index f47dce29..e06f14cb 100644 --- a/crates/core/src/commands/reflect.rs +++ b/crates/core/src/commands/reflect.rs @@ -14,12 +14,13 @@ use typed_builder::TypedBuilder; use crate::{ config::PaceConfig, domain::{activity::ActivityKind, filter::FilterOptions, reflection::ReflectionsFormatKind}, - error::{PaceResult, TemplatingErrorKind, UserMessage}, - prelude::{ActivityStorage, PaceErrorKind}, + prelude::ActivityStorage, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, template::{PaceReflectionTemplate, TEMPLATES}, }; +use pace_error::{PaceResult, TemplatingErrorKind, UserMessage}; + /// `reflect` subcommand options #[derive(Debug, Getters)] #[getset(get = "pub")] @@ -147,16 +148,14 @@ impl ReflectCommandOptions { PaceTimeZoneKind::NotSet, ))?; - let activity_store = - ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?; + let activity_store = ActivityStore::with_storage(storage)?; let activity_tracker = ActivityTracker::with_activity_store(activity_store); debug!("Displaying reflection for time frame: {}", time_frame); - let Some(reflection) = activity_tracker - .generate_reflection(FilterOptions::from(self), time_frame) - .map_err(PaceErrorKind::Storage)? + let Some(reflection) = + activity_tracker.generate_reflection(FilterOptions::from(self), time_frame)? else { return Ok(UserMessage::new( "No activities found for the specified time frame", diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index 75a11ec9..717c5b8b 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -10,10 +10,9 @@ use serde_derive::{Deserialize, Serialize}; use directories::ProjectDirs; use strum_macros::EnumString; -use crate::{ - domain::{priority::ItemPriorityKind, reflection::ReflectionsFormatKind}, - error::{PaceErrorKind, PaceResult}, -}; +use crate::domain::{priority::ItemPriorityKind, reflection::ReflectionsFormatKind}; + +use pace_error::{PaceErrorKind, PaceResult}; /// The pace configuration file /// @@ -503,7 +502,7 @@ impl Display for PaceConfig { #[cfg(test)] mod tests { - use crate::error::TestResult; + use pace_error::TestResult; use super::*; use rstest::*; diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index b8fe44ca..ff7856b4 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -17,10 +17,9 @@ use tracing::debug; use typed_builder::TypedBuilder; use ulid::Ulid; -use crate::{ - domain::status::ActivityStatusKind, - error::{ActivityLogErrorKind, PaceResult}, -}; +use crate::domain::status::ActivityStatusKind; + +use pace_error::{ActivityLogErrorKind, PaceResult}; #[derive( Debug, TypedBuilder, Serialize, Getters, Setters, MutGetters, Clone, Eq, PartialEq, Default, @@ -698,7 +697,7 @@ mod tests { use eyre::{eyre, OptionExt}; use pace_time::time_zone::PaceTimeZoneKind; - use crate::error::TestResult; + use pace_error::TestResult; use super::*; diff --git a/crates/core/src/domain/activity_log.rs b/crates/core/src/domain/activity_log.rs index 51971f34..157219d5 100644 --- a/crates/core/src/domain/activity_log.rs +++ b/crates/core/src/domain/activity_log.rs @@ -62,7 +62,7 @@ impl FromParallelIterator<(ActivityGuid, Activity)> for ActivityLog { #[cfg(test)] mod tests { - use crate::error::TestResult; + use pace_error::TestResult; use super::*; use rstest::*; diff --git a/crates/core/src/domain/project.rs b/crates/core/src/domain/project.rs index 248fbc8f..eccd1cdd 100644 --- a/crates/core/src/domain/project.rs +++ b/crates/core/src/domain/project.rs @@ -69,7 +69,7 @@ impl Default for ProjectGuid { #[cfg(test)] mod tests { - use crate::error::TestResult; + use pace_error::TestResult; use super::*; use rstest::*; diff --git a/crates/core/src/domain/task.rs b/crates/core/src/domain/task.rs index b3c32f8f..fe0a1242 100644 --- a/crates/core/src/domain/task.rs +++ b/crates/core/src/domain/task.rs @@ -58,7 +58,7 @@ impl Default for TaskGuid { #[cfg(test)] mod tests { - use crate::error::TestResult; + use pace_error::TestResult; use super::*; use rstest::*; diff --git a/crates/core/src/error.rs b/crates/core/src/error.rs deleted file mode 100644 index 00bc7fd7..00000000 --- a/crates/core/src/error.rs +++ /dev/null @@ -1,334 +0,0 @@ -//! Error types and Result module. - -use displaydoc::Display; -use eyre::Result as EyreResult; -use miette::Diagnostic; -use pace_time::error::PaceTimeErrorKind; -use std::{error::Error, io, path::PathBuf}; -use thiserror::Error; - -use crate::domain::activity::{Activity, ActivityGuid}; - -macro_rules! impl_pace_error_marker { - ($error:ty) => { - impl PaceErrorMarker for $error {} - }; -} - -/// Result type that is being returned from test functions and methods that can fail and thus have errors. -pub type TestResult = Result>; - -/// Result type that is being returned from methods that can fail and thus have [`PaceError`]s. -pub type PaceResult = Result; - -/// Result type that is being returned from methods that have optional return values and can fail thus having [`PaceError`]s. -pub type PaceOptResult = PaceResult>; - -pub type PaceStorageResult = EyreResult; -pub type PaceStorageOptResult = EyreResult>; - -/// User message type that is being returned from methods that need to print a message to the user. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct UserMessage { - /// The message to be printed to the user - msg: String, -} - -impl std::fmt::Display for UserMessage { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.msg) - } -} - -impl UserMessage { - pub fn new(msg: impl Into) -> Self { - Self { msg: msg.into() } - } - - pub fn display(&self) { - println!("{}", self.msg); - } -} - -impl std::ops::DerefMut for UserMessage { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.msg - } -} - -impl std::ops::Deref for UserMessage { - type Target = String; - - fn deref(&self) -> &Self::Target { - &self.msg - } -} - -// [`Error`] is public, but opaque and easy to keep compatible. -/// Errors that can result from pace. -#[derive(Error, Debug, Diagnostic)] -#[diagnostic(url(docsrs))] -pub struct PaceError(#[from] PaceErrorKind); - -impl std::fmt::Display for PaceError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } -} - -// Accessors for anything we do want to expose publicly. -impl PaceError { - /// Expose the inner error kind. - /// - /// This is useful for matching on the error kind. - #[must_use] - pub fn into_inner(self) -> PaceErrorKind { - self.0 - } - - /// Is this error related to a resumable activity so that we can prompt the user? - /// - /// This is useful for matching on the error kind. - #[must_use] - pub const fn possible_new_activity_from_resume(&self) -> bool { - matches!( - self.0, - PaceErrorKind::ActivityLog(ActivityLogErrorKind::NoHeldActivityFound(_)) - ) || matches!( - self.0, - PaceErrorKind::ActivityLog(ActivityLogErrorKind::ActivityAlreadyEnded(_)) - ) || matches!( - self.0, - PaceErrorKind::ActivityLog(ActivityLogErrorKind::ActivityAlreadyArchived(_)) - ) - } -} - -/// [`PaceErrorKind`] describes the errors that can happen while executing a high-level command. -/// -/// This is a non-exhaustive enum, so additional variants may be added in future. It is -/// recommended to match against the wildcard `_` instead of listing all possible variants, -/// to avoid problems when new variants are added. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum PaceErrorKind { - /// [`std::io::Error`] - #[error(transparent)] - StdIo(#[from] std::io::Error), - - /// Serialization to TOML failed: {0} - #[error(transparent)] - SerializationToTomlFailed(#[from] toml::ser::Error), - - /// Deserialization from TOML failed: {0} - #[error(transparent)] - DeserializationFromTomlFailed(#[from] toml::de::Error), - - /// Activity store error: {0} - #[error(transparent)] - ActivityStore(#[from] ActivityStoreErrorKind), - - /// Activity log error: {0} - #[error(transparent)] - ActivityLog(#[from] ActivityLogErrorKind), - - /// Time related error: {0} - #[error(transparent)] - PaceTime(#[from] PaceTimeErrorKind), - - /// JSON error: {0} - #[error(transparent)] - Json(#[from] serde_json::Error), - - /// Chrono parse error: {0} - #[error(transparent)] - ChronoParse(#[from] chrono::ParseError), - - /// Time chosen is not valid, because it lays before the current activity's beginning: {0} - #[error(transparent)] - ChronoDurationIsNegative(#[from] chrono::OutOfRangeError), - - /// Config file {file_name} not found in directory hierarchy starting from {current_dir} - ConfigFileNotFound { - /// The current directory - current_dir: String, - - /// The file name - file_name: String, - }, - - /// Configuration file not found, please run `pace setup config` to initialize `pace` - ParentDirNotFound(PathBuf), - - /// There is no path available to store the activity log - NoPathAvailable, - - /// Templating error: {0} - #[error(transparent)] - Template(#[from] TemplatingErrorKind), - - /// Storage error: {0} - #[error(transparent)] - Storage(#[from] eyre::Report), -} - -/// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum ActivityLogErrorKind { - /// No activities found in the activity log - NoActivitiesFound, - - /// Activity with ID {0} not found - FailedToReadActivity(ActivityGuid), - - /// Negative duration for activity - NegativeDuration, - - /// There are no activities to hold - NoActivityToHold, - - /// Failed to unwrap Arc - ArcUnwrapFailed, - - /// There are no unfinished activities to end - NoUnfinishedActivities, - - /// There is no cache to sync - NoCacheToSync, - - /// Cache not available - CacheNotAvailable, - - /// `Activity` with id {0} not found - ActivityNotFound(ActivityGuid), - - /// `Activity` with id {0} can't be removed from the activity log - ActivityCantBeRemoved(usize), - - /// This activity has no id - ActivityIdNotSet, - - /// `Activity` with id {0} already in use, can't create a new activity with the same id - ActivityIdAlreadyInUse(ActivityGuid), - - /// `Activity` in the `ActivityLog` has a different id than the one provided: {0} != {1} - ActivityIdMismatch(ActivityGuid, ActivityGuid), - - /// `Activity` already has an intermission: {0} - ActivityAlreadyHasIntermission(Box), - - /// There have been some activities that have not been ended - ActivityNotEnded, - - /// No active activity found with id {0} - NoActiveActivityFound(ActivityGuid), - - /// `Activity` with id {0} already ended - ActivityAlreadyEnded(ActivityGuid), - - /// Activity with id {0} already has been archived - ActivityAlreadyArchived(ActivityGuid), - - /// Active activity with id {0} found, although we wanted a held activity - ActiveActivityFound(ActivityGuid), - - /// Activity with id {0} is not held, but we wanted to resume it - NoHeldActivityFound(ActivityGuid), - - /// No activity kind options found for activity with id {0} - ActivityKindOptionsNotFound(ActivityGuid), - - /// `ParentId` not set for activity with id {0} - ParentIdNotSet(ActivityGuid), - - /// Category not set for activity with id {0} - CategoryNotSet(ActivityGuid), - - /// No active activity to adjust - NoActiveActivityToAdjust, - - /// Failed to group activities by keywords - FailedToGroupByKeywords, - - /// No end options found for activity - NoEndOptionsFound, -} - -/// [`TemplatingErrorKind`] describes the errors that can happen while dealing with templating. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum TemplatingErrorKind { - /// Failed to generate context from serializable struct: {0} - FailedToGenerateContextFromSerialize(tera::Error), - - /// Failed to render template: {0} - RenderingToTemplateFailed(tera::Error), - - /// Failed to read template file: {0} - FailedToReadTemplateFile(io::Error), - - /// Template file not specified - TemplateFileNotSpecified, -} - -/// [`ActivityStoreErrorKind`] describes the errors that can happen while dealing with time. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum ActivityStoreErrorKind { - /// Failed to list activities by id - ListActivitiesById, - - /// Failed to group activities by duration range - GroupByDurationRange, - - /// Failed to group activities by start date - GroupByStartDate, - - /// Failed to list activities with intermissions - ListActivitiesWithIntermissions, - - /// Failed to group activities by keywords - GroupByKeywords, - - /// Failed to group activities by kind - GroupByKind, - - /// Failed to list activities by time range - ListActivitiesByTimeRange, - - /// Failed to populate `ActivityStore` cache - PopulatingCache, - - /// Failed to list activities for activity: {0} - ListIntermissionsForActivity(ActivityGuid), - - /// Missing category for activity: {0} - MissingCategoryForActivity(ActivityGuid), - - /// Creating ActivityStore from storage failed - CreatingFromStorageFailed, -} - -trait PaceErrorMarker: Error {} - -impl_pace_error_marker!(std::io::Error); -impl_pace_error_marker!(toml::de::Error); -impl_pace_error_marker!(toml::ser::Error); -impl_pace_error_marker!(serde_json::Error); -impl_pace_error_marker!(chrono::ParseError); -impl_pace_error_marker!(chrono::OutOfRangeError); -impl_pace_error_marker!(ActivityLogErrorKind); -impl_pace_error_marker!(PaceTimeErrorKind); -impl_pace_error_marker!(ActivityStoreErrorKind); -impl_pace_error_marker!(TemplatingErrorKind); - -impl From for PaceError -where - E: PaceErrorMarker, - PaceErrorKind: From, -{ - fn from(value: E) -> Self { - Self(PaceErrorKind::from(value)) - } -} diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 468425bc..bfc056e1 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -3,7 +3,6 @@ pub(crate) mod commands; pub(crate) mod config; pub(crate) mod domain; -pub(crate) mod error; pub(crate) mod service; pub(crate) mod storage; pub(crate) mod template; @@ -61,10 +60,6 @@ pub mod prelude { }, status::ActivityStatusKind, }, - error::{ - ActivityLogErrorKind, PaceError, PaceErrorKind, PaceOptResult, PaceResult, - PaceStorageOptResult, PaceStorageResult, TestResult, UserMessage, - }, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, storage::{ ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, diff --git a/crates/core/src/service/activity_store.rs b/crates/core/src/service/activity_store.rs index 61c26d2c..92ea39ef 100644 --- a/crates/core/src/service/activity_store.rs +++ b/crates/core/src/service/activity_store.rs @@ -24,13 +24,14 @@ use crate::{ reflection::{SummaryActivityGroup, SummaryGroupByCategory}, status::ActivityStatusKind, }, - error::{ActivityStoreErrorKind, PaceStorageOptResult, PaceStorageResult}, storage::{ ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, ActivityWriteOps, SyncStorage, }, }; +use pace_error::{ActivityStoreErrorKind, PaceOptResult, PaceResult}; + /// The activity store entity #[derive(TypedBuilder, Getters, Setters, MutGetters)] #[getset(get = "pub", get_mut = "pub", set = "pub")] @@ -69,7 +70,7 @@ impl ActivityStore { /// /// This method returns a new `ActivityStore` if the storage backend /// was successfully created - pub fn with_storage(storage: Arc) -> PaceStorageResult { + pub fn with_storage(storage: Arc) -> PaceResult { debug!( "Creating activity store with storage: {}", storage.identify() @@ -98,7 +99,7 @@ impl ActivityStore { /// # Returns /// /// This method returns `Ok(())` if the cache was successfully populated - fn populate_caches(&mut self) -> PaceStorageResult<()> { + fn populate_caches(&mut self) -> PaceResult<()> { self.cache.by_start_date = self .storage .group_activities_by_start_date()? @@ -112,7 +113,7 @@ impl ActivityStore { &self, filter_opts: FilterOptions, time_range_opts: TimeRangeOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { let Some(activity_guids) = self.list_activities_by_time_range(time_range_opts)? else { debug!("No activities found for time range: {:?}", time_range_opts); @@ -213,7 +214,7 @@ impl ActivityStore { impl ActivityStorage for ActivityStore { #[tracing::instrument(skip(self))] - fn setup(&self) -> PaceStorageResult<()> { + fn setup(&self) -> PaceResult<()> { self.storage.setup() } @@ -223,36 +224,33 @@ impl ActivityStorage for ActivityStore { } #[tracing::instrument(skip(self))] - fn teardown(&self) -> PaceStorageResult<()> { + fn teardown(&self) -> PaceResult<()> { self.storage.teardown() } } impl SyncStorage for ActivityStore { #[tracing::instrument(skip(self))] - fn sync(&self) -> PaceStorageResult<()> { + fn sync(&self) -> PaceResult<()> { self.storage.sync() } } impl ActivityReadOps for ActivityStore { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { self.storage.read_activity(activity_id) } #[tracing::instrument(skip(self))] - fn list_activities( - &self, - filter: ActivityFilterKind, - ) -> PaceStorageOptResult { + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { self.storage.list_activities(filter) } } impl ActivityWriteOps for ActivityStore { #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceStorageResult { + fn create_activity(&self, activity: Activity) -> PaceResult { self.storage.create_activity(activity) } @@ -262,7 +260,7 @@ impl ActivityWriteOps for ActivityStore { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.storage .update_activity(activity_id, updated_activity, update_opts) } @@ -272,14 +270,14 @@ impl ActivityWriteOps for ActivityStore { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.storage.delete_activity(activity_id, delete_opts) } } impl ActivityStateManagement for ActivityStore { #[tracing::instrument(skip(self))] - fn begin_activity(&self, activity: Activity) -> PaceStorageResult { + fn begin_activity(&self, activity: Activity) -> PaceResult { self.storage.begin_activity(activity) } @@ -288,20 +286,17 @@ impl ActivityStateManagement for ActivityStore { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.storage.end_activity(activity_id, end_opts) } #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { self.storage.end_all_activities(end_opts) } #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity( - &self, - end_opts: EndOptions, - ) -> PaceStorageOptResult { + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { self.storage.end_last_unfinished_activity(end_opts) } @@ -309,7 +304,7 @@ impl ActivityStateManagement for ActivityStore { fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { self.storage.hold_most_recent_active_activity(hold_opts) } @@ -317,7 +312,7 @@ impl ActivityStateManagement for ActivityStore { fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { self.storage.end_all_active_intermissions(end_opts) } @@ -326,7 +321,7 @@ impl ActivityStateManagement for ActivityStore { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.storage.resume_activity(activity_id, resume_opts) } @@ -335,7 +330,7 @@ impl ActivityStateManagement for ActivityStore { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.storage.hold_activity(activity_id, hold_opts) } @@ -343,35 +338,35 @@ impl ActivityStateManagement for ActivityStore { fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { self.storage.resume_most_recent_activity(resume_opts) } } impl ActivityQuerying for ActivityStore { #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceStorageOptResult> { + fn list_activities_by_id(&self) -> PaceOptResult> { self.storage.list_activities_by_id() } #[tracing::instrument(skip(self))] fn group_activities_by_duration_range( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.storage.group_activities_by_duration_range() } #[tracing::instrument(skip(self))] fn group_activities_by_start_date( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.storage.group_activities_by_start_date() } #[tracing::instrument(skip(self))] fn list_activities_with_intermissions( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.storage.list_activities_with_intermissions() } @@ -379,14 +374,12 @@ impl ActivityQuerying for ActivityStore { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.storage.group_activities_by_keywords(keyword_opts) } #[tracing::instrument(skip(self))] - fn group_activities_by_kind( - &self, - ) -> PaceStorageOptResult>> { + fn group_activities_by_kind(&self) -> PaceOptResult>> { self.storage.group_activities_by_kind() } @@ -394,14 +387,14 @@ impl ActivityQuerying for ActivityStore { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { self.storage.list_activities_by_time_range(time_range_opts) } #[tracing::instrument(skip(self))] fn group_activities_by_status( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.storage.group_activities_by_status() } } diff --git a/crates/core/src/service/activity_tracker.rs b/crates/core/src/service/activity_tracker.rs index c744ff4e..bf9d9f4a 100644 --- a/crates/core/src/service/activity_tracker.rs +++ b/crates/core/src/service/activity_tracker.rs @@ -5,10 +5,11 @@ use tracing::debug; use crate::{ domain::{filter::FilterOptions, reflection::ReflectionSummary}, - error::PaceStorageOptResult, service::activity_store::ActivityStore, }; +use pace_error::PaceOptResult; + // This struct represents the overall structure for tracking activities and their intermissions. pub struct ActivityTracker { pub store: ActivityStore, @@ -32,7 +33,7 @@ impl ActivityTracker { &self, filter_opts: FilterOptions, time_frame: PaceTimeFrame, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { let time_range_opts = TimeRangeOptions::try_from(time_frame)?; let Some(summary_groups) = self diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 728c4031..24cdec31 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -4,6 +4,7 @@ use std::{ }; use itertools::Itertools; +use pace_error::{PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use tracing::debug; @@ -17,7 +18,6 @@ use crate::{ filter::{ActivityFilterKind, FilteredActivities}, status::ActivityStatusKind, }, - error::{PaceStorageOptResult, PaceStorageResult}, }; impl Debug for dyn ActivityStorage { @@ -39,7 +39,7 @@ pub trait SyncStorage { /// # Returns /// /// If the storage was synced successfully it should return `Ok(())`. - fn sync(&self) -> PaceStorageResult<()>; + fn sync(&self) -> PaceResult<()>; } /// The trait that all storage backends must implement. This allows us to swap out the storage @@ -65,7 +65,7 @@ pub trait ActivityStorage: /// # Errors /// /// This function should return an error if the storage backend cannot be setup. - fn setup(&self) -> PaceStorageResult<()>; + fn setup(&self) -> PaceResult<()>; /// Teardown the storage backend. This is called once when the application stops. /// @@ -78,7 +78,7 @@ pub trait ActivityStorage: /// # Returns /// /// If the storage backend was torn down successfully it should return `Ok(())`. - fn teardown(&self) -> PaceStorageResult<()>; + fn teardown(&self) -> PaceResult<()>; /// Identify the storage backend. /// @@ -109,7 +109,7 @@ pub trait ActivityReadOps { /// # Returns /// /// The activity that was read from the storage backend. If no activity is found, it should return `Ok(None)`. - fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult; + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult; /// List activities from the storage backend. /// @@ -124,10 +124,7 @@ pub trait ActivityReadOps { /// # Returns /// /// A collection of the activities that were loaded from the storage backend. Returns Ok(None) if no activities are found. - fn list_activities( - &self, - filter: ActivityFilterKind, - ) -> PaceStorageOptResult; + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult; } /// Basic CUD Operations for Activities in the storage backend. @@ -148,7 +145,7 @@ pub trait ActivityWriteOps: ActivityReadOps { /// # Returns /// /// If the activity was created successfully it should return the ID of the created activity. - fn create_activity(&self, activity: Activity) -> PaceStorageResult; + fn create_activity(&self, activity: Activity) -> PaceResult; /// Update an existing activity in the storage backend. /// @@ -178,7 +175,7 @@ pub trait ActivityWriteOps: ActivityReadOps { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceStorageResult; + ) -> PaceResult; /// Delete an activity from the storage backend. /// @@ -197,7 +194,7 @@ pub trait ActivityWriteOps: ActivityReadOps { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceStorageResult; + ) -> PaceResult; } /// Managing Activity State @@ -220,7 +217,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// # Returns /// /// If the activity was started successfully it should return the ID of the started activity. - fn begin_activity(&self, mut activity: Activity) -> PaceStorageResult { + fn begin_activity(&self, mut activity: Activity) -> PaceResult { // End all unfinished activities before starting a new one, // we don't want to have multiple activities running at the same time let _ = self.end_all_activities(EndOptions::default())?; @@ -250,7 +247,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceStorageResult; + ) -> PaceResult; /// Resume an activity in the storage backend. /// @@ -270,7 +267,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceStorageResult; + ) -> PaceResult; /// Resume the most recent activity in the storage backend. /// @@ -288,7 +285,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceStorageOptResult; + ) -> PaceOptResult; /// End an activity in the storage backend. /// @@ -308,7 +305,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceStorageResult; + ) -> PaceResult; /// End all activities in the storage backend. /// @@ -323,7 +320,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// # Returns /// /// A collection of the activities that were ended. Returns Ok(None) if no activities were ended. - fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult>; + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult>; /// End all active intermissions in the storage backend. /// @@ -341,7 +338,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceStorageOptResult>; + ) -> PaceOptResult>; /// End the last unfinished activity in the storage backend. /// @@ -356,10 +353,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity /// # Returns /// /// The activity that was ended. Returns Ok(None) if no activity was ended. - fn end_last_unfinished_activity( - &self, - end_opts: EndOptions, - ) -> PaceStorageOptResult; + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult; /// Hold the most recent activity that is active in the storage backend. /// @@ -382,7 +376,7 @@ pub trait ActivityStateManagement: ActivityReadOps + ActivityWriteOps + Activity fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceStorageOptResult; + ) -> PaceOptResult; } /// Querying Activities @@ -411,7 +405,7 @@ pub trait ActivityQuerying: ActivityReadOps { // TODO!: This method requires defining what constitutes short, medium, and long durations. fn group_activities_by_duration_range( &self, - ) -> PaceStorageOptResult>>; + ) -> PaceOptResult>>; /// Group activities by their start date. This can help in analyzing how /// activities are distributed over time. @@ -429,7 +423,7 @@ pub trait ActivityQuerying: ActivityReadOps { // TODO!: for the groupings, so we can distinguish between start and end date groupings. fn group_activities_by_start_date( &self, - ) -> PaceStorageOptResult>>; + ) -> PaceOptResult>>; /// Retrieve activities that have one or more intermissions, useful for identifying /// potential inefficiencies or breaks. @@ -445,7 +439,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// If no activities are found, it should return `Ok(None)`. fn list_activities_with_intermissions( &self, - ) -> PaceStorageOptResult>>; + ) -> PaceOptResult>>; /// Group activities based on keywords, e.g., category, tags, etc. /// @@ -467,7 +461,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceStorageOptResult>>; + ) -> PaceOptResult>>; /// Group activities based on their kind (e.g., Task, Intermission). /// @@ -480,9 +474,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// A collection of the activities with their kind. /// The key is the kind of the activity, and the value is a list of activities of that kind. /// If no activities are found, it should return `Ok(None)`. - fn group_activities_by_kind( - &self, - ) -> PaceStorageOptResult>>; + fn group_activities_by_kind(&self) -> PaceOptResult>>; /// List activities by time range from the storage backend. /// @@ -501,7 +493,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceStorageOptResult>; + ) -> PaceOptResult>; /// Group activities by their status from the storage backend. /// @@ -515,7 +507,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// If no activities are found, it should return `Ok(None)`. fn group_activities_by_status( &self, - ) -> PaceStorageOptResult>>; + ) -> PaceOptResult>>; /// List all current activities from the storage backend matching an `ActivityFilter`. /// @@ -530,7 +522,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_current_activities( &self, filter: ActivityFilterKind, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { Ok(self .list_activities(filter)? .map(FilteredActivities::into_vec)) @@ -546,7 +538,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// A collection of the activities that were loaded from the storage backend by their ID in a `BTreeMap`. /// If no activities are found, it should return `Ok(None)`. - fn list_activities_by_id(&self) -> PaceStorageOptResult>; + fn list_activities_by_id(&self) -> PaceOptResult>; /// List all active intermissions from the storage backend. /// @@ -558,7 +550,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// A collection of the activities that are currently active intermissions. /// If no activities are found, it should return `Ok(None)`. - fn list_active_intermissions(&self) -> PaceStorageOptResult> { + fn list_active_intermissions(&self) -> PaceOptResult> { Ok(self .list_activities(ActivityFilterKind::ActiveIntermission)? .map(FilteredActivities::into_vec)) @@ -578,7 +570,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// A collection of the most recent activities. /// If no activities are found, it should return `Ok(None)`. - fn list_most_recent_activities(&self, count: usize) -> PaceStorageOptResult> { + fn list_most_recent_activities(&self, count: usize) -> PaceOptResult> { let filtered = self .list_activities(ActivityFilterKind::OnlyActivities)? .map(FilteredActivities::into_vec); @@ -624,7 +616,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// # Returns /// /// If the activity is active, it should return `Ok(true)`. If it is not active, it should return `Ok(false)`. - fn is_activity_active(&self, activity_id: ActivityGuid) -> PaceStorageResult { + fn is_activity_active(&self, activity_id: ActivityGuid) -> PaceResult { let activity = self.read_activity(activity_id)?; debug!( @@ -657,7 +649,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_intermissions_for_activity_id( &self, activity_id: ActivityGuid, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { let Some(filtered) = self .list_activities(ActivityFilterKind::Intermission)? .map(FilteredActivities::into_vec) @@ -711,7 +703,7 @@ pub trait ActivityQuerying: ActivityReadOps { fn list_active_intermissions_for_activity_id( &self, activity_id: ActivityGuid, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { let guids = self.list_active_intermissions()?.map(|log| { log.iter() .filter_map(|active_intermission_id| { @@ -750,7 +742,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// The latest active activity. /// If no activity is found, it should return `Ok(None)`. - fn most_recent_active_activity(&self) -> PaceStorageOptResult { + fn most_recent_active_activity(&self) -> PaceOptResult { let Some(current) = self.list_current_activities(ActivityFilterKind::Active)? else { debug!("No active activities found"); @@ -785,7 +777,7 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// The latest held activity. /// If no activity is found, it should return `Ok(None)`. - fn most_recent_held_activity(&self) -> PaceStorageOptResult { + fn most_recent_held_activity(&self) -> PaceOptResult { let Some(current) = self.list_current_activities(ActivityFilterKind::Held)? else { debug!("No held activities found"); @@ -831,7 +823,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the tag was added successfully it should return `Ok(())`. -// fn add_tag_to_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceStorageResult<()>; +// fn add_tag_to_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceResult<()>; // /// Remove a tag from an activity. // /// @@ -847,7 +839,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the tag was removed successfully it should return `Ok(())`. -// fn remove_tag_from_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceStorageResult<()>; +// fn remove_tag_from_activity(&self, activity_id: ActivityGuid, tag: &str) -> PaceResult<()>; // } // /// Archiving Activities @@ -871,7 +863,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the activity was archived successfully it should return `Ok(())`. -// fn archive_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult<()>; +// fn archive_activity(&self, activity_id: ActivityGuid) -> PaceResult<()>; // /// Unarchive an activity. // /// @@ -886,7 +878,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// If the activity was unarchived successfully it should return `Ok(())`. -// fn unarchive_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult<()>; +// fn unarchive_activity(&self, activity_id: ActivityGuid) -> PaceResult<()>; // } // /// Generate Statistics for Activities @@ -910,7 +902,7 @@ pub trait ActivityQuerying: ActivityReadOps { // /// # Returns // /// // /// A summary or statistics of activities within the specified time frame. -// fn generate_activity_statistics(&self, time_frame: TimeFrame) -> PaceStorageResult; +// fn generate_activity_statistics(&self, time_frame: TimeFrame) -> PaceResult; // } // /// Reviewing Activities @@ -939,5 +931,5 @@ pub trait ActivityQuerying: ActivityReadOps { // &self, // start: PaceDateTime, // end: PaceDateTime, -// ) -> PaceStorageResult; +// ) -> PaceResult; // } diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 4638ee6c..86e1fed0 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -31,16 +31,16 @@ rusqlite = [ [dependencies] displaydoc = { workspace = true } -eyre = { workspace = true } itertools = { workspace = true } libsqlite3-sys = { workspace = true, features = ["bundled"], optional = true } merge = { workspace = true } pace_core = { workspace = true } +pace_error = { workspace = true } pace_time = { workspace = true, features = ["db"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } -sea-query = { workspace = true, optional = true, default-features = false, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } +sea-query = { workspace = true, optional = true, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } sea-query-rusqlite = { workspace = true, optional = true, features = ["with-chrono"] } strum = { workspace = true } thiserror = { workspace = true } diff --git a/crates/storage/src/error.rs b/crates/storage/src/error.rs deleted file mode 100644 index e9a3a07c..00000000 --- a/crates/storage/src/error.rs +++ /dev/null @@ -1,65 +0,0 @@ -use std::path::PathBuf; - -use displaydoc::Display; -use pace_core::prelude::{Activity, ActivityGuid, DatabaseEngineKind, PaceError}; -use thiserror::Error; - -pub type PaceStorageResult = Result; - -/// [`PaceTimeErrorKind`] describes the errors that can happen while dealing with time. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum PaceStorageErrorKind { - /// Pace error: {0} - #[error(transparent)] - PaceError(#[from] PaceError), - - // /// SQLite error: {0} - // #[error(transparent)] - // #[cfg(feature = "rusqlite")] - // SQLite(#[from] rusqlite::Error), - /// Database error: {0} - #[error(transparent)] - Database(#[from] DatabaseStorageErrorKind), - - /// Toml file error: {0} - #[error(transparent)] - TomlFile(#[from] TomlFileStorageErrorKind), - - /// Database storage not configured - DatabaseStorageNotConfigured, - - /// Database storage not implemented, yet! - StorageNotImplemented, -} - -/// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the `SQLite` database. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum DatabaseStorageErrorKind { - /// Error connecting to database: {0} - {1} - ConnectionFailed(String, String), - - /// No connection string provided - NoConnectionString, - - /// This database engine is currently not supported: {0} - UnsupportedDatabaseEngine(DatabaseEngineKind), - - /// Activity with id {0} not found - ActivityNotFound(ActivityGuid), - - /// Failed to create activity: {0} - ActivityCreationFailed(Activity), - - /// Failed to delete activity: {0} - ActivityDeletionFailed(ActivityGuid), -} - -/// [`TomlFileStorageErrorKind`] describes the errors that can happen while dealing with the Toml file storage. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum TomlFileStorageErrorKind { - /// Parent directory not found: {0} - ParentDirNotFound(PathBuf), -} diff --git a/crates/storage/src/file.rs b/crates/storage/src/file.rs index fafd596b..7eb29ff6 100644 --- a/crates/storage/src/file.rs +++ b/crates/storage/src/file.rs @@ -5,17 +5,16 @@ use std::{ path::{Path, PathBuf}, }; -use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; - use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityLog, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, - KeywordOptions, PaceStorageOptResult, PaceStorageResult, ResumeOptions, SyncStorage, - UpdateOptions, + KeywordOptions, ResumeOptions, SyncStorage, UpdateOptions, }; +use pace_error::{PaceOptResult, PaceResult, TomlFileStorageErrorKind}; +use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use crate::{error::TomlFileStorageErrorKind, in_memory::InMemoryActivityStorage}; +use crate::in_memory::InMemoryActivityStorage; /// In-memory backed TOML activity storage /// @@ -29,7 +28,7 @@ pub struct TomlActivityStorage { } impl SyncStorage for TomlActivityStorage { - fn sync(&self) -> PaceStorageResult<()> { + fn sync(&self) -> PaceResult<()> { self.sync_to_file() } } @@ -48,7 +47,7 @@ impl TomlActivityStorage { /// # Returns /// /// Returns a new `TomlActivityStorage` - pub fn new(path: impl AsRef) -> PaceStorageResult { + pub fn new(path: impl AsRef) -> PaceResult { let mut storage = Self { cache: InMemoryActivityStorage::new(), path: path.as_ref().to_path_buf(), @@ -71,7 +70,7 @@ impl TomlActivityStorage { /// /// Returns `Ok(())` if the data is loaded successfully #[tracing::instrument(skip(self))] - fn load(&mut self) -> PaceStorageResult<()> { + fn load(&mut self) -> PaceResult<()> { let data = std::fs::read_to_string(&self.path)?; self.cache = InMemoryActivityStorage::from(toml::from_str::(&data)?); @@ -90,7 +89,7 @@ impl TomlActivityStorage { /// /// Returns `Ok(())` if the cache is written successfully #[tracing::instrument(skip(self))] - pub fn sync_to_file(&self) -> PaceStorageResult<()> { + pub fn sync_to_file(&self) -> PaceResult<()> { let data = toml::to_string(&self.cache.get_activity_log())?; write(&self.path, data)?; Ok(()) @@ -99,7 +98,7 @@ impl TomlActivityStorage { impl ActivityStorage for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn setup(&self) -> PaceStorageResult<()> { + fn setup(&self) -> PaceResult<()> { if !self.path.exists() { create_dir_all( self.path.parent().ok_or_else(|| { @@ -119,7 +118,7 @@ impl ActivityStorage for TomlActivityStorage { } #[tracing::instrument(skip(self))] - fn teardown(&self) -> PaceStorageResult<()> { + fn teardown(&self) -> PaceResult<()> { self.sync_to_file() } @@ -131,30 +130,24 @@ impl ActivityStorage for TomlActivityStorage { impl ActivityReadOps for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { self.cache.read_activity(activity_id) } #[tracing::instrument(skip(self))] - fn list_activities( - &self, - filter: ActivityFilterKind, - ) -> PaceStorageOptResult { + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { self.cache.list_activities(filter) } } impl ActivityStateManagement for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { self.cache.end_all_activities(end_opts) } #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity( - &self, - end_opts: EndOptions, - ) -> PaceStorageOptResult { + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { self.cache.end_last_unfinished_activity(end_opts) } @@ -163,7 +156,7 @@ impl ActivityStateManagement for TomlActivityStorage { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.cache.end_activity(activity_id, end_opts) } @@ -171,7 +164,7 @@ impl ActivityStateManagement for TomlActivityStorage { fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { self.cache.hold_most_recent_active_activity(hold_opts) } @@ -179,7 +172,7 @@ impl ActivityStateManagement for TomlActivityStorage { fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { self.cache.end_all_active_intermissions(end_opts) } @@ -188,7 +181,7 @@ impl ActivityStateManagement for TomlActivityStorage { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.cache.resume_activity(activity_id, resume_opts) } @@ -197,7 +190,7 @@ impl ActivityStateManagement for TomlActivityStorage { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.cache.hold_activity(activity_id, hold_opts) } @@ -205,14 +198,14 @@ impl ActivityStateManagement for TomlActivityStorage { fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { self.cache.resume_most_recent_activity(resume_opts) } } impl ActivityWriteOps for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceStorageResult { + fn create_activity(&self, activity: Activity) -> PaceResult { self.cache.create_activity(activity) } @@ -222,7 +215,7 @@ impl ActivityWriteOps for TomlActivityStorage { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.cache .update_activity(activity_id, updated_activity, update_opts) } @@ -232,40 +225,40 @@ impl ActivityWriteOps for TomlActivityStorage { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceStorageResult { + ) -> PaceResult { self.cache.delete_activity(activity_id, delete_opts) } } impl ActivityQuerying for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceStorageOptResult> { + fn list_activities_by_id(&self) -> PaceOptResult> { self.cache.list_activities_by_id() } #[tracing::instrument(skip(self))] - fn most_recent_active_activity(&self) -> PaceStorageOptResult { + fn most_recent_active_activity(&self) -> PaceOptResult { self.cache.most_recent_active_activity() } #[tracing::instrument(skip(self))] fn group_activities_by_duration_range( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.cache.group_activities_by_duration_range() } #[tracing::instrument(skip(self))] fn group_activities_by_start_date( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.cache.group_activities_by_start_date() } #[tracing::instrument(skip(self))] fn list_activities_with_intermissions( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.cache.list_activities_with_intermissions() } @@ -273,14 +266,12 @@ impl ActivityQuerying for TomlActivityStorage { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.cache.group_activities_by_keywords(keyword_opts) } #[tracing::instrument(skip(self))] - fn group_activities_by_kind( - &self, - ) -> PaceStorageOptResult>> { + fn group_activities_by_kind(&self) -> PaceOptResult>> { self.cache.group_activities_by_kind() } @@ -288,14 +279,14 @@ impl ActivityQuerying for TomlActivityStorage { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { self.cache.list_activities_by_time_range(time_range_opts) } #[tracing::instrument(skip(self))] fn group_activities_by_status( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { self.cache.group_activities_by_status() } } diff --git a/crates/storage/src/in_memory.rs b/crates/storage/src/in_memory.rs index fba86101..c0d7324e 100644 --- a/crates/storage/src/in_memory.rs +++ b/crates/storage/src/in_memory.rs @@ -13,11 +13,11 @@ use tracing::debug; use pace_core::prelude::{ Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, - ActivityKindOptions, ActivityLog, ActivityLogErrorKind, ActivityQuerying, ActivityReadOps, - ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, - EndOptions, FilteredActivities, HoldOptions, KeywordOptions, PaceStorageOptResult, - PaceStorageResult, ResumeOptions, SyncStorage, UpdateOptions, + ActivityKindOptions, ActivityLog, ActivityQuerying, ActivityReadOps, ActivityStateManagement, + ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, + FilteredActivities, HoldOptions, KeywordOptions, ResumeOptions, SyncStorage, UpdateOptions, }; +use pace_error::{ActivityLogErrorKind, PaceOptResult, PaceResult}; /// Type for shared `ActivityLog` type SharedActivityLog = Arc>; @@ -76,12 +76,12 @@ impl Default for InMemoryActivityStorage { } impl ActivityStorage for InMemoryActivityStorage { - fn setup(&self) -> PaceStorageResult<()> { + fn setup(&self) -> PaceResult<()> { debug!("Setting up in-memory storage"); Ok(()) } - fn teardown(&self) -> PaceStorageResult<()> { + fn teardown(&self) -> PaceResult<()> { debug!("Tearing down in-memory storage"); Ok(()) } @@ -92,7 +92,7 @@ impl ActivityStorage for InMemoryActivityStorage { } impl SyncStorage for InMemoryActivityStorage { - fn sync(&self) -> PaceStorageResult<()> { + fn sync(&self) -> PaceResult<()> { debug!("Syncing in-memory storage"); Ok(()) @@ -101,13 +101,16 @@ impl SyncStorage for InMemoryActivityStorage { impl ActivityReadOps for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { let activities = self.log.read(); - let activity = activities - .get(&activity_id) - .cloned() - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; + let activity = + activities + .get(&activity_id) + .cloned() + .ok_or(ActivityLogErrorKind::ActivityNotFound( + activity_id.to_string(), + ))?; drop(activities); @@ -117,10 +120,7 @@ impl ActivityReadOps for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn list_activities( - &self, - filter: ActivityFilterKind, - ) -> PaceStorageOptResult { + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { let activity_log = self.log.read(); let filtered = activity_log @@ -173,7 +173,7 @@ impl ActivityReadOps for InMemoryActivityStorage { impl ActivityWriteOps for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn create_activity(&self, activity: Activity) -> PaceStorageResult { + fn create_activity(&self, activity: Activity) -> PaceResult { let activities = self.log.read(); let activity_item = ActivityItem::from(activity); @@ -187,7 +187,10 @@ impl ActivityWriteOps for InMemoryActivityStorage { // it's not expected to happen. if activities.contains_key(activity_item.guid()) { debug!("Activity ID already in use: {:?}", activity_item.guid()); - return Err(ActivityLogErrorKind::ActivityIdAlreadyInUse(*activity_item.guid()).into()); + return Err(ActivityLogErrorKind::ActivityIdAlreadyInUse( + activity_item.guid().to_string(), + ) + .into()); } drop(activities); @@ -211,13 +214,16 @@ impl ActivityWriteOps for InMemoryActivityStorage { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceStorageResult { + ) -> PaceResult { let activities = self.log.read(); - let original_activity = activities - .get(&activity_id) - .cloned() - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; + let original_activity = + activities + .get(&activity_id) + .cloned() + .ok_or(ActivityLogErrorKind::ActivityNotFound( + activity_id.to_string(), + ))?; debug!("Original activity: {:?}", original_activity); @@ -240,12 +246,15 @@ impl ActivityWriteOps for InMemoryActivityStorage { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceStorageResult { + ) -> PaceResult { let mut activities = self.log.write(); - let activity = activities - .remove(&activity_id) - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))?; + let activity = + activities + .remove(&activity_id) + .ok_or(ActivityLogErrorKind::ActivityNotFound( + activity_id.to_string(), + ))?; drop(activities); @@ -259,12 +268,14 @@ impl ActivityStateManagement for InMemoryActivityStorage { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceStorageResult { + ) -> PaceResult { let activities = self.log.read(); let begin_time = *activities .get(&activity_id) - .ok_or(ActivityLogErrorKind::ActivityNotFound(activity_id))? + .ok_or(ActivityLogErrorKind::ActivityNotFound( + activity_id.to_string(), + ))? .begin(); drop(activities); @@ -288,10 +299,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn end_last_unfinished_activity( - &self, - end_opts: EndOptions, - ) -> PaceStorageOptResult { + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { let Some(most_recent) = self.most_recent_active_activity()? else { debug!("No active activity found."); return Ok(None); @@ -305,7 +313,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { let activities = self.log.read(); let endable_activities = activities @@ -331,10 +339,10 @@ impl ActivityStateManagement for InMemoryActivityStorage { let ended_activities = endable_activities .par_iter() - .map(|activity_id| -> PaceStorageResult { + .map(|activity_id| -> PaceResult { self.end_activity(*activity_id, end_opts.clone()) }) - .collect::>>()?; + .collect::>>()?; debug!("Ended activities: {:?}", ended_activities); @@ -352,7 +360,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { // Get id from last activity that is not ended let Some(active_activity) = self.most_recent_active_activity()? else { debug!("No active activity found."); @@ -368,7 +376,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { let Some(active_intermissions) = self.list_active_intermissions()? else { debug!("No active intermissions found."); @@ -378,11 +386,11 @@ impl ActivityStateManagement for InMemoryActivityStorage { let ended_intermissions = active_intermissions .par_iter() - .map(|activity_id| -> PaceStorageResult { + .map(|activity_id| -> PaceResult { let _ = self.end_activity(*activity_id, end_opts.clone())?; Ok(*activity_id) }) - .collect::>>()?; + .collect::>>()?; debug!("Ended intermissions: {:?}", ended_intermissions); @@ -401,7 +409,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceStorageResult { + ) -> PaceResult { let resumable_activity = self.read_activity(activity_id)?; debug!("Resumable activity: {:?}", resumable_activity); @@ -409,16 +417,18 @@ impl ActivityStateManagement for InMemoryActivityStorage { // If the activity is active, return early with an error if resumable_activity.activity().is_in_progress() { debug!("Activity is already active."); - return Err(ActivityLogErrorKind::ActiveActivityFound(activity_id).into()); + return Err(ActivityLogErrorKind::ActiveActivityFound(activity_id.to_string()).into()); } else if resumable_activity.activity().is_completed() { debug!("Activity has ended."); - return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id).into()); + return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id.to_string()).into()); } else if resumable_activity.activity().is_archived() { debug!("Activity is archived."); - return Err(ActivityLogErrorKind::ActivityAlreadyArchived(activity_id).into()); + return Err( + ActivityLogErrorKind::ActivityAlreadyArchived(activity_id.to_string()).into(), + ); } else if !resumable_activity.activity().is_paused() { debug!("Activity is not held."); - return Err(ActivityLogErrorKind::NoHeldActivityFound(activity_id).into()); + return Err(ActivityLogErrorKind::NoHeldActivityFound(activity_id.to_string()).into()); }; // If there are active intermissions for any activity, end the intermissions @@ -452,7 +462,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceStorageResult { + ) -> PaceResult { // Get ActivityItem for activity that let active_activity = self.read_activity(activity_id)?; @@ -461,13 +471,17 @@ impl ActivityStateManagement for InMemoryActivityStorage { // make sure, the activity is not already ended or archived if !active_activity.activity().is_in_progress() { debug!("Activity is not active."); - return Err(ActivityLogErrorKind::NoActiveActivityFound(activity_id).into()); + return Err( + ActivityLogErrorKind::NoActiveActivityFound(activity_id.to_string()).into(), + ); } else if active_activity.activity().is_completed() { debug!("Activity has ended."); - return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id).into()); + return Err(ActivityLogErrorKind::ActivityAlreadyEnded(activity_id.to_string()).into()); } else if active_activity.activity().is_archived() { debug!("Activity is archived."); - return Err(ActivityLogErrorKind::ActivityAlreadyArchived(activity_id).into()); + return Err( + ActivityLogErrorKind::ActivityAlreadyArchived(activity_id.to_string()).into(), + ); }; // Check if the latest active activity is already having an intermission @@ -547,7 +561,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { // Get id from last activity that is not ended let Some(active_activity) = self.most_recent_held_activity()? else { debug!("No held activity found."); @@ -568,7 +582,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn list_activities_by_id(&self) -> PaceStorageOptResult> { + fn list_activities_by_id(&self) -> PaceOptResult> { let activities = self.log.read(); let activities_by_id = activities.activities().clone(); @@ -589,14 +603,14 @@ impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] fn group_activities_by_duration_range( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { todo!("Implement grouping activities by duration range") } #[tracing::instrument(skip(self))] fn group_activities_by_start_date( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -619,7 +633,7 @@ impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] fn list_activities_with_intermissions( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { let Some(intermissions) = self .list_activities(ActivityFilterKind::Intermission)? .map(FilteredActivities::into_vec) @@ -643,10 +657,12 @@ impl ActivityQuerying for InMemoryActivityStorage { .activity_kind_options() .as_ref() .ok_or(ActivityLogErrorKind::ActivityKindOptionsNotFound( - intermission_id, + intermission_id.to_string(), ))? .parent_id() - .ok_or(ActivityLogErrorKind::ParentIdNotSet(intermission_id))?; + .ok_or(ActivityLogErrorKind::ParentIdNotSet( + intermission_id.to_string(), + ))?; debug!("Parent id: {:?}", parent_id); @@ -666,7 +682,7 @@ impl ActivityQuerying for InMemoryActivityStorage { fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -681,7 +697,9 @@ impl ActivityQuerying for InMemoryActivityStorage { if activity .category() .as_ref() - .ok_or(ActivityLogErrorKind::CategoryNotSet(*activity_id))? + .ok_or(ActivityLogErrorKind::CategoryNotSet( + activity_id.to_string(), + ))? .to_lowercase() .contains(category.as_str()) { @@ -712,9 +730,7 @@ impl ActivityQuerying for InMemoryActivityStorage { } #[tracing::instrument(skip(self))] - fn group_activities_by_kind( - &self, - ) -> PaceStorageOptResult>> { + fn group_activities_by_kind(&self) -> PaceOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -740,7 +756,7 @@ impl ActivityQuerying for InMemoryActivityStorage { #[tracing::instrument(skip(self))] fn group_activities_by_status( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { let activities = self.log.read(); Some(activities.activities().iter().try_fold( @@ -767,7 +783,7 @@ impl ActivityQuerying for InMemoryActivityStorage { fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { let Some(filtered_activities) = self .list_activities(ActivityFilterKind::TimeRange(time_range_opts))? .map(FilteredActivities::into_vec) @@ -800,7 +816,7 @@ mod tests { use super::*; use chrono::Local; - use pace_core::prelude::TestResult; + use pace_error::TestResult; use pace_time::date_time::PaceDateTime; use std::collections::HashSet; diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 98bb4483..c1a78656 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,8 +1,6 @@ pub mod migration; pub mod storage; -pub mod error; - /// A type of storage that can be synced to a persistent medium - a file pub mod file; @@ -16,16 +14,12 @@ pub mod entities; use std::sync::Arc; -use pace_core::prelude::{ - ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig, PaceStorageResult, -}; +use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; +use pace_error::{DatabaseStorageErrorKind, PaceResult}; use tracing::debug; use crate::{ - error::{DatabaseStorageErrorKind, PaceStorageErrorKind}, - file::TomlActivityStorage, - in_memory::InMemoryActivityStorage, - sqlite::SqliteActivityStorage, + file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SqliteActivityStorage, }; /// Get the storage backend from the configuration. @@ -41,7 +35,7 @@ use crate::{ /// # Returns /// /// The storage backend. -pub fn get_storage_from_config(config: &PaceConfig) -> PaceStorageResult> { +pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { let storage: Arc = match config.general().activity_log_options().storage_kind() { ActivityLogStorageKind::File => Arc::new(TomlActivityStorage::new( @@ -69,17 +63,17 @@ pub fn get_storage_from_config(config: &PaceConfig) -> PaceStorageResult { return Err(DatabaseStorageErrorKind::UnsupportedDatabaseEngine( - *engine, + engine.to_string(), ) .into()) } } } else { - return Err(PaceStorageErrorKind::DatabaseStorageNotConfigured.into()); + return Err(DatabaseStorageErrorKind::DatabaseStorageNotConfigured.into()); } } ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), - _ => return Err(PaceStorageErrorKind::StorageNotImplemented.into()), + _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), }; debug!("Using storage backend: {:?}", storage); diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 4865d73c..5ca862c5 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -9,13 +9,12 @@ mod create_categories_20240326125937; mod create_schema_migrations; mod create_tags_20240326125555; -use eyre::OptionExt; use rusqlite::Connection; -use sea_query::{Cond, Expr, Query, SqliteQueryBuilder}; +use sea_query::{Cond, Expr, Iden, Query, SqliteQueryBuilder}; use std::collections::VecDeque; use ulid::Ulid; -use pace_core::prelude::PaceStorageResult; +use pace_error::{DatabaseStorageErrorKind, PaceResult}; use crate::entities::schema_migrations::SchemaMigrationsIden; @@ -32,7 +31,20 @@ pub struct SQLiteMigrator<'conn> { } impl<'conn> SQLiteMigrator<'conn> { - pub fn new(connection: &'conn Connection) -> PaceStorageResult { + /// Create a new `SQLiteMigrator` + /// + /// # Arguments + /// + /// * `connection` - The [`rusqlite::Connection`] + /// + /// # Errors + /// + /// Returns an error if the initial migration fails + /// + /// # Returns + /// + /// Returns a new `SQLiteMigrator` + pub fn new(connection: &'conn Connection) -> PaceResult { let mut migrator = Self { iterator: Self::load(), applied: VecDeque::default(), @@ -44,11 +56,25 @@ impl<'conn> SQLiteMigrator<'conn> { Ok(migrator) } - fn init(&mut self) -> PaceStorageResult<()> { - let migration = self.iterator.next().ok_or_eyre("No migrations found")?; + fn init(&mut self) -> PaceResult<()> { + let migration = + self.iterator + .next() + .ok_or(DatabaseStorageErrorKind::NoMigrationsFound { + table: SchemaMigrationsIden::Table.to_string(), + })?; let query = migration.up(); - self.connection.execute(&query, [])?; + if self.connection.execute(&query, []).map_err(|source| { + DatabaseStorageErrorKind::MigrationFailed { + version: migration.version(), + query: query.to_string(), + source, + } + })? > 1 + { + return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); + } self.applied.push_back(migration); @@ -78,41 +104,102 @@ impl<'conn> SQLiteMigrator<'conn> { Box::new(migrations.into_iter()) } - /// Push migration version to schema_migrations table - fn push_migration_version(&self, version: String) -> PaceStorageResult<()> { + /// Push migration version to `schema_migrations` table + /// + /// # Errors + /// + /// Returns an error if the migration version cannot be pushed + /// + /// # Returns + /// + /// Returns `Ok(())` if the migration version is pushed successfully + fn push_migration_version(&self, version: String) -> PaceResult<()> { let query = Query::insert() .into_table(SchemaMigrationsIden::Table) .columns([SchemaMigrationsIden::Guid, SchemaMigrationsIden::Version]) - .values([Ulid::new().to_string().into(), version.into()])? + .values([Ulid::new().to_string().into(), version.clone().into()]) + .map_err( + |source| DatabaseStorageErrorKind::BuildingMigrationQueryFailed { + version: version.clone(), + table: SchemaMigrationsIden::Table.to_string(), + query: source.to_string(), + source, + }, + )? .to_owned(); let query = query.to_string(SqliteQueryBuilder); - self.connection.execute(&query, [])?; + if self.connection.execute(&query, []).map_err(|err| { + DatabaseStorageErrorKind::MigrationFailed { + version, + query, + source: err, + } + })? > 1 + { + return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); + } Ok(()) } - /// Remove migration version from schema_migrations table - fn remove_migration_version(&self, version: String) -> PaceStorageResult<()> { + /// Remove migration version from `schema_migrations` table + /// + /// # Errors + /// + /// Returns an error if the migration version cannot be removed + /// + /// # Returns + /// + /// Returns `Ok(())` if the migration version is removed successfully + fn remove_migration_version(&self, version: String) -> PaceResult<()> { let query = Query::delete() .from_table(SchemaMigrationsIden::Table) - .cond_where(Cond::any().add(Expr::col(SchemaMigrationsIden::Version).eq(version))) + .cond_where( + Cond::any().add(Expr::col(SchemaMigrationsIden::Version).eq(version.clone())), + ) .to_owned(); let query = query.to_string(SqliteQueryBuilder); - self.connection.execute(&query, [])?; + if self.connection.execute(&query, []).map_err(|source| { + DatabaseStorageErrorKind::MigrationFailed { + version, + query, + source, + } + })? > 1 + { + return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); + } Ok(()) } /// Migrate to the latest version - pub fn up(&mut self) -> PaceStorageResult<()> { + /// + /// # Errors + /// + /// Returns an error if the migration fails + /// + /// # Returns + /// + /// Returns `Ok(())` if the migration is successful + pub fn up(&mut self) -> PaceResult<()> { while let Some(migration) = self.iterator.next() { let query = migration.up(); - self.connection.execute(&query, [])?; + if self.connection.execute(&query, []).map_err(|source| { + DatabaseStorageErrorKind::MigrationFailed { + version: migration.version(), + query: query.to_string(), + source, + } + })? > 1 + { + return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); + } self.push_migration_version(migration.version())?; @@ -123,15 +210,29 @@ impl<'conn> SQLiteMigrator<'conn> { } /// Rollback the most recent migration - pub fn down(&mut self) -> PaceStorageResult { + /// + /// # Errors + /// + /// Returns an error if there are no migrations to rollback + /// + /// # Returns + /// + /// Returns the version of the migration that was rolled back + pub fn down(&mut self) -> PaceResult { let migration = self .applied .pop_back() - .ok_or_eyre("No migrations to rollback")?; + .ok_or(DatabaseStorageErrorKind::NoMigrationsToRollback)?; let query = migration.down(); - _ = self.connection.execute(&query, [])?; + _ = self.connection.execute(&query, []).map_err(|source| { + DatabaseStorageErrorKind::MigrationFailed { + version: migration.version(), + query: query.to_string(), + source, + } + })?; self.remove_migration_version(migration.version())?; @@ -139,9 +240,8 @@ impl<'conn> SQLiteMigrator<'conn> { } /// List applied migrations - pub fn status(&self) -> PaceStorageResult> { - let applied = self.applied.iter().map(|m| m.version()).collect(); - - Ok(applied) + #[must_use] + pub fn status(&self) -> Vec { + self.applied.iter().map(|m| m.version()).collect() } } diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/sqlite.rs index 9cf397f6..8ba1b4b9 100644 --- a/crates/storage/src/sqlite.rs +++ b/crates/storage/src/sqlite.rs @@ -8,11 +8,12 @@ use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, - PaceStorageOptResult, PaceStorageResult, ResumeOptions, SyncStorage, UpdateOptions, + ResumeOptions, SyncStorage, UpdateOptions, }; +use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use crate::{error::DatabaseStorageErrorKind, migration::SQLiteMigrator}; +use crate::migration::SQLiteMigrator; #[derive(Debug)] pub struct SqliteActivityStorage { @@ -20,7 +21,7 @@ pub struct SqliteActivityStorage { } impl SqliteActivityStorage { - pub fn new(connection_string: String) -> PaceStorageResult { + pub fn new(connection_string: String) -> PaceResult { let connection = Connection::open(connection_string.as_str()).map_err(|err| { DatabaseStorageErrorKind::ConnectionFailed(connection_string, err.to_string()) })?; @@ -30,7 +31,7 @@ impl SqliteActivityStorage { } impl ActivityStorage for SqliteActivityStorage { - fn setup(&self) -> PaceStorageResult<()> { + fn setup(&self) -> PaceResult<()> { let mut migrate = SQLiteMigrator::new(&self.connection)?; migrate.up()?; @@ -38,7 +39,7 @@ impl ActivityStorage for SqliteActivityStorage { Ok(()) } - fn teardown(&self) -> PaceStorageResult<()> { + fn teardown(&self) -> PaceResult<()> { // TODO: Do we need a teardown for sqlite? unimplemented!("teardown not yet implemented for sqlite storage") } @@ -49,7 +50,7 @@ impl ActivityStorage for SqliteActivityStorage { } impl SyncStorage for SqliteActivityStorage { - fn sync(&self) -> PaceStorageResult<()> { + fn sync(&self) -> PaceResult<()> { // We sync activities to the database in each operation // so we don't need to do anything here @@ -59,7 +60,7 @@ impl SyncStorage for SqliteActivityStorage { impl ActivityReadOps for SqliteActivityStorage { #[tracing::instrument] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceStorageResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { // let mut stmt = self // .connection // .prepare("SELECT * FROM activities WHERE id = ?1")?; @@ -80,10 +81,7 @@ impl ActivityReadOps for SqliteActivityStorage { } #[tracing::instrument] - fn list_activities( - &self, - filter: ActivityFilterKind, - ) -> PaceStorageOptResult { + fn list_activities(&self, filter: ActivityFilterKind) -> PaceOptResult { // let mut stmt = self.connection.prepare(filter.to_sql_statement())?; // let activity_item_iter = stmt.query_map([], |row| Ok(ActivityGuid::from_row(&row)))?; @@ -119,7 +117,7 @@ impl ActivityReadOps for SqliteActivityStorage { } impl ActivityWriteOps for SqliteActivityStorage { - fn create_activity(&self, activity: Activity) -> PaceStorageResult { + fn create_activity(&self, activity: Activity) -> PaceResult { // let tx = self.connection.transaction()?; // let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; @@ -140,7 +138,7 @@ impl ActivityWriteOps for SqliteActivityStorage { activity_id: ActivityGuid, updated_activity: Activity, update_opts: UpdateOptions, - ) -> PaceStorageResult { + ) -> PaceResult { todo!() } @@ -148,7 +146,7 @@ impl ActivityWriteOps for SqliteActivityStorage { &self, activity_id: ActivityGuid, delete_opts: DeleteOptions, - ) -> PaceStorageResult { + ) -> PaceResult { // let activity = self.read_activity(activity_id)?; // let tx = self.connection.transaction()?; @@ -168,7 +166,7 @@ impl ActivityStateManagement for SqliteActivityStorage { &self, activity_id: ActivityGuid, hold_opts: HoldOptions, - ) -> PaceStorageResult { + ) -> PaceResult { todo!() } @@ -176,14 +174,14 @@ impl ActivityStateManagement for SqliteActivityStorage { &self, activity_id: ActivityGuid, resume_opts: ResumeOptions, - ) -> PaceStorageResult { + ) -> PaceResult { todo!() } fn resume_most_recent_activity( &self, resume_opts: ResumeOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { todo!() } @@ -191,81 +189,76 @@ impl ActivityStateManagement for SqliteActivityStorage { &self, activity_id: ActivityGuid, end_opts: EndOptions, - ) -> PaceStorageResult { + ) -> PaceResult { todo!() } - fn end_all_activities(&self, end_opts: EndOptions) -> PaceStorageOptResult> { + fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { todo!() } fn end_all_active_intermissions( &self, end_opts: EndOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { todo!() } - fn end_last_unfinished_activity( - &self, - end_opts: EndOptions, - ) -> PaceStorageOptResult { + fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { todo!() } fn hold_most_recent_active_activity( &self, hold_opts: HoldOptions, - ) -> PaceStorageOptResult { + ) -> PaceOptResult { todo!() } } impl ActivityQuerying for SqliteActivityStorage { fn group_activities_by_duration_range( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { todo!() } fn group_activities_by_start_date( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { todo!() } fn list_activities_with_intermissions( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { todo!() } fn group_activities_by_keywords( &self, keyword_opts: KeywordOptions, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { todo!() } - fn group_activities_by_kind( - &self, - ) -> PaceStorageOptResult>> { + fn group_activities_by_kind(&self) -> PaceOptResult>> { todo!() } fn list_activities_by_time_range( &self, time_range_opts: TimeRangeOptions, - ) -> PaceStorageOptResult> { + ) -> PaceOptResult> { todo!() } fn group_activities_by_status( &self, - ) -> PaceStorageOptResult>> { + ) -> PaceOptResult>> { todo!() } - fn list_activities_by_id(&self) -> PaceStorageOptResult> { + fn list_activities_by_id(&self) -> PaceOptResult> { todo!() } } diff --git a/crates/time/Cargo.toml b/crates/time/Cargo.toml index a70cc854..dbab4023 100644 --- a/crates/time/Cargo.toml +++ b/crates/time/Cargo.toml @@ -34,6 +34,7 @@ derive_more = { workspace = true, features = ["add", "add_assign"] } displaydoc = { workspace = true } getset = { workspace = true } humantime = { workspace = true } +pace_error = { workspace = true } rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } serde = { workspace = true } serde_derive = { workspace = true } diff --git a/crates/time/src/date.rs b/crates/time/src/date.rs index 340767a5..5434db9a 100644 --- a/crates/time/src/date.rs +++ b/crates/time/src/date.rs @@ -4,7 +4,8 @@ use chrono::{Local, NaiveDate}; use serde_derive::{Deserialize, Serialize}; -use crate::{date_time::PaceDateTime, error::PaceTimeErrorKind}; +use crate::date_time::PaceDateTime; +use pace_error::TimeErrorKind; /// {0} #[derive( @@ -53,26 +54,22 @@ impl PaceDate { } impl FromStr for PaceDate { - type Err = PaceTimeErrorKind; + type Err = TimeErrorKind; fn from_str(s: &str) -> Result { let date = NaiveDate::parse_from_str(s, "%Y-%m-%d") - .map_err(|_| PaceTimeErrorKind::ParsingDateFailed(format!("Invalid date: {s}")))?; + .map_err(|_| TimeErrorKind::ParsingDateFailed(format!("Invalid date: {s}")))?; Ok(Self(date)) } } impl TryFrom<(i32, u32, u32)> for PaceDate { - type Error = PaceTimeErrorKind; + type Error = TimeErrorKind; fn try_from((year, month, day): (i32, u32, u32)) -> Result { NaiveDate::from_ymd_opt(year, month, day).map_or_else( - || { - Err(PaceTimeErrorKind::InvalidDate(format!( - "{year}/{month}/{day}" - ))) - }, + || Err(TimeErrorKind::InvalidDate(format!("{year}/{month}/{day}"))), |date| Ok(Self(date)), ) } diff --git a/crates/time/src/date_time.rs b/crates/time/src/date_time.rs index 980ab31c..e074750b 100644 --- a/crates/time/src/date_time.rs +++ b/crates/time/src/date_time.rs @@ -12,21 +12,18 @@ use serde_derive::{Deserialize, Serialize}; use tracing::debug; use crate::{ - date::PaceDate, - duration::PaceDuration, - error::{PaceTimeErrorKind, PaceTimeResult}, - time::PaceTime, - time_zone::PaceTimeZoneKind, - Validate, + date::PaceDate, duration::PaceDuration, time::PaceTime, time_zone::PaceTimeZoneKind, Validate, }; +use pace_error::{PaceError, PaceResult, TimeErrorKind}; + impl TryFrom for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = TimeErrorKind; fn try_from(_date: PaceDate) -> Result { // if the date is invalid because of the time, use the default time // Ok(Self::new(date.inner().and_hms_opt(0, 0, 0).ok_or_else( - // || PaceTimeErrorKind::InvalidDate(date.to_string()), + // || TimeErrorKind::InvalidDate(date.to_string()), // )?)) unimplemented!("Implement conversion from PaceDate to PaceDateTime") } @@ -37,7 +34,7 @@ impl TryFrom for PaceDateTime { pub struct PaceDateTime(DateTime); impl FromStr for PaceDateTime { - type Err = PaceTimeErrorKind; + type Err = TimeErrorKind; /// Parse a `PaceDateTime` from a string /// @@ -54,13 +51,13 @@ impl FromStr for PaceDateTime { /// Returns the parsed `PaceDateTime` fn from_str(s: &str) -> Result { Ok(Self(DateTime::parse_from_rfc3339(s).map_err(|e| { - PaceTimeErrorKind::ParseError(format!("{e:?}")) + TimeErrorKind::ParseError(format!("{e:?}")) })?)) } } impl TryFrom<(Option<&NaiveTime>, PaceTimeZoneKind, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; /// Try to convert from a tuple of optional naive time, time zone and time zone offset /// @@ -103,7 +100,7 @@ impl TryFrom<(Option<&NaiveTime>, PaceTimeZoneKind, PaceTimeZoneKind)> for PaceD } _ => { debug!("Conversion failed with time zones: {tz:?} and {tz_config:?}"); - Err(PaceTimeErrorKind::ConversionToPaceDateTimeFailed) + Err(TimeErrorKind::ConversionToPaceDateTimeFailed.into()) } } } @@ -125,11 +122,7 @@ impl PaceDateTime { /// # Returns /// /// Returns the date time with a time zone implementation - pub fn new( - date: NaiveDate, - time: NaiveTime, - time_zone: PaceTimeZoneKind, - ) -> PaceTimeResult { + pub fn new(date: NaiveDate, time: NaiveTime, time_zone: PaceTimeZoneKind) -> PaceResult { pace_date_time_from_date_and_time_and_tz(date, time, time_zone) } @@ -146,22 +139,18 @@ impl PaceDateTime { /// # Returns /// /// Returns the new [`PaceDateTime`] with the added [`TimeDelta`] - pub fn add_duration(self, rhs: PaceDuration) -> PaceTimeResult { + pub fn add_duration(self, rhs: PaceDuration) -> PaceResult { Ok(Self( self.0 .checked_add_signed( Duration::new( i64::try_from(rhs.inner()) - .map_err(PaceTimeErrorKind::FailedToConvertDurationToI64)?, + .map_err(TimeErrorKind::FailedToConvertDurationToI64)?, 0, ) - .ok_or_else(|| { - PaceTimeErrorKind::ConversionToDurationFailed(format!("{rhs:?}")) - })?, + .ok_or_else(|| TimeErrorKind::ConversionToDurationFailed(format!("{rhs:?}")))?, ) - .ok_or_else(|| { - PaceTimeErrorKind::AddingTimeDeltaFailed(format!("{self} + {rhs:?}")) - })?, + .ok_or_else(|| TimeErrorKind::AddingTimeDeltaFailed(format!("{self} + {rhs:?}")))?, )) } @@ -195,16 +184,16 @@ impl PaceDateTime { /// /// Returns an error if the time can't be set to the start of the day /// and the time is ambiguous - pub fn start_of_day(mut self) -> PaceTimeResult { + pub fn start_of_day(mut self) -> PaceResult { let time_zone = self.0.offset(); let time = self.0.date_naive().and_time( - NaiveTime::from_hms_opt(0, 0, 0).ok_or(PaceTimeErrorKind::SettingStartOfDayFailed)?, + NaiveTime::from_hms_opt(0, 0, 0).ok_or(TimeErrorKind::SettingStartOfDayFailed)?, ); if let LocalResult::Single(datetime) = time_zone.from_local_datetime(&time) { self.0 = datetime; } else { - return Err(PaceTimeErrorKind::AmbiguousConversionResult); + return Err(TimeErrorKind::AmbiguousConversionResult.into()); } Ok(self) @@ -216,17 +205,16 @@ impl PaceDateTime { /// /// Returns an error if the time can't be set to the end of the day /// and the time is ambiguous - pub fn end_of_day(mut self) -> PaceTimeResult { + pub fn end_of_day(mut self) -> PaceResult { let time_zone = self.0.offset(); let time = self.0.date_naive().and_time( - NaiveTime::from_hms_opt(23, 59, 59) - .ok_or(PaceTimeErrorKind::SettingStartOfDayFailed)?, + NaiveTime::from_hms_opt(23, 59, 59).ok_or(TimeErrorKind::SettingStartOfDayFailed)?, ); if let LocalResult::Single(datetime) = time_zone.from_local_datetime(&time) { self.0 = datetime; } else { - return Err(PaceTimeErrorKind::AmbiguousConversionResult); + return Err(TimeErrorKind::AmbiguousConversionResult.into()); } Ok(self) @@ -290,7 +278,7 @@ impl PaceDateTime { impl Validate for PaceDateTime { type Output = Self; - type Error = PaceTimeErrorKind; + type Error = PaceError; /// Check if time is in the future /// @@ -301,9 +289,9 @@ impl Validate for PaceDateTime { /// # Returns /// /// Returns the time if it's not in the future - fn validate(self) -> PaceTimeResult { + fn validate(self) -> PaceResult { if self > Self::now() { - Err(PaceTimeErrorKind::StartTimeInFuture(self)) + Err(TimeErrorKind::StartTimeInFuture(self.to_string()).into()) } else { Ok(self) } @@ -336,16 +324,16 @@ impl From>> for PaceDateTime { } impl TryFrom for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; - fn try_from(time: NaiveDateTime) -> PaceTimeResult { + fn try_from(time: NaiveDateTime) -> PaceResult { // get local time zone let local = Local::now(); let local = local.offset(); // combine NaiveDateTime with local time zone let LocalResult::Single(datetime) = local.from_local_datetime(&time) else { - Err(PaceTimeErrorKind::AmbiguousConversionResult)? + Err(TimeErrorKind::AmbiguousConversionResult)? }; Ok(Self::from(datetime.round_subsecs(0).fixed_offset())) @@ -373,11 +361,11 @@ impl TryFrom for PaceDateTime { pub(crate) fn pace_date_time_from_date_and_tz_with_zero_hms( date: NaiveDate, time_zone: PaceTimeZoneKind, -) -> PaceTimeResult { +) -> PaceResult { pace_date_time_from_date_and_time_and_tz( date, NaiveTime::from_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(date.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(date.to_string()))?, time_zone, )? .validate() @@ -402,18 +390,18 @@ pub fn pace_date_time_from_date_and_time_and_tz( date: NaiveDate, time: NaiveTime, tz: PaceTimeZoneKind, -) -> PaceTimeResult { +) -> PaceResult { let date_time = match tz { PaceTimeZoneKind::TimeZone(ref tz) => { let LocalResult::Single(datetime) = tz.from_local_datetime(&date.and_time(time)) else { - return Err(PaceTimeErrorKind::AmbiguousConversionResult); + return Err(TimeErrorKind::AmbiguousConversionResult.into()); }; PaceDateTime::from(datetime.round_subsecs(0).fixed_offset()) } PaceTimeZoneKind::TimeZoneOffset(ref tz) => { let LocalResult::Single(datetime) = tz.from_local_datetime(&date.and_time(time)) else { - return Err(PaceTimeErrorKind::AmbiguousConversionResult); + return Err(TimeErrorKind::AmbiguousConversionResult.into()); }; PaceDateTime::from(datetime.round_subsecs(0).fixed_offset()) @@ -421,7 +409,7 @@ pub fn pace_date_time_from_date_and_time_and_tz( PaceTimeZoneKind::NotSet => { let LocalResult::Single(datetime) = Local.from_local_datetime(&date.and_time(time)) else { - return Err(PaceTimeErrorKind::AmbiguousConversionResult); + return Err(TimeErrorKind::AmbiguousConversionResult.into()); }; PaceDateTime::from(datetime.round_subsecs(0).fixed_offset()) @@ -434,7 +422,7 @@ pub fn pace_date_time_from_date_and_time_and_tz( } impl TryFrom<(NaiveDate, NaiveTime, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from( (date, time, tz): (NaiveDate, NaiveTime, PaceTimeZoneKind), @@ -444,7 +432,7 @@ impl TryFrom<(NaiveDate, NaiveTime, PaceTimeZoneKind)> for PaceDateTime { } impl TryFrom<(NaiveDate, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from((date, tz): (NaiveDate, PaceTimeZoneKind)) -> Result { pace_date_time_from_date_and_time_and_tz(date, Local::now().time(), tz)?.validate() @@ -452,7 +440,7 @@ impl TryFrom<(NaiveDate, PaceTimeZoneKind)> for PaceDateTime { } impl TryFrom<(NaiveTime, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from((time, tz): (NaiveTime, PaceTimeZoneKind)) -> Result { pace_date_time_from_date_and_time_and_tz(Local::now().date_naive(), time, tz)?.validate() @@ -460,7 +448,7 @@ impl TryFrom<(NaiveTime, PaceTimeZoneKind)> for PaceDateTime { } impl TryFrom<(NaiveDate, NaiveTime)> for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from((date, time): (NaiveDate, NaiveTime)) -> Result { pace_date_time_from_date_and_time_and_tz( @@ -473,7 +461,7 @@ impl TryFrom<(NaiveDate, NaiveTime)> for PaceDateTime { } impl TryFrom<(NaiveDateTime, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from((date_time, tz): (NaiveDateTime, PaceTimeZoneKind)) -> Result { pace_date_time_from_date_and_time_and_tz(date_time.date(), date_time.time(), tz)?.validate() diff --git a/crates/time/src/duration.rs b/crates/time/src/duration.rs index e05d3c38..92a3ca13 100644 --- a/crates/time/src/duration.rs +++ b/crates/time/src/duration.rs @@ -11,10 +11,9 @@ use humantime::format_duration; use serde_derive::{Deserialize, Serialize}; use tracing::debug; -use crate::{ - date_time::PaceDateTime, - error::{PaceTimeErrorKind, PaceTimeResult}, -}; +use pace_error::{PaceResult, TimeErrorKind}; + +use crate::date_time::PaceDateTime; /// Converts timespec to nice readable relative time string /// @@ -159,11 +158,11 @@ impl PaceDuration { } impl FromStr for PaceDuration { - type Err = PaceTimeErrorKind; + type Err = TimeErrorKind; fn from_str(s: &str) -> Result { s.parse::().map_or_else( - |_| Err(PaceTimeErrorKind::ParsingDurationFailed(s.to_string())), + |_| Err(TimeErrorKind::ParsingDurationFailed(s.to_string())), |duration| Ok(Self(duration)), ) } @@ -176,11 +175,11 @@ impl From for PaceDuration { } impl TryFrom for PaceDuration { - type Error = PaceTimeErrorKind; + type Error = TimeErrorKind; fn try_from(duration: chrono::Duration) -> Result { Ok(Self(duration.num_seconds().try_into().map_err(|_| { - PaceTimeErrorKind::ParsingDurationFailed(duration.to_string()) + TimeErrorKind::ParsingDurationFailed(duration.to_string()) })?)) } } @@ -228,10 +227,7 @@ impl std::ops::SubAssign for PaceDuration { /// /// Returns the duration of the activity #[tracing::instrument] -pub fn calculate_duration( - begin: &PaceDateTime, - end: &PaceDateTime, -) -> PaceTimeResult { +pub fn calculate_duration(begin: &PaceDateTime, end: &PaceDateTime) -> PaceResult { let duration = end.inner().signed_duration_since(begin.inner()).to_std()?; debug!("Duration: {duration:?}"); diff --git a/crates/time/src/error.rs b/crates/time/src/error.rs deleted file mode 100644 index ceb4d391..00000000 --- a/crates/time/src/error.rs +++ /dev/null @@ -1,77 +0,0 @@ -use std::num::TryFromIntError; - -use chrono::OutOfRangeError; -use displaydoc::Display; -use thiserror::Error; - -use crate::date_time::PaceDateTime; - -pub type PaceTimeResult = Result; - -/// [`PaceTimeErrorKind`] describes the errors that can happen while dealing with time. -#[non_exhaustive] -#[derive(Error, Debug, Display)] -pub enum PaceTimeErrorKind { - /// {0} - #[error(transparent)] - OutOfRange(#[from] OutOfRangeError), - - /// Failed to parse time '{0}' from user input, please use the format HH:MM - ParsingTimeFromUserInputFailed(String), - - /// The start time cannot be in the future, please use a time in the past: '{0}' - StartTimeInFuture(PaceDateTime), - - /// Failed to parse duration '{0}', please use only numbers >= 0 - ParsingDurationFailed(String), - - /// Failed to parse date '{0}', please use the format YYYY-MM-DD - InvalidDate(String), - /// Date is not present! - DateShouldBePresent, - - /// Failed to parse date '{0}' - ParsingDateFailed(String), - - /// Invalid time range: Start '{0}' - End '{1}' - InvalidTimeRange(String, String), - - /// Invalid time zone: '{0}' - InvalidTimeZone(String), - - /// Failed to parse fixed offset '{0}' from user input, please use the format ±HHMM - ParsingFixedOffsetFailed(String), - - /// Failed to create PaceDateTime from user input, please use the format HH:MM and ±HHMM - InvalidUserInput, - - /// Time zone not found - UndefinedTimeZone, - - /// Both time zone and time zone offset are defined, please use only one - AmbiguousTimeZones, - - /// Ambiguous conversion result - AmbiguousConversionResult, - - /// Conversion to PaceDateTime failed - ConversionToPaceDateTimeFailed, - - /// Failed to parse time '{0}', please use the format HH:MM - InvalidTime(String), - - /// Failed to parse time '{0}', please use rfc3339 format - ParseError(String), - - /// Setting start of day failed - SettingStartOfDayFailed, - - /// Adding time delta failed: '{0}' - AddingTimeDeltaFailed(String), - - /// Failed to convert duration to i64: '{0}' - FailedToConvertDurationToI64(TryFromIntError), - - /// Failed to convert PaceDuration to Standard Duration: '{0}' - ConversionToDurationFailed(String), -} diff --git a/crates/time/src/lib.rs b/crates/time/src/lib.rs index 230c1dee..8a4db13f 100644 --- a/crates/time/src/lib.rs +++ b/crates/time/src/lib.rs @@ -1,7 +1,6 @@ pub mod date; pub mod date_time; pub mod duration; -pub mod error; pub mod flags; #[cfg(feature = "rusqlite")] pub mod rusqlite; diff --git a/crates/time/src/time_frame.rs b/crates/time/src/time_frame.rs index 1ffd85db..5edc059a 100644 --- a/crates/time/src/time_frame.rs +++ b/crates/time/src/time_frame.rs @@ -5,12 +5,13 @@ use tracing::debug; use crate::{ date::PaceDate, date_time::PaceDateTime, - error::PaceTimeErrorKind, flags::{DateFlags, TimeFlags}, time_range::TimeRangeOptions, time_zone::PaceTimeZoneKind, }; +use pace_error::{PaceError, PaceResult}; + #[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize, Display)] pub enum PaceTimeFrame { /// Current Month @@ -53,7 +54,7 @@ impl PaceTimeZoneKind, )> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from( (time_flags, date_flags, tz, tz_config): ( @@ -70,7 +71,7 @@ impl } impl TryFrom<(Option<&TimeFlags>, Option<&DateFlags>, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from( (time_flags, date_flags, tz): (Option<&TimeFlags>, Option<&DateFlags>, PaceTimeZoneKind), @@ -85,7 +86,7 @@ impl TryFrom<(Option<&TimeFlags>, Option<&DateFlags>, PaceTimeZoneKind)> for Pac } impl TryFrom<(&DateFlags, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from((date_flags, tz): (&DateFlags, PaceTimeZoneKind)) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -98,7 +99,7 @@ impl TryFrom<(&DateFlags, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<&DateFlags> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from(date_flags: &DateFlags) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -111,7 +112,7 @@ impl TryFrom<&DateFlags> for PaceTimeFrame { } impl TryFrom<(Option<&DateFlags>, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from( (date_flags, tz): (Option<&DateFlags>, PaceTimeZoneKind), @@ -126,7 +127,7 @@ impl TryFrom<(Option<&DateFlags>, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<(Option<&TimeFlags>, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from( (time_flags, tz): (Option<&TimeFlags>, PaceTimeZoneKind), @@ -141,7 +142,7 @@ impl TryFrom<(Option<&TimeFlags>, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<(&TimeFlags, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from((time_flags, tz): (&TimeFlags, PaceTimeZoneKind)) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -154,7 +155,7 @@ impl TryFrom<(&TimeFlags, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<&TimeFlags> for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from(time_flags: &TimeFlags) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -167,7 +168,7 @@ impl TryFrom<&TimeFlags> for PaceTimeFrame { } impl TryFrom for PaceTimeFrame { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from(tz: PaceTimeZoneKind) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -200,7 +201,7 @@ pub(crate) fn time_frame_from_date_and_time_flags_with_time_zone_kind( date_flags: Option<&DateFlags>, tz: PaceTimeZoneKind, tz_config: PaceTimeZoneKind, -) -> Result { +) -> PaceResult { let time_zone = match (tz, tz_config) { (tzk, _) | (PaceTimeZoneKind::NotSet, tzk) if !tzk.is_not_set() => tzk, _ => PaceTimeZoneKind::default(), diff --git a/crates/time/src/time_range.rs b/crates/time/src/time_range.rs index b9da889f..6a91610e 100644 --- a/crates/time/src/time_range.rs +++ b/crates/time/src/time_range.rs @@ -7,13 +7,9 @@ use serde_derive::{Deserialize, Serialize}; use tracing::debug; use typed_builder::TypedBuilder; -use crate::{ - date::PaceDate, - date_time::PaceDateTime, - error::{PaceTimeErrorKind, PaceTimeResult}, - time_frame::PaceTimeFrame, - Validate, -}; +use pace_error::{PaceError, PaceResult, TimeErrorKind}; + +use crate::{date::PaceDate, date_time::PaceDateTime, time_frame::PaceTimeFrame, Validate}; /// `TimeRangeOptions` represents the start and end time of a time range #[derive( @@ -34,7 +30,7 @@ impl Display for TimeRangeOptions { } impl TryFrom for TimeRangeOptions { - type Error = PaceTimeErrorKind; + type Error = PaceError; fn try_from(time_frame: PaceTimeFrame) -> Result { match time_frame { @@ -54,7 +50,7 @@ impl TryFrom for TimeRangeOptions { impl Validate for TimeRangeOptions { type Output = Self; - type Error = PaceTimeErrorKind; + type Error = PaceError; /// Validate the time range /// @@ -65,12 +61,13 @@ impl Validate for TimeRangeOptions { /// # Returns /// /// Returns the time range options if they are valid - fn validate(self) -> PaceTimeResult { + fn validate(self) -> PaceResult { if self.start > self.end { - return Err(PaceTimeErrorKind::InvalidTimeRange( + return Err(TimeErrorKind::InvalidTimeRange( self.start.to_string(), self.end.to_string(), - )); + ) + .into()); } Ok(self) @@ -93,18 +90,17 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the current month - pub fn current_month() -> PaceTimeResult { + pub fn current_month() -> PaceResult { let now = Local::now().naive_local(); - let start = NaiveDate::from_ymd_opt(now.year(), now.month(), 1).ok_or_else(|| { - PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year(), now.month())) - })?; + let start = NaiveDate::from_ymd_opt(now.year(), now.month(), 1) + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year(), now.month())))?; Ok(Self::builder() .start(PaceDateTime::try_from( start .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))?, )?) .build()) } @@ -118,13 +114,13 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the current week - pub fn current_week() -> PaceTimeResult { + pub fn current_week() -> PaceResult { let now = Local::now(); let start = now .date_naive() .pred_opt() - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(now.to_string()))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(now.to_string()))?; let week = start.week(chrono::Weekday::Mon); @@ -132,7 +128,7 @@ impl TimeRangeOptions { .start(PaceDateTime::try_from( week.first_day() .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(week.first_day().to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(week.first_day().to_string()))?, )?) .build()) } @@ -146,17 +142,17 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the current year - pub fn current_year() -> PaceTimeResult { + pub fn current_year() -> PaceResult { let now = Local::now(); let start = NaiveDate::from_ymd_opt(now.year(), 1, 1) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year(), 1)))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year(), 1)))?; Ok(Self::builder() .start(PaceDateTime::try_from( start .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))?, )?) .build()) } @@ -174,7 +170,7 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the specific date - pub fn specific_date(date: PaceDate) -> PaceTimeResult { + pub fn specific_date(date: PaceDate) -> PaceResult { // handle date if it's in the future let (start, end) = if date.is_future() { debug!("Date is in the future, using today."); @@ -183,7 +179,7 @@ impl TimeRangeOptions { PaceDate::default() .inner() .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(date.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(date.to_string()))?, )?, PaceDateTime::now(), ) @@ -192,12 +188,12 @@ impl TimeRangeOptions { PaceDateTime::try_from( date.inner() .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(date.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(date.to_string()))?, )?, PaceDateTime::try_from( date.inner() .and_hms_opt(23, 59, 59) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(date.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(date.to_string()))?, )?, ) }; @@ -214,30 +210,30 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the last month - pub fn last_month() -> PaceTimeResult { + pub fn last_month() -> PaceResult { let now = Local::now(); let start = NaiveDate::from_ymd_opt(now.year(), now.month() - 1, 1).ok_or_else(|| { - PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year(), now.month() - 1)) + TimeErrorKind::InvalidDate(format!("{}/{}", now.year(), now.month() - 1)) })?; let end = start .with_day(1) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))? + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))? .with_month(start.month() + 1) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))? + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))? .pred_opt() - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))?; Ok(Self::builder() .start(PaceDateTime::try_from( start .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))?, )?) .end(PaceDateTime::try_from( end.and_hms_opt(23, 59, 59) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(end.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(end.to_string()))?, )?) .build()) } @@ -251,7 +247,7 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the last week - pub fn last_week() -> PaceTimeResult { + pub fn last_week() -> PaceResult { let now = Local::now(); let last_week = now @@ -259,32 +255,30 @@ impl TimeRangeOptions { .iso_week() .week() .checked_sub(1) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(now.date_naive().to_string()))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(now.date_naive().to_string()))?; let week = NaiveDate::from_isoywd_opt(now.year(), last_week, chrono::Weekday::Mon) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year(), last_week)))? + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year(), last_week)))? .week(chrono::Weekday::Mon); // handle first week of the year // FIXME: this is a hack, find a better way to handle this if week.first_day().year() != now.year() { - let start = NaiveDate::from_ymd_opt(now.year() - 1, 12, 25).ok_or_else(|| { - PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 12)) - })?; + let start = NaiveDate::from_ymd_opt(now.year() - 1, 12, 25) + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 12)))?; - let end = NaiveDate::from_ymd_opt(now.year() - 1, 12, 31).ok_or_else(|| { - PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 12)) - })?; + let end = NaiveDate::from_ymd_opt(now.year() - 1, 12, 31) + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 12)))?; return Ok(Self::builder() .start(PaceDateTime::try_from( start .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))?, )?) .end(PaceDateTime::try_from( end.and_hms_opt(23, 59, 59) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(end.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(end.to_string()))?, )?) .build()); } @@ -293,12 +287,12 @@ impl TimeRangeOptions { .start(PaceDateTime::try_from( week.first_day() .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(week.first_day().to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(week.first_day().to_string()))?, )?) .end(PaceDateTime::try_from( week.last_day() .and_hms_opt(23, 59, 59) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(week.last_day().to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(week.last_day().to_string()))?, )?) .build()) } @@ -312,24 +306,24 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for the last year - pub fn last_year() -> PaceTimeResult { + pub fn last_year() -> PaceResult { let now = Local::now(); let start = NaiveDate::from_ymd_opt(now.year() - 1, 1, 1) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 1)))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 1)))?; let end = NaiveDate::from_ymd_opt(now.year() - 1, 12, 31) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 12)))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(format!("{}/{}", now.year() - 1, 12)))?; Ok(Self::builder() .start(PaceDateTime::try_from( start .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(start.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(start.to_string()))?, )?) .end(PaceDateTime::try_from( end.and_hms_opt(23, 59, 59) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(end.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(end.to_string()))?, )?) .build()) } @@ -343,14 +337,14 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for today - pub fn today() -> PaceTimeResult { + pub fn today() -> PaceResult { let now = Local::now(); Ok(Self::builder() .start(PaceDateTime::try_from( now.date_naive() .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(now.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(now.to_string()))?, )?) .build()) } @@ -364,31 +358,31 @@ impl TimeRangeOptions { /// # Returns /// /// Returns the time range options for yesterday - pub fn yesterday() -> PaceTimeResult { + pub fn yesterday() -> PaceResult { let now = Local::now(); let yesterday = now .date_naive() .pred_opt() - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(now.date_naive().to_string()))?; + .ok_or_else(|| TimeErrorKind::InvalidDate(now.date_naive().to_string()))?; Ok(Self::builder() .start(PaceDateTime::try_from( yesterday .and_hms_opt(0, 0, 0) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(yesterday.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(yesterday.to_string()))?, )?) .end(PaceDateTime::try_from( yesterday .and_hms_opt(23, 59, 59) - .ok_or_else(|| PaceTimeErrorKind::InvalidDate(yesterday.to_string()))?, + .ok_or_else(|| TimeErrorKind::InvalidDate(yesterday.to_string()))?, )?) .build()) } } impl TryFrom<(PaceDate, PaceDate)> for TimeRangeOptions { - type Error = PaceTimeErrorKind; + type Error = TimeErrorKind; fn try_from((start, end): (PaceDate, PaceDate)) -> Result { Ok(Self::builder() diff --git a/crates/time/src/time_zone.rs b/crates/time/src/time_zone.rs index 045fac02..2be52286 100644 --- a/crates/time/src/time_zone.rs +++ b/crates/time/src/time_zone.rs @@ -1,6 +1,6 @@ use chrono::{FixedOffset, Local}; -use crate::error::PaceTimeErrorKind; +use pace_error::TimeErrorKind; /// Get the local time zone offset to UTC to guess the time zones /// @@ -92,7 +92,7 @@ impl PaceTimeZoneKind { } impl TryFrom<(Option<&chrono_tz::Tz>, Option<&FixedOffset>)> for PaceTimeZoneKind { - type Error = PaceTimeErrorKind; + type Error = TimeErrorKind; fn try_from( (tz, tz_offset): (Option<&chrono_tz::Tz>, Option<&FixedOffset>), @@ -101,7 +101,7 @@ impl TryFrom<(Option<&chrono_tz::Tz>, Option<&FixedOffset>)> for PaceTimeZoneKin (Some(tz), None) => Ok(Self::TimeZone(tz.to_owned())), (None, Some(tz_offset)) => Ok(Self::TimeZoneOffset(tz_offset.to_owned())), (None, None) => Ok(Self::NotSet), - (Some(_), Some(_)) => Err(PaceTimeErrorKind::AmbiguousTimeZones), + (Some(_), Some(_)) => Err(TimeErrorKind::AmbiguousTimeZones), } } } diff --git a/src/commands/resume.rs b/src/commands/resume.rs index 1ce428e2..db617d5d 100644 --- a/src/commands/resume.rs +++ b/src/commands/resume.rs @@ -7,9 +7,11 @@ use eyre::Result; use pace_cli::{confirmation_or_break, prompt_resume_activity}; use pace_core::prelude::{ - get_storage_from_config, ActivityQuerying, ActivityReadOps, ActivityStateManagement, - ActivityStore, ResumeCommandOptions, ResumeOptions, SyncStorage, UserMessage, + ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStore, + ResumeCommandOptions, ResumeOptions, SyncStorage, }; +use pace_error::UserMessage; +use pace_storage::get_storage_from_config; use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use crate::prelude::PACE_APP; From 394fd23248f08662418747bd40791f6a9eba4640 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 19:34:13 +0100 Subject: [PATCH 22/59] fix imports for tests Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 2 ++ Cargo.toml | 2 ++ crates/storage/src/storage.rs | 16 ++++++++++++++++ tests/integration/activity_store.rs | 6 ++++-- tests/integration/activity_tracker.rs | 3 ++- tests/integration/find_configs.rs | 3 ++- tests/integration/util.rs | 12 ++++++------ tests/journey/hold_resume.rs | 4 +++- .../journey/start_finish_different_time_zone.rs | 7 +++---- 9 files changed, 40 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4033e4cb..a4d87d5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1326,9 +1326,11 @@ dependencies = [ "pace_storage", "pace_time", "predicates", + "rstest", "serde", "serde_derive", "similar-asserts", + "strum", "tempfile", "thiserror", "toml 0.8.12", diff --git a/Cargo.toml b/Cargo.toml index 4056b3bb..8daa8d64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -134,7 +134,9 @@ insta = { workspace = true, features = ["toml"] } insta-cmd = { workspace = true } once_cell = { workspace = true } predicates = { workspace = true } +rstest = { workspace = true } similar-asserts = { workspace = true } +strum = { workspace = true } tempfile = { workspace = true } # The profile that 'cargo dist' will build with diff --git a/crates/storage/src/storage.rs b/crates/storage/src/storage.rs index dc837985..e3145f6b 100644 --- a/crates/storage/src/storage.rs +++ b/crates/storage/src/storage.rs @@ -1,6 +1,22 @@ use rusqlite::{Error, Row}; +/// Trait for `SQLite` entities. +/// +/// This trait is used to convert a `SQLite` row into a struct. pub trait SQLiteEntity { + /// Convert a `SQLite` row into a struct. + /// + /// # Arguments + /// + /// * `row` - A [`rusqlite::Row`]. + /// + /// # Errors + /// + /// Returns an error if the conversion fails. + /// + /// # Returns + /// + /// Returns a struct. fn from_row(row: Row<'_>) -> Result where Self: Sized; diff --git a/tests/integration/activity_store.rs b/tests/integration/activity_store.rs index 6ea0e626..8983f4db 100644 --- a/tests/integration/activity_store.rs +++ b/tests/integration/activity_store.rs @@ -5,8 +5,10 @@ use std::{collections::HashSet, sync::Arc}; use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStore, ActivityWriteOps, DeleteOptions, EndOptions, HoldOptions, - InMemoryActivityStorage, ResumeOptions, TestResult, UpdateOptions, + ResumeOptions, UpdateOptions, }; +use pace_error::TestResult; +use pace_storage::in_memory::InMemoryActivityStorage; use crate::util::{ activity_store, activity_store_empty, activity_store_no_intermissions, TestData, @@ -629,7 +631,7 @@ fn test_activity_store_resume_activity_passes( #[rstest] fn test_begin_activity_with_held_activity() -> TestResult<()> { - let store = ActivityStore::with_storage(Arc::new(InMemoryActivityStorage::new().into()))?; + let store = ActivityStore::with_storage(Arc::new(InMemoryActivityStorage::new()))?; // Begin activity let activity = Activity::builder() diff --git a/tests/integration/activity_tracker.rs b/tests/integration/activity_tracker.rs index f60b419e..6e51c262 100644 --- a/tests/integration/activity_tracker.rs +++ b/tests/integration/activity_tracker.rs @@ -1,7 +1,8 @@ //! Test the `ActivityStore` implementation with a `InMemoryStorage` backend. use chrono::NaiveDate; -use pace_core::prelude::{ActivityStore, ActivityTracker, FilterOptions, TestResult}; +use pace_core::prelude::{ActivityStore, ActivityTracker, FilterOptions}; +use pace_error::TestResult; use pace_time::{duration::PaceDuration, time_range::TimeRangeOptions}; use rstest::rstest; use similar_asserts::assert_eq; diff --git a/tests/integration/find_configs.rs b/tests/integration/find_configs.rs index 9bbace44..a3646003 100644 --- a/tests/integration/find_configs.rs +++ b/tests/integration/find_configs.rs @@ -1,4 +1,5 @@ -use pace_core::prelude::{find_root_config_file_path, TestResult}; +use pace_core::prelude::find_root_config_file_path; +use pace_error::TestResult; use similar_asserts::assert_eq; use std::env; diff --git a/tests/integration/util.rs b/tests/integration/util.rs index b98f1752..e6698227 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -4,9 +4,11 @@ use chrono::Local; use pace_core::prelude::{ Activity, ActivityGuid, ActivityItem, ActivityKind, ActivityKindOptions, ActivityLog, - ActivityStatusKind, ActivityStore, TestResult, + ActivityStatusKind, ActivityStore, }; +use pace_error::TestResult; +use pace_storage::file::TomlActivityStorage; use rstest::fixture; pub struct TestData { @@ -52,6 +54,7 @@ pub fn activity_store_no_intermissions() -> TestResult { // We need to use `#[cfg(not(tarpaulin_include))]` to exclude this from coverage reports #[cfg(not(tarpaulin_include))] pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult { + use pace_storage::in_memory::InMemoryActivityStorage; use pace_time::date_time::PaceDateTime; let begin_time = PaceDateTime::default(); @@ -163,8 +166,7 @@ pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult TestResult let fixture_path = Path::new("../../tests/fixtures/activity_tracker/activities.pace.toml").canonicalize()?; - let storage = TomlActivityStorage::new(fixture_path)?; - - Ok(ActivityStore::with_storage(Arc::new(storage.into()))?) + Ok(ActivityStore::with_storage(Arc::new(TomlActivityStorage::new(fixture_path)?))?) } diff --git a/tests/journey/hold_resume.rs b/tests/journey/hold_resume.rs index 33df6017..a25d1dae 100644 --- a/tests/journey/hold_resume.rs +++ b/tests/journey/hold_resume.rs @@ -1,7 +1,9 @@ use pace_core::prelude::{ Activity, ActivityQuerying, ActivityReadOps, ActivityStateManagement, HoldOptions, - InMemoryActivityStorage, ResumeOptions, TestResult, + ResumeOptions, }; +use pace_error::TestResult; +use pace_storage::in_memory::InMemoryActivityStorage; #[test] #[allow(clippy::too_many_lines)] diff --git a/tests/journey/start_finish_different_time_zone.rs b/tests/journey/start_finish_different_time_zone.rs index 84ce7a15..ad7ed4db 100644 --- a/tests/journey/start_finish_different_time_zone.rs +++ b/tests/journey/start_finish_different_time_zone.rs @@ -1,9 +1,8 @@ use chrono::FixedOffset; use eyre::OptionExt; -use pace_core::prelude::{ - Activity, ActivityReadOps, ActivityStateManagement, EndOptions, InMemoryActivityStorage, - TestResult, -}; +use pace_core::prelude::{Activity, ActivityReadOps, ActivityStateManagement, EndOptions}; +use pace_error::TestResult; +use pace_storage::in_memory::InMemoryActivityStorage; use pace_time::{date_time::PaceDateTime, duration::PaceDuration}; #[test] From d465cfbd1682fbfa3dc1c370e509ebd2a54f5888 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 20:49:47 +0100 Subject: [PATCH 23/59] adopt new config format for database changes Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- config/pace.toml | 28 +++-- crates/core/src/config.rs | 117 +++++++++--------- crates/core/src/lib.rs | 6 +- crates/storage/src/entities.rs | 2 - crates/storage/src/lib.rs | 56 +++------ src/commands.rs | 16 +-- tests/fixtures/configs/pace.toml | 13 +- .../{find_configs.rs => config.rs} | 10 +- tests/integration/main.rs | 2 +- ...onfig__config_default_snapshot_passes.snap | 12 ++ tests/integration/util.rs | 4 +- 11 files changed, 128 insertions(+), 138 deletions(-) rename tests/integration/{find_configs.rs => config.rs} (76%) create mode 100644 tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap diff --git a/config/pace.toml b/config/pace.toml index 7e5cb80f..f6140187 100644 --- a/config/pace.toml +++ b/config/pace.toml @@ -1,10 +1,4 @@ [general] -# Define where to store the activity log: options include "file", "database", etc. -storage-kind = "file" -# Path to the activity log file, used if storage-kind is set to "file" -path = "/path/to/your/activity.pace.toml" -# Specify the default format for new activity logs: "toml" or "yaml" -format-kind = "toml" # Category separator used in the cli category-separator = "::" # Default priority for new tasks @@ -12,6 +6,23 @@ default-priority = "medium" # Default time zone for new tasks default-timezone = "UTC" +# The storage location +[storage.database] +# The kind of database storage +# Supported values: "sqlite", "mysql", "postgres", "mssql" +# If you choose "sqlite", the connection string should be the path to the database file +# Currently, only "sqlite" is supported +kind = 'sqlite' +# In case of a SQLite database, this is the connection string: `sqlite://path/to/database` +connection = './db/activities.pace.sqlite3' + +# For completeness, here is the file storage configuration +# +# The storage location in case it is a file +# [storage.file] +# In case of a file, this is the path to the file: `/path/to/file` +# location = "/path/to/your/storage" + [reflections] # Format of the reflections generated by the pace: "console", "template", "json", or "csv" etc. format = "console" @@ -23,11 +34,6 @@ include-tags = true include-descriptions = true time-format = "%Y-%m-%d %H:%M" -[database] -# Database configurations are used if storage-kind is set to "database" -engine = "sqlite" # only option supported for now is "sqlite" -connection-string = "path/to/your/database.db" - [pomodoro] # Pomodoro technique specific configurations work-duration-minutes = 25 diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index 717c5b8b..34ba0532 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -26,6 +26,11 @@ pub struct PaceConfig { #[getset(get = "pub", get_mut = "pub")] general: GeneralConfig, + /// Storage configuration for the pace application + #[serde(default)] + #[getset(get = "pub", get_mut = "pub")] + storage: StorageConfig, + /// Reflections configuration for the pace application #[serde(default, skip_serializing_if = "Option::is_none")] #[getset(get = "pub", get_mut = "pub")] @@ -36,11 +41,6 @@ pub struct PaceConfig { #[getset(get = "pub", get_mut = "pub")] export: Option, - /// Database configuration for the pace application - #[serde(default, skip_serializing_if = "Option::is_none")] - #[getset(get = "pub", get_mut = "pub")] - database: Option, // Optional because it's only needed if log_storage is "database" - /// Pomodoro configuration for the pace application #[serde(default, skip_serializing_if = "Option::is_none")] #[getset(get = "pub", get_mut = "pub")] @@ -64,8 +64,11 @@ impl PaceConfig { /// /// `activity_log` - The path to the activity log file pub fn set_activity_log_path(&mut self, activity_log: impl AsRef) { - *self.general_mut().activity_log_options_mut().path_mut() = - activity_log.as_ref().to_path_buf(); + *self.storage_mut() = StorageConfig { + storage: ActivityLogStorageKind::File { + location: activity_log.as_ref().to_path_buf(), + }, + }; } pub fn set_time_zone(&mut self, time_zone: Tz) { @@ -78,10 +81,6 @@ impl PaceConfig { #[getset(get = "pub")] #[serde(rename_all = "kebab-case")] pub struct GeneralConfig { - #[serde(flatten)] - #[getset(get = "pub", get_mut = "pub")] - activity_log_options: ActivityLogOptions, - /// The default category separator /// Default: `::` #[serde(default, skip_serializing_if = "Option::is_none")] @@ -104,56 +103,28 @@ pub struct GeneralConfig { default_time_zone: Option, } -#[derive(Debug, Deserialize, Serialize, Getters, MutGetters, Clone, Default)] -#[getset(get = "pub")] -#[serde(rename_all = "kebab-case")] -pub struct ActivityLogOptions { - /// The path to the activity log file - /// Default is operating system dependent - /// Use `pace setup config` to set this value initially - #[getset(get_mut = "pub")] - path: PathBuf, - - /// The format for the activity log - /// Default: `toml` - #[getset(get_mut = "pub")] - format_kind: Option, - - /// The storage type for the activity log - /// Default: `file` - storage_kind: ActivityLogStorageKind, -} - -/// The kind of activity log format -/// Default: `toml` -/// -/// Options: `toml`, `json`, `yaml` -#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, EnumString)] -#[serde(rename_all = "lowercase")] -#[non_exhaustive] -pub enum ActivityLogFormatKind { - #[default] - Toml, -} - /// The kind of log storage -/// Default: `file` -/// -/// Options: `file`, `database` -#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default)] +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] #[non_exhaustive] pub enum ActivityLogStorageKind { - #[default] - File, - Database, + File { + /// The location of the activity log file + location: PathBuf, + }, + Database { + /// The database engine to use + kind: DatabaseEngineKind, + + /// The connection string to the database + connection: String, + }, InMemory, } impl Default for GeneralConfig { fn default() -> Self { Self { - activity_log_options: ActivityLogOptions::default(), category_separator: Some("::".to_string()), default_priority: Some(ItemPriorityKind::default()), most_recent_count: Some(9), @@ -193,7 +164,18 @@ pub struct ExportConfig { /// Default: `sqlite` /// /// Options: `sqlite`, `postgres`, `mysql`, `sql-server` -#[derive(Debug, Deserialize, Serialize, Clone, Copy, Default, displaydoc::Display, EnumString)] +#[derive( + Debug, + Deserialize, + Serialize, + Clone, + Copy, + Default, + displaydoc::Display, + EnumString, + PartialEq, + Eq, +)] #[serde(rename_all = "kebab-case")] #[non_exhaustive] pub enum DatabaseEngineKind { @@ -211,16 +193,27 @@ pub enum DatabaseEngineKind { SqlServer, } -/// The database configuration for the pace application -#[derive(Debug, Deserialize, Default, Serialize, Getters, Clone)] +/// The storage configuration for the pace application +#[derive(Debug, Deserialize, Serialize, Getters, Clone)] #[getset(get = "pub")] #[serde(rename_all = "kebab-case")] -pub struct DatabaseConfig { - /// The connection string for the database - connection_string: String, +pub struct StorageConfig { + /// The storage location + /// In case of a file, this is the path to the file: `file://path/to/file` + /// In case of a database, this is the connection string: `sqlite://path/to/database` + #[serde(flatten)] + storage: ActivityLogStorageKind, +} - /// The kind of database engine - engine: DatabaseEngineKind, +impl Default for StorageConfig { + fn default() -> Self { + Self { + storage: ActivityLogStorageKind::Database { + kind: DatabaseEngineKind::Sqlite, + connection: "./db/activities.pace.sqlite3".to_string(), + }, + } + } } /// The pomodoro configuration for the pace application @@ -525,8 +518,10 @@ mod tests { config.set_activity_log_path(activity_log); assert_eq!( - config.general().activity_log_options().path(), - Path::new(activity_log) + *config.storage().storage(), + ActivityLogStorageKind::File { + location: PathBuf::from(activity_log) + } ); } diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index bfc056e1..33ec339e 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -41,9 +41,9 @@ pub mod prelude { config::{ find_root_config_file_path, find_root_project_file, get_activity_log_paths, get_config_paths, get_home_activity_log_path, get_home_config_path, - ActivityLogFormatKind, ActivityLogStorageKind, AutoArchivalConfig, DatabaseConfig, - DatabaseEngineKind, ExportConfig, GeneralConfig, InboxConfig, PaceConfig, - PomodoroConfig, ReflectionsConfig, + ActivityLogStorageKind, AutoArchivalConfig, DatabaseEngineKind, ExportConfig, + GeneralConfig, InboxConfig, PaceConfig, PomodoroConfig, ReflectionsConfig, + StorageConfig, }, domain::{ activity::{ diff --git a/crates/storage/src/entities.rs b/crates/storage/src/entities.rs index 2df21d24..8f9bcd0f 100644 --- a/crates/storage/src/entities.rs +++ b/crates/storage/src/entities.rs @@ -26,8 +26,6 @@ pub struct SQLiteActivityStatusKind(ActivityStatusKind); pub struct SQLiteActivityEndOptions(ActivityEndOptions); - - // impl SqliteActivity { // pub fn to_sql_prepare_statement(&self) -> &'static str { // "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index c1a78656..4b37a731 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -36,45 +36,29 @@ use crate::{ /// /// The storage backend. pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { - let storage: Arc = - match config.general().activity_log_options().storage_kind() { - ActivityLogStorageKind::File => Arc::new(TomlActivityStorage::new( - config.general().activity_log_options().path(), - )?), - ActivityLogStorageKind::Database => { - if let Some(db_config) = config.database() { - match db_config.engine() { - DatabaseEngineKind::Sqlite => { - #[cfg(feature = "rusqlite")] - { - let connection_string = config - .database() - .as_ref() - .ok_or(DatabaseStorageErrorKind::NoConnectionString)? - .connection_string(); + let storage: Arc = match config.storage().storage() { + ActivityLogStorageKind::File { location } => Arc::new(TomlActivityStorage::new(location)?), + ActivityLogStorageKind::Database { kind, connection } => match kind { + DatabaseEngineKind::Sqlite => { + #[cfg(feature = "rusqlite")] + { + debug!("Connecting to database: {}", connection); - debug!("Connecting to database: {}", &connection_string); - - Arc::new(SqliteActivityStorage::new(connection_string.clone())?) - } - - #[cfg(not(feature = "rusqlite"))] - return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); - } - engine => { - return Err(DatabaseStorageErrorKind::UnsupportedDatabaseEngine( - engine.to_string(), - ) - .into()) - } - } - } else { - return Err(DatabaseStorageErrorKind::DatabaseStorageNotConfigured.into()); + Arc::new(SqliteActivityStorage::new(connection.clone())?) } + + #[cfg(not(feature = "rusqlite"))] + return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); + } + engine => { + return Err( + DatabaseStorageErrorKind::UnsupportedDatabaseEngine(engine.to_string()).into(), + ) } - ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), - _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), - }; + }, + ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), + _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), + }; debug!("Using storage backend: {:?}", storage); diff --git a/src/commands.rs b/src/commands.rs index 6cb1655a..dbfbdf10 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -30,7 +30,7 @@ use std::path::PathBuf; use pace_core::{ constants::PACE_CONFIG_FILENAME, - prelude::{get_config_paths, ActivityLogFormatKind, PaceConfig}, + prelude::{get_config_paths, PaceConfig}, }; /// Pace Subcommands @@ -112,7 +112,7 @@ pub struct EntryPoint { /// Use the specified activity log file #[arg(long, env = "PACE_ACTIVITY_LOG_FILE", value_hint = clap::ValueHint::FilePath)] - pub activity_log_file: Option, + pub activity_log: Option, /// Pace Home Directory #[arg(long, env = "PACE_HOME", value_hint = clap::ValueHint::DirPath)] @@ -129,7 +129,7 @@ impl Runnable for EntryPoint { impl Override for EntryPoint { fn override_config(&self, mut config: PaceConfig) -> Result { // Override the activity log file if it's set - if let Some(activity_log_file) = &self.activity_log_file { + if let Some(activity_log_file) = &self.activity_log { debug!("Overriding activity log file with: {:?}", activity_log_file); // Handle not existing activity log file and parent directory @@ -144,15 +144,7 @@ impl Override for EntryPoint { _ => {} }; - *config.general_mut().activity_log_options_mut().path_mut() = - activity_log_file.to_path_buf(); - - // Set the activity log format to TOML - // TODO: This should be configurable - *config - .general_mut() - .activity_log_options_mut() - .format_kind_mut() = Some(ActivityLogFormatKind::Toml); + config.set_activity_log_path(activity_log_file); }; debug!("Overridden config: {:?}", config); diff --git a/tests/fixtures/configs/pace.toml b/tests/fixtures/configs/pace.toml index 7e5cb80f..256ba459 100644 --- a/tests/fixtures/configs/pace.toml +++ b/tests/fixtures/configs/pace.toml @@ -1,10 +1,4 @@ [general] -# Define where to store the activity log: options include "file", "database", etc. -storage-kind = "file" -# Path to the activity log file, used if storage-kind is set to "file" -path = "/path/to/your/activity.pace.toml" -# Specify the default format for new activity logs: "toml" or "yaml" -format-kind = "toml" # Category separator used in the cli category-separator = "::" # Default priority for new tasks @@ -23,10 +17,9 @@ include-tags = true include-descriptions = true time-format = "%Y-%m-%d %H:%M" -[database] -# Database configurations are used if storage-kind is set to "database" -engine = "sqlite" # only option supported for now is "sqlite" -connection-string = "path/to/your/database.db" +[storage.file] +# In case of a file, this is the path to the file: `/path/to/file` +location = "/path/to/your/storage" [pomodoro] # Pomodoro technique specific configurations diff --git a/tests/integration/find_configs.rs b/tests/integration/config.rs similarity index 76% rename from tests/integration/find_configs.rs rename to tests/integration/config.rs index a3646003..2959c0a8 100644 --- a/tests/integration/find_configs.rs +++ b/tests/integration/config.rs @@ -1,4 +1,5 @@ -use pace_core::prelude::find_root_config_file_path; +use insta::assert_toml_snapshot; +use pace_core::prelude::{find_root_config_file_path, PaceConfig}; use pace_error::TestResult; use similar_asserts::assert_eq; use std::env; @@ -27,3 +28,10 @@ fn test_find_root_projects_file() -> TestResult<()> { Ok(()) } + +#[test] +fn test_config_default_snapshot_passes() { + let config = PaceConfig::default(); + + assert_toml_snapshot!(config); +} diff --git a/tests/integration/main.rs b/tests/integration/main.rs index d330e7e8..a01fe552 100644 --- a/tests/integration/main.rs +++ b/tests/integration/main.rs @@ -1,4 +1,4 @@ mod activity_store; mod activity_tracker; -mod find_configs; +mod config; mod util; diff --git a/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap b/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap new file mode 100644 index 00000000..59aca4f0 --- /dev/null +++ b/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap @@ -0,0 +1,12 @@ +--- +source: tests/integration/config.rs +expression: config +--- +[general] +category-separator = '::' +default-priority = 'medium' +most-recent-count = 9 +default-time-zone = 'UTC' +[storage.database] +kind = 'sqlite' +connection = './db/activities.pace.sqlite3' diff --git a/tests/integration/util.rs b/tests/integration/util.rs index e6698227..5222aedb 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -176,5 +176,7 @@ pub fn setup_activity_store_for_activity_tracker() -> TestResult let fixture_path = Path::new("../../tests/fixtures/activity_tracker/activities.pace.toml").canonicalize()?; - Ok(ActivityStore::with_storage(Arc::new(TomlActivityStorage::new(fixture_path)?))?) + Ok(ActivityStore::with_storage(Arc::new( + TomlActivityStorage::new(fixture_path)?, + ))?) } From cd770f038b09fe8bf3281d19294bb2359c0026ed Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:06:02 +0100 Subject: [PATCH 24/59] add readmes Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.toml | 2 +- crates/storage/Cargo.toml | 27 ++++++------ crates/storage/README.md | 89 +++++++++++++++++++++++++++++++++++++++ crates/storage/src/lib.rs | 11 +---- 4 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 crates/storage/README.md diff --git a/Cargo.toml b/Cargo.toml index 8daa8d64..2892abd7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -113,7 +113,7 @@ human-panic = { workspace = true } pace_cli = { workspace = true } pace_core = { workspace = true, features = ["cli"] } pace_error = { workspace = true } -pace_storage = { workspace = true, features = ["db"] } +pace_storage = { workspace = true } pace_time = { workspace = true, features = ["cli", "db"] } serde = { workspace = true } serde_derive = { workspace = true } diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index 86e1fed0..ab325a45 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -19,29 +19,30 @@ include = [ "Cargo.toml", ] -[features] -default = ["db"] -db = ["rusqlite"] -rusqlite = [ - "dep:rusqlite", - "dep:libsqlite3-sys", - "dep:sea-query", - "dep:sea-query-rusqlite", -] +# TODO: With our limited scope, we don't feature gate anything +# [features] +# default = ["db"] +# db = ["rusqlite"] +# rusqlite = [ +# "dep:rusqlite", +# "dep:libsqlite3-sys", +# "dep:sea-query", +# "dep:sea-query-rusqlite", +# ] [dependencies] displaydoc = { workspace = true } itertools = { workspace = true } -libsqlite3-sys = { workspace = true, features = ["bundled"], optional = true } +libsqlite3-sys = { workspace = true, features = ["bundled"] } merge = { workspace = true } pace_core = { workspace = true } pace_error = { workspace = true } pace_time = { workspace = true, features = ["db"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } -rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } -sea-query = { workspace = true, optional = true, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } -sea-query-rusqlite = { workspace = true, optional = true, features = ["with-chrono"] } +rusqlite = { workspace = true, features = ["bundled", "chrono"] } +sea-query = { workspace = true, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } +sea-query-rusqlite = { workspace = true, features = ["with-chrono"] } strum = { workspace = true } thiserror = { workspace = true } toml = { workspace = true, features = ["indexmap", "preserve_order"] } diff --git a/crates/storage/README.md b/crates/storage/README.md new file mode 100644 index 00000000..e9d3854d --- /dev/null +++ b/crates/storage/README.md @@ -0,0 +1,89 @@ +

+ +

+

pace-storage - a library handling storage engines for pace

+ +

+ + + + +

+ +## About + +`pace-storage` is a library to support timetracking on the command line. It is +the storage handling library for the `pace` timetracking application. + +⚠️ **Note:** `pace-storage` is currently in active development and is not yet +ready for production use. Expect breaking changes and incomplete features. We +encourage you to try it out and provide feedback, but please be aware that it is +not yet stable. + +## Contact + +You can ask questions in the +[Discussions](https://github.com/orgs/pace-rs/discussions) or have a look at the +[FAQ](https://pace.cli.rs/docs/FAQ.html). + +| Contact | Where? | +| ------------- | --------------------------------------------------------------------------------------------------------------- | +| Issue Tracker | [GitHub Issues](https://github.com/pace-rs/pace/issues/new/choose) | +| Discord | [![Discord](https://dcbadge.vercel.app/api/server/RKSWrAcYdG?style=flat-square)](https://discord.gg/RKSWrAcYdG) | +| Discussions | [GitHub Discussions](https://github.com/orgs/pace-rs/discussions) | + + + +## Examples + +TODO! + +## Contributing + +Found a bug? [Open an issue!](https://github.com/pace-rs/pace/issues/new/choose) + +Got an idea for an improvement? Don't keep it to yourself! + +- [Contribute fixes](https://github.com/pace-rs/pace/contribute) or new features + via a pull requests! + +Please make sure, that you read the +[contribution guide](https://pace.cli.rs/docs/contributing_to_pace.html). + +## Code of Conduct + +Please review and abide by the general +[Rust Community Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) +when contributing to this project. In the future, we might create our own Code +of Conduct and supplement it at this location. + +## Minimum Rust version policy + +This crate's minimum supported `rustc` version is `1.74.1`. + +The current policy is that the minimum Rust version required to use this crate +can be increased in minor version updates. For example, if `crate 1.0` requires +Rust 1.20.0, then `crate 1.0.z` for all values of `z` will also require Rust +1.20.0 or newer. However, `crate 1.y` for `y > 0` may require a newer minimum +version of Rust. + +In general, this crate will be conservative with respect to the minimum +supported version of Rust. + +## License + +**AGPL-3.0-or-later**; see [LICENSE](./LICENSE). diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 4b37a731..14c10b30 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -7,7 +7,6 @@ pub mod file; /// An in-memory storage backend for activities. pub mod in_memory; -#[cfg(feature = "rusqlite")] pub mod sqlite; pub mod entities; @@ -40,15 +39,9 @@ pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult Arc::new(TomlActivityStorage::new(location)?), ActivityLogStorageKind::Database { kind, connection } => match kind { DatabaseEngineKind::Sqlite => { - #[cfg(feature = "rusqlite")] - { - debug!("Connecting to database: {}", connection); + debug!("Connecting to database: {}", connection); - Arc::new(SqliteActivityStorage::new(connection.clone())?) - } - - #[cfg(not(feature = "rusqlite"))] - return Err(PaceErrorKind::DatabaseStorageNotImplemented.into()); + Arc::new(SqliteActivityStorage::new(connection.clone())?) } engine => { return Err( From df7970a4c7ec540487b72b4e47bbc02ee8dc5f43 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:10:05 +0100 Subject: [PATCH 25/59] fix option for cli Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- tests/journey/cli.rs | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/tests/journey/cli.rs b/tests/journey/cli.rs index 768dc958..dfa2aa43 100644 --- a/tests/journey/cli.rs +++ b/tests/journey/cli.rs @@ -33,7 +33,7 @@ fn fixture_begin_activity(dir_str: &String) -> TestResult<()> { .args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", dir_str, "begin", "MyActivity", @@ -77,7 +77,7 @@ fn test_begin_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "begin", "MyActivity", @@ -97,7 +97,7 @@ fn test_now_no_activities_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "now" ])); @@ -115,7 +115,7 @@ fn test_now_with_active_activity_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "now" ])); @@ -133,7 +133,7 @@ fn test_end_with_active_activity_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "end" ])); @@ -151,7 +151,7 @@ fn test_hold_with_active_activity_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "hold" ])); @@ -170,7 +170,7 @@ fn test_resume_with_held_activity_snapshot_passes() -> TestResult<()> { .args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "hold", ]) @@ -179,7 +179,7 @@ fn test_resume_with_held_activity_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "resume" ])); @@ -198,7 +198,7 @@ fn test_adjust_activity_snapshot_passes() -> TestResult<()> { .args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "adjust", "--description", @@ -211,7 +211,7 @@ fn test_adjust_activity_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &dir_str, "now", ])); @@ -228,7 +228,7 @@ fn test_reflect_from_to_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--from", @@ -249,7 +249,7 @@ fn test_reflect_date_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--date", @@ -267,7 +267,7 @@ fn test_reflect_today_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", ])); @@ -283,7 +283,7 @@ fn test_reflect_current_week_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "current-week", @@ -300,7 +300,7 @@ fn test_reflect_current_month_snapshot_passes() -> TestResult<()> { assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "current-month", @@ -318,7 +318,7 @@ fn test_reflect_from_to_filter_category_glob_front_snapshot_passes() -> TestResu assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--from", @@ -341,7 +341,7 @@ fn test_reflect_from_to_filter_category_case_sensitive_snapshot_passes() -> Test assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--from", @@ -365,7 +365,7 @@ fn test_reflect_from_to_filter_category_full_snapshot_passes() -> TestResult<()> assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--from", @@ -388,7 +388,7 @@ fn test_reflect_from_to_filter_category_glob_back_snapshot_passes() -> TestResul assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--from", @@ -412,7 +412,7 @@ fn test_reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes assert_cmd_snapshot!(StdCommand::new(env!("CARGO_BIN_EXE_pace")).args([ "--config", "tests/fixtures/configs/pace.toml", - "--activity-log-file", + "--activity-log", &activities, "reflect", "--from", From d5d4640cc646934835a2baad54d04185318d6b30 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:13:10 +0100 Subject: [PATCH 26/59] add missing error crate Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/error/Cargo.toml | 28 ++ crates/error/LICENSE | 661 ++++++++++++++++++++++++++++++++++++++++ crates/error/README.md | 73 +++++ crates/error/src/lib.rs | 465 ++++++++++++++++++++++++++++ 4 files changed, 1227 insertions(+) create mode 100644 crates/error/Cargo.toml create mode 100644 crates/error/LICENSE create mode 100644 crates/error/README.md create mode 100644 crates/error/src/lib.rs diff --git a/crates/error/Cargo.toml b/crates/error/Cargo.toml new file mode 100644 index 00000000..d3c4071e --- /dev/null +++ b/crates/error/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "pace_error" +version = "0.1.0" +authors = { workspace = true } +categories = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +keywords = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } +description = "pace-error - library for error handling in pace ecosystem" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +chrono = { workspace = true } +displaydoc = { workspace = true } +miette = { workspace = true, features = ["fancy"] } +rusqlite = { workspace = true } +sea-query = { workspace = true } +serde_json = { workspace = true } +tera = { workspace = true } +thiserror = { workspace = true } +toml = { workspace = true } + +[lints] +workspace = true diff --git a/crates/error/LICENSE b/crates/error/LICENSE new file mode 100644 index 00000000..0ad25db4 --- /dev/null +++ b/crates/error/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/crates/error/README.md b/crates/error/README.md new file mode 100644 index 00000000..468a1950 --- /dev/null +++ b/crates/error/README.md @@ -0,0 +1,73 @@ +

+ +

+

pace-error - library for error handling in pace ecosystem

+ +

+ + + + +

+ +## About + +`pace-error` is a library to support timetracking on the command line. It is the +error handling library for the `pace` timetracking application. + +⚠️ **Note:** `pace-error` is currently in active development and is not yet ready +for production use. Expect breaking changes and incomplete features. We +encourage you to try it out and provide feedback, but please be aware that it is +not yet stable. + +## Contact + +You can ask questions in the +[Discussions](https://github.com/orgs/pace-rs/discussions) or have a look at the +[FAQ](https://pace.cli.rs/docs/FAQ.html). + +| Contact | Where? | +| ------------- | --------------------------------------------------------------------------------------------------------------- | +| Issue Tracker | [GitHub Issues](https://github.com/pace-rs/pace/issues/new/choose) | +| Discord | [![Discord](https://dcbadge.vercel.app/api/server/RKSWrAcYdG?style=flat-square)](https://discord.gg/RKSWrAcYdG) | +| Discussions | [GitHub Discussions](https://github.com/orgs/pace-rs/discussions) | + +## Examples + +TODO! + +## Contributing + +Found a bug? [Open an issue!](https://github.com/pace-rs/pace/issues/new/choose) + +Got an idea for an improvement? Don't keep it to yourself! + +- [Contribute fixes](https://github.com/pace-rs/pace/contribute) or new features + via a pull requests! + +Please make sure, that you read the +[contribution guide](https://pace.cli.rs/docs/contributing_to_pace.html). + +## Code of Conduct + +Please review and abide by the general +[Rust Community Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) +when contributing to this project. In the future, we might create our own Code +of Conduct and supplement it at this location. + +## Minimum Rust version policy + +This crate's minimum supported `rustc` version is `1.74.1`. + +The current policy is that the minimum Rust version required to use this crate +can be increased in minor version updates. For example, if `crate 1.0` requires +Rust 1.20.0, then `crate 1.0.z` for all values of `z` will also require Rust +1.20.0 or newer. However, `crate 1.y` for `y > 0` may require a newer minimum +version of Rust. + +In general, this crate will be conservative with respect to the minimum +supported version of Rust. + +## License + +**AGPL-3.0-or-later**; see [LICENSE](./LICENSE). diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs new file mode 100644 index 00000000..feba836a --- /dev/null +++ b/crates/error/src/lib.rs @@ -0,0 +1,465 @@ +//! Error types and Result module. + +use displaydoc::Display; +use miette::Diagnostic; +use std::num::TryFromIntError; +use std::{error::Error, io, path::PathBuf}; +use thiserror::Error; + +macro_rules! impl_pace_error_marker { + ($error:ty) => { + impl PaceErrorMarker for $error {} + }; +} + +/// Result type that is being returned from test functions and methods that can fail and thus have errors. +pub type TestResult = Result>; + +/// Result type that is being returned from methods that can fail and thus have [`PaceError`]s. +pub type PaceResult = Result; + +/// Result type that is being returned from methods that have optional return values and can fail thus having [`PaceError`]s. +pub type PaceOptResult = PaceResult>; + +/// User message type that is being returned from methods that need to print a message to the user. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct UserMessage { + /// The message to be printed to the user + msg: String, +} + +impl std::fmt::Display for UserMessage { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.msg) + } +} + +impl UserMessage { + pub fn new(msg: impl Into) -> Self { + Self { msg: msg.into() } + } + + pub fn display(&self) { + println!("{}", self.msg); + } +} + +impl std::ops::DerefMut for UserMessage { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.msg + } +} + +impl std::ops::Deref for UserMessage { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.msg + } +} + +// [`Error`] is public, but opaque and easy to keep compatible. +/// Errors that can result from pace. +#[derive(Error, Debug, Diagnostic)] +#[diagnostic(url(docsrs))] +pub struct PaceError(#[from] PaceErrorKind); + +impl std::fmt::Display for PaceError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +// Accessors for anything we do want to expose publicly. +impl PaceError { + /// Expose the inner error kind. + /// + /// This is useful for matching on the error kind. + #[must_use] + pub fn into_inner(self) -> PaceErrorKind { + self.0 + } + + /// Is this error related to a resumable activity so that we can prompt the user? + /// + /// This is useful for matching on the error kind. + #[must_use] + pub const fn possible_new_activity_from_resume(&self) -> bool { + matches!( + self.0, + PaceErrorKind::ActivityLog(ActivityLogErrorKind::NoHeldActivityFound(_)) + ) || matches!( + self.0, + PaceErrorKind::ActivityLog(ActivityLogErrorKind::ActivityAlreadyEnded(_)) + ) || matches!( + self.0, + PaceErrorKind::ActivityLog(ActivityLogErrorKind::ActivityAlreadyArchived(_)) + ) + } +} + +/// [`PaceErrorKind`] describes the errors that can happen while executing a high-level command. +/// +/// This is a non-exhaustive enum, so additional variants may be added in future. It is +/// recommended to match against the wildcard `_` instead of listing all possible variants, +/// to avoid problems when new variants are added. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum PaceErrorKind { + /// [`std::io::Error`] + #[error(transparent)] + StdIo(#[from] std::io::Error), + + /// Serialization to TOML failed: {0} + #[error(transparent)] + SerializationToTomlFailed(#[from] toml::ser::Error), + + /// Deserialization from TOML failed: {0} + #[error(transparent)] + DeserializationFromTomlFailed(#[from] toml::de::Error), + + /// Activity store error: {0} + #[error(transparent)] + ActivityStore(#[from] ActivityStoreErrorKind), + + /// Activity log error: {0} + #[error(transparent)] + ActivityLog(#[from] ActivityLogErrorKind), + + /// Time related error: {0} + #[error(transparent)] + Time(#[from] TimeErrorKind), + + /// JSON error: {0} + #[error(transparent)] + Json(#[from] serde_json::Error), + + /// Chrono parse error: {0} + #[error(transparent)] + ChronoParse(#[from] chrono::ParseError), + + /// Time chosen is not valid, because it lays before the current activity's beginning: {0} + #[error(transparent)] + ChronoDurationIsNegative(#[from] chrono::OutOfRangeError), + + /// Config file {file_name} not found in directory hierarchy starting from {current_dir} + ConfigFileNotFound { + /// The current directory + current_dir: String, + + /// The file name + file_name: String, + }, + + /// Configuration file not found, please run `pace setup config` to initialize `pace` + ParentDirNotFound(PathBuf), + + /// There is no path available to store the activity log + NoPathAvailable, + + /// Templating error: {0} + #[error(transparent)] + Template(#[from] TemplatingErrorKind), + + /// Database error: {0} + #[error(transparent)] + Database(#[from] DatabaseStorageErrorKind), + + /// Toml file error: {0} + #[error(transparent)] + TomlFile(#[from] TomlFileStorageErrorKind), +} + +/// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the `SQLite` database. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum DatabaseStorageErrorKind { + /// Error connecting to database: {0} - {1} + ConnectionFailed(String, String), + + /// No connection string provided + NoConnectionString, + + /// This database engine is currently not supported: {0} + UnsupportedDatabaseEngine(String), + + /// Activity with id {0} not found + ActivityNotFound(String), + + /// Failed to create activity: {0} + ActivityCreationFailed(String), + + /// Failed to delete activity: {0} + ActivityDeletionFailed(String), + + /// Database storage not configured + DatabaseStorageNotConfigured, + + /// Database storage not implemented, yet! + StorageNotImplemented, + + /// Database migration failed. Version: {version}, Query: {query}, Source: {source} + MigrationFailed { + version: String, + query: String, + #[source] + source: rusqlite::Error, + }, + + /// No migrations found for table: {table} + NoMigrationsFound { table: String }, + + /// Building migration query failed. Version: {version}, Table: {table}, Query: {query}, Source: {source} + BuildingMigrationQueryFailed { + version: String, + table: String, + query: String, + #[source] + source: sea_query::error::Error, + }, + + /// No migrations to rollback + NoMigrationsToRollback, + + /// Migration affected multiple rows + MigrationAffectedMultipleRows, +} + +/// [`TomlFileStorageErrorKind`] describes the errors that can happen while dealing with the Toml file storage. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum TomlFileStorageErrorKind { + /// Parent directory not found: {0} + ParentDirNotFound(PathBuf), +} + +/// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum ActivityLogErrorKind { + /// No activities found in the activity log + NoActivitiesFound, + + /// Activity with ID {0} not found + FailedToReadActivity(String), + + /// Negative duration for activity + NegativeDuration, + + /// There are no activities to hold + NoActivityToHold, + + /// Failed to unwrap Arc + ArcUnwrapFailed, + + /// There are no unfinished activities to end + NoUnfinishedActivities, + + /// There is no cache to sync + NoCacheToSync, + + /// Cache not available + CacheNotAvailable, + + /// `Activity` with id {0} not found + ActivityNotFound(String), + + /// `Activity` with id {0} can't be removed from the activity log + ActivityCantBeRemoved(usize), + + /// This activity has no id + ActivityIdNotSet, + + /// `Activity` with id {0} already in use, can't create a new activity with the same id + ActivityIdAlreadyInUse(String), + + /// `Activity` in the `ActivityLog` has a different id than the one provided: {0} != {1} + ActivityIdMismatch(String, String), + + /// `Activity` already has an intermission: {0} + ActivityAlreadyHasIntermission(Box), + + /// There have been some activities that have not been ended + ActivityNotEnded, + + /// No active activity found with id {0} + NoActiveActivityFound(String), + + /// `Activity` with id {0} already ended + ActivityAlreadyEnded(String), + + /// Activity with id {0} already has been archived + ActivityAlreadyArchived(String), + + /// Active activity with id {0} found, although we wanted a held activity + ActiveActivityFound(String), + + /// Activity with id {0} is not held, but we wanted to resume it + NoHeldActivityFound(String), + + /// No activity kind options found for activity with id {0} + ActivityKindOptionsNotFound(String), + + /// `ParentId` not set for activity with id {0} + ParentIdNotSet(String), + + /// Category not set for activity with id {0} + CategoryNotSet(String), + + /// No active activity to adjust + NoActiveActivityToAdjust, + + /// Failed to group activities by keywords + FailedToGroupByKeywords, + + /// No end options found for activity + NoEndOptionsFound, +} + +/// [`TemplatingErrorKind`] describes the errors that can happen while dealing with templating. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum TemplatingErrorKind { + /// Failed to generate context from serializable struct: {0} + FailedToGenerateContextFromSerialize(tera::Error), + + /// Failed to render template: {0} + RenderingToTemplateFailed(tera::Error), + + /// Failed to read template file: {0} + FailedToReadTemplateFile(io::Error), + + /// Template file not specified + TemplateFileNotSpecified, +} + +/// [`ActivityStoreErrorKind`] describes the errors that can happen while dealing with time. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum ActivityStoreErrorKind { + /// Failed to list activities by id + ListActivitiesById, + + /// Failed to group activities by duration range + GroupByDurationRange, + + /// Failed to group activities by start date + GroupByStartDate, + + /// Failed to list activities with intermissions + ListActivitiesWithIntermissions, + + /// Failed to group activities by keywords + GroupByKeywords, + + /// Failed to group activities by kind + GroupByKind, + + /// Failed to list activities by time range + ListActivitiesByTimeRange, + + /// Failed to populate `ActivityStore` cache + PopulatingCache, + + /// Failed to list activities for activity: {0} + ListIntermissionsForActivity(String), + + /// Missing category for activity: {0} + MissingCategoryForActivity(String), + + /// Creating ActivityStore from storage failed + CreatingFromStorageFailed, +} + +/// [`TimeErrorKind`] describes the errors that can happen while dealing with time. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum TimeErrorKind { + /// {0} + #[error(transparent)] + OutOfRange(#[from] chrono::OutOfRangeError), + + /// Failed to parse time '{0}' from user input, please use the format HH:MM + ParsingTimeFromUserInputFailed(String), + + /// The start time cannot be in the future, please use a time in the past: '{0}' + StartTimeInFuture(String), + + /// Failed to parse duration '{0}', please use only numbers >= 0 + ParsingDurationFailed(String), + + /// Failed to parse date '{0}', please use the format YYYY-MM-DD + InvalidDate(String), + /// Date is not present! + DateShouldBePresent, + + /// Failed to parse date '{0}' + ParsingDateFailed(String), + + /// Invalid time range: Start '{0}' - End '{1}' + InvalidTimeRange(String, String), + + /// Invalid time zone: '{0}' + InvalidTimeZone(String), + + /// Failed to parse fixed offset '{0}' from user input, please use the format ±HHMM + ParsingFixedOffsetFailed(String), + + /// Failed to create PaceDateTime from user input, please use the format HH:MM and ±HHMM + InvalidUserInput, + + /// Time zone not found + UndefinedTimeZone, + + /// Both time zone and time zone offset are defined, please use only one + AmbiguousTimeZones, + + /// Ambiguous conversion result + AmbiguousConversionResult, + + /// Conversion to PaceDateTime failed + ConversionToPaceDateTimeFailed, + + /// Failed to parse time '{0}', please use the format HH:MM + InvalidTime(String), + + /// Failed to parse time '{0}', please use rfc3339 format + ParseError(String), + + /// Setting start of day failed + SettingStartOfDayFailed, + + /// Adding time delta failed: '{0}' + AddingTimeDeltaFailed(String), + + /// Failed to convert duration to i64: '{0}' + FailedToConvertDurationToI64(TryFromIntError), + + /// Failed to convert PaceDuration to Standard Duration: '{0}' + ConversionToDurationFailed(String), +} + +trait PaceErrorMarker: Error {} + +impl_pace_error_marker!(std::io::Error); +impl_pace_error_marker!(toml::de::Error); +impl_pace_error_marker!(toml::ser::Error); +impl_pace_error_marker!(serde_json::Error); +impl_pace_error_marker!(chrono::ParseError); +impl_pace_error_marker!(chrono::OutOfRangeError); +impl_pace_error_marker!(ActivityLogErrorKind); +impl_pace_error_marker!(ActivityStoreErrorKind); +impl_pace_error_marker!(TimeErrorKind); +impl_pace_error_marker!(TemplatingErrorKind); +impl_pace_error_marker!(DatabaseStorageErrorKind); +impl_pace_error_marker!(TomlFileStorageErrorKind); + +impl From for PaceError +where + E: PaceErrorMarker, + PaceErrorKind: From, +{ + fn from(value: E) -> Self { + Self(PaceErrorKind::from(value)) + } +} From 9c91fe2d635508ca35a36c4ea834fde9c6cfb3f6 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:27:29 +0100 Subject: [PATCH 27/59] fix clippy Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- config/pace.toml | 6 +-- crates/core/src/config.rs | 7 +-- crates/storage/src/lib.rs | 6 +-- crates/storage/src/sqlite.rs | 47 +++++++++---------- src/commands.rs | 4 ++ ...onfig__config_default_snapshot_passes.snap | 2 +- 6 files changed, 37 insertions(+), 35 deletions(-) diff --git a/config/pace.toml b/config/pace.toml index f6140187..2ec2302b 100644 --- a/config/pace.toml +++ b/config/pace.toml @@ -10,11 +10,11 @@ default-timezone = "UTC" [storage.database] # The kind of database storage # Supported values: "sqlite", "mysql", "postgres", "mssql" -# If you choose "sqlite", the connection string should be the path to the database file +# If you choose "sqlite", the url should be the path to the database file # Currently, only "sqlite" is supported kind = 'sqlite' -# In case of a SQLite database, this is the connection string: `sqlite://path/to/database` -connection = './db/activities.pace.sqlite3' +# In case of a SQLite database, this is the url: `/path/to/database` +url = './db/activities.pace.sqlite3' # For completeness, here is the file storage configuration # diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index 34ba0532..a81059fe 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -116,8 +116,9 @@ pub enum ActivityLogStorageKind { /// The database engine to use kind: DatabaseEngineKind, - /// The connection string to the database - connection: String, + /// The URL to the database + /// In case of [`DatabaseEngineKind::Sqlite`], this is the path to the database file + url: String, }, InMemory, } @@ -210,7 +211,7 @@ impl Default for StorageConfig { Self { storage: ActivityLogStorageKind::Database { kind: DatabaseEngineKind::Sqlite, - connection: "./db/activities.pace.sqlite3".to_string(), + url: "./db/activities.pace.sqlite3".to_string(), }, } } diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 14c10b30..e080d1f1 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -37,11 +37,11 @@ use crate::{ pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { let storage: Arc = match config.storage().storage() { ActivityLogStorageKind::File { location } => Arc::new(TomlActivityStorage::new(location)?), - ActivityLogStorageKind::Database { kind, connection } => match kind { + ActivityLogStorageKind::Database { kind, url } => match kind { DatabaseEngineKind::Sqlite => { - debug!("Connecting to database: {}", connection); + debug!("Connecting to database: {}", url); - Arc::new(SqliteActivityStorage::new(connection.clone())?) + Arc::new(SqliteActivityStorage::new(url.clone())?) } engine => { return Err( diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/sqlite.rs index 8ba1b4b9..54bc57ff 100644 --- a/crates/storage/src/sqlite.rs +++ b/crates/storage/src/sqlite.rs @@ -1,8 +1,6 @@ use std::collections::BTreeMap; -use itertools::Itertools; use rusqlite::Connection; -use tracing::debug; use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityQuerying, @@ -21,10 +19,9 @@ pub struct SqliteActivityStorage { } impl SqliteActivityStorage { - pub fn new(connection_string: String) -> PaceResult { - let connection = Connection::open(connection_string.as_str()).map_err(|err| { - DatabaseStorageErrorKind::ConnectionFailed(connection_string, err.to_string()) - })?; + pub fn new(url: String) -> PaceResult { + let connection = Connection::open(url.as_str()) + .map_err(|err| DatabaseStorageErrorKind::ConnectionFailed(url, err.to_string()))?; Ok(Self { connection }) } @@ -117,7 +114,7 @@ impl ActivityReadOps for SqliteActivityStorage { } impl ActivityWriteOps for SqliteActivityStorage { - fn create_activity(&self, activity: Activity) -> PaceResult { + fn create_activity(&self, _activity: Activity) -> PaceResult { // let tx = self.connection.transaction()?; // let mut stmt = tx.prepare(activity.to_sql_prepare_statement())?; @@ -135,17 +132,17 @@ impl ActivityWriteOps for SqliteActivityStorage { fn update_activity( &self, - activity_id: ActivityGuid, - updated_activity: Activity, - update_opts: UpdateOptions, + _activity_id: ActivityGuid, + _updated_activity: Activity, + _update_opts: UpdateOptions, ) -> PaceResult { todo!() } fn delete_activity( &self, - activity_id: ActivityGuid, - delete_opts: DeleteOptions, + _activity_id: ActivityGuid, + _delete_opts: DeleteOptions, ) -> PaceResult { // let activity = self.read_activity(activity_id)?; @@ -164,53 +161,53 @@ impl ActivityWriteOps for SqliteActivityStorage { impl ActivityStateManagement for SqliteActivityStorage { fn hold_activity( &self, - activity_id: ActivityGuid, - hold_opts: HoldOptions, + _activity_id: ActivityGuid, + _hold_opts: HoldOptions, ) -> PaceResult { todo!() } fn resume_activity( &self, - activity_id: ActivityGuid, - resume_opts: ResumeOptions, + _activity_id: ActivityGuid, + _resume_opts: ResumeOptions, ) -> PaceResult { todo!() } fn resume_most_recent_activity( &self, - resume_opts: ResumeOptions, + _resume_opts: ResumeOptions, ) -> PaceOptResult { todo!() } fn end_activity( &self, - activity_id: ActivityGuid, - end_opts: EndOptions, + _activity_id: ActivityGuid, + _end_opts: EndOptions, ) -> PaceResult { todo!() } - fn end_all_activities(&self, end_opts: EndOptions) -> PaceOptResult> { + fn end_all_activities(&self, _end_opts: EndOptions) -> PaceOptResult> { todo!() } fn end_all_active_intermissions( &self, - end_opts: EndOptions, + _end_opts: EndOptions, ) -> PaceOptResult> { todo!() } - fn end_last_unfinished_activity(&self, end_opts: EndOptions) -> PaceOptResult { + fn end_last_unfinished_activity(&self, _end_opts: EndOptions) -> PaceOptResult { todo!() } fn hold_most_recent_active_activity( &self, - hold_opts: HoldOptions, + _hold_opts: HoldOptions, ) -> PaceOptResult { todo!() } @@ -236,7 +233,7 @@ impl ActivityQuerying for SqliteActivityStorage { fn group_activities_by_keywords( &self, - keyword_opts: KeywordOptions, + _keyword_opts: KeywordOptions, ) -> PaceOptResult>> { todo!() } @@ -247,7 +244,7 @@ impl ActivityQuerying for SqliteActivityStorage { fn list_activities_by_time_range( &self, - time_range_opts: TimeRangeOptions, + _time_range_opts: TimeRangeOptions, ) -> PaceOptResult> { todo!() } diff --git a/src/commands.rs b/src/commands.rs index dbfbdf10..3834b301 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -114,6 +114,10 @@ pub struct EntryPoint { #[arg(long, env = "PACE_ACTIVITY_LOG_FILE", value_hint = clap::ValueHint::FilePath)] pub activity_log: Option, + /// Use the specified activity log file + #[arg(long, env = "PACE_ACTIVITY_LOG_FILE", value_hint = clap::ValueHint::FilePath)] + pub database_url: Option, + /// Pace Home Directory #[arg(long, env = "PACE_HOME", value_hint = clap::ValueHint::DirPath)] pub home: Option, diff --git a/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap b/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap index 59aca4f0..47856b5b 100644 --- a/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap +++ b/tests/integration/snapshots/integration__config__config_default_snapshot_passes.snap @@ -9,4 +9,4 @@ most-recent-count = 9 default-time-zone = 'UTC' [storage.database] kind = 'sqlite' -connection = './db/activities.pace.sqlite3' +url = './db/activities.pace.sqlite3' From 475de7e55d5f79ae81f2ee3b2c41eaba16d02e06 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 27 Mar 2024 21:29:27 +0100 Subject: [PATCH 28/59] add enviroment variable to clap parsing Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- src/commands.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands.rs b/src/commands.rs index 3834b301..91621f4d 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -114,8 +114,8 @@ pub struct EntryPoint { #[arg(long, env = "PACE_ACTIVITY_LOG_FILE", value_hint = clap::ValueHint::FilePath)] pub activity_log: Option, - /// Use the specified activity log file - #[arg(long, env = "PACE_ACTIVITY_LOG_FILE", value_hint = clap::ValueHint::FilePath)] + /// Use the specified database URL for activity storage + #[arg(long, env = "PACE_ACTIVITY_DATABASE_URL", value_hint = clap::ValueHint::Url)] pub database_url: Option, /// Pace Home Directory From 9ac4fb37a44dee492e3f5c0d4ba2500a12b61343 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 17:18:13 +0100 Subject: [PATCH 29/59] more preparations for database storage Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 11 ++- crates/core/Cargo.toml | 7 +- crates/core/src/commands.rs | 7 +- crates/core/src/commands/adjust.rs | 3 +- crates/core/src/commands/begin.rs | 7 +- crates/core/src/commands/reflect.rs | 7 +- crates/core/src/domain.rs | 2 + crates/core/src/domain/activity.rs | 31 +++++---- crates/core/src/domain/category.rs | 68 +++++++++++++++--- crates/core/src/domain/filter.rs | 7 +- crates/core/src/domain/id.rs | 39 +++++++++++ crates/core/src/domain/project.rs | 4 +- crates/core/src/lib.rs | 2 +- crates/core/src/service/activity_store.rs | 16 +++-- crates/core/src/storage.rs | 3 + crates/core/src/storage/rusqlite.rs | 67 ++++++++++++++++++ crates/core/src/util.rs | 6 +- crates/error/Cargo.toml | 1 + crates/error/src/lib.rs | 7 ++ crates/storage/Cargo.toml | 5 +- crates/storage/src/entities.rs | 69 ++++--------------- crates/storage/src/entities/activities.rs | 10 ++- .../src/entities/activities_categories.rs | 5 +- .../storage/src/entities/activities_tags.rs | 5 +- crates/storage/src/entities/activity_kinds.rs | 5 +- .../storage/src/entities/activity_status.rs | 5 +- crates/storage/src/entities/categories.rs | 5 +- .../storage/src/entities/schema_migrations.rs | 5 +- crates/storage/src/entities/tags.rs | 5 +- crates/storage/src/lib.rs | 11 +-- crates/storage/src/mediator.rs | 29 ++++++++ .../create_activities_20240325143710.rs | 2 +- crates/storage/src/storage.rs | 8 +++ crates/storage/src/{ => storage}/file.rs | 2 +- crates/storage/src/{ => storage}/in_memory.rs | 13 ++-- crates/storage/src/{ => storage}/sqlite.rs | 0 crates/time/Cargo.toml | 2 +- crates/time/src/lib.rs | 2 +- crates/time/src/storage.rs | 1 + crates/time/src/{ => storage}/rusqlite.rs | 0 tests/integration/activity_store.rs | 14 ++-- tests/integration/util.rs | 7 +- tests/journey/hold_resume.rs | 2 +- .../start_finish_different_time_zone.rs | 2 +- 44 files changed, 359 insertions(+), 150 deletions(-) create mode 100644 crates/core/src/domain/id.rs create mode 100644 crates/core/src/storage/rusqlite.rs create mode 100644 crates/storage/src/mediator.rs rename crates/storage/src/{ => storage}/file.rs (99%) rename crates/storage/src/{ => storage}/in_memory.rs (99%) rename crates/storage/src/{ => storage}/sqlite.rs (100%) create mode 100644 crates/time/src/storage.rs rename crates/time/src/{ => storage}/rusqlite.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index a4d87d5e..6598ef89 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -579,12 +579,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - [[package]] name = "either" version = "1.10.0" @@ -1359,7 +1353,6 @@ dependencies = [ "clap", "directories", "displaydoc", - "dotenvy", "eyre", "getset", "insta", @@ -1372,6 +1365,7 @@ dependencies = [ "parking_lot", "rayon", "rstest", + "rusqlite", "serde", "serde_derive", "serde_json", @@ -1401,6 +1395,7 @@ dependencies = [ "tera", "thiserror", "toml 0.8.12", + "ulid", ] [[package]] @@ -1413,6 +1408,7 @@ version = "0.1.0" dependencies = [ "chrono", "displaydoc", + "getset", "itertools", "libsqlite3-sys", "merge", @@ -1428,6 +1424,7 @@ dependencies = [ "thiserror", "toml 0.8.12", "tracing", + "typed-builder", "ulid", ] diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index cff3567d..dbac03be 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -20,9 +20,11 @@ include = [ ] [features] -default = ["cli"] +default = ["cli", "db"] cli = ["clap"] clap = ["dep:clap"] +db = ["rusqlite"] +rusqlite = ["dep:rusqlite"] [dependencies] chrono = { workspace = true, features = ["serde"] } @@ -30,7 +32,7 @@ chrono-tz = { workspace = true, features = ["serde"] } clap = { workspace = true, optional = true, features = ["env", "wrap_help", "derive"] } directories = { workspace = true } displaydoc = { workspace = true } -dotenvy = { workspace = true } +# dotenvy = { workspace = true } getset = { workspace = true } itertools = { workspace = true } merge = { workspace = true } @@ -40,6 +42,7 @@ pace_error = { workspace = true } pace_time = { workspace = true, features = ["rusqlite"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } +rusqlite = { workspace = true, optional = true, features = ["chrono"] } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } diff --git a/crates/core/src/commands.rs b/crates/core/src/commands.rs index 9a6b2911..086963d4 100644 --- a/crates/core/src/commands.rs +++ b/crates/core/src/commands.rs @@ -11,7 +11,10 @@ use getset::Getters; use pace_time::date_time::PaceDateTime; use typed_builder::TypedBuilder; -use crate::commands::{hold::HoldOptions, resume::ResumeOptions}; +use crate::{ + commands::{hold::HoldOptions, resume::ResumeOptions}, + domain::category::PaceCategory, +}; /// Options for ending an activity #[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] @@ -56,5 +59,5 @@ pub struct DeleteOptions {} #[non_exhaustive] pub struct KeywordOptions { #[builder(default, setter(into, strip_option))] - category: Option, + category: Option, } diff --git a/crates/core/src/commands/adjust.rs b/crates/core/src/commands/adjust.rs index 1ed41a5d..9d61e802 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/core/src/commands/adjust.rs @@ -14,6 +14,7 @@ use pace_error::{ActivityLogErrorKind, PaceResult, UserMessage}; use crate::{ commands::UpdateOptions, config::PaceConfig, + domain::category::PaceCategory, service::activity_store::ActivityStore, storage::{ActivityQuerying, ActivityStorage, ActivityWriteOps, SyncStorage}, }; @@ -39,7 +40,7 @@ pub struct AdjustCommandOptions { visible_alias = "cat" ) )] - category: Option, + category: Option, /// The description of the activity #[cfg_attr( diff --git a/crates/core/src/commands/begin.rs b/crates/core/src/commands/begin.rs index 770d93eb..fc01dbce 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/core/src/commands/begin.rs @@ -10,7 +10,10 @@ use tracing::debug; use crate::{ config::PaceConfig, - domain::activity::{Activity, ActivityKind}, + domain::{ + activity::{Activity, ActivityKind}, + category::PaceCategory, + }, service::activity_store::ActivityStore, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; @@ -29,7 +32,7 @@ pub struct BeginCommandOptions { /// You can use the separator you setup in the configuration file /// to specify a subcategory. #[cfg_attr(feature = "clap", clap(short, long, name = "Category"))] - category: Option, + category: Option, /// The time the activity has been started at. Format: HH:MM #[cfg_attr( diff --git a/crates/core/src/commands/reflect.rs b/crates/core/src/commands/reflect.rs index e06f14cb..a8ab8ecf 100644 --- a/crates/core/src/commands/reflect.rs +++ b/crates/core/src/commands/reflect.rs @@ -13,7 +13,10 @@ use typed_builder::TypedBuilder; use crate::{ config::PaceConfig, - domain::{activity::ActivityKind, filter::FilterOptions, reflection::ReflectionsFormatKind}, + domain::{ + activity::ActivityKind, category::PaceCategory, filter::FilterOptions, + reflection::ReflectionsFormatKind, + }, prelude::ActivityStorage, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, template::{PaceReflectionTemplate, TEMPLATES}, @@ -40,7 +43,7 @@ pub struct ReflectCommandOptions { feature = "clap", clap(short, long, value_name = "Category", visible_alias = "cat") )] - category: Option, + category: Option, /// Case sensitive category filter #[cfg_attr( diff --git a/crates/core/src/domain.rs b/crates/core/src/domain.rs index 29540f79..988a0156 100644 --- a/crates/core/src/domain.rs +++ b/crates/core/src/domain.rs @@ -1,5 +1,7 @@ //! Domain models and business rules +pub mod id; + /// The kind of activity a user can track pub mod activity; diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index ff7856b4..2b0de0a9 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -15,9 +15,8 @@ use std::{collections::HashSet, fmt::Display}; use strum_macros::EnumString; use tracing::debug; use typed_builder::TypedBuilder; -use ulid::Ulid; -use crate::domain::status::ActivityStatusKind; +use crate::domain::{category::PaceCategory, id::Guid, status::ActivityStatusKind}; use pace_error::{ActivityLogErrorKind, PaceResult}; @@ -203,7 +202,7 @@ pub struct Activity { #[getset(get = "pub", get_mut = "pub")] #[serde(skip_serializing_if = "Option::is_none")] #[merge(strategy = crate::util::overwrite_left_with_right)] - category: Option, + category: Option, /// The description of the activity // This needs to be an Optional, because we use the whole activity struct @@ -314,18 +313,23 @@ impl ActivityKindOptions { /// The unique identifier of an activity #[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] -pub struct ActivityGuid(Ulid); +pub struct ActivityGuid(Guid); impl ActivityGuid { #[must_use] pub fn new() -> Self { - Self(Ulid::new()) + Self(Guid::new()) } #[must_use] - pub const fn with_id(id: Ulid) -> Self { + pub const fn with_id(id: Guid) -> Self { Self(id) } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } } impl Display for ActivityGuid { @@ -336,7 +340,7 @@ impl Display for ActivityGuid { impl Default for ActivityGuid { fn default() -> Self { - Self(Ulid::new()) + Self(Guid::new()) } } @@ -345,7 +349,7 @@ impl Display for Activity { let time = self.begin.and_local_timezone(&Local); let utc_offset = time.offset(); let symbol = self.kind.as_symbol(); - let nop_cat = "Uncategorized".to_string(); + let nop_cat = PaceCategory::new("Uncategorized"); let description = self.description(); let category = self.category().as_ref().unwrap_or(&nop_cat); let started_at = duration_to_str(time); @@ -714,13 +718,16 @@ mod tests { let activity: Activity = toml::from_str(toml)?; - assert_eq!(activity.category.as_ref().ok_or("No category.")?, "Work"); + assert_eq!( + activity.category.as_ref().ok_or("No category.")?, + &PaceCategory::new("Work") + ); assert_eq!(activity.description, "This is an example activity"); let ActivityEndOptions { end, duration } = activity .activity_end_options() - .clone() + .as_ref() .ok_or("No end options")?; let begin_time = PaceDateTime::try_from(( @@ -745,9 +752,9 @@ mod tests { assert_eq!(activity.begin, begin_time); - assert_eq!(end, end_time); + assert_eq!(end, &end_time); - assert_eq!(duration, PaceDuration::from_str("19")?); + assert_eq!(duration, &PaceDuration::from_str("19")?); assert_eq!(activity.kind, ActivityKind::Activity); diff --git a/crates/core/src/domain/category.rs b/crates/core/src/domain/category.rs index 22bf5f7f..215d0967 100644 --- a/crates/core/src/domain/category.rs +++ b/crates/core/src/domain/category.rs @@ -1,14 +1,51 @@ //! Category entity and business logic +use std::str::FromStr; + use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use ulid::Ulid; -use crate::config::GeneralConfig; +use crate::{config::GeneralConfig, domain::id::Guid}; + +#[derive(Debug, Serialize, Deserialize, Clone, Eq, Hash, PartialEq, Default, PartialOrd, Ord)] +pub struct PaceCategory(String); + +impl PaceCategory { + pub fn new(category: &str) -> Self { + Self(category.to_owned()) + } +} +impl<'a, T: AsRef<&'a str>> From for PaceCategory { + fn from(category: T) -> Self { + Self::new(category.as_ref()) + } +} + +impl FromStr for PaceCategory { + type Err = String; + + fn from_str(s: &str) -> Result { + Ok(Self::new(s)) + } +} + +impl std::fmt::Display for PaceCategory { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl std::ops::Deref for PaceCategory { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} /// The category entity #[derive(Debug, Serialize, Deserialize, TypedBuilder, Clone)] -pub struct Category { +struct NewCategory { /// The category description #[builder(default, setter(strip_option))] #[serde(skip_serializing_if = "Option::is_none")] @@ -26,7 +63,7 @@ pub struct Category { // TODO: Add support for subcategories #[builder(default, setter(strip_option))] #[serde(skip_serializing_if = "Option::is_none")] - subcategories: Option>, + subcategories: Option>, } /// Extracts the category and subcategory from a string @@ -40,19 +77,28 @@ pub struct Category { /// /// A tuple containing the category and subcategory #[must_use] -pub fn extract_categories(category_string: &str, separator: &str) -> (Category, Option) { +fn extract_categories( + category_string: &str, + separator: &str, +) -> (NewCategory, Option) { let parts: Vec<_> = category_string.split(separator).collect(); if parts.len() > 1 { // if there are more than one part, the first part is the category // and the rest is the subcategory ( - Category::builder().name(parts[0].to_string()).build(), - Some(Category::builder().name(parts[1..].join(separator)).build()), + NewCategory::builder().name(parts[0].to_string()).build(), + Some( + NewCategory::builder() + .name(parts[1..].join(separator)) + .build(), + ), ) } else { // if there is only one part, it's the category ( - Category::builder().name(category_string.to_owned()).build(), + NewCategory::builder() + .name(category_string.to_owned()) + .build(), None, ) } @@ -95,15 +141,15 @@ pub fn split_category_by_category_separator( /// The category id #[derive(Debug, Serialize, Deserialize, Clone, Copy)] -pub struct CategoryGuid(Ulid); +pub struct CategoryGuid(Guid); impl Default for CategoryGuid { fn default() -> Self { - Self(Ulid::new()) + Self(Guid::new()) } } -impl Default for Category { +impl Default for NewCategory { fn default() -> Self { Self { guid: Some(CategoryGuid::default()), diff --git a/crates/core/src/domain/filter.rs b/crates/core/src/domain/filter.rs index 7cead0f5..e7d4790f 100644 --- a/crates/core/src/domain/filter.rs +++ b/crates/core/src/domain/filter.rs @@ -4,7 +4,10 @@ use serde_derive::Serialize; use strum::EnumIter; use typed_builder::TypedBuilder; -use crate::{commands::reflect::ReflectCommandOptions, domain::activity::ActivityGuid}; +use crate::{ + commands::reflect::ReflectCommandOptions, + domain::{activity::ActivityGuid, category::PaceCategory}, +}; /// Filter for activities #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, EnumIter)] @@ -92,7 +95,7 @@ impl FilteredActivities { )] #[getset(get = "pub")] pub struct FilterOptions { - category: Option, + category: Option, case_sensitive: bool, } diff --git a/crates/core/src/domain/id.rs b/crates/core/src/domain/id.rs new file mode 100644 index 00000000..e0270533 --- /dev/null +++ b/crates/core/src/domain/id.rs @@ -0,0 +1,39 @@ +use std::{fmt::Display, str::FromStr}; + +use pace_error::PaceErrorKind; +use serde_derive::{Deserialize, Serialize}; +use ulid::Ulid; + +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct Guid(Ulid); + +impl Guid { + pub fn new() -> Self { + Self(Ulid::new()) + } +} + +impl Default for Guid { + fn default() -> Self { + Self::new() + } +} + +impl FromStr for Guid { + type Err = PaceErrorKind; + + fn from_str(value: &str) -> Result { + Ok(Self(Ulid::from_string(value).map_err(|source| { + PaceErrorKind::InvalidGuid { + value: value.to_string(), + source, + } + })?)) + } +} + +impl Display for Guid { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Ulid: {}", self.0.to_string()) + } +} diff --git a/crates/core/src/domain/project.rs b/crates/core/src/domain/project.rs index eccd1cdd..10ffd9be 100644 --- a/crates/core/src/domain/project.rs +++ b/crates/core/src/domain/project.rs @@ -18,11 +18,11 @@ pub struct ProjectList { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct DefaultOptions { - categories: Option>, + categories: Option>, } #[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Category { +pub struct ProjectCategory { id: Ulid, name: String, description: Option, diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 33ec339e..86e6bc2e 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -51,7 +51,7 @@ pub mod prelude { ActivityKind, ActivityKindOptions, ActivitySession, }, activity_log::ActivityLog, - category::split_category_by_category_separator, + category::{split_category_by_category_separator, PaceCategory}, filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, intermission::IntermissionAction, reflection::{ diff --git a/crates/core/src/service/activity_store.rs b/crates/core/src/service/activity_store.rs index 92ea39ef..116bba37 100644 --- a/crates/core/src/service/activity_store.rs +++ b/crates/core/src/service/activity_store.rs @@ -19,7 +19,7 @@ use crate::{ activity::{ Activity, ActivityGroup, ActivityGuid, ActivityItem, ActivityKind, ActivitySession, }, - category, + category::{self, PaceCategory}, filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, reflection::{SummaryActivityGroup, SummaryGroupByCategory}, status::ActivityStatusKind, @@ -135,19 +135,23 @@ impl ActivityStore { for activity_guid in activity_guids { let activity_item = self.read_activity(activity_guid)?; + let fallback_category = PaceCategory::new("Uncategorized"); + let activity_category = activity_item .activity() .category() - .as_deref() - .unwrap_or("Uncategorized") - .to_string(); + .as_ref() + .unwrap_or(&fallback_category); // Skip if category does not match user input if let Some(category) = filter_opts.category() { let (filter_category, activity_category) = if *filter_opts.case_sensitive() { (category.clone(), activity_category.clone()) } else { - (category.to_lowercase(), activity_category.to_lowercase()) + ( + PaceCategory::new(&category.to_lowercase()), + PaceCategory::new(&activity_category.to_lowercase()), + ) }; if !WildMatch::new(&filter_category).matches(&activity_category) { @@ -165,7 +169,7 @@ impl ActivityStore { // Handle splitting subcategories let (category, subcategory) = - category::split_category_by_category_separator(&activity_category, None); + category::split_category_by_category_separator(activity_category, None); // Deduplicate activities by category and description first _ = activity_sessions_lookup_by_category diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 24cdec31..63cbe0bb 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -1,3 +1,6 @@ +#[cfg(feature = "rusqlite")] +pub mod rusqlite; + use std::{ collections::BTreeMap, fmt::{self, Debug, Formatter}, diff --git a/crates/core/src/storage/rusqlite.rs b/crates/core/src/storage/rusqlite.rs new file mode 100644 index 00000000..49a93946 --- /dev/null +++ b/crates/core/src/storage/rusqlite.rs @@ -0,0 +1,67 @@ +use std::str::FromStr; + +use rusqlite::{types::FromSql, ToSql}; + +use crate::{ + domain::id::Guid, + prelude::{ActivityGuid, ActivityKind, ActivityStatusKind}, +}; + +impl ToSql for ActivityGuid { + fn to_sql(&self) -> rusqlite::Result> { + self.inner().to_sql() + } +} + +impl FromSql for ActivityGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::with_id(Guid::from_str(value.as_str()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} + +impl ToSql for ActivityKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for ActivityKind { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Self::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} + +impl ToSql for ActivityStatusKind { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for ActivityStatusKind { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Self::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} + +impl ToSql for Guid { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for Guid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Self::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} diff --git a/crates/core/src/util.rs b/crates/core/src/util.rs index 316e604a..e1fefe2f 100644 --- a/crates/core/src/util.rs +++ b/crates/core/src/util.rs @@ -13,7 +13,7 @@ pub fn overwrite_left_with_right(left: &mut T, right: T) { #[cfg(test)] mod tests { - use crate::domain::activity::Activity; + use crate::domain::{activity::Activity, category::PaceCategory}; use super::*; @@ -37,8 +37,8 @@ mod tests { fn test_overwrite_activity_passes() { let mut left = Activity::default(); let mut right = Activity::default(); - _ = right.category_mut().replace("right".to_string()); + _ = right.category_mut().replace(PaceCategory::new("right")); overwrite_left_with_right(&mut left, right); - assert_eq!(left.category(), &Some("right".to_string())); + assert_eq!(left.category(), &Some(PaceCategory::new("right"))); } } diff --git a/crates/error/Cargo.toml b/crates/error/Cargo.toml index d3c4071e..8532abc2 100644 --- a/crates/error/Cargo.toml +++ b/crates/error/Cargo.toml @@ -23,6 +23,7 @@ serde_json = { workspace = true } tera = { workspace = true } thiserror = { workspace = true } toml = { workspace = true } +ulid = { workspace = true } [lints] workspace = true diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index feba836a..63691cc9 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -168,6 +168,13 @@ pub enum PaceErrorKind { /// Toml file error: {0} #[error(transparent)] TomlFile(#[from] TomlFileStorageErrorKind), + + /// Invalid Ulid parsed from string: {value} due to {source} + InvalidGuid { + value: String, + #[source] + source: ulid::DecodeError, + }, } /// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the `SQLite` database. diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index ab325a45..a3466bdf 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -31,11 +31,13 @@ include = [ # ] [dependencies] +chrono = { workspace = true, features = ["serde"] } displaydoc = { workspace = true } +getset = { workspace = true } itertools = { workspace = true } libsqlite3-sys = { workspace = true, features = ["bundled"] } merge = { workspace = true } -pace_core = { workspace = true } +pace_core = { workspace = true, features = ["db"] } pace_error = { workspace = true } pace_time = { workspace = true, features = ["db"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } @@ -47,6 +49,7 @@ strum = { workspace = true } thiserror = { workspace = true } toml = { workspace = true, features = ["indexmap", "preserve_order"] } tracing = { workspace = true } +typed-builder = { workspace = true } ulid = { workspace = true, features = ["serde"] } [dev-dependencies] diff --git a/crates/storage/src/entities.rs b/crates/storage/src/entities.rs index 8f9bcd0f..cc082487 100644 --- a/crates/storage/src/entities.rs +++ b/crates/storage/src/entities.rs @@ -1,6 +1,10 @@ use pace_core::prelude::{ Activity, ActivityEndOptions, ActivityGuid, ActivityKind, ActivityStatusKind, }; +use typed_builder::TypedBuilder; +use ulid::Ulid; + +use crate::entities::activities::Activities as SQLiteActivity; pub mod activities; pub mod activities_categories; @@ -11,20 +15,18 @@ pub mod categories; pub mod schema_migrations; pub mod tags; -pub struct SQLiteActivity(Activity); - -pub struct SQLiteActivityGuid(ActivityGuid); - +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder)] pub struct SQLiteActivityItem { - guid: SQLiteActivityGuid, + guid: Ulid, activity: SQLiteActivity, } -pub struct SQLiteActivityKind(ActivityKind); - -pub struct SQLiteActivityStatusKind(ActivityStatusKind); - -pub struct SQLiteActivityEndOptions(ActivityEndOptions); +impl SQLiteActivityItem { + #[must_use] + pub const fn new(guid: Ulid, activity: SQLiteActivity) -> Self { + Self { guid, activity } + } +} // impl SqliteActivity { // pub fn to_sql_prepare_statement(&self) -> &'static str { @@ -167,50 +169,3 @@ pub struct SQLiteActivityEndOptions(ActivityEndOptions); // Ok(Self::builder().guid(guid).activity(activity).build()) // } // } - -// impl ToSql for SqliteActivityGuid { -// fn to_sql(&self) -> rusqlite::Result> { -// Ok(rusqlite::types::ToSqlOutput::Owned( -// rusqlite::types::Value::Text(self.to_string()), -// )) -// } -// } - -// impl FromSql for SqliteActivityGuid { -// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { -// Ok(ActivityGuid::with_id( -// Ulid::from_string(value.as_str()?) -// .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?, -// )) -// } -// } - -// impl ToSql for SqliteActivityKind { -// fn to_sql(&self) -> rusqlite::Result> { -// Ok(rusqlite::types::ToSqlOutput::Owned( -// rusqlite::types::Value::Text(self.to_string()), -// )) -// } -// } - -// impl FromSql for SqliteActivityKind { -// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { -// Ok(ActivityKind::from_str(value.as_str()?) -// .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) -// } -// } - -// impl ToSql for SqliteActivityStatusKind { -// fn to_sql(&self) -> rusqlite::Result> { -// Ok(rusqlite::types::ToSqlOutput::Owned( -// rusqlite::types::Value::Text(self.to_string()), -// )) -// } -// } - -// impl FromSql for SqliteActivityStatusKind { -// fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { -// Ok(ActivityStatusKind::from_str(value.as_str()?) -// .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err)))?) -// } -// } diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs index a2293c50..3bc3ce9f 100644 --- a/crates/storage/src/entities/activities.rs +++ b/crates/storage/src/entities/activities.rs @@ -1,17 +1,21 @@ +use chrono::FixedOffset; +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct Activities { pub guid: String, pub category: String, pub description: String, - pub begin: String, - pub end: Option, + pub begin: chrono::DateTime, + pub end: Option>, pub duration: Option, pub kind: String, pub status: String, diff --git a/crates/storage/src/entities/activities_categories.rs b/crates/storage/src/entities/activities_categories.rs index bee3d1e5..69db8e62 100644 --- a/crates/storage/src/entities/activities_categories.rs +++ b/crates/storage/src/entities/activities_categories.rs @@ -1,10 +1,13 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct ActivitiesCategories { pub guid: String, diff --git a/crates/storage/src/entities/activities_tags.rs b/crates/storage/src/entities/activities_tags.rs index 6aec968d..0f82a07b 100644 --- a/crates/storage/src/entities/activities_tags.rs +++ b/crates/storage/src/entities/activities_tags.rs @@ -1,10 +1,13 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct ActivitiesTags { pub guid: String, diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs index a3ad3c7f..944efb7f 100644 --- a/crates/storage/src/entities/activity_kinds.rs +++ b/crates/storage/src/entities/activity_kinds.rs @@ -1,10 +1,13 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct ActivityKinds { pub guid: String, diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs index 8945a9b2..ddc18b56 100644 --- a/crates/storage/src/entities/activity_status.rs +++ b/crates/storage/src/entities/activity_status.rs @@ -1,10 +1,13 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct ActivityStatus { pub guid: String, diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs index 4f3161f7..81d6d5d1 100644 --- a/crates/storage/src/entities/categories.rs +++ b/crates/storage/src/entities/categories.rs @@ -1,10 +1,13 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct Categories { pub guid: String, diff --git a/crates/storage/src/entities/schema_migrations.rs b/crates/storage/src/entities/schema_migrations.rs index 5b1de416..d37d8478 100644 --- a/crates/storage/src/entities/schema_migrations.rs +++ b/crates/storage/src/entities/schema_migrations.rs @@ -1,9 +1,12 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct SchemaMigrations { pub guid: String, diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs index b907c02d..626dda23 100644 --- a/crates/storage/src/entities/tags.rs +++ b/crates/storage/src/entities/tags.rs @@ -1,10 +1,13 @@ +use getset::Getters; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; +use typed_builder::TypedBuilder; use crate::storage::SQLiteEntity; -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] #[enum_def] pub struct Tags { pub guid: String, diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index e080d1f1..20745305 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,14 +1,7 @@ +pub mod mediator; pub mod migration; pub mod storage; -/// A type of storage that can be synced to a persistent medium - a file -pub mod file; - -/// An in-memory storage backend for activities. -pub mod in_memory; - -pub mod sqlite; - pub mod entities; use std::sync::Arc; @@ -17,7 +10,7 @@ use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngine use pace_error::{DatabaseStorageErrorKind, PaceResult}; use tracing::debug; -use crate::{ +use crate::storage::{ file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SqliteActivityStorage, }; diff --git a/crates/storage/src/mediator.rs b/crates/storage/src/mediator.rs new file mode 100644 index 00000000..36cb4d69 --- /dev/null +++ b/crates/storage/src/mediator.rs @@ -0,0 +1,29 @@ +use pace_core::prelude::ActivityItem; +use pace_error::PaceResult; + +use crate::entities::SQLiteActivityItem; + +pub trait Mediator { + type Options; + type Source; + type Target; + + fn to_stored(source: Self::Source, opts: Self::Options) -> PaceResult; + fn from_stored(stored: Self::Target, opts: Self::Options) -> PaceResult; +} + +pub struct SQLiteActivityMediator; + +impl Mediator for SQLiteActivityMediator { + type Options = (); + type Source = ActivityItem; + type Target = SQLiteActivityItem; + + fn to_stored(source: Self::Source, opts: Self::Options) -> PaceResult { + todo!() + } + + fn from_stored(stored: Self::Target, opts: Self::Options) -> PaceResult { + todo!() + } +} diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs index 2f20b6e2..950b42fa 100644 --- a/crates/storage/src/migration/create_activities_20240325143710.rs +++ b/crates/storage/src/migration/create_activities_20240325143710.rs @@ -31,7 +31,7 @@ impl SQLiteMigration for Migration { .text() .not_null(), ) - .col(ColumnDef::new(ActivitiesIden::Begin).text().not_null()) + .col(ColumnDef::new(ActivitiesIden::Begin).date_time().not_null()) .col(ColumnDef::new(ActivitiesIden::End).text().null()) .col(ColumnDef::new(ActivitiesIden::Duration).integer().null()) .col(ColumnDef::new(ActivitiesIden::Kind).text().not_null()) diff --git a/crates/storage/src/storage.rs b/crates/storage/src/storage.rs index e3145f6b..0a86c495 100644 --- a/crates/storage/src/storage.rs +++ b/crates/storage/src/storage.rs @@ -1,3 +1,11 @@ +/// A type of storage that can be synced to a persistent medium - a file +pub mod file; + +/// An in-memory storage backend for activities. +pub mod in_memory; + +pub mod sqlite; + use rusqlite::{Error, Row}; /// Trait for `SQLite` entities. diff --git a/crates/storage/src/file.rs b/crates/storage/src/storage/file.rs similarity index 99% rename from crates/storage/src/file.rs rename to crates/storage/src/storage/file.rs index 7eb29ff6..d56906be 100644 --- a/crates/storage/src/file.rs +++ b/crates/storage/src/storage/file.rs @@ -14,7 +14,7 @@ use pace_core::prelude::{ use pace_error::{PaceOptResult, PaceResult, TomlFileStorageErrorKind}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use crate::in_memory::InMemoryActivityStorage; +use crate::storage::in_memory::InMemoryActivityStorage; /// In-memory backed TOML activity storage /// diff --git a/crates/storage/src/in_memory.rs b/crates/storage/src/storage/in_memory.rs similarity index 99% rename from crates/storage/src/in_memory.rs rename to crates/storage/src/storage/in_memory.rs index c0d7324e..4cf7047a 100644 --- a/crates/storage/src/in_memory.rs +++ b/crates/storage/src/storage/in_memory.rs @@ -15,7 +15,8 @@ use pace_core::prelude::{ Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityKindOptions, ActivityLog, ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, - FilteredActivities, HoldOptions, KeywordOptions, ResumeOptions, SyncStorage, UpdateOptions, + FilteredActivities, HoldOptions, KeywordOptions, PaceCategory, ResumeOptions, SyncStorage, + UpdateOptions, }; use pace_error::{ActivityLogErrorKind, PaceOptResult, PaceResult}; @@ -712,11 +713,13 @@ impl ActivityQuerying for InMemoryActivityStorage { debug!("No category specified. Using 'Uncategorized' as the category."); + let fallback_category = PaceCategory::new("Uncategorized"); + acc.entry( activity .category() .as_ref() - .unwrap_or(&"Uncategorized".to_string()) + .unwrap_or(&fallback_category) .to_string(), ) .or_default() @@ -1571,12 +1574,14 @@ mod tests { .begin(begin_time) .kind(kind) .description(description) - .category("Project::Test".to_string()) + .category(PaceCategory::new("Project::Test")) .build(); let activity_item = storage.begin_activity(activity)?; - let keyword_opts = KeywordOptions::builder().category("Test").build(); + let keyword_opts = KeywordOptions::builder() + .category(PaceCategory::new("Test")) + .build(); let grouped_activities = storage.group_activities_by_keywords(keyword_opts)?.ok_or( "Grouped activities by keywords returned None, but should have returned Some.", diff --git a/crates/storage/src/sqlite.rs b/crates/storage/src/storage/sqlite.rs similarity index 100% rename from crates/storage/src/sqlite.rs rename to crates/storage/src/storage/sqlite.rs diff --git a/crates/time/Cargo.toml b/crates/time/Cargo.toml index dbab4023..40aaba1e 100644 --- a/crates/time/Cargo.toml +++ b/crates/time/Cargo.toml @@ -35,7 +35,7 @@ displaydoc = { workspace = true } getset = { workspace = true } humantime = { workspace = true } pace_error = { workspace = true } -rusqlite = { workspace = true, optional = true, features = ["bundled", "chrono"] } +rusqlite = { workspace = true, optional = true, features = ["chrono"] } serde = { workspace = true } serde_derive = { workspace = true } thiserror = { workspace = true } diff --git a/crates/time/src/lib.rs b/crates/time/src/lib.rs index 8a4db13f..f8a6f6db 100644 --- a/crates/time/src/lib.rs +++ b/crates/time/src/lib.rs @@ -3,7 +3,7 @@ pub mod date_time; pub mod duration; pub mod flags; #[cfg(feature = "rusqlite")] -pub mod rusqlite; +pub mod storage; pub mod time; pub mod time_frame; pub mod time_range; diff --git a/crates/time/src/storage.rs b/crates/time/src/storage.rs new file mode 100644 index 00000000..86b1d615 --- /dev/null +++ b/crates/time/src/storage.rs @@ -0,0 +1 @@ +pub mod rusqlite; diff --git a/crates/time/src/rusqlite.rs b/crates/time/src/storage/rusqlite.rs similarity index 100% rename from crates/time/src/rusqlite.rs rename to crates/time/src/storage/rusqlite.rs diff --git a/tests/integration/activity_store.rs b/tests/integration/activity_store.rs index 8983f4db..b9c921b1 100644 --- a/tests/integration/activity_store.rs +++ b/tests/integration/activity_store.rs @@ -5,10 +5,10 @@ use std::{collections::HashSet, sync::Arc}; use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStore, ActivityWriteOps, DeleteOptions, EndOptions, HoldOptions, - ResumeOptions, UpdateOptions, + PaceCategory, ResumeOptions, UpdateOptions, }; use pace_error::TestResult; -use pace_storage::in_memory::InMemoryActivityStorage; +use pace_storage::storage::in_memory::InMemoryActivityStorage; use crate::util::{ activity_store, activity_store_empty, activity_store_no_intermissions, TestData, @@ -28,7 +28,7 @@ fn test_activity_store_create_activity_passes( let activity = Activity::builder() .description("Test Description".to_string()) - .category("Test::Category".to_string()) + .category(PaceCategory::new("Test::Category")) .build(); let og_activity = activity.clone(); @@ -256,7 +256,7 @@ fn test_activity_store_update_activity_passes( let og_activity_id = *og_activity.guid(); let updated_test_desc = "Updated Test Description".to_string(); - let updated_test_cat = "Test::UpdatedCategory".to_string(); + let updated_test_cat = PaceCategory::new("Test::UpdatedCategory"); let new_activity = Activity::builder() .description(updated_test_desc.to_string()) @@ -356,7 +356,7 @@ fn test_activity_store_update_activity_fails( let new_activity = Activity::builder() .description("test".to_string()) - .category("test".to_string()) + .category(PaceCategory::new("test")) .build(); let activity_id = ActivityGuid::default(); @@ -419,7 +419,7 @@ fn test_activity_store_begin_intermission_passes( assert_eq!( intermission.activity().category(), - &Some("Test::Intermission".to_string()) + &Some(PaceCategory::new("Test::Intermission")) ); assert_eq!( @@ -485,7 +485,7 @@ fn test_activity_store_begin_intermission_with_existing_does_nothing_passes( assert_eq!( intermission.activity().category(), - &Some("Test::Intermission".to_string()), + &Some(PaceCategory::new("Test::Intermission")), "Category should be the same as original activity." ); diff --git a/tests/integration/util.rs b/tests/integration/util.rs index 5222aedb..08968a1b 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -8,7 +8,7 @@ use pace_core::prelude::{ }; use pace_error::TestResult; -use pace_storage::file::TomlActivityStorage; +use pace_storage::storage::file::TomlActivityStorage; use rstest::fixture; pub struct TestData { @@ -54,7 +54,8 @@ pub fn activity_store_no_intermissions() -> TestResult { // We need to use `#[cfg(not(tarpaulin_include))]` to exclude this from coverage reports #[cfg(not(tarpaulin_include))] pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult { - use pace_storage::in_memory::InMemoryActivityStorage; + use pace_core::prelude::PaceCategory; + use pace_storage::storage::in_memory::InMemoryActivityStorage; use pace_time::date_time::PaceDateTime; let begin_time = PaceDateTime::default(); @@ -95,7 +96,7 @@ pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult Date: Thu, 28 Mar 2024 17:42:14 +0100 Subject: [PATCH 30/59] more preparations for database storage II Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/commands/adjust.rs | 4 +- crates/core/src/commands/begin.rs | 3 +- crates/core/src/commands/hold.rs | 6 +- crates/core/src/domain.rs | 1 + crates/core/src/domain/activity.rs | 17 ++++-- crates/core/src/domain/category.rs | 10 ++- crates/core/src/domain/description.rs | 40 ++++++++++++ crates/core/src/domain/project.rs | 6 +- crates/core/src/domain/reflection.rs | 9 ++- crates/core/src/domain/task.rs | 4 +- crates/core/src/lib.rs | 1 + crates/core/src/service/activity_store.rs | 3 +- crates/storage/src/storage/in_memory.rs | 61 ++++++++++--------- tests/integration/activity_store.rs | 18 +++--- tests/integration/util.rs | 12 ++-- tests/journey/hold_resume.rs | 10 ++- .../start_finish_different_time_zone.rs | 6 +- 17 files changed, 139 insertions(+), 72 deletions(-) create mode 100644 crates/core/src/domain/description.rs diff --git a/crates/core/src/commands/adjust.rs b/crates/core/src/commands/adjust.rs index 9d61e802..9b374015 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/core/src/commands/adjust.rs @@ -14,7 +14,7 @@ use pace_error::{ActivityLogErrorKind, PaceResult, UserMessage}; use crate::{ commands::UpdateOptions, config::PaceConfig, - domain::category::PaceCategory, + domain::{category::PaceCategory, description::PaceDescription}, service::activity_store::ActivityStore, storage::{ActivityQuerying, ActivityStorage, ActivityWriteOps, SyncStorage}, }; @@ -53,7 +53,7 @@ pub struct AdjustCommandOptions { visible_alias = "desc" ) )] - description: Option, + description: Option, /// The start time of the activity. Format: HH:MM #[cfg_attr( diff --git a/crates/core/src/commands/begin.rs b/crates/core/src/commands/begin.rs index fc01dbce..8fe09d0d 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/core/src/commands/begin.rs @@ -13,6 +13,7 @@ use crate::{ domain::{ activity::{Activity, ActivityKind}, category::PaceCategory, + description::PaceDescription, }, service::activity_store::ActivityStore, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, @@ -43,7 +44,7 @@ pub struct BeginCommandOptions { /// The description of the activity you want to start #[cfg_attr(feature = "clap", clap(value_name = "Activity Description"))] - description: String, + description: PaceDescription, /// The tags you want to associate with the activity, separated by a comma #[cfg_attr( diff --git a/crates/core/src/commands/hold.rs b/crates/core/src/commands/hold.rs index c479c9e2..65b791b4 100644 --- a/crates/core/src/commands/hold.rs +++ b/crates/core/src/commands/hold.rs @@ -12,7 +12,7 @@ use typed_builder::TypedBuilder; use crate::{ config::PaceConfig, - domain::intermission::IntermissionAction, + domain::{description::PaceDescription, intermission::IntermissionAction}, service::activity_store::ActivityStore, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; @@ -34,7 +34,7 @@ pub struct HoldCommandOptions { /// The reason for the intermission, if this is not set, the description of the activity to be held will be used #[cfg_attr(feature = "clap", clap(short, long, value_name = "Reason"))] - reason: Option, + reason: Option, /// If there are existing intermissions, they will be finished and a new one is being created /// @@ -151,5 +151,5 @@ pub struct HoldOptions { /// The reason for holding the activity #[builder(default, setter(into))] - reason: Option, + reason: Option, } diff --git a/crates/core/src/domain.rs b/crates/core/src/domain.rs index 988a0156..a75e652d 100644 --- a/crates/core/src/domain.rs +++ b/crates/core/src/domain.rs @@ -11,6 +11,7 @@ pub mod activity_log; /// A category for activities pub mod category; +pub mod description; /// A filter for activities pub mod filter; pub mod inbox; diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index 2b0de0a9..451cc023 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -16,7 +16,9 @@ use strum_macros::EnumString; use tracing::debug; use typed_builder::TypedBuilder; -use crate::domain::{category::PaceCategory, id::Guid, status::ActivityStatusKind}; +use crate::domain::{ + category::PaceCategory, description::PaceDescription, id::Guid, status::ActivityStatusKind, +}; use pace_error::{ActivityLogErrorKind, PaceResult}; @@ -209,7 +211,7 @@ pub struct Activity { // as well for intermissions, which don't have a description #[builder(setter(into))] #[merge(strategy = crate::util::overwrite_left_with_right)] - description: String, + description: PaceDescription, /// The start date and time of the activity #[builder(default, setter(into))] @@ -555,7 +557,7 @@ impl Activity { #[getset(get = "pub")] pub struct ActivitySession { /// A description of the activity group - description: String, + description: PaceDescription, /// Root Activity within the activity group root_activity: ActivityItem, @@ -614,7 +616,7 @@ impl ActivitySession { #[getset(get = "pub")] pub struct ActivityGroup { /// A description of the activity group - description: String, + description: PaceDescription, /// Duration spent on the grouped activities, essentially the sum of all durations /// of the activities within the group and their children. Intermissions are counting @@ -647,7 +649,7 @@ impl ActivityGroup { } pub fn with_multiple_sessions( - description: String, + description: PaceDescription, activity_sessions: Vec, ) -> Self { debug!("Creating new activity group"); @@ -723,7 +725,10 @@ mod tests { &PaceCategory::new("Work") ); - assert_eq!(activity.description, "This is an example activity"); + assert_eq!( + activity.description, + PaceDescription::new("This is an example activity") + ); let ActivityEndOptions { end, duration } = activity .activity_end_options() diff --git a/crates/core/src/domain/category.rs b/crates/core/src/domain/category.rs index 215d0967..a6899529 100644 --- a/crates/core/src/domain/category.rs +++ b/crates/core/src/domain/category.rs @@ -5,12 +5,16 @@ use std::str::FromStr; use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use crate::{config::GeneralConfig, domain::id::Guid}; +use crate::{ + config::GeneralConfig, + domain::{description::PaceDescription, id::Guid}, +}; #[derive(Debug, Serialize, Deserialize, Clone, Eq, Hash, PartialEq, Default, PartialOrd, Ord)] pub struct PaceCategory(String); impl PaceCategory { + #[must_use] pub fn new(category: &str) -> Self { Self(category.to_owned()) } @@ -49,7 +53,7 @@ struct NewCategory { /// The category description #[builder(default, setter(strip_option))] #[serde(skip_serializing_if = "Option::is_none")] - description: Option, + description: Option, /// The category id #[builder(default = Some(CategoryGuid::default()), setter(strip_option))] @@ -154,7 +158,7 @@ impl Default for NewCategory { Self { guid: Some(CategoryGuid::default()), name: "Uncategorized".to_string(), - description: Some("Uncategorized category".to_string()), + description: Some(PaceDescription::new("Uncategorized category")), subcategories: Option::default(), } } diff --git a/crates/core/src/domain/description.rs b/crates/core/src/domain/description.rs new file mode 100644 index 00000000..42b66554 --- /dev/null +++ b/crates/core/src/domain/description.rs @@ -0,0 +1,40 @@ +use std::str::FromStr; + +use serde_derive::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone, Eq, Hash, PartialEq, Default, PartialOrd, Ord)] +pub struct PaceDescription(String); + +impl PaceDescription { + #[must_use] + pub fn new(description: &str) -> Self { + Self(description.to_owned()) + } +} +impl<'a, T: AsRef<&'a str>> From for PaceDescription { + fn from(description: T) -> Self { + Self::new(description.as_ref()) + } +} + +impl FromStr for PaceDescription { + type Err = String; + + fn from_str(s: &str) -> Result { + Ok(Self::new(s)) + } +} + +impl std::fmt::Display for PaceDescription { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl std::ops::Deref for PaceDescription { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/crates/core/src/domain/project.rs b/crates/core/src/domain/project.rs index 10ffd9be..a0dd4378 100644 --- a/crates/core/src/domain/project.rs +++ b/crates/core/src/domain/project.rs @@ -8,6 +8,8 @@ use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; use ulid::Ulid; +use crate::domain::description::PaceDescription; + #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ProjectList { /// The tasks in the list @@ -25,7 +27,7 @@ pub struct DefaultOptions { pub struct ProjectCategory { id: Ulid, name: String, - description: Option, + description: Option, } #[derive(Debug, TypedBuilder, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] @@ -34,7 +36,7 @@ pub struct Project { name: String, #[serde(skip_serializing_if = "Option::is_none")] - description: Option, + description: Option, tasks_file: PathBuf, diff --git a/crates/core/src/domain/reflection.rs b/crates/core/src/domain/reflection.rs index 75886b62..834c90a1 100644 --- a/crates/core/src/domain/reflection.rs +++ b/crates/core/src/domain/reflection.rs @@ -10,7 +10,10 @@ use tabled::{ use typed_builder::TypedBuilder; -use crate::domain::activity::{ActivityGroup, ActivityItem, ActivityKind}; +use crate::domain::{ + activity::{ActivityGroup, ActivityItem, ActivityKind}, + description::PaceDescription, +}; /// The kind of review format /// Default: `console` @@ -111,7 +114,7 @@ impl std::fmt::Display for ReflectionSummary { for (description, activity_group) in summary_group.activity_groups_by_description() { builder.push_record(vec![ subcategory, - description, + description.to_string().as_str(), format!( "{} ({})", &activity_group.adjusted_duration().to_string(), @@ -168,7 +171,7 @@ pub struct SummaryActivityGroup { total_break_count: usize, /// The groups of activities for a summary category - activity_groups_by_description: BTreeMap, + activity_groups_by_description: BTreeMap, } impl SummaryActivityGroup { diff --git a/crates/core/src/domain/task.rs b/crates/core/src/domain/task.rs index fe0a1242..d103ce8b 100644 --- a/crates/core/src/domain/task.rs +++ b/crates/core/src/domain/task.rs @@ -10,13 +10,13 @@ use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; use ulid::Ulid; -use crate::domain::{priority::ItemPriorityKind, status::TaskStatus}; +use crate::domain::{description::PaceDescription, priority::ItemPriorityKind, status::TaskStatus}; #[derive(Debug, TypedBuilder, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Clone)] pub struct Task { created_at: NaiveDateTime, - description: String, + description: PaceDescription, #[builder(default, setter(strip_option))] #[serde(skip_serializing_if = "Option::is_none")] diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 86e6bc2e..4d7b9841 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -52,6 +52,7 @@ pub mod prelude { }, activity_log::ActivityLog, category::{split_category_by_category_separator, PaceCategory}, + description::PaceDescription, filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, intermission::IntermissionAction, reflection::{ diff --git a/crates/core/src/service/activity_store.rs b/crates/core/src/service/activity_store.rs index 116bba37..bea8dcc1 100644 --- a/crates/core/src/service/activity_store.rs +++ b/crates/core/src/service/activity_store.rs @@ -20,6 +20,7 @@ use crate::{ Activity, ActivityGroup, ActivityGuid, ActivityItem, ActivityKind, ActivitySession, }, category::{self, PaceCategory}, + description::PaceDescription, filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, reflection::{SummaryActivityGroup, SummaryGroupByCategory}, status::ActivityStatusKind, @@ -124,7 +125,7 @@ impl ActivityStore { let mut summary_groups: SummaryGroupByCategory = BTreeMap::new(); let mut activity_sessions_lookup_by_category: HashMap< - (Category, Subcategory, Description), + (Category, Subcategory, PaceDescription), Vec, > = HashMap::new(); diff --git a/crates/storage/src/storage/in_memory.rs b/crates/storage/src/storage/in_memory.rs index 4cf7047a..aaf0782d 100644 --- a/crates/storage/src/storage/in_memory.rs +++ b/crates/storage/src/storage/in_memory.rs @@ -819,6 +819,7 @@ mod tests { use super::*; use chrono::Local; + use pace_core::prelude::PaceDescription; use pace_error::TestResult; use pace_time::date_time::PaceDateTime; use std::collections::HashSet; @@ -852,7 +853,7 @@ mod tests { let begin = Local::now().fixed_offset(); let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -889,7 +890,7 @@ mod tests { let begin = Local::now().fixed_offset(); let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -931,7 +932,7 @@ mod tests { let begin = Local::now().fixed_offset(); let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -953,7 +954,7 @@ mod tests { "Stored activity is not the same as the original activity." ); - let new_description = "Updated description"; + let new_description = PaceDescription::new("Updated description"); let tags = vec!["bla".to_string(), "test".to_string()] .into_iter() @@ -967,7 +968,7 @@ mod tests { .begin(new_begin) .kind(ActivityKind::PomodoroWork) .status(ActivityStatusKind::InProgress) - .description(new_description) + .description(new_description.clone()) .tags(tags.clone()) .build(); @@ -993,7 +994,7 @@ mod tests { assert_eq!( new_stored_activity.activity().description(), - new_description, + &new_description, "Description was not updated." ); @@ -1030,7 +1031,7 @@ mod tests { // Create activity let begin = Local::now().fixed_offset(); let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -1075,7 +1076,7 @@ mod tests { ); // Update activity - let new_description = "Updated description"; + let new_description = PaceDescription::new("Updated description"); let tags = vec!["bla".to_string(), "test".to_string()] .into_iter() @@ -1089,7 +1090,7 @@ mod tests { .begin(new_begin) .kind(ActivityKind::PomodoroWork) .status(ActivityStatusKind::Created) - .description(new_description) + .description(new_description.clone()) .tags(tags.clone()) .build(); @@ -1103,7 +1104,7 @@ mod tests { assert_eq!( new_stored_activity.activity().description(), - new_description, + &new_description, "Description was not updated." ); @@ -1164,7 +1165,7 @@ mod tests { let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let end_time = now + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -1226,7 +1227,7 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -1285,7 +1286,7 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -1302,7 +1303,7 @@ mod tests { let begin_time = now - chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?; let kind = ActivityKind::Activity; - let description = "Test activity 2"; + let description = PaceDescription::new("Test activity 2"); let activity2 = Activity::builder() .begin(begin_time) @@ -1353,7 +1354,7 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -1427,7 +1428,7 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() .collect::>(); @@ -1507,7 +1508,7 @@ mod tests { let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; let end_time = now + chrono::TimeDelta::try_seconds(60).ok_or("Invalid time delta.")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let activity = Activity::builder() .begin(begin_time) @@ -1568,7 +1569,7 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let activity = Activity::builder() .begin(begin_time) @@ -1616,12 +1617,12 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let activity = Activity::builder() .begin(begin_time) .kind(kind) - .description(description) + .description(description.clone()) .build(); let activity_item = storage.begin_activity(activity)?; @@ -1657,8 +1658,8 @@ mod tests { ); assert_eq!( - *grouped_activity.activity().description(), - description, + grouped_activity.activity().description(), + &description, "Grouped activity description is not the same as the original activity description." ); @@ -1671,12 +1672,12 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let activity = Activity::builder() .begin(begin_time) .kind(kind) - .description(description) + .description(description.clone()) .build(); let activity_item = storage.begin_activity(activity)?; @@ -1718,8 +1719,8 @@ mod tests { ); assert_eq!( - *grouped_activity.activity().description(), - description, + grouped_activity.activity().description(), + &description, "Grouped activity description is not the same as the original activity description." ); @@ -1732,12 +1733,12 @@ mod tests { let now = Local::now().fixed_offset(); let begin_time = now - chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta.")?; let kind = ActivityKind::Activity; - let description = "Test activity"; + let description = PaceDescription::new("Test activity"); let activity = Activity::builder() .begin(begin_time) .kind(kind) - .description(description) + .description(description.clone()) .build(); let activity_item = storage.begin_activity(activity)?; @@ -1779,8 +1780,8 @@ mod tests { ); assert_eq!( - *grouped_activity.activity().description(), - description, + grouped_activity.activity().description(), + &description, "Grouped activity description is not the same as the original activity description." ); diff --git a/tests/integration/activity_store.rs b/tests/integration/activity_store.rs index b9c921b1..f9351b7d 100644 --- a/tests/integration/activity_store.rs +++ b/tests/integration/activity_store.rs @@ -5,7 +5,7 @@ use std::{collections::HashSet, sync::Arc}; use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStore, ActivityWriteOps, DeleteOptions, EndOptions, HoldOptions, - PaceCategory, ResumeOptions, UpdateOptions, + PaceCategory, PaceDescription, ResumeOptions, UpdateOptions, }; use pace_error::TestResult; use pace_storage::storage::in_memory::InMemoryActivityStorage; @@ -27,7 +27,7 @@ fn test_activity_store_create_activity_passes( } = activity_store_empty?; let activity = Activity::builder() - .description("Test Description".to_string()) + .description(PaceDescription::new("Test Description")) .category(PaceCategory::new("Test::Category")) .build(); @@ -255,11 +255,11 @@ fn test_activity_store_update_activity_passes( let og_activity = activities[0].clone(); let og_activity_id = *og_activity.guid(); - let updated_test_desc = "Updated Test Description".to_string(); + let updated_test_desc = PaceDescription::new("Updated Test Description"); let updated_test_cat = PaceCategory::new("Test::UpdatedCategory"); let new_activity = Activity::builder() - .description(updated_test_desc.to_string()) + .description(updated_test_desc.clone()) .category(updated_test_cat.clone()) .tags(tags.clone()) .build(); @@ -355,7 +355,7 @@ fn test_activity_store_update_activity_fails( } = activity_store?; let new_activity = Activity::builder() - .description("test".to_string()) + .description(PaceDescription::new("test")) .category(PaceCategory::new("test")) .build(); @@ -424,7 +424,7 @@ fn test_activity_store_begin_intermission_passes( assert_eq!( intermission.activity().description(), - "Activity with Intermission" + &PaceDescription::new("Activity with Intermission") ); assert_eq!( @@ -491,7 +491,7 @@ fn test_activity_store_begin_intermission_with_existing_does_nothing_passes( assert_eq!( intermission.activity().description(), - "Activity with Intermission" + &PaceDescription::new("Activity with Intermission") ); assert_eq!( @@ -635,7 +635,7 @@ fn test_begin_activity_with_held_activity() -> TestResult<()> { // Begin activity let activity = Activity::builder() - .description("Test Description".to_string()) + .description(PaceDescription::new("Test Description")) .build(); let activity = store.begin_activity(activity)?; @@ -659,7 +659,7 @@ fn test_begin_activity_with_held_activity() -> TestResult<()> { // Begin another activity although there is a held activity let new_activity = Activity::builder() - .description("New Description".to_string()) + .description(PaceDescription::new("New Description")) .build(); let new_activity = store.begin_activity(new_activity)?; diff --git a/tests/integration/util.rs b/tests/integration/util.rs index 08968a1b..759dfb37 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -54,7 +54,7 @@ pub fn activity_store_no_intermissions() -> TestResult { // We need to use `#[cfg(not(tarpaulin_include))]` to exclude this from coverage reports #[cfg(not(tarpaulin_include))] pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult { - use pace_core::prelude::PaceCategory; + use pace_core::prelude::{PaceCategory, PaceDescription}; use pace_storage::storage::in_memory::InMemoryActivityStorage; use pace_time::date_time::PaceDateTime; @@ -65,7 +65,7 @@ pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult>(); let mut completed = Activity::builder() - .description("Activity with end".to_string()) + .description(PaceDescription::new("Activity with end")) .begin(begin_time) .status(ActivityStatusKind::Completed) .tags(tags.clone()) @@ -75,7 +75,7 @@ pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult TestResult TestResult TestResult<()> { let storage = InMemoryActivityStorage::new(); - let first_og_activity = Activity::builder().description("Test activity").build(); + let first_og_activity = Activity::builder() + .description(PaceDescription::new("Test activity")) + .build(); let first_begin_activity = storage.begin_activity(first_og_activity.clone())?; @@ -52,7 +54,9 @@ fn test_hold_resume_journey_for_activities_passes() -> TestResult<()> { // Now we create another activity, which should end the first one automatically - let second_og_activity = Activity::builder().description("Our new activity").build(); + let second_og_activity = Activity::builder() + .description(PaceDescription::new("Our new activity")) + .build(); let second_begin_activity = storage.begin_activity(second_og_activity.clone())?; diff --git a/tests/journey/start_finish_different_time_zone.rs b/tests/journey/start_finish_different_time_zone.rs index 76ea0aa5..4a2da653 100644 --- a/tests/journey/start_finish_different_time_zone.rs +++ b/tests/journey/start_finish_different_time_zone.rs @@ -1,6 +1,8 @@ use chrono::FixedOffset; use eyre::OptionExt; -use pace_core::prelude::{Activity, ActivityReadOps, ActivityStateManagement, EndOptions}; +use pace_core::prelude::{ + Activity, ActivityReadOps, ActivityStateManagement, EndOptions, PaceDescription, +}; use pace_error::TestResult; use pace_storage::storage::in_memory::InMemoryActivityStorage; use pace_time::{date_time::PaceDateTime, duration::PaceDuration}; @@ -14,7 +16,7 @@ fn test_begin_and_end_activity_in_different_time_zones_passes() -> TestResult<() let now = PaceDateTime::now(); let first_og_activity = Activity::builder() - .description("Our time zone") + .description(PaceDescription::new("Our time zone")) .begin(now) .build(); From e3ed98ad707527c4df330d8b5bb8454cff2aae15 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:06:13 +0100 Subject: [PATCH 31/59] more preparations for database storage III Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/commands/adjust.rs | 5 +- crates/core/src/commands/begin.rs | 5 +- crates/core/src/domain/activity.rs | 15 ++--- crates/core/src/domain/category.rs | 4 +- crates/core/src/domain/description.rs | 4 +- crates/core/src/domain/tag.rs | 83 ++++++++++++++++++++++++- crates/core/src/lib.rs | 1 + crates/core/src/storage/rusqlite.rs | 53 +++++++++++++++- crates/storage/src/storage/in_memory.rs | 25 ++++---- tests/integration/activity_store.rs | 6 +- tests/integration/util.rs | 16 ++--- 11 files changed, 173 insertions(+), 44 deletions(-) diff --git a/crates/core/src/commands/adjust.rs b/crates/core/src/commands/adjust.rs index 9b374015..37e9caaf 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/core/src/commands/adjust.rs @@ -1,4 +1,4 @@ -use std::{collections::HashSet, sync::Arc}; +use std::sync::Arc; use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; @@ -15,6 +15,7 @@ use crate::{ commands::UpdateOptions, config::PaceConfig, domain::{category::PaceCategory, description::PaceDescription}, + prelude::PaceTagCollection, service::activity_store::ActivityStore, storage::{ActivityQuerying, ActivityStorage, ActivityWriteOps, SyncStorage}, }; @@ -196,7 +197,7 @@ impl AdjustCommandOptions { } if let Some(tags) = tags { - let tags = tags.iter().cloned().collect::>(); + let tags = tags.iter().cloned().collect::(); if *override_tags { debug!("Overriding tags with: {:?}", tags); diff --git a/crates/core/src/commands/begin.rs b/crates/core/src/commands/begin.rs index 8fe09d0d..1733ee54 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/core/src/commands/begin.rs @@ -1,4 +1,4 @@ -use std::{collections::HashSet, sync::Arc}; +use std::sync::Arc; use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; @@ -15,6 +15,7 @@ use crate::{ category::PaceCategory, description::PaceDescription, }, + prelude::PaceTagCollection, service::activity_store::ActivityStore, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; @@ -134,7 +135,7 @@ impl BeginCommandOptions { // parse tags from string or get an empty set let tags = tags .as_ref() - .map(|tags| tags.iter().cloned().collect::>()); + .map(|tags| tags.iter().cloned().collect::()); debug!("Parsed tags: {tags:?}"); diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index 451cc023..10b547fb 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -11,13 +11,14 @@ use pace_time::{ use strum::EnumIter; use serde_derive::{Deserialize, Serialize}; -use std::{collections::HashSet, fmt::Display}; +use std::fmt::Display; use strum_macros::EnumString; use tracing::debug; use typed_builder::TypedBuilder; use crate::domain::{ category::PaceCategory, description::PaceDescription, id::Guid, status::ActivityStatusKind, + tag::PaceTagCollection, }; use pace_error::{ActivityLogErrorKind, PaceResult}; @@ -239,7 +240,12 @@ pub struct Activity { /// Tags for the activity #[builder(default, setter(into))] #[merge(strategy = crate::util::overwrite_left_with_right)] - tags: Option>, + tags: Option, + + #[serde(default)] + #[builder(default)] + #[merge(strategy = crate::util::overwrite_left_with_right)] + status: ActivityStatusKind, // Pomodoro-specific attributes /// The pomodoro cycle of the activity @@ -247,11 +253,6 @@ pub struct Activity { #[serde(skip_serializing_if = "Option::is_none")] #[merge(strategy = crate::util::overwrite_left_with_right)] pomodoro_cycle_options: Option, - - #[serde(default)] - #[builder(default)] - #[merge(strategy = crate::util::overwrite_left_with_right)] - status: ActivityStatusKind, } #[derive( diff --git a/crates/core/src/domain/category.rs b/crates/core/src/domain/category.rs index a6899529..84417ee6 100644 --- a/crates/core/src/domain/category.rs +++ b/crates/core/src/domain/category.rs @@ -1,6 +1,6 @@ //! Category entity and business logic -use std::str::FromStr; +use std::{convert::Infallible, str::FromStr}; use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; @@ -26,7 +26,7 @@ impl<'a, T: AsRef<&'a str>> From for PaceCategory { } impl FromStr for PaceCategory { - type Err = String; + type Err = Infallible; fn from_str(s: &str) -> Result { Ok(Self::new(s)) diff --git a/crates/core/src/domain/description.rs b/crates/core/src/domain/description.rs index 42b66554..ed35c445 100644 --- a/crates/core/src/domain/description.rs +++ b/crates/core/src/domain/description.rs @@ -1,4 +1,4 @@ -use std::str::FromStr; +use std::{convert::Infallible, str::FromStr}; use serde_derive::{Deserialize, Serialize}; @@ -18,7 +18,7 @@ impl<'a, T: AsRef<&'a str>> From for PaceDescription { } impl FromStr for PaceDescription { - type Err = String; + type Err = Infallible; fn from_str(s: &str) -> Result { Ok(Self::new(s)) diff --git a/crates/core/src/domain/tag.rs b/crates/core/src/domain/tag.rs index ff06ab91..22d85314 100644 --- a/crates/core/src/domain/tag.rs +++ b/crates/core/src/domain/tag.rs @@ -1,8 +1,87 @@ -use serde_derive::{Deserialize, Serialize}; - use typed_builder::TypedBuilder; use ulid::Ulid; +use std::{collections::HashSet, convert::Infallible, str::FromStr}; + +use serde_derive::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Default)] +pub struct PaceTagCollection(HashSet); + +impl FromIterator for PaceTagCollection { + fn from_iter>(iter: T) -> Self { + Self(iter.into_iter().collect()) + } +} + +impl FromIterator for PaceTagCollection { + fn from_iter>(iter: T) -> Self { + Self( + iter.into_iter() + .map(|tag_string| PaceTag::new(&tag_string)) + .collect(), + ) + } +} + +impl std::ops::DerefMut for PaceTagCollection { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl std::ops::Deref for PaceTagCollection { + type Target = HashSet; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl PaceTagCollection { + #[must_use] + pub const fn new(tags: HashSet) -> Self { + Self(tags) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone, Eq, Hash, PartialEq, Default, PartialOrd, Ord)] +pub struct PaceTag(String); + +impl PaceTag { + #[must_use] + pub fn new(tag: &str) -> Self { + Self(tag.to_owned()) + } +} +impl<'a, T: AsRef<&'a str>> From for PaceTag { + fn from(tag: T) -> Self { + Self::new(tag.as_ref()) + } +} + +impl FromStr for PaceTag { + type Err = Infallible; + + fn from_str(s: &str) -> Result { + Ok(Self::new(s)) + } +} + +impl std::fmt::Display for PaceTag { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl std::ops::Deref for PaceTag { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone)] pub struct TagGuid(Ulid); diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 4d7b9841..0e190c64 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -60,6 +60,7 @@ pub mod prelude { SummaryCategories, SummaryGroupByCategory, }, status::ActivityStatusKind, + tag::{PaceTag, PaceTagCollection}, }, service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, storage::{ diff --git a/crates/core/src/storage/rusqlite.rs b/crates/core/src/storage/rusqlite.rs index 49a93946..6fca53a8 100644 --- a/crates/core/src/storage/rusqlite.rs +++ b/crates/core/src/storage/rusqlite.rs @@ -2,9 +2,15 @@ use std::str::FromStr; use rusqlite::{types::FromSql, ToSql}; +// TODO: handle ActivityEndOptions +// TODO: handle ActivityKindOptions +// TODO: handle PaceTagCollection + use crate::{ domain::id::Guid, - prelude::{ActivityGuid, ActivityKind, ActivityStatusKind}, + prelude::{ + ActivityGuid, ActivityKind, ActivityStatusKind, PaceCategory, PaceDescription, PaceTag, + }, }; impl ToSql for ActivityGuid { @@ -65,3 +71,48 @@ impl FromSql for Guid { .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) } } + +impl ToSql for PaceCategory { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for PaceCategory { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Self::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} + +impl ToSql for PaceDescription { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for PaceDescription { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Self::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} + +impl ToSql for PaceTag { + fn to_sql(&self) -> rusqlite::Result> { + Ok(rusqlite::types::ToSqlOutput::Owned( + rusqlite::types::Value::Text(self.to_string()), + )) + } +} + +impl FromSql for PaceTag { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Self::from_str(value.as_str()?) + .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) + } +} diff --git a/crates/storage/src/storage/in_memory.rs b/crates/storage/src/storage/in_memory.rs index aaf0782d..779507a3 100644 --- a/crates/storage/src/storage/in_memory.rs +++ b/crates/storage/src/storage/in_memory.rs @@ -819,10 +819,9 @@ mod tests { use super::*; use chrono::Local; - use pace_core::prelude::PaceDescription; + use pace_core::prelude::{PaceDescription, PaceTagCollection}; use pace_error::TestResult; use pace_time::date_time::PaceDateTime; - use std::collections::HashSet; #[test] fn test_in_memory_activity_storage_passes() { @@ -856,7 +855,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin) @@ -893,7 +892,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin) @@ -935,7 +934,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let og_activity = Activity::builder() .begin(begin) @@ -958,7 +957,7 @@ mod tests { let tags = vec!["bla".to_string(), "test".to_string()] .into_iter() - .collect::>(); + .collect::(); let new_begin = PaceDateTime::from( begin + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?, @@ -1034,7 +1033,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let mut activity = Activity::builder() .begin(begin) @@ -1080,7 +1079,7 @@ mod tests { let tags = vec!["bla".to_string(), "test".to_string()] .into_iter() - .collect::>(); + .collect::(); let new_begin = PaceDateTime::from( begin + chrono::TimeDelta::try_seconds(30).ok_or("Invalid time delta")?, @@ -1168,7 +1167,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin_time) @@ -1230,7 +1229,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin_time) @@ -1289,7 +1288,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin_time) @@ -1357,7 +1356,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin_time) @@ -1431,7 +1430,7 @@ mod tests { let description = PaceDescription::new("Test activity"); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let activity = Activity::builder() .begin(begin_time) diff --git a/tests/integration/activity_store.rs b/tests/integration/activity_store.rs index f9351b7d..457d8bec 100644 --- a/tests/integration/activity_store.rs +++ b/tests/integration/activity_store.rs @@ -1,11 +1,11 @@ //! Test the `ActivityStore` implementation with a `InMemoryStorage` backend. -use std::{collections::HashSet, sync::Arc}; +use std::sync::Arc; use pace_core::prelude::{ Activity, ActivityFilterKind, ActivityGuid, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStore, ActivityWriteOps, DeleteOptions, EndOptions, HoldOptions, - PaceCategory, PaceDescription, ResumeOptions, UpdateOptions, + PaceCategory, PaceDescription, PaceTagCollection, ResumeOptions, UpdateOptions, }; use pace_error::TestResult; use pace_storage::storage::in_memory::InMemoryActivityStorage; @@ -250,7 +250,7 @@ fn test_activity_store_update_activity_passes( let tags = vec!["bla".to_string(), "cookie".to_string()] .into_iter() - .collect::>(); + .collect::(); let og_activity = activities[0].clone(); let og_activity_id = *og_activity.guid(); diff --git a/tests/integration/util.rs b/tests/integration/util.rs index 759dfb37..d17daff4 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -1,15 +1,15 @@ -use std::{collections::HashSet, path::Path, sync::Arc}; +use std::{path::Path, sync::Arc}; use chrono::Local; +use rstest::fixture; use pace_core::prelude::{ Activity, ActivityGuid, ActivityItem, ActivityKind, ActivityKindOptions, ActivityLog, - ActivityStatusKind, ActivityStore, + ActivityStatusKind, ActivityStore, PaceCategory, PaceDescription, PaceTagCollection, }; use pace_error::TestResult; - -use pace_storage::storage::file::TomlActivityStorage; -use rstest::fixture; +use pace_storage::storage::{file::TomlActivityStorage, in_memory::InMemoryActivityStorage}; +use pace_time::date_time::PaceDateTime; pub struct TestData { pub activities: Vec, @@ -54,15 +54,11 @@ pub fn activity_store_no_intermissions() -> TestResult { // We need to use `#[cfg(not(tarpaulin_include))]` to exclude this from coverage reports #[cfg(not(tarpaulin_include))] pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult { - use pace_core::prelude::{PaceCategory, PaceDescription}; - use pace_storage::storage::in_memory::InMemoryActivityStorage; - use pace_time::date_time::PaceDateTime; - let begin_time = PaceDateTime::default(); let tags = vec!["test".to_string(), "activity".to_string()] .into_iter() - .collect::>(); + .collect::(); let mut completed = Activity::builder() .description(PaceDescription::new("Activity with end")) From 8b0fab43780a76c09f93ff71bf82e12710d8186e Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:24:45 +0100 Subject: [PATCH 32/59] implementation of migrations and more error handling regarding that Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/config.rs | 4 +- crates/error/src/lib.rs | 77 ++++++++++++--- crates/storage/src/migration.rs | 94 +++++++++++++++---- .../create_activities_20240325143710.rs | 24 ++--- ...te_activities_categories_20240326130013.rs | 10 ++ crates/time/src/date_time.rs | 18 ++-- crates/time/src/time_frame.rs | 20 ++-- crates/time/src/time_range.rs | 6 +- 8 files changed, 185 insertions(+), 68 deletions(-) diff --git a/crates/core/src/config.rs b/crates/core/src/config.rs index a81059fe..dde1ed9d 100644 --- a/crates/core/src/config.rs +++ b/crates/core/src/config.rs @@ -12,7 +12,7 @@ use strum_macros::EnumString; use crate::domain::{priority::ItemPriorityKind, reflection::ReflectionsFormatKind}; -use pace_error::{PaceErrorKind, PaceResult}; +use pace_error::{ConfigErrorKind, PaceResult}; /// The pace configuration file /// @@ -335,7 +335,7 @@ pub fn find_root_config_file_path( file_name: &str, ) -> PaceResult { find_root_project_file(¤t_dir, file_name).ok_or_else(|| { - PaceErrorKind::ConfigFileNotFound { + ConfigErrorKind::ConfigFileNotFound { current_dir: current_dir.as_ref().to_string_lossy().to_string(), file_name: file_name.to_string(), } diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index 63691cc9..9839237b 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -15,8 +15,11 @@ macro_rules! impl_pace_error_marker { /// Result type that is being returned from test functions and methods that can fail and thus have errors. pub type TestResult = Result>; +/// We use a boxed error type for flexibility and size. +pub type BoxedPaceError = Box; + /// Result type that is being returned from methods that can fail and thus have [`PaceError`]s. -pub type PaceResult = Result; +pub type PaceResult = Result; /// Result type that is being returned from methods that have optional return values and can fail thus having [`PaceError`]s. pub type PaceOptResult = PaceResult>; @@ -72,6 +75,12 @@ impl std::fmt::Display for PaceError { // Accessors for anything we do want to expose publicly. impl PaceError { + /// Create a new [`PaceError`]. + #[must_use] + pub const fn new(kind: PaceErrorKind) -> Self { + Self(kind) + } + /// Expose the inner error kind. /// /// This is useful for matching on the error kind. @@ -130,6 +139,10 @@ pub enum PaceErrorKind { #[error(transparent)] Time(#[from] TimeErrorKind), + /// Config related error: {0} + #[error(transparent)] + Config(#[from] ConfigErrorKind), + /// JSON error: {0} #[error(transparent)] Json(#[from] serde_json::Error), @@ -142,18 +155,6 @@ pub enum PaceErrorKind { #[error(transparent)] ChronoDurationIsNegative(#[from] chrono::OutOfRangeError), - /// Config file {file_name} not found in directory hierarchy starting from {current_dir} - ConfigFileNotFound { - /// The current directory - current_dir: String, - - /// The file name - file_name: String, - }, - - /// Configuration file not found, please run `pace setup config` to initialize `pace` - ParentDirNotFound(PathBuf), - /// There is no path available to store the activity log NoPathAvailable, @@ -177,6 +178,23 @@ pub enum PaceErrorKind { }, } +/// [`ConfigErrorKind`] describes the errors that can happen while dealing with our configuration. +#[non_exhaustive] +#[derive(Error, Debug, Display)] +pub enum ConfigErrorKind { + /// Config file {file_name} not found in directory hierarchy starting from {current_dir} + ConfigFileNotFound { + /// The current directory + current_dir: String, + + /// The file name + file_name: String, + }, + + /// Configuration file not found, please run `pace setup config` to initialize `pace` + ParentDirNotFound(PathBuf), +} + /// [`DatabaseErrorKind`] describes the errors that can happen while dealing with the `SQLite` database. #[non_exhaustive] #[derive(Error, Debug, Display)] @@ -230,6 +248,28 @@ pub enum DatabaseStorageErrorKind { /// Migration affected multiple rows MigrationAffectedMultipleRows, + + /// Checking if migration exists failed. Version: {version}, Table: {table}, Query: {query}, Source: {source} + CheckingMigrationExistsFailed { + version: String, + table: String, + query: String, + source: rusqlite::Error, + }, + + /// Selection query failed for migration version: {version}, table: {table}, query: {query}, source: {source} + SelectionQueryFailed { + version: String, + table: String, + query: String, + source: rusqlite::Error, + }, + + /// Row does not contain migration version: {version}, source: {source} + RowDoesNotContainMigrationVersion { + version: String, + source: rusqlite::Error, + }, } /// [`TomlFileStorageErrorKind`] describes the errors that can happen while dealing with the Toml file storage. @@ -460,6 +500,7 @@ impl_pace_error_marker!(TimeErrorKind); impl_pace_error_marker!(TemplatingErrorKind); impl_pace_error_marker!(DatabaseStorageErrorKind); impl_pace_error_marker!(TomlFileStorageErrorKind); +impl_pace_error_marker!(ConfigErrorKind); impl From for PaceError where @@ -470,3 +511,13 @@ where Self(PaceErrorKind::from(value)) } } + +impl From for Box +where + E: PaceErrorMarker, + PaceErrorKind: From, +{ + fn from(value: E) -> Self { + Self::new(PaceError::new(PaceErrorKind::from(value))) + } +} diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 5ca862c5..46995fc8 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -11,7 +11,8 @@ mod create_tags_20240326125555; use rusqlite::Connection; use sea_query::{Cond, Expr, Iden, Query, SqliteQueryBuilder}; -use std::collections::VecDeque; +use std::{collections::VecDeque, f32::consts::E}; +use tracing::debug; use ulid::Ulid; use pace_error::{DatabaseStorageErrorKind, PaceResult}; @@ -24,6 +25,7 @@ pub trait SQLiteMigration { fn down(&self) -> String; } +// TODO: Select migration_version from database and skip the migration if already a value exists pub struct SQLiteMigrator<'conn> { iterator: Box>>, applied: VecDeque>, @@ -65,16 +67,21 @@ impl<'conn> SQLiteMigrator<'conn> { })?; let query = migration.up(); - if self.connection.execute(&query, []).map_err(|source| { - DatabaseStorageErrorKind::MigrationFailed { - version: migration.version(), - query: query.to_string(), - source, + _ = match self.connection.execute(&query, []) { + Ok(val) => val, + Err(rusqlite::Error::SqlInputError { msg, .. }) if msg.contains("already exists") => { + debug!("Table already exists"); + 0 } - })? > 1 - { - return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); - } + Err(err) => { + return Err(DatabaseStorageErrorKind::MigrationFailed { + version: migration.version(), + query: query.to_string(), + source: err, + } + .into()); + } + }; self.applied.push_back(migration); @@ -190,16 +197,29 @@ impl<'conn> SQLiteMigrator<'conn> { while let Some(migration) = self.iterator.next() { let query = migration.up(); - if self.connection.execute(&query, []).map_err(|source| { - DatabaseStorageErrorKind::MigrationFailed { - version: migration.version(), - query: query.to_string(), - source, + // check if migration already exists in schema_migrations table + if self.check_migration_exists(&migration.version())? { + debug!("Migration already exists"); + continue; + }; + + _ = match self.connection.execute(&query, []) { + Ok(val) => val, + Err(rusqlite::Error::SqlInputError { msg, .. }) + if msg.contains("already exists") => + { + debug!("Table already exists"); + 0 } - })? > 1 - { - return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); - } + Err(err) => { + return Err(DatabaseStorageErrorKind::MigrationFailed { + version: migration.version(), + query: query.to_string(), + source: err, + } + .into()); + } + }; self.push_migration_version(migration.version())?; @@ -209,6 +229,42 @@ impl<'conn> SQLiteMigrator<'conn> { Ok(()) } + fn check_migration_exists(&self, version: &str) -> PaceResult { + let query = Query::select() + .from(SchemaMigrationsIden::Table) + .columns([SchemaMigrationsIden::Version]) + .cond_where(Expr::col(SchemaMigrationsIden::Version).eq(version)) + .to_string(SqliteQueryBuilder); + + let mut stmt = self.connection.prepare(&query).map_err(|source| { + DatabaseStorageErrorKind::CheckingMigrationExistsFailed { + version: version.to_string(), + table: SchemaMigrationsIden::Table.to_string(), + query: query.to_string(), + source, + } + })?; + + let mut rows = + stmt.query([]) + .map_err(|source| DatabaseStorageErrorKind::SelectionQueryFailed { + version: version.to_string(), + table: SchemaMigrationsIden::Table.to_string(), + query: query.to_string(), + source, + })?; + + Ok(rows + .next() + .map_err( + |source| DatabaseStorageErrorKind::RowDoesNotContainMigrationVersion { + version: version.to_string(), + source, + }, + )? + .is_some()) + } + /// Rollback the most recent migration /// /// # Errors diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs index 950b42fa..30b849fd 100644 --- a/crates/storage/src/migration/create_activities_20240325143710.rs +++ b/crates/storage/src/migration/create_activities_20240325143710.rs @@ -43,18 +43,18 @@ impl SQLiteMigration for Migration { .from_col(ActivitiesIden::ParentGuid) .to_col(ActivitiesIden::Guid), ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_kind") - .from(ActivitiesIden::Table, ActivitiesIden::Kind) - .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_status") - .from(ActivitiesIden::Table, ActivitiesIden::Status) - .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), - ) + // .foreign_key( + // ForeignKey::create() + // .name("fk_activities_kind") + // .from(ActivitiesIden::Table, ActivitiesIden::Kind) + // .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), + // ) + // .foreign_key( + // ForeignKey::create() + // .name("fk_activities_status") + // .from(ActivitiesIden::Table, ActivitiesIden::Status) + // .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), + // ) .build(SqliteQueryBuilder) } diff --git a/crates/storage/src/migration/create_activities_categories_20240326130013.rs b/crates/storage/src/migration/create_activities_categories_20240326130013.rs index 3ee374e7..ca748b8e 100644 --- a/crates/storage/src/migration/create_activities_categories_20240326130013.rs +++ b/crates/storage/src/migration/create_activities_categories_20240326130013.rs @@ -25,6 +25,16 @@ impl SQLiteMigration for Migration { .not_null() .primary_key(), ) + .col( + ColumnDef::new(ActivitiesCategoriesIden::ActivityGuid) + .text() + .not_null(), + ) + .col( + ColumnDef::new(ActivitiesCategoriesIden::CategoryGuid) + .text() + .not_null(), + ) .foreign_key( ForeignKey::create() .name("fk_activities_categories_category_guid") diff --git a/crates/time/src/date_time.rs b/crates/time/src/date_time.rs index e074750b..18a7e4cb 100644 --- a/crates/time/src/date_time.rs +++ b/crates/time/src/date_time.rs @@ -15,7 +15,7 @@ use crate::{ date::PaceDate, duration::PaceDuration, time::PaceTime, time_zone::PaceTimeZoneKind, Validate, }; -use pace_error::{PaceError, PaceResult, TimeErrorKind}; +use pace_error::{BoxedPaceError, PaceResult, TimeErrorKind}; impl TryFrom for PaceDateTime { type Error = TimeErrorKind; @@ -57,7 +57,7 @@ impl FromStr for PaceDateTime { } impl TryFrom<(Option<&NaiveTime>, PaceTimeZoneKind, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; /// Try to convert from a tuple of optional naive time, time zone and time zone offset /// @@ -278,7 +278,7 @@ impl PaceDateTime { impl Validate for PaceDateTime { type Output = Self; - type Error = PaceError; + type Error = BoxedPaceError; /// Check if time is in the future /// @@ -324,7 +324,7 @@ impl From>> for PaceDateTime { } impl TryFrom for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from(time: NaiveDateTime) -> PaceResult { // get local time zone @@ -422,7 +422,7 @@ pub fn pace_date_time_from_date_and_time_and_tz( } impl TryFrom<(NaiveDate, NaiveTime, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from( (date, time, tz): (NaiveDate, NaiveTime, PaceTimeZoneKind), @@ -432,7 +432,7 @@ impl TryFrom<(NaiveDate, NaiveTime, PaceTimeZoneKind)> for PaceDateTime { } impl TryFrom<(NaiveDate, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from((date, tz): (NaiveDate, PaceTimeZoneKind)) -> Result { pace_date_time_from_date_and_time_and_tz(date, Local::now().time(), tz)?.validate() @@ -440,7 +440,7 @@ impl TryFrom<(NaiveDate, PaceTimeZoneKind)> for PaceDateTime { } impl TryFrom<(NaiveTime, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from((time, tz): (NaiveTime, PaceTimeZoneKind)) -> Result { pace_date_time_from_date_and_time_and_tz(Local::now().date_naive(), time, tz)?.validate() @@ -448,7 +448,7 @@ impl TryFrom<(NaiveTime, PaceTimeZoneKind)> for PaceDateTime { } impl TryFrom<(NaiveDate, NaiveTime)> for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from((date, time): (NaiveDate, NaiveTime)) -> Result { pace_date_time_from_date_and_time_and_tz( @@ -461,7 +461,7 @@ impl TryFrom<(NaiveDate, NaiveTime)> for PaceDateTime { } impl TryFrom<(NaiveDateTime, PaceTimeZoneKind)> for PaceDateTime { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from((date_time, tz): (NaiveDateTime, PaceTimeZoneKind)) -> Result { pace_date_time_from_date_and_time_and_tz(date_time.date(), date_time.time(), tz)?.validate() diff --git a/crates/time/src/time_frame.rs b/crates/time/src/time_frame.rs index 5edc059a..fafa7868 100644 --- a/crates/time/src/time_frame.rs +++ b/crates/time/src/time_frame.rs @@ -10,7 +10,7 @@ use crate::{ time_zone::PaceTimeZoneKind, }; -use pace_error::{PaceError, PaceResult}; +use pace_error::{BoxedPaceError, PaceResult}; #[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize, Display)] pub enum PaceTimeFrame { @@ -54,7 +54,7 @@ impl PaceTimeZoneKind, )> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from( (time_flags, date_flags, tz, tz_config): ( @@ -71,7 +71,7 @@ impl } impl TryFrom<(Option<&TimeFlags>, Option<&DateFlags>, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from( (time_flags, date_flags, tz): (Option<&TimeFlags>, Option<&DateFlags>, PaceTimeZoneKind), @@ -86,7 +86,7 @@ impl TryFrom<(Option<&TimeFlags>, Option<&DateFlags>, PaceTimeZoneKind)> for Pac } impl TryFrom<(&DateFlags, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from((date_flags, tz): (&DateFlags, PaceTimeZoneKind)) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -99,7 +99,7 @@ impl TryFrom<(&DateFlags, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<&DateFlags> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from(date_flags: &DateFlags) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -112,7 +112,7 @@ impl TryFrom<&DateFlags> for PaceTimeFrame { } impl TryFrom<(Option<&DateFlags>, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from( (date_flags, tz): (Option<&DateFlags>, PaceTimeZoneKind), @@ -127,7 +127,7 @@ impl TryFrom<(Option<&DateFlags>, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<(Option<&TimeFlags>, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from( (time_flags, tz): (Option<&TimeFlags>, PaceTimeZoneKind), @@ -142,7 +142,7 @@ impl TryFrom<(Option<&TimeFlags>, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<(&TimeFlags, PaceTimeZoneKind)> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from((time_flags, tz): (&TimeFlags, PaceTimeZoneKind)) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -155,7 +155,7 @@ impl TryFrom<(&TimeFlags, PaceTimeZoneKind)> for PaceTimeFrame { } impl TryFrom<&TimeFlags> for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from(time_flags: &TimeFlags) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( @@ -168,7 +168,7 @@ impl TryFrom<&TimeFlags> for PaceTimeFrame { } impl TryFrom for PaceTimeFrame { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from(tz: PaceTimeZoneKind) -> Result { time_frame_from_date_and_time_flags_with_time_zone_kind( diff --git a/crates/time/src/time_range.rs b/crates/time/src/time_range.rs index 6a91610e..b5f12b59 100644 --- a/crates/time/src/time_range.rs +++ b/crates/time/src/time_range.rs @@ -7,7 +7,7 @@ use serde_derive::{Deserialize, Serialize}; use tracing::debug; use typed_builder::TypedBuilder; -use pace_error::{PaceError, PaceResult, TimeErrorKind}; +use pace_error::{BoxedPaceError, PaceResult, TimeErrorKind}; use crate::{date::PaceDate, date_time::PaceDateTime, time_frame::PaceTimeFrame, Validate}; @@ -30,7 +30,7 @@ impl Display for TimeRangeOptions { } impl TryFrom for TimeRangeOptions { - type Error = PaceError; + type Error = BoxedPaceError; fn try_from(time_frame: PaceTimeFrame) -> Result { match time_frame { @@ -50,7 +50,7 @@ impl TryFrom for TimeRangeOptions { impl Validate for TimeRangeOptions { type Output = Self; - type Error = PaceError; + type Error = BoxedPaceError; /// Validate the time range /// From fe726e755659358542a9ad8f9e422c93f2af748f Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 21:50:34 +0100 Subject: [PATCH 33/59] fix migration for activities table Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .../create_activities_20240325143710.rs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs index 30b849fd..7feccd85 100644 --- a/crates/storage/src/migration/create_activities_20240325143710.rs +++ b/crates/storage/src/migration/create_activities_20240325143710.rs @@ -40,21 +40,21 @@ impl SQLiteMigration for Migration { .foreign_key( ForeignKey::create() .name("fk_activities_parent_guid") - .from_col(ActivitiesIden::ParentGuid) - .to_col(ActivitiesIden::Guid), + .from(ActivitiesIden::Table, ActivitiesIden::ParentGuid) + .to(ActivitiesIden::Table, ActivitiesIden::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_kind") + .from(ActivitiesIden::Table, ActivitiesIden::Kind) + .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_status") + .from(ActivitiesIden::Table, ActivitiesIden::Status) + .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), ) - // .foreign_key( - // ForeignKey::create() - // .name("fk_activities_kind") - // .from(ActivitiesIden::Table, ActivitiesIden::Kind) - // .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), - // ) - // .foreign_key( - // ForeignKey::create() - // .name("fk_activities_status") - // .from(ActivitiesIden::Table, ActivitiesIden::Status) - // .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), - // ) .build(SqliteQueryBuilder) } From 75594e2b061015c6717aef7b441b21a2c5027134 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 22:23:03 +0100 Subject: [PATCH 34/59] update trait Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/error/src/lib.rs | 6 ++++++ crates/storage/src/entities/activities.rs | 6 +++--- crates/storage/src/entities/activities_categories.rs | 6 +++--- crates/storage/src/entities/activities_tags.rs | 6 +++--- crates/storage/src/entities/activity_kinds.rs | 6 +++--- crates/storage/src/entities/activity_status.rs | 6 +++--- crates/storage/src/entities/categories.rs | 6 +++--- crates/storage/src/entities/schema_migrations.rs | 6 +++--- crates/storage/src/entities/tags.rs | 6 +++--- crates/storage/src/storage.rs | 2 +- 10 files changed, 31 insertions(+), 25 deletions(-) diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index 9839237b..d263cf46 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -270,6 +270,12 @@ pub enum DatabaseStorageErrorKind { version: String, source: rusqlite::Error, }, + + /// Failed to read activity {guid}: {source} + ActivityReadFailed { + guid: String, + source: rusqlite::Error, + }, } /// [`TomlFileStorageErrorKind`] describes the errors that can happen while dealing with the Toml file storage. diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs index 3bc3ce9f..3489a92d 100644 --- a/crates/storage/src/entities/activities.rs +++ b/crates/storage/src/entities/activities.rs @@ -32,7 +32,7 @@ pub enum Relation { } impl SQLiteEntity for Activities { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -40,10 +40,10 @@ impl SQLiteEntity for Activities { } } -impl TryFrom> for Activities { +impl TryFrom<&Row<'_>> for Activities { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, category: row.get("category")?, diff --git a/crates/storage/src/entities/activities_categories.rs b/crates/storage/src/entities/activities_categories.rs index 69db8e62..f544a505 100644 --- a/crates/storage/src/entities/activities_categories.rs +++ b/crates/storage/src/entities/activities_categories.rs @@ -22,7 +22,7 @@ pub enum Relation { } impl SQLiteEntity for ActivitiesCategories { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -30,10 +30,10 @@ impl SQLiteEntity for ActivitiesCategories { } } -impl TryFrom> for ActivitiesCategories { +impl TryFrom<&Row<'_>> for ActivitiesCategories { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, category_guid: row.get("category_guid")?, diff --git a/crates/storage/src/entities/activities_tags.rs b/crates/storage/src/entities/activities_tags.rs index 0f82a07b..9fb96da7 100644 --- a/crates/storage/src/entities/activities_tags.rs +++ b/crates/storage/src/entities/activities_tags.rs @@ -22,7 +22,7 @@ pub enum Relation { } impl SQLiteEntity for ActivitiesTags { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -30,10 +30,10 @@ impl SQLiteEntity for ActivitiesTags { } } -impl TryFrom> for ActivitiesTags { +impl TryFrom<&Row<'_>> for ActivitiesTags { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, tag_guid: row.get("tag_guid")?, diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs index 944efb7f..e9695f63 100644 --- a/crates/storage/src/entities/activity_kinds.rs +++ b/crates/storage/src/entities/activity_kinds.rs @@ -20,7 +20,7 @@ pub enum Relation { } impl SQLiteEntity for ActivityKinds { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -28,10 +28,10 @@ impl SQLiteEntity for ActivityKinds { } } -impl TryFrom> for ActivityKinds { +impl TryFrom<&Row<'_>> for ActivityKinds { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, kind: row.get("kind")?, diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs index ddc18b56..9cfd0931 100644 --- a/crates/storage/src/entities/activity_status.rs +++ b/crates/storage/src/entities/activity_status.rs @@ -20,7 +20,7 @@ pub enum Relation { } impl SQLiteEntity for ActivityStatus { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -28,10 +28,10 @@ impl SQLiteEntity for ActivityStatus { } } -impl TryFrom> for ActivityStatus { +impl TryFrom<&Row<'_>> for ActivityStatus { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, status: row.get("status")?, diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs index 81d6d5d1..6cf8f5a3 100644 --- a/crates/storage/src/entities/categories.rs +++ b/crates/storage/src/entities/categories.rs @@ -21,7 +21,7 @@ pub enum Relation { } impl SQLiteEntity for Categories { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -29,10 +29,10 @@ impl SQLiteEntity for Categories { } } -impl TryFrom> for Categories { +impl TryFrom<&Row<'_>> for Categories { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, category: row.get("category")?, diff --git a/crates/storage/src/entities/schema_migrations.rs b/crates/storage/src/entities/schema_migrations.rs index d37d8478..99bda3a8 100644 --- a/crates/storage/src/entities/schema_migrations.rs +++ b/crates/storage/src/entities/schema_migrations.rs @@ -14,7 +14,7 @@ pub struct SchemaMigrations { } impl SQLiteEntity for SchemaMigrations { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -22,10 +22,10 @@ impl SQLiteEntity for SchemaMigrations { } } -impl TryFrom> for SchemaMigrations { +impl TryFrom<&Row<'_>> for SchemaMigrations { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, version: row.get("version")?, diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs index 626dda23..1b14a66d 100644 --- a/crates/storage/src/entities/tags.rs +++ b/crates/storage/src/entities/tags.rs @@ -20,7 +20,7 @@ pub enum Relation { } impl SQLiteEntity for Tags { - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized, { @@ -28,10 +28,10 @@ impl SQLiteEntity for Tags { } } -impl TryFrom> for Tags { +impl TryFrom<&Row<'_>> for Tags { type Error = Error; - fn try_from(row: Row<'_>) -> Result { + fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, tag: row.get("tag")?, diff --git a/crates/storage/src/storage.rs b/crates/storage/src/storage.rs index 0a86c495..38eddf0d 100644 --- a/crates/storage/src/storage.rs +++ b/crates/storage/src/storage.rs @@ -25,7 +25,7 @@ pub trait SQLiteEntity { /// # Returns /// /// Returns a struct. - fn from_row(row: Row<'_>) -> Result + fn from_row(row: &Row<'_>) -> Result where Self: Sized; } From fbe6592fb3d11ac8f2abff2dd6eeb5fae8e218c8 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 22:48:10 +0100 Subject: [PATCH 35/59] fix adding values from migration Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/error/src/lib.rs | 23 ++++++++- crates/storage/src/migration.rs | 44 +++++++++++------ crates/storage/src/storage/sqlite.rs | 74 +++++++++++++++++++++------- 3 files changed, 106 insertions(+), 35 deletions(-) diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index d263cf46..2c2c2493 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -208,8 +208,12 @@ pub enum DatabaseStorageErrorKind { /// This database engine is currently not supported: {0} UnsupportedDatabaseEngine(String), - /// Activity with id {0} not found - ActivityNotFound(String), + /// Activity with id {guid} not found: {source} + ActivityNotFound { + guid: String, + #[source] + source: rusqlite::Error, + }, /// Failed to create activity: {0} ActivityCreationFailed(String), @@ -254,6 +258,7 @@ pub enum DatabaseStorageErrorKind { version: String, table: String, query: String, + #[source] source: rusqlite::Error, }, @@ -262,18 +267,32 @@ pub enum DatabaseStorageErrorKind { version: String, table: String, query: String, + #[source] source: rusqlite::Error, }, /// Row does not contain migration version: {version}, source: {source} RowDoesNotContainMigrationVersion { version: String, + #[source] source: rusqlite::Error, }, /// Failed to read activity {guid}: {source} ActivityReadFailed { guid: String, + #[source] + source: rusqlite::Error, + }, + + /// There is no item contained with id {0} + NoItemContained(String), + + /// Failed to add values to database table: {version}, query: {query}, source: {source} + AddingValuesToDatabaseTableFailed { + version: String, + query: String, + #[source] source: rusqlite::Error, }, } diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 46995fc8..93517dff 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -203,23 +203,39 @@ impl<'conn> SQLiteMigrator<'conn> { continue; }; - _ = match self.connection.execute(&query, []) { - Ok(val) => val, - Err(rusqlite::Error::SqlInputError { msg, .. }) - if msg.contains("already exists") => - { - debug!("Table already exists"); - 0 - } - Err(err) => { - return Err(DatabaseStorageErrorKind::MigrationFailed { + if query.is_empty() { + continue; + } + + // check if query contains multiple queries + // if so, run each query separately + if query.contains("; ") { + self.connection.execute_batch(&query).map_err(|source| { + DatabaseStorageErrorKind::AddingValuesToDatabaseTableFailed { version: migration.version(), query: query.to_string(), - source: err, + source, } - .into()); - } - }; + })?; + } else { + _ = match self.connection.execute(&query, []) { + Ok(val) => val, + Err(rusqlite::Error::SqlInputError { msg, .. }) + if msg.contains("already exists") => + { + debug!("Table already exists"); + 0 + } + Err(err) => { + return Err(DatabaseStorageErrorKind::MigrationFailed { + version: migration.version(), + query: query.to_string(), + source: err, + } + .into()); + } + }; + } self.push_migration_version(migration.version())?; diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index 54bc57ff..b7200f9d 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -1,5 +1,6 @@ use std::collections::BTreeMap; +use itertools::Itertools; use rusqlite::Connection; use pace_core::prelude::{ @@ -10,8 +11,15 @@ use pace_core::prelude::{ }; use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; - -use crate::migration::SQLiteMigrator; +use sea_query::{Expr, Query, SqliteQueryBuilder}; +use tracing::debug; + +use crate::{ + entities::activities::{Activities, ActivitiesIden}, + mediator::Mediator, + migration::SQLiteMigrator, + storage::SQLiteEntity, +}; #[derive(Debug)] pub struct SqliteActivityStorage { @@ -58,23 +66,51 @@ impl SyncStorage for SqliteActivityStorage { impl ActivityReadOps for SqliteActivityStorage { #[tracing::instrument] fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { - // let mut stmt = self - // .connection - // .prepare("SELECT * FROM activities WHERE id = ?1")?; - - // let activity_item_iter = - // stmt.query_map(&[&activity_id], |row| Ok(ActivityItem::from_row(&row)))?; - - // let activity_item = activity_item_iter - // .filter_map_ok(|item| item.ok()) - // .next() - // .transpose()? - // .ok_or(DatabaseStorageErrorKind::ActivityNotFound(activity_id))?; - - // debug!("Read activity: {:?}", activity_item); - - // Ok(activity_item) - todo!("implement read_activity for sqlite") + let query = Query::select() + .from(ActivitiesIden::Table) + .cond_where(Expr::col(ActivitiesIden::Guid).eq(activity_id.to_string())) + .limit(1) + .to_string(SqliteQueryBuilder); + + debug!("Read activity query: {query}"); + + let mut stmt = self.connection.prepare(&query).map_err(|source| { + DatabaseStorageErrorKind::ActivityReadFailed { + guid: activity_id.to_string(), + source, + } + })?; + + let activity_item_iter = stmt + .query_map([&activity_id], |row| Ok(Activities::from_row(row))) + .map_err(|source| DatabaseStorageErrorKind::ActivityReadFailed { + guid: activity_id.to_string(), + source, + })?; + + let database_item = activity_item_iter + .filter_map_ok(std::result::Result::ok) + .next() + .ok_or(DatabaseStorageErrorKind::NoItemContained( + activity_id.to_string(), + ))? + .map_err(|source| DatabaseStorageErrorKind::ActivityNotFound { + guid: activity_id.to_string(), + source, + })?; + + debug!("Read activity: {:?}", database_item); + + // TODO: Now we need to get the rest of the data from the database + // and return the ActivityItem + // + // Missing data: + // ActivityStatus (1:N) + // ActivityKind (1:N) + // Categories (M:N) + // Tags (M:N) + + Ok(ActivityItem::default()) } #[tracing::instrument] From 83a7d4e6b58766095d4226cdfae3439460220cde Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 22:49:17 +0100 Subject: [PATCH 36/59] cleanup comments and unused import Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/src/migration.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 93517dff..468b2e5a 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -11,7 +11,7 @@ mod create_tags_20240326125555; use rusqlite::Connection; use sea_query::{Cond, Expr, Iden, Query, SqliteQueryBuilder}; -use std::{collections::VecDeque, f32::consts::E}; +use std::collections::VecDeque; use tracing::debug; use ulid::Ulid; @@ -25,7 +25,6 @@ pub trait SQLiteMigration { fn down(&self) -> String; } -// TODO: Select migration_version from database and skip the migration if already a value exists pub struct SQLiteMigrator<'conn> { iterator: Box>>, applied: VecDeque>, From b62bf930d72d1e30d45e34ed9695d187cfc122bb Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Thu, 28 Mar 2024 23:14:58 +0100 Subject: [PATCH 37/59] renamed mediator to converter to better reflect usage Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/src/{mediator.rs => convert.rs} | 6 +++--- crates/storage/src/lib.rs | 2 +- crates/storage/src/storage/sqlite.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename crates/storage/src/{mediator.rs => convert.rs} (87%) diff --git a/crates/storage/src/mediator.rs b/crates/storage/src/convert.rs similarity index 87% rename from crates/storage/src/mediator.rs rename to crates/storage/src/convert.rs index 36cb4d69..3f09d096 100644 --- a/crates/storage/src/mediator.rs +++ b/crates/storage/src/convert.rs @@ -3,7 +3,7 @@ use pace_error::PaceResult; use crate::entities::SQLiteActivityItem; -pub trait Mediator { +pub trait Convert { type Options; type Source; type Target; @@ -12,9 +12,9 @@ pub trait Mediator { fn from_stored(stored: Self::Target, opts: Self::Options) -> PaceResult; } -pub struct SQLiteActivityMediator; +pub struct SQLiteActivityConverter; -impl Mediator for SQLiteActivityMediator { +impl Convert for SQLiteActivityConverter { type Options = (); type Source = ActivityItem; type Target = SQLiteActivityItem; diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 20745305..c31792d9 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,4 +1,4 @@ -pub mod mediator; +pub mod convert; pub mod migration; pub mod storage; diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index b7200f9d..b133cd84 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -15,8 +15,8 @@ use sea_query::{Expr, Query, SqliteQueryBuilder}; use tracing::debug; use crate::{ + convert::Convert, entities::activities::{Activities, ActivitiesIden}, - mediator::Mediator, migration::SQLiteMigrator, storage::SQLiteEntity, }; From 8760f14cde3238c9a5bcb48c1d6368535d8d7118 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 13:36:44 +0100 Subject: [PATCH 38/59] move description to own table for easier deduplication and storage space Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/lib.rs | 1 + crates/storage/src/entities.rs | 1 + crates/storage/src/entities/activities.rs | 20 ++++----- .../src/entities/activities_categories.rs | 7 ++-- .../storage/src/entities/activities_tags.rs | 7 ++-- crates/storage/src/entities/activity_kinds.rs | 3 +- .../storage/src/entities/activity_status.rs | 3 +- crates/storage/src/entities/categories.rs | 3 +- crates/storage/src/entities/description.rs | 41 +++++++++++++++++++ .../storage/src/entities/schema_migrations.rs | 3 +- crates/storage/src/entities/tags.rs | 3 +- crates/storage/src/migration.rs | 2 + .../create_activities_20240325143710.rs | 19 +++++---- .../create_descriptions_20240329131712.rs | 35 ++++++++++++++++ crates/storage/src/storage/sqlite.rs | 1 + 15 files changed, 121 insertions(+), 28 deletions(-) create mode 100644 crates/storage/src/entities/description.rs create mode 100644 crates/storage/src/migration/create_descriptions_20240329131712.rs diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 0e190c64..45a8f746 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -54,6 +54,7 @@ pub mod prelude { category::{split_category_by_category_separator, PaceCategory}, description::PaceDescription, filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, + id::Guid, intermission::IntermissionAction, reflection::{ Highlights, ReflectionSummary, ReflectionsFormatKind, SummaryActivityGroup, diff --git a/crates/storage/src/entities.rs b/crates/storage/src/entities.rs index cc082487..85d9e227 100644 --- a/crates/storage/src/entities.rs +++ b/crates/storage/src/entities.rs @@ -12,6 +12,7 @@ pub mod activities_tags; pub mod activity_kinds; pub mod activity_status; pub mod categories; +pub mod description; pub mod schema_migrations; pub mod tags; diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs index 3489a92d..4bba992a 100644 --- a/crates/storage/src/entities/activities.rs +++ b/crates/storage/src/entities/activities.rs @@ -1,5 +1,6 @@ use chrono::FixedOffset; use getset::Getters; +use pace_core::prelude::{ActivityGuid, ActivityItem, Guid}; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -11,15 +12,14 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct Activities { - pub guid: String, - pub category: String, - pub description: String, + pub guid: ActivityGuid, + pub description_guid: Guid, pub begin: chrono::DateTime, pub end: Option>, + pub kind_guid: Guid, pub duration: Option, - pub kind: String, - pub status: String, - pub parent_guid: Option, + pub status_guid: Guid, + pub parent_guid: Option, } #[derive(Copy, Clone, Debug, EnumIter)] @@ -29,6 +29,7 @@ pub enum Relation { ActivitiesTags, ActivityKinds, ActivityStatus, + Descriptions, } impl SQLiteEntity for Activities { @@ -46,13 +47,12 @@ impl TryFrom<&Row<'_>> for Activities { fn try_from(row: &Row<'_>) -> Result { Ok(Self { guid: row.get("guid")?, - category: row.get("category")?, - description: row.get("description")?, + description_guid: row.get("description")?, begin: row.get("begin")?, end: row.get("end")?, duration: row.get("duration")?, - kind: row.get("kind")?, - status: row.get("status")?, + kind_guid: row.get("kind")?, + status_guid: row.get("status")?, parent_guid: row.get("parent_guid")?, }) } diff --git a/crates/storage/src/entities/activities_categories.rs b/crates/storage/src/entities/activities_categories.rs index f544a505..a01d6ce8 100644 --- a/crates/storage/src/entities/activities_categories.rs +++ b/crates/storage/src/entities/activities_categories.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -10,9 +11,9 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct ActivitiesCategories { - pub guid: String, - pub category_guid: String, - pub activity_guid: String, + pub guid: Guid, + pub category_guid: Guid, + pub activity_guid: Guid, } #[derive(Copy, Clone, Debug, EnumIter)] diff --git a/crates/storage/src/entities/activities_tags.rs b/crates/storage/src/entities/activities_tags.rs index 9fb96da7..24211530 100644 --- a/crates/storage/src/entities/activities_tags.rs +++ b/crates/storage/src/entities/activities_tags.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -10,9 +11,9 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct ActivitiesTags { - pub guid: String, - pub tag_guid: String, - pub activity_guid: String, + pub guid: Guid, + pub tag_guid: Guid, + pub activity_guid: Guid, } #[derive(Copy, Clone, Debug, EnumIter)] diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs index e9695f63..94497ab9 100644 --- a/crates/storage/src/entities/activity_kinds.rs +++ b/crates/storage/src/entities/activity_kinds.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -10,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct ActivityKinds { - pub guid: String, + pub guid: Guid, pub kind: String, } diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs index 9cfd0931..995d298c 100644 --- a/crates/storage/src/entities/activity_status.rs +++ b/crates/storage/src/entities/activity_status.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -10,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct ActivityStatus { - pub guid: String, + pub guid: Guid, pub status: String, } diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs index 6cf8f5a3..37d388d7 100644 --- a/crates/storage/src/entities/categories.rs +++ b/crates/storage/src/entities/categories.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -10,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct Categories { - pub guid: String, + pub guid: Guid, pub category: String, pub description: Option, } diff --git a/crates/storage/src/entities/description.rs b/crates/storage/src/entities/description.rs new file mode 100644 index 00000000..c1930609 --- /dev/null +++ b/crates/storage/src/entities/description.rs @@ -0,0 +1,41 @@ +use getset::Getters; +use pace_core::prelude::{Guid, PaceDescription}; +use rusqlite::{Error, Row}; +use sea_query::enum_def; +use strum::EnumIter; +use typed_builder::TypedBuilder; + +use crate::storage::SQLiteEntity; + +#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] +#[getset(get = "pub")] +#[enum_def] +pub struct Descriptions { + pub guid: Guid, + pub description: PaceDescription, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation { + Activities, +} + +impl SQLiteEntity for Descriptions { + fn from_row(row: &Row<'_>) -> Result + where + Self: Sized, + { + Self::try_from(row) + } +} + +impl TryFrom<&Row<'_>> for Descriptions { + type Error = Error; + + fn try_from(row: &Row<'_>) -> Result { + Ok(Self { + guid: row.get("guid")?, + description: row.get("description")?, + }) + } +} diff --git a/crates/storage/src/entities/schema_migrations.rs b/crates/storage/src/entities/schema_migrations.rs index 99bda3a8..a77a5dfb 100644 --- a/crates/storage/src/entities/schema_migrations.rs +++ b/crates/storage/src/entities/schema_migrations.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use typed_builder::TypedBuilder; @@ -9,7 +10,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct SchemaMigrations { - pub guid: String, + pub guid: Guid, pub version: i64, } diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs index 1b14a66d..d3bf2d83 100644 --- a/crates/storage/src/entities/tags.rs +++ b/crates/storage/src/entities/tags.rs @@ -1,4 +1,5 @@ use getset::Getters; +use pace_core::prelude::Guid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -10,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct Tags { - pub guid: String, + pub guid: Guid, pub tag: String, } diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 468b2e5a..44b894e6 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -6,6 +6,7 @@ mod create_activity_kinds_20240326124253; mod create_activity_status_20240326125819; mod create_activity_status_values_20240327163645; mod create_categories_20240326125937; +mod create_descriptions_20240329131712; mod create_schema_migrations; mod create_tags_20240326125555; @@ -105,6 +106,7 @@ impl<'conn> SQLiteMigrator<'conn> { Box::new(create_activities_categories_20240326130013::Migration), Box::new(create_activity_kind_values_20240327162015::Migration), Box::new(create_activity_status_values_20240327163645::Migration), + Box::new(create_descriptions_20240329131712::Migration), ]; Box::new(migrations.into_iter()) diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs index 7feccd85..5f6427fe 100644 --- a/crates/storage/src/migration/create_activities_20240325143710.rs +++ b/crates/storage/src/migration/create_activities_20240325143710.rs @@ -3,7 +3,7 @@ use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; use crate::{ entities::{ activities::ActivitiesIden, activity_kinds::ActivityKindsIden, - activity_status::ActivityStatusIden, + activity_status::ActivityStatusIden, description::DescriptionsIden, }, migration::SQLiteMigration, }; @@ -25,17 +25,16 @@ impl SQLiteMigration for Migration { .not_null() .primary_key(), ) - .col(ColumnDef::new(ActivitiesIden::Category).text().not_null()) .col( - ColumnDef::new(ActivitiesIden::Description) + ColumnDef::new(ActivitiesIden::DescriptionGuid) .text() .not_null(), ) .col(ColumnDef::new(ActivitiesIden::Begin).date_time().not_null()) .col(ColumnDef::new(ActivitiesIden::End).text().null()) .col(ColumnDef::new(ActivitiesIden::Duration).integer().null()) - .col(ColumnDef::new(ActivitiesIden::Kind).text().not_null()) - .col(ColumnDef::new(ActivitiesIden::Status).text().not_null()) + .col(ColumnDef::new(ActivitiesIden::KindGuid).text().not_null()) + .col(ColumnDef::new(ActivitiesIden::StatusGuid).text().not_null()) .col(ColumnDef::new(ActivitiesIden::ParentGuid).text().null()) .foreign_key( ForeignKey::create() @@ -46,15 +45,21 @@ impl SQLiteMigration for Migration { .foreign_key( ForeignKey::create() .name("fk_activities_kind") - .from(ActivitiesIden::Table, ActivitiesIden::Kind) + .from(ActivitiesIden::Table, ActivitiesIden::KindGuid) .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_status") - .from(ActivitiesIden::Table, ActivitiesIden::Status) + .from(ActivitiesIden::Table, ActivitiesIden::StatusGuid) .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_description") + .from(ActivitiesIden::Table, ActivitiesIden::DescriptionGuid) + .to(DescriptionsIden::Table, DescriptionsIden::Guid), + ) .build(SqliteQueryBuilder) } diff --git a/crates/storage/src/migration/create_descriptions_20240329131712.rs b/crates/storage/src/migration/create_descriptions_20240329131712.rs new file mode 100644 index 00000000..a685d804 --- /dev/null +++ b/crates/storage/src/migration/create_descriptions_20240329131712.rs @@ -0,0 +1,35 @@ +use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; + +use crate::{entities::description::DescriptionsIden, migration::SQLiteMigration}; + +pub struct Migration; + +impl SQLiteMigration for Migration { + fn version(&self) -> String { + "20240329131712".to_string() + } + + fn up(&self) -> String { + Table::create() + .if_not_exists() + .table(DescriptionsIden::Table) + .col( + ColumnDef::new(DescriptionsIden::Guid) + .text() + .not_null() + .primary_key(), + ) + .col( + ColumnDef::new(DescriptionsIden::Description) + .text() + .not_null(), + ) + .build(SqliteQueryBuilder) + } + + fn down(&self) -> String { + Table::drop() + .table(DescriptionsIden::Table) + .build(SqliteQueryBuilder) + } +} diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index b133cd84..f14169ed 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -105,6 +105,7 @@ impl ActivityReadOps for SqliteActivityStorage { // and return the ActivityItem // // Missing data: + // Description (1:1) (in extra table for deduplication) // ActivityStatus (1:N) // ActivityKind (1:N) // Categories (M:N) From 09d260d5ff174849a89dca89f81ba5e9ea737dc4 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 18:32:13 +0100 Subject: [PATCH 39/59] factor out pace_service Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .gitignore | 1 + Cargo.lock | 25 ++- Cargo.toml | 3 + crates/cli/Cargo.toml | 13 ++ crates/cli/src/commands.rs | 8 + crates/{core => cli}/src/commands/adjust.rs | 14 +- crates/{core => cli}/src/commands/begin.rs | 9 +- crates/{core => cli}/src/commands/docs.rs | 2 +- crates/{core => cli}/src/commands/end.rs | 9 +- crates/{core => cli}/src/commands/hold.rs | 29 +-- crates/{core => cli}/src/commands/now.rs | 5 +- crates/{core => cli}/src/commands/reflect.rs | 35 +-- crates/{core => cli}/src/commands/resume.rs | 11 - crates/cli/src/lib.rs | 12 +- crates/cli/src/prompt.rs | 29 ++- crates/cli/src/setup.rs | 36 +-- crates/core/Cargo.toml | 2 - crates/core/src/domain/activity.rs | 37 +--- crates/core/src/domain/activity_log.rs | 5 +- crates/core/src/domain/category.rs | 15 +- crates/core/src/domain/filter.rs | 37 +--- crates/core/src/domain/id.rs | 206 +++++++++++++++++- crates/core/src/domain/tag.rs | 13 +- crates/core/src/lib.rs | 36 ++- crates/core/src/{commands.rs => options.rs} | 54 +++-- crates/core/src/storage.rs | 14 +- crates/core/src/storage/rusqlite.rs | 77 ++++++- crates/core/src/template.rs | 10 + crates/service/Cargo.toml | 26 +++ crates/{core => service}/LICENSE | 0 .../service => service/src}/activity_store.rs | 17 +- .../src}/activity_tracker.rs | 8 +- .../src/service.rs => service/src/lib.rs} | 0 crates/storage/src/entities/activities.rs | 12 +- crates/storage/src/entities/activity_kinds.rs | 4 +- .../storage/src/entities/activity_status.rs | 4 +- crates/storage/src/entities/categories.rs | 4 +- crates/storage/src/entities/description.rs | 4 +- crates/storage/src/entities/tags.rs | 4 +- crates/storage/src/lib.rs | 4 +- .../create_activities_20240325143710.rs | 12 +- crates/storage/src/query.rs | 8 + crates/storage/src/storage/file.rs | 14 +- crates/storage/src/storage/in_memory.rs | 16 +- crates/storage/src/storage/sqlite.rs | 18 +- src/commands/adjust.rs | 3 +- src/commands/begin.rs | 3 +- src/commands/docs.rs | 2 +- src/commands/end.rs | 3 +- src/commands/hold.rs | 2 +- src/commands/now.rs | 3 +- src/commands/reflect.rs | 2 +- src/commands/resume.rs | 14 +- src/commands/settings/set.rs | 2 +- src/commands/setup/config.rs | 2 +- tests/integration/activity_store.rs | 11 +- tests/integration/activity_tracker.rs | 8 +- tests/integration/util.rs | 3 +- tests/journey/hold_resume.rs | 8 +- .../start_finish_different_time_zone.rs | 5 +- 60 files changed, 632 insertions(+), 341 deletions(-) create mode 100644 crates/cli/src/commands.rs rename crates/{core => cli}/src/commands/adjust.rs (98%) rename crates/{core => cli}/src/commands/begin.rs (97%) rename crates/{core => cli}/src/commands/docs.rs (99%) rename crates/{core => cli}/src/commands/end.rs (97%) rename crates/{core => cli}/src/commands/hold.rs (86%) rename crates/{core => cli}/src/commands/now.rs (96%) rename crates/{core => cli}/src/commands/reflect.rs (92%) rename crates/{core => cli}/src/commands/resume.rs (83%) rename crates/core/src/{commands.rs => options.rs} (51%) create mode 100644 crates/service/Cargo.toml rename crates/{core => service}/LICENSE (100%) rename crates/{core/src/service => service/src}/activity_store.rs (97%) rename crates/{core/src/service => service/src}/activity_tracker.rs (92%) rename crates/{core/src/service.rs => service/src/lib.rs} (100%) create mode 100644 crates/storage/src/query.rs diff --git a/.gitignore b/.gitignore index 55b481fa..7ed3d28b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ logs/* # Database db/activities.pace.sqlite3 +/sea-orm \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 6598ef89..58545d0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1317,6 +1317,7 @@ dependencies = [ "pace_cli", "pace_core", "pace_error", + "pace_service", "pace_storage", "pace_time", "predicates", @@ -1336,10 +1337,19 @@ version = "0.4.5" dependencies = [ "chrono", "chrono-tz", + "clap", "dialoguer", "eyre", "getset", + "open", "pace_core", + "pace_error", + "pace_service", + "pace_time", + "serde", + "serde_derive", + "serde_json", + "tera", "tracing", "typed-builder", ] @@ -1359,7 +1369,6 @@ dependencies = [ "itertools", "merge", "once_cell", - "open", "pace_error", "pace_time", "parking_lot", @@ -1379,7 +1388,6 @@ dependencies = [ "tracing", "typed-builder", "ulid", - "wildmatch", ] [[package]] @@ -1402,6 +1410,19 @@ dependencies = [ name = "pace_server" version = "0.1.3" +[[package]] +name = "pace_service" +version = "0.1.0" +dependencies = [ + "getset", + "pace_core", + "pace_error", + "pace_time", + "tracing", + "typed-builder", + "wildmatch", +] + [[package]] name = "pace_storage" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 2892abd7..ff0a2ee4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "crates/core", "crates/error", "crates/server", + "crates/service", "crates/storage", "crates/time", ] @@ -47,6 +48,7 @@ open = "5.1.2" pace_cli = { path = "crates/cli", version = "0" } pace_core = { path = "crates/core", version = "0" } pace_error = { path = "crates/error", version = "0" } +pace_service = { path = "crates/service", version = "0" } pace_storage = { path = "crates/storage", version = "0" } pace_time = { path = "crates/time", version = "0" } parking_lot = "0.12.1" @@ -113,6 +115,7 @@ human-panic = { workspace = true } pace_cli = { workspace = true } pace_core = { workspace = true, features = ["cli"] } pace_error = { workspace = true } +pace_service = { workspace = true } pace_storage = { workspace = true } pace_time = { workspace = true, features = ["cli", "db"] } serde = { workspace = true } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index a15b5128..07424521 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -18,14 +18,27 @@ include = [ "src/**/*", "Cargo.toml", ] +[features] +default = ["cli"] +cli = ["clap"] +clap = ["dep:clap"] [dependencies] chrono = { workspace = true } chrono-tz = { workspace = true } +clap = { workspace = true, optional = true, features = ["env", "wrap_help", "derive"] } dialoguer = { workspace = true, features = ["fuzzy-select"] } eyre = { workspace = true } getset = { workspace = true } +open = { workspace = true } pace_core = { workspace = true } +pace_error = { workspace = true } +pace_service = { workspace = true } +pace_time = { workspace = true } +serde = { workspace = true } +serde_derive = { workspace = true } +serde_json = { workspace = true } +tera = { workspace = true } tracing = { workspace = true } typed-builder = { workspace = true } diff --git a/crates/cli/src/commands.rs b/crates/cli/src/commands.rs new file mode 100644 index 00000000..1c188309 --- /dev/null +++ b/crates/cli/src/commands.rs @@ -0,0 +1,8 @@ +pub mod adjust; +pub mod begin; +pub mod docs; +pub mod end; +pub mod hold; +pub mod now; +pub mod reflect; +pub mod resume; diff --git a/crates/core/src/commands/adjust.rs b/crates/cli/src/commands/adjust.rs similarity index 98% rename from crates/core/src/commands/adjust.rs rename to crates/cli/src/commands/adjust.rs index 37e9caaf..c7915652 100644 --- a/crates/core/src/commands/adjust.rs +++ b/crates/cli/src/commands/adjust.rs @@ -5,20 +5,18 @@ use chrono_tz::Tz; #[cfg(feature = "clap")] use clap::Parser; use getset::Getters; -use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use tracing::debug; use typed_builder::TypedBuilder; -use pace_error::{ActivityLogErrorKind, PaceResult, UserMessage}; - -use crate::{ - commands::UpdateOptions, +use pace_core::{ config::PaceConfig, - domain::{category::PaceCategory, description::PaceDescription}, - prelude::PaceTagCollection, - service::activity_store::ActivityStore, + domain::{category::PaceCategory, description::PaceDescription, tag::PaceTagCollection}, + options::UpdateOptions, storage::{ActivityQuerying, ActivityStorage, ActivityWriteOps, SyncStorage}, }; +use pace_error::{ActivityLogErrorKind, PaceResult, UserMessage}; +use pace_service::activity_store::ActivityStore; +use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; /// `adjust` subcommand options #[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] diff --git a/crates/core/src/commands/begin.rs b/crates/cli/src/commands/begin.rs similarity index 97% rename from crates/core/src/commands/begin.rs rename to crates/cli/src/commands/begin.rs index 1733ee54..7836776a 100644 --- a/crates/core/src/commands/begin.rs +++ b/crates/cli/src/commands/begin.rs @@ -5,22 +5,21 @@ use chrono_tz::Tz; #[cfg(feature = "clap")] use clap::Parser; use getset::Getters; -use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use tracing::debug; -use crate::{ +use pace_core::{ config::PaceConfig, domain::{ activity::{Activity, ActivityKind}, category::PaceCategory, description::PaceDescription, + tag::PaceTagCollection, }, - prelude::PaceTagCollection, - service::activity_store::ActivityStore, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; - use pace_error::{PaceResult, UserMessage}; +use pace_service::activity_store::ActivityStore; +use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; /// `begin` subcommand options #[derive(Debug, Clone, PartialEq, Eq, Getters)] diff --git a/crates/core/src/commands/docs.rs b/crates/cli/src/commands/docs.rs similarity index 99% rename from crates/core/src/commands/docs.rs rename to crates/cli/src/commands/docs.rs index 9924b6ab..3c6b5eb3 100644 --- a/crates/core/src/commands/docs.rs +++ b/crates/cli/src/commands/docs.rs @@ -1,7 +1,7 @@ #[cfg(feature = "clap")] use clap::Parser; -use crate::{ +use pace_core::{ constants::PACE_DOCS_URL, constants::{PACE_CONFIG_DOCS_URL, PACE_DEV_DOCS_URL}, }; diff --git a/crates/core/src/commands/end.rs b/crates/cli/src/commands/end.rs similarity index 97% rename from crates/core/src/commands/end.rs rename to crates/cli/src/commands/end.rs index 5e7bbd4a..14dfb608 100644 --- a/crates/core/src/commands/end.rs +++ b/crates/cli/src/commands/end.rs @@ -5,18 +5,17 @@ use chrono_tz::Tz; #[cfg(feature = "clap")] use clap::Parser; use getset::Getters; -use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use tracing::debug; use typed_builder::TypedBuilder; -use crate::{ - commands::EndOptions, +use pace_core::{ config::PaceConfig, - service::activity_store::ActivityStore, + options::EndOptions, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; - use pace_error::{PaceResult, UserMessage}; +use pace_service::activity_store::ActivityStore; +use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; /// `end` subcommand options #[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] diff --git a/crates/core/src/commands/hold.rs b/crates/cli/src/commands/hold.rs similarity index 86% rename from crates/core/src/commands/hold.rs rename to crates/cli/src/commands/hold.rs index 65b791b4..57002953 100644 --- a/crates/core/src/commands/hold.rs +++ b/crates/cli/src/commands/hold.rs @@ -4,20 +4,17 @@ use chrono::{FixedOffset, NaiveTime}; use chrono_tz::Tz; #[cfg(feature = "clap")] use clap::Parser; - -use getset::Getters; -use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use tracing::debug; -use typed_builder::TypedBuilder; -use crate::{ +use pace_core::{ config::PaceConfig, domain::{description::PaceDescription, intermission::IntermissionAction}, - service::activity_store::ActivityStore, + options::HoldOptions, storage::{ActivityStateManagement, ActivityStorage, SyncStorage}, }; - use pace_error::{PaceResult, UserMessage}; +use pace_service::activity_store::ActivityStore; +use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; /// `hold` subcommand options #[derive(Debug)] @@ -135,21 +132,3 @@ impl HoldCommandOptions { Ok(UserMessage::new(user_message)) } } - -/// Options for holding an activity -#[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] -#[getset(get = "pub")] -#[non_exhaustive] -pub struct HoldOptions { - /// The action to take on the intermission - #[builder(default)] - action: IntermissionAction, - - /// The start time of the intermission - #[builder(default, setter(into))] - begin_time: PaceDateTime, - - /// The reason for holding the activity - #[builder(default, setter(into))] - reason: Option, -} diff --git a/crates/core/src/commands/now.rs b/crates/cli/src/commands/now.rs similarity index 96% rename from crates/core/src/commands/now.rs rename to crates/cli/src/commands/now.rs index feb0b852..c9c12f8f 100644 --- a/crates/core/src/commands/now.rs +++ b/crates/cli/src/commands/now.rs @@ -4,14 +4,13 @@ use std::sync::Arc; use clap::Parser; use tracing::debug; -use crate::{ +use pace_core::{ config::PaceConfig, domain::{activity::ActivityItem, filter::ActivityFilterKind}, - service::activity_store::ActivityStore, storage::{ActivityQuerying, ActivityReadOps, ActivityStorage}, }; - use pace_error::{PaceResult, UserMessage}; +use pace_service::activity_store::ActivityStore; /// `now` subcommand options #[derive(Debug)] diff --git a/crates/core/src/commands/reflect.rs b/crates/cli/src/commands/reflect.rs similarity index 92% rename from crates/core/src/commands/reflect.rs rename to crates/cli/src/commands/reflect.rs index a8ab8ecf..cc6bc983 100644 --- a/crates/core/src/commands/reflect.rs +++ b/crates/cli/src/commands/reflect.rs @@ -1,28 +1,25 @@ #[cfg(feature = "clap")] use clap::Parser; use getset::{Getters, MutGetters, Setters}; -use pace_time::{ - flags::{DateFlags, TimeFlags}, - time_frame::PaceTimeFrame, - time_zone::PaceTimeZoneKind, -}; use serde_derive::Serialize; use std::{path::PathBuf, sync::Arc}; use tracing::debug; use typed_builder::TypedBuilder; -use crate::{ +use pace_core::{ config::PaceConfig, - domain::{ - activity::ActivityKind, category::PaceCategory, filter::FilterOptions, - reflection::ReflectionsFormatKind, - }, - prelude::ActivityStorage, - service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, + domain::{activity::ActivityKind, category::PaceCategory, reflection::ReflectionsFormatKind}, + options::FilterOptions, + storage::ActivityStorage, template::{PaceReflectionTemplate, TEMPLATES}, }; - use pace_error::{PaceResult, TemplatingErrorKind, UserMessage}; +use pace_service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}; +use pace_time::{ + flags::{DateFlags, TimeFlags}, + time_frame::PaceTimeFrame, + time_zone::PaceTimeZoneKind, +}; /// `reflect` subcommand options #[derive(Debug, Getters)] @@ -138,6 +135,8 @@ impl ReflectCommandOptions { date_flags, template_file, output_format, + category, + case_sensitive, // time_zone, // time_zone_offset, .. // TODO: ignore the rest of the fields for now, @@ -157,8 +156,12 @@ impl ReflectCommandOptions { debug!("Displaying reflection for time frame: {}", time_frame); - let Some(reflection) = - activity_tracker.generate_reflection(FilterOptions::from(self), time_frame)? + let filter_opts = FilterOptions::builder() + .category(category.clone()) + .case_sensitive(*case_sensitive) + .build(); + + let Some(reflection) = activity_tracker.generate_reflection(filter_opts, time_frame)? else { return Ok(UserMessage::new( "No activities found for the specified time frame", @@ -186,7 +189,6 @@ impl ReflectCommandOptions { return Ok(UserMessage::new(json)); } - Some(ReflectionsFormatKind::Template) => { let context = PaceReflectionTemplate::from(reflection).into_context(); @@ -221,6 +223,7 @@ impl ReflectCommandOptions { return Ok(UserMessage::new(templated)); } Some(ReflectionsFormatKind::Csv) => unimplemented!("CSV format not yet supported"), + _ => unimplemented!("Unsupported output format"), } } } diff --git a/crates/core/src/commands/resume.rs b/crates/cli/src/commands/resume.rs similarity index 83% rename from crates/core/src/commands/resume.rs rename to crates/cli/src/commands/resume.rs index 41d3ffb6..8dd63f86 100644 --- a/crates/core/src/commands/resume.rs +++ b/crates/cli/src/commands/resume.rs @@ -3,7 +3,6 @@ use chrono_tz::Tz; #[cfg(feature = "clap")] use clap::Parser; use getset::Getters; -use pace_time::date_time::PaceDateTime; use typed_builder::TypedBuilder; /// `resume` subcommand options @@ -56,13 +55,3 @@ impl ResumeCommandOptions { // FIXME: Inner run implementation for the resume command kept in pace-rs crate for now // FIXME: due to the dependency on pace-cli } - -/// Options for resuming an activity -#[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] -#[getset(get = "pub")] -#[non_exhaustive] -pub struct ResumeOptions { - /// The resume time of the intermission - #[builder(default, setter(into))] - resume_time: Option, -} diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 2b1d7967..89276d17 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -1,14 +1,10 @@ //! `pace_cli` contains utilities for the `pace` command-line interface /// Contains the main logic for prompting the user for input -pub(crate) mod prompt; +pub mod prompt; /// Contains the main logic for the `setup` command -pub(crate) mod setup; +pub mod setup; -pub(crate) static PACE_ART: &str = include_str!("pace.art"); +pub mod commands; -// Public API -pub use crate::{ - prompt::{confirmation_or_break, prompt_resume_activity, prompt_time_zone}, - setup::{setup_config, PathOptions}, -}; +pub(crate) static PACE_ART: &str = include_str!("pace.art"); diff --git a/crates/cli/src/prompt.rs b/crates/cli/src/prompt.rs index 4eade99a..102eb345 100644 --- a/crates/cli/src/prompt.rs +++ b/crates/cli/src/prompt.rs @@ -111,7 +111,7 @@ pub fn prompt_config_file_path( /// # Returns /// /// Returns `Ok(())` if the user confirms their choices -pub fn confirmation_or_break(prompt: &str) -> Result<()> { +pub fn confirmation_or_break_default_false(prompt: &str) -> Result<()> { let confirmation = Confirm::with_theme(&ColorfulTheme::default()) .with_prompt(prompt) .default(false) @@ -124,6 +124,33 @@ pub fn confirmation_or_break(prompt: &str) -> Result<()> { Ok(()) } +/// Prompts the user to confirm their choices or break the setup assistant +/// +/// # Arguments +/// +/// * `prompt` - The prompt to display to the user +/// +/// # Errors +/// +/// Returns an error if the wants to break the setup assistant or +/// if the prompt fails +/// +/// # Returns +/// +/// Returns `Ok(())` if the user confirms their choices +pub fn confirmation_or_break_default_true(prompt: &str) -> Result<()> { + let confirmation = Confirm::with_theme(&ColorfulTheme::default()) + .with_prompt(prompt) + .default(true) + .interact()?; + + if !confirmation { + eyre::bail!("Setup exited without changes. No changes were made."); + } + + Ok(()) +} + /// Prompts the user to select an activity to resume /// /// # Arguments diff --git a/crates/cli/src/setup.rs b/crates/cli/src/setup.rs index cff7f7ca..043f9840 100644 --- a/crates/cli/src/setup.rs +++ b/crates/cli/src/setup.rs @@ -22,8 +22,11 @@ use pace_core::{ }; use crate::{ - prompt::{prompt_activity_log_path, prompt_config_file_path}, - prompt_time_zone, PACE_ART, + prompt::{ + confirmation_or_break_default_true, prompt_activity_log_path, prompt_config_file_path, + prompt_time_zone, + }, + PACE_ART, }; #[derive(Debug, TypedBuilder, Getters)] @@ -279,33 +282,6 @@ Use Q, ESC, or Ctrl-C to exit gracefully at any time."; Ok(()) } -/// Prompts the user to confirm their choices or break the setup assistant -/// -/// # Arguments -/// -/// * `prompt` - The prompt to display to the user -/// -/// # Errors -/// -/// Returns an error if the wants to break the setup assistant or -/// if the prompt fails -/// -/// # Returns -/// -/// Returns `Ok(())` if the user confirms their choices -pub fn confirmation_or_break(prompt: &str) -> Result<()> { - let confirmation = Confirm::with_theme(&ColorfulTheme::default()) - .with_prompt(prompt) - .default(true) - .interact()?; - - if !confirmation { - eyre::bail!("Setup exited without changes. No changes were made."); - } - - Ok(()) -} - /// The `setup` commands interior for the pace application /// /// # Arguments @@ -355,7 +331,7 @@ pub fn setup_config(term: &Term, path_opts: &PathOptions) -> Result<()> { let prompt = "Do you want the files to be written?"; - confirmation_or_break(prompt)?; + confirmation_or_break_default_true(prompt)?; term.clear_screen()?; diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index dbac03be..3bf61189 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -37,7 +37,6 @@ getset = { workspace = true } itertools = { workspace = true } merge = { workspace = true } once_cell = { workspace = true } -open = { workspace = true } pace_error = { workspace = true } pace_time = { workspace = true, features = ["rusqlite"] } parking_lot = { workspace = true, features = ["deadlock_detection"] } @@ -54,7 +53,6 @@ toml = { workspace = true, features = ["indexmap", "preserve_order"] } tracing = { workspace = true } typed-builder = { workspace = true } ulid = { workspace = true, features = ["serde"] } -wildmatch = { workspace = true } [dev-dependencies] eyre = { workspace = true } diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index 10b547fb..859a7634 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -17,8 +17,8 @@ use tracing::debug; use typed_builder::TypedBuilder; use crate::domain::{ - category::PaceCategory, description::PaceDescription, id::Guid, status::ActivityStatusKind, - tag::PaceTagCollection, + category::PaceCategory, description::PaceDescription, id::ActivityGuid, + status::ActivityStatusKind, tag::PaceTagCollection, }; use pace_error::{ActivityLogErrorKind, PaceResult}; @@ -314,39 +314,6 @@ impl ActivityKindOptions { } } -/// The unique identifier of an activity -#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] -pub struct ActivityGuid(Guid); - -impl ActivityGuid { - #[must_use] - pub fn new() -> Self { - Self(Guid::new()) - } - - #[must_use] - pub const fn with_id(id: Guid) -> Self { - Self(id) - } - - #[must_use] - pub const fn inner(&self) -> &Guid { - &self.0 - } -} - -impl Display for ActivityGuid { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - self.0.fmt(f) - } -} - -impl Default for ActivityGuid { - fn default() -> Self { - Self(Guid::new()) - } -} - impl Display for Activity { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let time = self.begin.and_local_timezone(&Local); diff --git a/crates/core/src/domain/activity_log.rs b/crates/core/src/domain/activity_log.rs index 157219d5..b64f2ab4 100644 --- a/crates/core/src/domain/activity_log.rs +++ b/crates/core/src/domain/activity_log.rs @@ -3,7 +3,10 @@ use rayon::iter::{FromParallelIterator, IntoParallelIterator}; use serde_derive::{Deserialize, Serialize}; use std::collections::BTreeMap; -use crate::domain::activity::{Activity, ActivityGuid, ActivityItem}; +use crate::domain::{ + activity::{Activity, ActivityItem}, + id::ActivityGuid, +}; /// The activity log entity /// diff --git a/crates/core/src/domain/category.rs b/crates/core/src/domain/category.rs index 84417ee6..2626827e 100644 --- a/crates/core/src/domain/category.rs +++ b/crates/core/src/domain/category.rs @@ -5,10 +5,7 @@ use std::{convert::Infallible, str::FromStr}; use serde_derive::{Deserialize, Serialize}; use typed_builder::TypedBuilder; -use crate::{ - config::GeneralConfig, - domain::{description::PaceDescription, id::Guid}, -}; +use crate::{config::GeneralConfig, domain::description::PaceDescription, prelude::CategoryGuid}; #[derive(Debug, Serialize, Deserialize, Clone, Eq, Hash, PartialEq, Default, PartialOrd, Ord)] pub struct PaceCategory(String); @@ -143,16 +140,6 @@ pub fn split_category_by_category_separator( } } -/// The category id -#[derive(Debug, Serialize, Deserialize, Clone, Copy)] -pub struct CategoryGuid(Guid); - -impl Default for CategoryGuid { - fn default() -> Self { - Self(Guid::new()) - } -} - impl Default for NewCategory { fn default() -> Self { Self { diff --git a/crates/core/src/domain/filter.rs b/crates/core/src/domain/filter.rs index e7d4790f..61c3c96c 100644 --- a/crates/core/src/domain/filter.rs +++ b/crates/core/src/domain/filter.rs @@ -1,13 +1,8 @@ -use getset::{Getters, MutGetters, Setters}; -use pace_time::time_range::TimeRangeOptions; -use serde_derive::Serialize; use strum::EnumIter; -use typed_builder::TypedBuilder; -use crate::{ - commands::reflect::ReflectCommandOptions, - domain::{activity::ActivityGuid, category::PaceCategory}, -}; +use pace_time::time_range::TimeRangeOptions; + +use crate::domain::id::ActivityGuid; /// Filter for activities #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, EnumIter)] @@ -89,29 +84,3 @@ impl FilteredActivities { } } } - -#[derive( - Debug, TypedBuilder, Serialize, Getters, Setters, MutGetters, Clone, Eq, PartialEq, Default, -)] -#[getset(get = "pub")] -pub struct FilterOptions { - category: Option, - case_sensitive: bool, -} - -impl From for FilterOptions { - fn from(options: ReflectCommandOptions) -> Self { - Self { - category: options.category().clone(), - case_sensitive: *options.case_sensitive(), - } - } -} -impl From<&ReflectCommandOptions> for FilterOptions { - fn from(options: &ReflectCommandOptions) -> Self { - Self { - category: options.category().clone(), - case_sensitive: *options.case_sensitive(), - } - } -} diff --git a/crates/core/src/domain/id.rs b/crates/core/src/domain/id.rs index e0270533..d862fd24 100644 --- a/crates/core/src/domain/id.rs +++ b/crates/core/src/domain/id.rs @@ -1,4 +1,7 @@ -use std::{fmt::Display, str::FromStr}; +use std::{ + fmt::{Display, Formatter}, + str::FromStr, +}; use pace_error::PaceErrorKind; use serde_derive::{Deserialize, Serialize}; @@ -8,6 +11,7 @@ use ulid::Ulid; pub struct Guid(Ulid); impl Guid { + #[must_use] pub fn new() -> Self { Self(Ulid::new()) } @@ -33,7 +37,205 @@ impl FromStr for Guid { } impl Display for Guid { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "Ulid: {}", self.0.to_string()) } } + +/// The unique identifier of an activity +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct ActivityGuid(Guid); + +impl ActivityGuid { + #[must_use] + pub fn new() -> Self { + Self(Guid::new()) + } + + #[must_use] + pub const fn with_id(id: Guid) -> Self { + Self(id) + } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } +} + +impl Display for ActivityGuid { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Default for ActivityGuid { + fn default() -> Self { + Self(Guid::new()) + } +} + +/// The unique identifier of a category +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct CategoryGuid(Guid); + +impl CategoryGuid { + #[must_use] + pub fn new() -> Self { + Self(Guid::new()) + } + + #[must_use] + pub const fn with_id(id: Guid) -> Self { + Self(id) + } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } +} + +impl Display for CategoryGuid { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Default for CategoryGuid { + fn default() -> Self { + Self(Guid::new()) + } +} + +/// The unique identifier of a description +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct DescriptionGuid(Guid); + +impl DescriptionGuid { + #[must_use] + pub fn new() -> Self { + Self(Guid::new()) + } + + #[must_use] + pub const fn with_id(id: Guid) -> Self { + Self(id) + } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } +} + +impl Display for DescriptionGuid { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Default for DescriptionGuid { + fn default() -> Self { + Self(Guid::new()) + } +} + +/// The unique identifier of an activity kind +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct ActivityKindGuid(Guid); + +impl ActivityKindGuid { + #[must_use] + pub fn new() -> Self { + Self(Guid::new()) + } + + #[must_use] + pub const fn with_id(id: Guid) -> Self { + Self(id) + } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } +} + +impl Display for ActivityKindGuid { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Default for ActivityKindGuid { + fn default() -> Self { + Self(Guid::new()) + } +} + +/// The unique identifier of an activity status +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct ActivityStatusGuid(Guid); + +impl ActivityStatusGuid { + #[must_use] + pub fn new() -> Self { + Self(Guid::new()) + } + + #[must_use] + pub const fn with_id(id: Guid) -> Self { + Self(id) + } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } +} + +impl Display for ActivityStatusGuid { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Default for ActivityStatusGuid { + fn default() -> Self { + Self(Guid::new()) + } +} + +/// The unique identifier of a tag +#[derive(Debug, Clone, Serialize, Deserialize, Ord, PartialEq, PartialOrd, Eq, Copy, Hash)] +pub struct TagGuid(Guid); + +impl TagGuid { + #[must_use] + pub fn new() -> Self { + Self(Guid::new()) + } + + #[must_use] + pub const fn with_id(id: Guid) -> Self { + Self(id) + } + + #[must_use] + pub const fn inner(&self) -> &Guid { + &self.0 + } +} + +impl Display for TagGuid { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl Default for TagGuid { + fn default() -> Self { + Self(Guid::new()) + } +} diff --git a/crates/core/src/domain/tag.rs b/crates/core/src/domain/tag.rs index 22d85314..d704a653 100644 --- a/crates/core/src/domain/tag.rs +++ b/crates/core/src/domain/tag.rs @@ -1,10 +1,11 @@ use typed_builder::TypedBuilder; -use ulid::Ulid; use std::{collections::HashSet, convert::Infallible, str::FromStr}; use serde_derive::{Deserialize, Serialize}; +use crate::domain::id::TagGuid; + #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Default)] pub struct PaceTagCollection(HashSet); @@ -82,15 +83,6 @@ impl std::ops::Deref for PaceTag { } } -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone)] -pub struct TagGuid(Ulid); - -impl Default for TagGuid { - fn default() -> Self { - Self(Ulid::new()) - } -} - #[derive(Debug, TypedBuilder, Serialize, Deserialize, PartialEq, Eq, Hash, Clone)] pub struct Tag { #[builder(default, setter(strip_option))] @@ -101,6 +93,7 @@ pub struct Tag { } impl Tag { + #[must_use] pub const fn new(guid: Option, text: String) -> Self { Self { guid, text } } diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 45a8f746..1cdfaef1 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -1,12 +1,11 @@ //! # Pace Core -pub(crate) mod commands; -pub(crate) mod config; -pub(crate) mod domain; -pub(crate) mod service; -pub(crate) mod storage; -pub(crate) mod template; -pub(crate) mod util; +pub mod config; +pub mod domain; +pub mod options; +pub mod storage; +pub mod template; +pub mod util; // Constants pub mod constants { @@ -27,17 +26,6 @@ pub use toml; pub mod prelude { // Public Prelude API pub use crate::{ - commands::{ - adjust::AdjustCommandOptions, - begin::BeginCommandOptions, - docs::DocsCommandOptions, - end::EndCommandOptions, - hold::{HoldCommandOptions, HoldOptions}, - now::NowCommandOptions, - reflect::{ExpensiveFlags, ReflectCommandOptions}, - resume::{ResumeCommandOptions, ResumeOptions}, - DeleteOptions, EndOptions, KeywordOptions, UpdateOptions, - }, config::{ find_root_config_file_path, find_root_project_file, get_activity_log_paths, get_config_paths, get_home_activity_log_path, get_home_config_path, @@ -47,14 +35,17 @@ pub mod prelude { }, domain::{ activity::{ - Activity, ActivityEndOptions, ActivityGroup, ActivityGuid, ActivityItem, - ActivityKind, ActivityKindOptions, ActivitySession, + Activity, ActivityEndOptions, ActivityGroup, ActivityItem, ActivityKind, + ActivityKindOptions, ActivitySession, }, activity_log::ActivityLog, category::{split_category_by_category_separator, PaceCategory}, description::PaceDescription, - filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, - id::Guid, + filter::{ActivityFilterKind, FilteredActivities}, + id::{ + ActivityGuid, ActivityKindGuid, ActivityStatusGuid, CategoryGuid, DescriptionGuid, + Guid, TagGuid, + }, intermission::IntermissionAction, reflection::{ Highlights, ReflectionSummary, ReflectionsFormatKind, SummaryActivityGroup, @@ -63,7 +54,6 @@ pub mod prelude { status::ActivityStatusKind, tag::{PaceTag, PaceTagCollection}, }, - service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}, storage::{ ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, ActivityWriteOps, SyncStorage, diff --git a/crates/core/src/commands.rs b/crates/core/src/options.rs similarity index 51% rename from crates/core/src/commands.rs rename to crates/core/src/options.rs index 086963d4..1baa3f1c 100644 --- a/crates/core/src/commands.rs +++ b/crates/core/src/options.rs @@ -1,21 +1,30 @@ -pub mod adjust; -pub mod begin; -pub mod docs; -pub mod end; -pub mod hold; -pub mod now; -pub mod reflect; -pub mod resume; - -use getset::Getters; +use getset::{Getters, MutGetters, Setters}; use pace_time::date_time::PaceDateTime; +use serde_derive::Serialize; use typed_builder::TypedBuilder; -use crate::{ - commands::{hold::HoldOptions, resume::ResumeOptions}, - domain::category::PaceCategory, +use crate::domain::{ + category::PaceCategory, description::PaceDescription, intermission::IntermissionAction, }; +/// Options for holding an activity +#[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] +#[getset(get = "pub")] +#[non_exhaustive] +pub struct HoldOptions { + /// The action to take on the intermission + #[builder(default)] + action: IntermissionAction, + + /// The start time of the intermission + #[builder(default, setter(into))] + begin_time: PaceDateTime, + + /// The reason for holding the activity + #[builder(default, setter(into))] + reason: Option, +} + /// Options for ending an activity #[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] #[getset(get = "pub")] @@ -61,3 +70,22 @@ pub struct KeywordOptions { #[builder(default, setter(into, strip_option))] category: Option, } + +/// Options for resuming an activity +#[derive(Debug, Clone, PartialEq, TypedBuilder, Eq, Hash, Default, Getters)] +#[getset(get = "pub")] +#[non_exhaustive] +pub struct ResumeOptions { + /// The resume time of the intermission + #[builder(default, setter(into))] + resume_time: Option, +} + +#[derive( + Debug, TypedBuilder, Serialize, Getters, Setters, MutGetters, Clone, Eq, PartialEq, Default, +)] +#[getset(get = "pub")] +pub struct FilterOptions { + category: Option, + case_sensitive: bool, +} diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 63cbe0bb..0c57a8e1 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -1,26 +1,26 @@ #[cfg(feature = "rusqlite")] pub mod rusqlite; +use itertools::Itertools; use std::{ collections::BTreeMap, fmt::{self, Debug, Formatter}, }; +use tracing::debug; -use itertools::Itertools; use pace_error::{PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use tracing::debug; use crate::{ - commands::{ - hold::HoldOptions, resume::ResumeOptions, DeleteOptions, EndOptions, KeywordOptions, - UpdateOptions, - }, domain::{ - activity::{Activity, ActivityGuid, ActivityItem, ActivityKind}, + activity::{Activity, ActivityItem, ActivityKind}, filter::{ActivityFilterKind, FilteredActivities}, + id::ActivityGuid, status::ActivityStatusKind, }, + options::{ + DeleteOptions, EndOptions, HoldOptions, KeywordOptions, ResumeOptions, UpdateOptions, + }, }; impl Debug for dyn ActivityStorage { diff --git a/crates/core/src/storage/rusqlite.rs b/crates/core/src/storage/rusqlite.rs index 6fca53a8..48c9465b 100644 --- a/crates/core/src/storage/rusqlite.rs +++ b/crates/core/src/storage/rusqlite.rs @@ -7,10 +7,11 @@ use rusqlite::{types::FromSql, ToSql}; // TODO: handle PaceTagCollection use crate::{ - domain::id::Guid, - prelude::{ - ActivityGuid, ActivityKind, ActivityStatusKind, PaceCategory, PaceDescription, PaceTag, + domain::id::{ + ActivityGuid, ActivityKindGuid, ActivityStatusGuid, CategoryGuid, DescriptionGuid, Guid, + TagGuid, }, + prelude::{ActivityKind, ActivityStatusKind, PaceCategory, PaceDescription, PaceTag}, }; impl ToSql for ActivityGuid { @@ -116,3 +117,73 @@ impl FromSql for PaceTag { .map_err(|err| rusqlite::types::FromSqlError::Other(Box::new(err))) } } + +impl ToSql for ActivityKindGuid { + fn to_sql(&self) -> rusqlite::Result> { + self.inner().to_sql() + } +} + +impl FromSql for ActivityKindGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::with_id(Guid::from_str(value.as_str()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} + +impl ToSql for ActivityStatusGuid { + fn to_sql(&self) -> rusqlite::Result> { + self.inner().to_sql() + } +} + +impl FromSql for ActivityStatusGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::with_id(Guid::from_str(value.as_str()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} + +impl ToSql for CategoryGuid { + fn to_sql(&self) -> rusqlite::Result> { + self.inner().to_sql() + } +} + +impl FromSql for CategoryGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::with_id(Guid::from_str(value.as_str()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} + +impl ToSql for DescriptionGuid { + fn to_sql(&self) -> rusqlite::Result> { + self.inner().to_sql() + } +} + +impl FromSql for DescriptionGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::with_id(Guid::from_str(value.as_str()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} + +impl ToSql for TagGuid { + fn to_sql(&self) -> rusqlite::Result> { + self.inner().to_sql() + } +} + +impl FromSql for TagGuid { + fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult { + Ok(Self::with_id(Guid::from_str(value.as_str()?).map_err( + |err| rusqlite::types::FromSqlError::Other(Box::new(err)), + )?)) + } +} diff --git a/crates/core/src/template.rs b/crates/core/src/template.rs index e8193fba..ddd78dfd 100644 --- a/crates/core/src/template.rs +++ b/crates/core/src/template.rs @@ -20,6 +20,15 @@ pub static TEMPLATES: Lazy = Lazy::new(|| { }); /// Returns the human duration of the argument. +/// +/// # Errors +/// +/// Returns an error if the argument is not a valid `PaceDuration`. +/// +/// # Returns +/// +/// Returns a `Value` with the human readable duration. +#[allow(clippy::implicit_hasher)] pub fn human_duration(value: &Value, _: &HashMap) -> Result { let Ok(duration) = from_value::(value.clone()) else { return Err(Error::msg(format!( @@ -36,6 +45,7 @@ pub struct PaceReflectionTemplate { } impl PaceReflectionTemplate { + #[must_use] pub fn into_context(self) -> Context { self.context } diff --git a/crates/service/Cargo.toml b/crates/service/Cargo.toml new file mode 100644 index 00000000..07cd5144 --- /dev/null +++ b/crates/service/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "pace_service" +version = "0.1.0" +authors = { workspace = true } +categories = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +keywords = { workspace = true } +license = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } +description = "pace-service - service support library for pace" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +getset = { workspace = true } +pace_core = { workspace = true, features = ["db"] } +pace_error = { workspace = true } +pace_time = { workspace = true, features = ["rusqlite"] } +tracing = { workspace = true } +typed-builder = { workspace = true } +wildmatch = { workspace = true } + +[lints] +workspace = true diff --git a/crates/core/LICENSE b/crates/service/LICENSE similarity index 100% rename from crates/core/LICENSE rename to crates/service/LICENSE diff --git a/crates/core/src/service/activity_store.rs b/crates/service/src/activity_store.rs similarity index 97% rename from crates/core/src/service/activity_store.rs rename to crates/service/src/activity_store.rs index bea8dcc1..923675a1 100644 --- a/crates/core/src/service/activity_store.rs +++ b/crates/service/src/activity_store.rs @@ -10,21 +10,20 @@ use typed_builder::TypedBuilder; use wildmatch::WildMatch; -use crate::{ - commands::{ - hold::HoldOptions, resume::ResumeOptions, DeleteOptions, EndOptions, KeywordOptions, - UpdateOptions, - }, +use pace_core::{ domain::{ - activity::{ - Activity, ActivityGroup, ActivityGuid, ActivityItem, ActivityKind, ActivitySession, - }, + activity::{Activity, ActivityGroup, ActivityItem, ActivityKind, ActivitySession}, category::{self, PaceCategory}, description::PaceDescription, - filter::{ActivityFilterKind, FilterOptions, FilteredActivities}, + filter::{ActivityFilterKind, FilteredActivities}, + id::ActivityGuid, reflection::{SummaryActivityGroup, SummaryGroupByCategory}, status::ActivityStatusKind, }, + options::{ + DeleteOptions, EndOptions, FilterOptions, HoldOptions, KeywordOptions, ResumeOptions, + UpdateOptions, + }, storage::{ ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStorage, ActivityWriteOps, SyncStorage, diff --git a/crates/core/src/service/activity_tracker.rs b/crates/service/src/activity_tracker.rs similarity index 92% rename from crates/core/src/service/activity_tracker.rs rename to crates/service/src/activity_tracker.rs index bf9d9f4a..0aaeff56 100644 --- a/crates/core/src/service/activity_tracker.rs +++ b/crates/service/src/activity_tracker.rs @@ -3,13 +3,11 @@ use pace_time::{time_frame::PaceTimeFrame, time_range::TimeRangeOptions}; use tracing::debug; -use crate::{ - domain::{filter::FilterOptions, reflection::ReflectionSummary}, - service::activity_store::ActivityStore, -}; - +use pace_core::{domain::reflection::ReflectionSummary, options::FilterOptions}; use pace_error::PaceOptResult; +use crate::activity_store::ActivityStore; + // This struct represents the overall structure for tracking activities and their intermissions. pub struct ActivityTracker { pub store: ActivityStore, diff --git a/crates/core/src/service.rs b/crates/service/src/lib.rs similarity index 100% rename from crates/core/src/service.rs rename to crates/service/src/lib.rs diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs index 4bba992a..34146620 100644 --- a/crates/storage/src/entities/activities.rs +++ b/crates/storage/src/entities/activities.rs @@ -1,6 +1,8 @@ use chrono::FixedOffset; use getset::Getters; -use pace_core::prelude::{ActivityGuid, ActivityItem, Guid}; +use pace_core::prelude::{ + ActivityGuid, ActivityItem, ActivityKindGuid, ActivityStatusGuid, DescriptionGuid, +}; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -13,13 +15,13 @@ use crate::storage::SQLiteEntity; #[enum_def] pub struct Activities { pub guid: ActivityGuid, - pub description_guid: Guid, + pub description_guid: DescriptionGuid, pub begin: chrono::DateTime, pub end: Option>, - pub kind_guid: Guid, + pub kind_guid: ActivityKindGuid, pub duration: Option, - pub status_guid: Guid, - pub parent_guid: Option, + pub status_guid: ActivityStatusGuid, + pub parent_guid: Option, } #[derive(Copy, Clone, Debug, EnumIter)] diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs index 94497ab9..8716655e 100644 --- a/crates/storage/src/entities/activity_kinds.rs +++ b/crates/storage/src/entities/activity_kinds.rs @@ -1,5 +1,5 @@ use getset::Getters; -use pace_core::prelude::Guid; +use pace_core::prelude::ActivityKindGuid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -11,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct ActivityKinds { - pub guid: Guid, + pub guid: ActivityKindGuid, pub kind: String, } diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs index 995d298c..bb412f8a 100644 --- a/crates/storage/src/entities/activity_status.rs +++ b/crates/storage/src/entities/activity_status.rs @@ -1,5 +1,5 @@ use getset::Getters; -use pace_core::prelude::Guid; +use pace_core::prelude::ActivityStatusGuid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -11,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct ActivityStatus { - pub guid: Guid, + pub guid: ActivityStatusGuid, pub status: String, } diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs index 37d388d7..5bd286b3 100644 --- a/crates/storage/src/entities/categories.rs +++ b/crates/storage/src/entities/categories.rs @@ -1,5 +1,5 @@ use getset::Getters; -use pace_core::prelude::Guid; +use pace_core::prelude::CategoryGuid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -11,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct Categories { - pub guid: Guid, + pub guid: CategoryGuid, pub category: String, pub description: Option, } diff --git a/crates/storage/src/entities/description.rs b/crates/storage/src/entities/description.rs index c1930609..c112e081 100644 --- a/crates/storage/src/entities/description.rs +++ b/crates/storage/src/entities/description.rs @@ -1,5 +1,5 @@ use getset::Getters; -use pace_core::prelude::{Guid, PaceDescription}; +use pace_core::prelude::{DescriptionGuid, PaceDescription}; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -11,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct Descriptions { - pub guid: Guid, + pub guid: DescriptionGuid, pub description: PaceDescription, } diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs index d3bf2d83..69b7b084 100644 --- a/crates/storage/src/entities/tags.rs +++ b/crates/storage/src/entities/tags.rs @@ -1,5 +1,5 @@ use getset::Getters; -use pace_core::prelude::Guid; +use pace_core::prelude::TagGuid; use rusqlite::{Error, Row}; use sea_query::enum_def; use strum::EnumIter; @@ -11,7 +11,7 @@ use crate::storage::SQLiteEntity; #[getset(get = "pub")] #[enum_def] pub struct Tags { - pub guid: Guid, + pub guid: TagGuid, pub tag: String, } diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index c31792d9..bd859677 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,9 +1,9 @@ pub mod convert; +pub mod entities; pub mod migration; +pub mod query; pub mod storage; -pub mod entities; - use std::sync::Arc; use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs index 5f6427fe..67847391 100644 --- a/crates/storage/src/migration/create_activities_20240325143710.rs +++ b/crates/storage/src/migration/create_activities_20240325143710.rs @@ -30,8 +30,16 @@ impl SQLiteMigration for Migration { .text() .not_null(), ) - .col(ColumnDef::new(ActivitiesIden::Begin).date_time().not_null()) - .col(ColumnDef::new(ActivitiesIden::End).text().null()) + .col( + ColumnDef::new(ActivitiesIden::Begin) + .timestamp_with_time_zone() + .not_null(), + ) + .col( + ColumnDef::new(ActivitiesIden::End) + .timestamp_with_time_zone() + .null(), + ) .col(ColumnDef::new(ActivitiesIden::Duration).integer().null()) .col(ColumnDef::new(ActivitiesIden::KindGuid).text().not_null()) .col(ColumnDef::new(ActivitiesIden::StatusGuid).text().not_null()) diff --git a/crates/storage/src/query.rs b/crates/storage/src/query.rs new file mode 100644 index 00000000..881ac953 --- /dev/null +++ b/crates/storage/src/query.rs @@ -0,0 +1,8 @@ +use pace_error::PaceResult; + +// Lazy loading related entities +trait LazyLoad { + fn query(&self) -> PaceResult> + where + Self: Sized; +} diff --git a/crates/storage/src/storage/file.rs b/crates/storage/src/storage/file.rs index d56906be..fde0ddce 100644 --- a/crates/storage/src/storage/file.rs +++ b/crates/storage/src/storage/file.rs @@ -5,11 +5,15 @@ use std::{ path::{Path, PathBuf}, }; -use pace_core::prelude::{ - Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityLog, - ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, - ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, - KeywordOptions, ResumeOptions, SyncStorage, UpdateOptions, +use pace_core::{ + options::{ + DeleteOptions, EndOptions, HoldOptions, KeywordOptions, ResumeOptions, UpdateOptions, + }, + prelude::{ + Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityLog, + ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStatusKind, + ActivityStorage, ActivityWriteOps, FilteredActivities, SyncStorage, + }, }; use pace_error::{PaceOptResult, PaceResult, TomlFileStorageErrorKind}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; diff --git a/crates/storage/src/storage/in_memory.rs b/crates/storage/src/storage/in_memory.rs index 779507a3..231cfc0d 100644 --- a/crates/storage/src/storage/in_memory.rs +++ b/crates/storage/src/storage/in_memory.rs @@ -11,12 +11,16 @@ use merge::Merge; use rayon::prelude::{IntoParallelRefIterator, ParallelIterator}; use tracing::debug; -use pace_core::prelude::{ - Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, - ActivityKindOptions, ActivityLog, ActivityQuerying, ActivityReadOps, ActivityStateManagement, - ActivityStatusKind, ActivityStorage, ActivityWriteOps, DeleteOptions, EndOptions, - FilteredActivities, HoldOptions, KeywordOptions, PaceCategory, ResumeOptions, SyncStorage, - UpdateOptions, +use pace_core::{ + options::{ + DeleteOptions, EndOptions, HoldOptions, KeywordOptions, ResumeOptions, UpdateOptions, + }, + prelude::{ + Activity, ActivityEndOptions, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, + ActivityKindOptions, ActivityLog, ActivityQuerying, ActivityReadOps, + ActivityStateManagement, ActivityStatusKind, ActivityStorage, ActivityWriteOps, + FilteredActivities, PaceCategory, SyncStorage, + }, }; use pace_error::{ActivityLogErrorKind, PaceOptResult, PaceResult}; diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index f14169ed..a9495cae 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -2,17 +2,21 @@ use std::collections::BTreeMap; use itertools::Itertools; use rusqlite::Connection; +use sea_query::{Expr, Query, SqliteQueryBuilder}; +use tracing::debug; -use pace_core::prelude::{ - Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityQuerying, - ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, - ActivityWriteOps, DeleteOptions, EndOptions, FilteredActivities, HoldOptions, KeywordOptions, - ResumeOptions, SyncStorage, UpdateOptions, +use pace_core::{ + options::{ + DeleteOptions, EndOptions, HoldOptions, KeywordOptions, ResumeOptions, UpdateOptions, + }, + prelude::{ + Activity, ActivityFilterKind, ActivityGuid, ActivityItem, ActivityKind, ActivityQuerying, + ActivityReadOps, ActivityStateManagement, ActivityStatusKind, ActivityStorage, + ActivityWriteOps, FilteredActivities, SyncStorage, + }, }; use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; -use sea_query::{Expr, Query, SqliteQueryBuilder}; -use tracing::debug; use crate::{ convert::Convert, diff --git a/src/commands/adjust.rs b/src/commands/adjust.rs index 066fe59b..4f7e019f 100644 --- a/src/commands/adjust.rs +++ b/src/commands/adjust.rs @@ -2,12 +2,11 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_cli::commands::adjust::AdjustCommandOptions; use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; -use pace_core::prelude::AdjustCommandOptions; - /// `adjust` subcommand #[derive(Command, Debug, Parser)] pub struct AdjustCmd { diff --git a/src/commands/begin.rs b/src/commands/begin.rs index e964c45b..e1fe2fb4 100644 --- a/src/commands/begin.rs +++ b/src/commands/begin.rs @@ -2,12 +2,11 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_cli::commands::begin::BeginCommandOptions; use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; -use pace_core::prelude::BeginCommandOptions; - /// `begin` subcommand #[derive(Command, Debug, Parser)] pub struct BeginCmd { diff --git a/src/commands/docs.rs b/src/commands/docs.rs index 06fcbc38..5d974fbf 100644 --- a/src/commands/docs.rs +++ b/src/commands/docs.rs @@ -2,7 +2,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Args; -use pace_core::prelude::DocsCommandOptions; +use pace_cli::commands::docs::DocsCommandOptions; use crate::application::PACE_APP; diff --git a/src/commands/end.rs b/src/commands/end.rs index 3fc99642..89d69c5f 100644 --- a/src/commands/end.rs +++ b/src/commands/end.rs @@ -2,12 +2,11 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_cli::commands::end::EndCommandOptions; use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; -use pace_core::prelude::EndCommandOptions; - /// `end` subcommand #[derive(Command, Debug, Parser)] pub struct EndCmd { diff --git a/src/commands/hold.rs b/src/commands/hold.rs index 45f986be..dfccb61f 100644 --- a/src/commands/hold.rs +++ b/src/commands/hold.rs @@ -3,7 +3,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; -use pace_core::prelude::HoldCommandOptions; +use pace_cli::commands::hold::HoldCommandOptions; use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/now.rs b/src/commands/now.rs index a6d4103c..21715723 100644 --- a/src/commands/now.rs +++ b/src/commands/now.rs @@ -2,12 +2,11 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; +use pace_cli::commands::now::NowCommandOptions; use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; -use pace_core::prelude::NowCommandOptions; - /// `now` subcommand #[derive(Command, Debug, Parser)] pub struct NowCmd { diff --git a/src/commands/reflect.rs b/src/commands/reflect.rs index bda04713..eea21713 100644 --- a/src/commands/reflect.rs +++ b/src/commands/reflect.rs @@ -6,7 +6,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; -use pace_core::prelude::ReflectCommandOptions; +use pace_cli::commands::reflect::ReflectCommandOptions; use pace_storage::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/resume.rs b/src/commands/resume.rs index db617d5d..dde42447 100644 --- a/src/commands/resume.rs +++ b/src/commands/resume.rs @@ -5,12 +5,16 @@ use abscissa_core::{status_err, tracing::debug, Application, Command, Runnable, use clap::Parser; use eyre::Result; -use pace_cli::{confirmation_or_break, prompt_resume_activity}; -use pace_core::prelude::{ - ActivityQuerying, ActivityReadOps, ActivityStateManagement, ActivityStore, - ResumeCommandOptions, ResumeOptions, SyncStorage, +use pace_cli::{ + commands::resume::ResumeCommandOptions, + prompt::{confirmation_or_break_default_true, prompt_resume_activity}, +}; +use pace_core::{ + options::ResumeOptions, + prelude::{ActivityQuerying, ActivityReadOps, ActivityStateManagement, SyncStorage}, }; use pace_error::UserMessage; +use pace_service::activity_store::ActivityStore; use pace_storage::get_storage_from_config; use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; @@ -113,7 +117,7 @@ impl ResumeCmd { Err(recoverable_err) if recoverable_err.possible_new_activity_from_resume() => { debug!("Activity to resume: {:?}", activity_item.activity()); - confirmation_or_break( + confirmation_or_break_default_true( "We can't resume this already ended activity. Do you want to begin one with the same contents?", )?; diff --git a/src/commands/settings/set.rs b/src/commands/settings/set.rs index fe7cd7de..fe58c0a8 100644 --- a/src/commands/settings/set.rs +++ b/src/commands/settings/set.rs @@ -1,7 +1,7 @@ use abscissa_core::{Command, Runnable}; use clap::{Parser, Subcommand}; -use pace_cli::prompt_time_zone; +use pace_cli::prompt::prompt_time_zone; use pace_core::prelude::PaceConfig; use crate::prelude::PACE_APP; diff --git a/src/commands/setup/config.rs b/src/commands/setup/config.rs index c41ec2ef..e418ce5f 100644 --- a/src/commands/setup/config.rs +++ b/src/commands/setup/config.rs @@ -6,7 +6,7 @@ use abscissa_core::{status_warn, Application, Command, Runnable, Shutdown}; use clap::Parser; use dialoguer::console::Term; -use pace_cli::{setup_config, PathOptions}; +use pace_cli::setup::{setup_config, PathOptions}; use crate::prelude::PACE_APP; diff --git a/tests/integration/activity_store.rs b/tests/integration/activity_store.rs index 457d8bec..35b0874f 100644 --- a/tests/integration/activity_store.rs +++ b/tests/integration/activity_store.rs @@ -2,12 +2,15 @@ use std::sync::Arc; -use pace_core::prelude::{ - Activity, ActivityFilterKind, ActivityGuid, ActivityReadOps, ActivityStateManagement, - ActivityStatusKind, ActivityStore, ActivityWriteOps, DeleteOptions, EndOptions, HoldOptions, - PaceCategory, PaceDescription, PaceTagCollection, ResumeOptions, UpdateOptions, +use pace_core::{ + options::{DeleteOptions, EndOptions, HoldOptions, ResumeOptions, UpdateOptions}, + prelude::{ + Activity, ActivityFilterKind, ActivityGuid, ActivityReadOps, ActivityStateManagement, + ActivityStatusKind, ActivityWriteOps, PaceCategory, PaceDescription, PaceTagCollection, + }, }; use pace_error::TestResult; +use pace_service::activity_store::ActivityStore; use pace_storage::storage::in_memory::InMemoryActivityStorage; use crate::util::{ diff --git a/tests/integration/activity_tracker.rs b/tests/integration/activity_tracker.rs index 6e51c262..3c3270f2 100644 --- a/tests/integration/activity_tracker.rs +++ b/tests/integration/activity_tracker.rs @@ -1,12 +1,14 @@ //! Test the `ActivityStore` implementation with a `InMemoryStorage` backend. use chrono::NaiveDate; -use pace_core::prelude::{ActivityStore, ActivityTracker, FilterOptions}; -use pace_error::TestResult; -use pace_time::{duration::PaceDuration, time_range::TimeRangeOptions}; use rstest::rstest; use similar_asserts::assert_eq; +use pace_core::options::FilterOptions; +use pace_error::TestResult; +use pace_service::{activity_store::ActivityStore, activity_tracker::ActivityTracker}; +use pace_time::{duration::PaceDuration, time_range::TimeRangeOptions}; + use crate::util::setup_activity_store_for_activity_tracker; #[rstest] diff --git a/tests/integration/util.rs b/tests/integration/util.rs index d17daff4..26a9f1cc 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -5,9 +5,10 @@ use rstest::fixture; use pace_core::prelude::{ Activity, ActivityGuid, ActivityItem, ActivityKind, ActivityKindOptions, ActivityLog, - ActivityStatusKind, ActivityStore, PaceCategory, PaceDescription, PaceTagCollection, + ActivityStatusKind, PaceCategory, PaceDescription, PaceTagCollection, }; use pace_error::TestResult; +use pace_service::activity_store::ActivityStore; use pace_storage::storage::{file::TomlActivityStorage, in_memory::InMemoryActivityStorage}; use pace_time::date_time::PaceDateTime; diff --git a/tests/journey/hold_resume.rs b/tests/journey/hold_resume.rs index 41a6947e..69f5471a 100644 --- a/tests/journey/hold_resume.rs +++ b/tests/journey/hold_resume.rs @@ -1,6 +1,8 @@ -use pace_core::prelude::{ - Activity, ActivityQuerying, ActivityReadOps, ActivityStateManagement, HoldOptions, - PaceDescription, ResumeOptions, +use pace_core::{ + options::{HoldOptions, ResumeOptions}, + prelude::{ + Activity, ActivityQuerying, ActivityReadOps, ActivityStateManagement, PaceDescription, + }, }; use pace_error::TestResult; use pace_storage::storage::in_memory::InMemoryActivityStorage; diff --git a/tests/journey/start_finish_different_time_zone.rs b/tests/journey/start_finish_different_time_zone.rs index 4a2da653..6ced2a58 100644 --- a/tests/journey/start_finish_different_time_zone.rs +++ b/tests/journey/start_finish_different_time_zone.rs @@ -1,7 +1,8 @@ use chrono::FixedOffset; use eyre::OptionExt; -use pace_core::prelude::{ - Activity, ActivityReadOps, ActivityStateManagement, EndOptions, PaceDescription, +use pace_core::{ + options::EndOptions, + prelude::{Activity, ActivityReadOps, ActivityStateManagement, PaceDescription}, }; use pace_error::TestResult; use pace_storage::storage::in_memory::InMemoryActivityStorage; From 3383d2b6a0f8f51e3b01667cac0f6699006277d1 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:00:42 +0100 Subject: [PATCH 40/59] refactor commands Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 1 + Cargo.toml | 2 +- crates/service/Cargo.toml | 1 + crates/service/src/lib.rs | 47 +++++++++++++++++++++++++++++++++++++++ crates/storage/src/lib.rs | 47 --------------------------------------- src/commands/adjust.rs | 2 +- src/commands/begin.rs | 2 +- src/commands/end.rs | 2 +- src/commands/hold.rs | 2 +- src/commands/now.rs | 2 +- src/commands/reflect.rs | 2 +- src/commands/resume.rs | 3 +-- 12 files changed, 57 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58545d0b..023b8758 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1417,6 +1417,7 @@ dependencies = [ "getset", "pace_core", "pace_error", + "pace_storage", "pace_time", "tracing", "typed-builder", diff --git a/Cargo.toml b/Cargo.toml index ff0a2ee4..d8b03ce3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -116,7 +116,6 @@ pace_cli = { workspace = true } pace_core = { workspace = true, features = ["cli"] } pace_error = { workspace = true } pace_service = { workspace = true } -pace_storage = { workspace = true } pace_time = { workspace = true, features = ["cli", "db"] } serde = { workspace = true } serde_derive = { workspace = true } @@ -136,6 +135,7 @@ assert_cmd = { workspace = true } insta = { workspace = true, features = ["toml"] } insta-cmd = { workspace = true } once_cell = { workspace = true } +pace_storage = { workspace = true } predicates = { workspace = true } rstest = { workspace = true } similar-asserts = { workspace = true } diff --git a/crates/service/Cargo.toml b/crates/service/Cargo.toml index 07cd5144..1e39f21d 100644 --- a/crates/service/Cargo.toml +++ b/crates/service/Cargo.toml @@ -17,6 +17,7 @@ description = "pace-service - service support library for pace" getset = { workspace = true } pace_core = { workspace = true, features = ["db"] } pace_error = { workspace = true } +pace_storage = { workspace = true } pace_time = { workspace = true, features = ["rusqlite"] } tracing = { workspace = true } typed-builder = { workspace = true } diff --git a/crates/service/src/lib.rs b/crates/service/src/lib.rs index 5e21f2a6..7bb3e77a 100644 --- a/crates/service/src/lib.rs +++ b/crates/service/src/lib.rs @@ -5,3 +5,50 @@ pub mod activity_store; pub mod activity_tracker; + +use std::sync::Arc; + +use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; +use pace_error::{DatabaseStorageErrorKind, PaceResult}; +use tracing::debug; + +use pace_storage::storage::{ + file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SqliteActivityStorage, +}; + +/// Get the storage backend from the configuration. +/// +/// # Arguments +/// +/// * `config` - The application configuration. +/// +/// # Errors +/// +/// This function should return an error if the storage backend cannot be created or is not supported. +/// +/// # Returns +/// +/// The storage backend. +pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { + let storage: Arc = match config.storage().storage() { + ActivityLogStorageKind::File { location } => Arc::new(TomlActivityStorage::new(location)?), + ActivityLogStorageKind::Database { kind, url } => match kind { + DatabaseEngineKind::Sqlite => { + debug!("Connecting to database: {}", url); + + Arc::new(SqliteActivityStorage::new(url.clone())?) + } + engine => { + return Err( + DatabaseStorageErrorKind::UnsupportedDatabaseEngine(engine.to_string()).into(), + ) + } + }, + ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), + _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), + }; + + debug!("Using storage backend: {:?}", storage); + + Ok(storage) +} diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index bd859677..2ac9eaff 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -3,50 +3,3 @@ pub mod entities; pub mod migration; pub mod query; pub mod storage; - -use std::sync::Arc; - -use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; -use pace_error::{DatabaseStorageErrorKind, PaceResult}; -use tracing::debug; - -use crate::storage::{ - file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SqliteActivityStorage, -}; - -/// Get the storage backend from the configuration. -/// -/// # Arguments -/// -/// * `config` - The application configuration. -/// -/// # Errors -/// -/// This function should return an error if the storage backend cannot be created or is not supported. -/// -/// # Returns -/// -/// The storage backend. -pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { - let storage: Arc = match config.storage().storage() { - ActivityLogStorageKind::File { location } => Arc::new(TomlActivityStorage::new(location)?), - ActivityLogStorageKind::Database { kind, url } => match kind { - DatabaseEngineKind::Sqlite => { - debug!("Connecting to database: {}", url); - - Arc::new(SqliteActivityStorage::new(url.clone())?) - } - engine => { - return Err( - DatabaseStorageErrorKind::UnsupportedDatabaseEngine(engine.to_string()).into(), - ) - } - }, - ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), - _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), - }; - - debug!("Using storage backend: {:?}", storage); - - Ok(storage) -} diff --git a/src/commands/adjust.rs b/src/commands/adjust.rs index 4f7e019f..59f16dde 100644 --- a/src/commands/adjust.rs +++ b/src/commands/adjust.rs @@ -3,7 +3,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_cli::commands::adjust::AdjustCommandOptions; -use pace_storage::get_storage_from_config; +use pace_service::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/begin.rs b/src/commands/begin.rs index e1fe2fb4..909b173f 100644 --- a/src/commands/begin.rs +++ b/src/commands/begin.rs @@ -3,7 +3,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_cli::commands::begin::BeginCommandOptions; -use pace_storage::get_storage_from_config; +use pace_service::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/end.rs b/src/commands/end.rs index 89d69c5f..6a5add56 100644 --- a/src/commands/end.rs +++ b/src/commands/end.rs @@ -3,7 +3,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_cli::commands::end::EndCommandOptions; -use pace_storage::get_storage_from_config; +use pace_service::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/hold.rs b/src/commands/hold.rs index dfccb61f..059e7c3b 100644 --- a/src/commands/hold.rs +++ b/src/commands/hold.rs @@ -4,7 +4,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_cli::commands::hold::HoldCommandOptions; -use pace_storage::get_storage_from_config; +use pace_service::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/now.rs b/src/commands/now.rs index 21715723..1b56ce21 100644 --- a/src/commands/now.rs +++ b/src/commands/now.rs @@ -3,7 +3,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_cli::commands::now::NowCommandOptions; -use pace_storage::get_storage_from_config; +use pace_service::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/reflect.rs b/src/commands/reflect.rs index eea21713..2b7698ba 100644 --- a/src/commands/reflect.rs +++ b/src/commands/reflect.rs @@ -7,7 +7,7 @@ use abscissa_core::{status_err, Application, Command, Runnable, Shutdown}; use clap::Parser; use pace_cli::commands::reflect::ReflectCommandOptions; -use pace_storage::get_storage_from_config; +use pace_service::get_storage_from_config; use crate::prelude::PACE_APP; diff --git a/src/commands/resume.rs b/src/commands/resume.rs index dde42447..0acad6f9 100644 --- a/src/commands/resume.rs +++ b/src/commands/resume.rs @@ -14,8 +14,7 @@ use pace_core::{ prelude::{ActivityQuerying, ActivityReadOps, ActivityStateManagement, SyncStorage}, }; use pace_error::UserMessage; -use pace_service::activity_store::ActivityStore; -use pace_storage::get_storage_from_config; +use pace_service::{activity_store::ActivityStore, get_storage_from_config}; use pace_time::{date_time::PaceDateTime, time_zone::PaceTimeZoneKind, Validate}; use crate::prelude::PACE_APP; From 52c8c54c39240d8be8280466d223a60a2bcaedcd Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:10:47 +0100 Subject: [PATCH 41/59] add docs to service Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/cli/README.md | 10 +++++ crates/service/README.md | 89 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 crates/service/README.md diff --git a/crates/cli/README.md b/crates/cli/README.md index 9b9369ee..a9a8eaae 100644 --- a/crates/cli/README.md +++ b/crates/cli/README.md @@ -33,6 +33,16 @@ You can ask questions in the | Discord | [![Discord](https://dcbadge.vercel.app/api/server/RKSWrAcYdG?style=flat-square)](https://discord.gg/RKSWrAcYdG) | | Discussions | [GitHub Discussions](https://github.com/orgs/pace-rs/discussions) | +## Crate features + +This crate exposes a few features for controlling dependency usage: + +- **clap** - Enables a dependency on the `clap` crate and enables parsing from + the commandline. *This feature is enabled by default*. + +- **cli** - Enables support for CLI features by enabling `merge` and `clap` + features. *This feature is enabled by default*. + ## Examples TODO! diff --git a/crates/service/README.md b/crates/service/README.md new file mode 100644 index 00000000..4471a514 --- /dev/null +++ b/crates/service/README.md @@ -0,0 +1,89 @@ +

+ +

+

pace-service - a service library for the pace ecosystem

+ +

+ + + + +

+ +## About + +`pace-service` is a library to support timetracking on the command line. It is +the service library for the `pace` timetracking application. + +⚠️ **Note:** `pace-service` is currently in active development and is not yet +ready for production use. Expect breaking changes and incomplete features. We +encourage you to try it out and provide feedback, but please be aware that it is +not yet stable. + +## Contact + +You can ask questions in the +[Discussions](https://github.com/orgs/pace-rs/discussions) or have a look at the +[FAQ](https://pace.cli.rs/docs/FAQ.html). + +| Contact | Where? | +| ------------- | --------------------------------------------------------------------------------------------------------------- | +| Issue Tracker | [GitHub Issues](https://github.com/pace-rs/pace/issues/new/choose) | +| Discord | [![Discord](https://dcbadge.vercel.app/api/server/RKSWrAcYdG?style=flat-square)](https://discord.gg/RKSWrAcYdG) | +| Discussions | [GitHub Discussions](https://github.com/orgs/pace-rs/discussions) | + + + +## Examples + +TODO! + +## Contributing + +Found a bug? [Open an issue!](https://github.com/pace-rs/pace/issues/new/choose) + +Got an idea for an improvement? Don't keep it to yourself! + +- [Contribute fixes](https://github.com/pace-rs/pace/contribute) or new features + via a pull requests! + +Please make sure, that you read the +[contribution guide](https://pace.cli.rs/docs/contributing_to_pace.html). + +## Code of Conduct + +Please review and abide by the general +[Rust Community Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct) +when contributing to this project. In the future, we might create our own Code +of Conduct and supplement it at this location. + +## Minimum Rust version policy + +This crate's minimum supported `rustc` version is `1.74.1`. + +The current policy is that the minimum Rust version required to use this crate +can be increased in minor version updates. For example, if `crate 1.0` requires +Rust 1.20.0, then `crate 1.0.z` for all values of `z` will also require Rust +1.20.0 or newer. However, `crate 1.y` for `y > 0` may require a newer minimum +version of Rust. + +In general, this crate will be conservative with respect to the minimum +supported version of Rust. + +## License + +**AGPL-3.0-or-later**; see [LICENSE](./LICENSE). From 73b3f75a71ee8febefb683ad35aa35a3ba499ec2 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:19:19 +0100 Subject: [PATCH 42/59] add ecosystem png Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/ecosystem.png | Bin 0 -> 1009671 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 crates/ecosystem.png diff --git a/crates/ecosystem.png b/crates/ecosystem.png new file mode 100644 index 0000000000000000000000000000000000000000..97acc73280f9fdc1e4665f651b95a2b3bc00e57e GIT binary patch literal 1009671 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

e#u>prBo-@^$KHJ6U)t0GJc$2 z&|l2ch#{`(}fkdm4 z;2J#aky0X$LT5ND$ihi}1)dGyAftN+{C6uaO?NJdw?;HrfCvFAJ48Izs^ zA5;5-GLP@&mp=d08Ag64Ygys@omnZm>Bl`YKvR%@rd|6gkUZy*J#%&iJe)kNYUp$6 zc`Y`a()jrONy!6rO8KUCtTJEn=(A5;_W4W}KN)zw9x4#UtQ)*0kbeApKSlbViVA4_ zARC3e51;JeGvv=DT+p{4Jzwcxb*EE(?_EGRW=B+`-`AO}#(`tZ=rh;NFtHC<94_`d z#R;?1#Rxy{1%*a&YH9L}UP=pi!8PNDCl)NASpC})K>i-i8GdC25idpuQkoXp!T=?e z6&cq)68JH8CGT;e1Tn?*ngnCL&yR=PO&B1}P{IaQ62qLZO@C|Nl3}dL0U|Yn%QjWD zfK{YunOa#CUL%ZLUabp`Ml=hd=LpM)aey-bv? z=+;db@L?9YUN^BDLIYtt>7%d=Iiw+R=dTOr=ZVMxvHn+ zUM?$uN$L3p_H6fQ)X>`)XA)&vVosgeI#(8R_iCO<{eFxMES6%N^oiffG|T zFXej>rPvoP8QZj{tejPbi7@6`tl!0I+xpk-%*VsPZ1M3GS1E5FXD6ro1#5yHp7%rc zzbNnjs|`j09;{4W?;U(Zfzm zPbN1wLs$zY`ywkC!33?vz6p0`%SOp`i@}kkJ-h4Gs52wxacO!cUB6az2pZKHLY6xe zZI(`ZP#DJe-p~=7pTW@g3;>>@E7BT)fo=-0yWsGlwj0m)ou$e>i;(CniWzT8HepCOXeJ|0C-ck*U7QU#T|6;NKtMLgL z@Q-bBz2i0?`bNN!p&%UmH_uB2KEgDH_w3qf>HK~P?(4}DoV;X{?>xJ z+TpOg$mO>wKn1kFvPwP_1Pkdxj3B57a|S^`g8Ceg#Tw#lrWQD1qM*~ENCfGEG^W8| zlQ~Mpql!>5naWm|jD}Q3dVn~iu%KL0aTje_qJd@_#2i$7r2^I*7aCECRy;XSlZ~*` z>5I#}ghg_6vG(M8+!}nzT%a9fx5rViAW{lM%^a^;6w{MSLXpLQG7%oWsG@syhB&Yx z(;b~S8))hRcr50Lk%h(}PXQu>#}@sFw3YmUypx;<7wk z#8jwb8(qofBN&6xmr2c-&?$^w&q;4{0>>`lhMik%PNg1zpB;*bnB#EGQpyWvb2Xl!q!DT}(c<)UPtISD!Q-pbg{jTykC!0_(V z?nI8zxz3Dpw5&8yRhtXW$`+S4M^Ud}@zPh4Bz%phiuV{@Z5vtvaAi2n4=7_8%B`6C zKZhSwHm|qK2?#L4QLdfUxKfcF2KKL$v zDUFGI9_w9uEkCFT+`G)TEbEUpYE(=)&j^uMRcBSE5%AzvKbz4r+Eh0Qqo1D~R_BW^ z!UB>U2N15sRPRF2iwtV~H45=c zIND6X?_zV(iQeJW`a@x=)d^E$YLyD{^FlP0?^vKR3u{`quK4B(9hBZ1rG|*eY~n;) zePfw!zc*+ElNkN4=%c%-O3f?uHGUhkq$k}u#;&Y`o{T#s6Eo|70%-J5TNAh`HU}F9 zG6uD{g;6>oI8wyj7#S07!{G{RLe&ZY+=&EL35yE*v@{ zU08YYVAK^_6Au? zz-tv@%KmNVZiqwHB)#Vx7F0&X$?uF#y0d<(F`_h5;>Ku^4k)8b4dsgp&@&M_E2K$s z6+XJ@!eMYVef|}#phfFji>xaMlTrHaI&x1an|4fM^tnpKSxtLTRr%jq*k z?YPlzg5>hRLOPKUtj~Vr9Iw53{`<%!+OCJmD74WTYW0)0e^*!dPiR+vUhg|vsPOnl zPp~-2&aeFR+aV>&>-~N=VBY*kN>)}=J-}i{6jhD9FFqU5Hc<`Ma!~Q(mgE;H6NXYk zT&Go`Oa0l%GvQrbR~2s%?NyC`7t_Y`&QL5JZj5ubW@aGB_E?VNe9`%hqF`%$YWHLV zt#)t7sqL^@zDYn~c`LD`69SJ3Zjk<~!1I`W@iJ%1A(kmO#Wj77t zOuwINmHEFAl(H6djS*G!Jl#0ZgX@OUSF{xJE81Bp!DlQ*XCrA{WxnSrfR40c`}LHr zB7N=Hr2`;BRME~%msrlA$a={F_fS*K2EkdZX7E1F7EuQzvk2!K(;YbR!T!Zt)2Dh6 zi~gx=75-D?gXCD~OigE7D}9a+zMNxq`AI1)nz`}GFST+2Y2CiH^=$o{;9~`Yw_yWb zzEfBQ8k^X9=zjvoVY-3SFh<=b^XumqC+q2FZzbOUgb@HlMSJeW!BwQSaY2 z0WNRPeQ#C#EDk-f=s?+<9ULYS1|yW=F3&_HUdeGmib&Y*n)f)r^!kG~pZMW^(Sx8! z6%uc;A$$m&Bs|eb!Ik{N;$Q}Gfk;Y{PK|DiEcnn^j`5Q;5@}yvz&ItT*b3lQ51@vKsJ}#$3vfmF};{ui8SLs9iEh^$o;GJ5F4vT>U zoOdu!`hkWtRQ9v}hb+ivIjV^!s>DjiyAjmKDJbErI0~Ex+1uh0nU$I043}_-@tIoA zD}UfYBuNg{K#IhRsx;!s+{rvF{T%5s2obX_JUC4zpiFxCa0YSiOS-$+oT+bNQ^k;V%Z0V7LR)qOetQrLx6PsBa z`8AqQJ&D&?I{OW-3x7EAczp_04k9PF_kl=o{ z<($qXe~+t7B@3}rXYc#vvE*mtL$O0Lq!*Yl?BhX`naCc?^w}LE+V7@voDix;3v{12uCsFR^`8=5d<~vS-Ee>QFB^ zq({32Ni8D!7QKaWt$fu&F6%+=VQ<}31({s?A5o3Cw7&fMXXTq2f9KEpHwbS0$Rtt> zB4?hJ+-i?*(*#M+7W}2oFk64^Dq0+{ReNcWV6AX#;Z4>t6o=y!4-=-m;ZbA-pz`*$ zpCSz=8&zDCg{l9m7Jw%~`$YCb*q6Fid%;AGWnGP3y*&$Vu)!kH1ddiB_KWBpQQs$w zuo9`uokj~SZPS}ortDCrGROMi-kPK>pZgD94t&`M-FbiDP$y}Zat_6-A(!(#Qwc4RKrCFe+#^QR5cP%de4tB&oRCc7 zEx$uDxGbx+*5B*iD!={TM(TW&E+9wv5r)2RzP`3B`1WyTULeYb4bH@_Zqhr;@i_j6 zQ?r9<@NVBeKZ8w7gB?@(;dMzWbKz|pE-a6ePTeR zltO^BPbo>>S4uI2Cce2T-~yw7Y>Q<0U?fHio-EwwMG?w6r}}$Hj?iOHmX9wnln#7l z(nbQ4EHdJ+FM_PCc?iY{3M6B9D-Og2B~R(r+R+gf7XO8cJjcjp z{-zzA#W(R<6CC(MkVm?%&y>M;5+43V)onSBnK!~{FUjz` z-oN9R<83h&F1qY~^PKvbx4Zx`L8U+#21vPcpN$gZ^`g zUw3@0Oi`ZRpLQWIC0e~QZ<<@-pyZ!}%HJ*+pQ%ql;jvWxl@tc&UFEQFSh~E$3z1Y} z9xxeN5u!b4Erx<)ezZ$;yO|NsGc-Z;XDLdphrLlBRy&7msxV4@&G3Hn&xhA{)Xg5y z@ZFnOrV&cC9`F4wgO?$|H2?xwV>P<-P7zfB>NOSn$rQ&3W^<>xzo^0^oDCdO z9o^gL>a67WEH=k(y|5Z*QaWLKIUXl;&$TCVn$*qENB6nYM^iCq7y?wZ(wth=XeJ1t zl#aid*0Hnf|Hs!ic2~A=YbL4Kw(Vrcwrx8VRBW3&wo`E` zHY&F5q+;84y6(As-tHdbj{XDd!N`|F_UyN>_q&`7HkUbuhrSq7gf0zvPkzdqnar4;Mh)(adb zaMHvV;ex?;1RvlB60%10vOv4`DUT+$DW1ZT?A0bFJzo1!D0zh(nt^ZR*hC3IY?vz0 zCQy@OZGST=7LB(HqDiJfV28?)n}LcWBDDxSq$a{PxcuStTQtX9#hoIn{`t2k{HjSp1U zo>E6|ec-UnB*t9B(ms2sqkPqHY+QM{*`$pDC(%bD`d}uY&A6CB3i(*Km?MGhRyU>i zHIj7Q=Zn~Chdi$qVPBI$`!5I-qHk(S0Ln3fmc!cPliP(LO_oZeXf-c#k-izVe#IKb zRO~|IV4nOmZz6n^V=S!R_>xJzbIxNuD)O}|fR@62>17u#rBvzAAUra|1vkMIyd>wf zSjIEaR}G5cjb}#yd*KbZ+HCcwaWcMtG66%&xVYRrK5jp%f4aY0y$Z1=#;ddIesq_? z`srTy!o4?N#M+hzQ=77Ya*5+)AQSO)KHLbU1rzAN}Z`7QccU3|HA#J;S9t7 z=2QPIw0MC@B?_NoPVKL&9Y5@T5qX~oX4-W>a6m%AQ+|9x&nZwWAOE@p1#YR04?REY zT|IPM>>V;hhE<#HGJ`=wy0J@K&lI3mrl$`KbtWPc#eoV0<0Hvnw;$Q7Oh3@Dxk0Mq zfJ0^!L1x3+$vPAptp&qwJdn)*nTLXLz-7Rx4Ty_^mY+2s-y)w?5=b6Iz7GUP$C4sz zZnL#%NS(lliv5TWCt`gn1Eo*utktFHnh_1Q9CCye$ZsYw6PXhxH7T@j4ZD@6E+3wn`at7ay6z6yk&Y)>e<8;SN!U;CZI1m-mnJMI zHbtEpLHtW+cV^=jXqKNefPe1oAPMD?UF5ZvxhucrC=@f`K%nFauSrak41%^B1}9xv(*%ps5MkUCBfQ zY>5%vYHBXMr*8c6vF=>P#eMq8y9B&9>a0AYuzN%oAR@)}$Kzb?u`>^kZtjsYOOo*` zCmaQB&&&?0s1?;XIcTXRLA@}d+25si;=piCB*ZUr$84gyu6lx63qa_`(P^10;%7-~ z;R90q5f5#$3lj<`EpvWwiJ>!Pq7>~Mo>=6jZ}Nc?_XktW=im?frtpkN?)&jaXO}G@ zxO>_EUt|3(q=&c0`{*c_+j|=CE-Il^uyZ%u-@|J!Ycr%g9*9K?S!T`(%Sj6^Icu%g z1Nm9NgKxcK6ZhK0Skole6_-@%{X+DlEC#$`Jx6jSNByA(zR+UTg!NFh;TErH2wb3O zO08yEI84iF*eVZSwiFkF$)8Ql#&sbwX`qyh-le(q695F#mmy^~)KmE;%40%^-7DFs zP3$h38K_#%I|7~xPYuT2N2NrO7I42=T*T!;>)$grUE#DsYYpUD6%N`}8a1>x(w6UG zLwQ?!)Z|K_ANKG(4Xuls^b3dN^uOt?O!q)5GsV2JeT+;eREp+Gwl<$1#Ka92Cp~ax zD)YMIU5q9J!Uf;b1(Z739^sDO0F7LLs$1*a0hE1%qAtE_!&+jMY}NaD?A$J$7{2-{Asw7>&u<_QZ#KD6t05|GA2ow(0Q$mqM5ywM@JcNeV=%ItwHfIAb~%B@MVB zS7GmwBxdT1zNd}=P9vOx9_?^y?33ZB^$DW1nn*qFag9y~#?;CM5lK4;q3cK>%iSt+ z2a-owiY?zpV+VZHDw>%rCMdCo=7*y3p2kIa@Q62j-0#8e4F>*cXjd z7z~qM)IqlS`dFYl3a*u)bqyzFBN{0kJ-%0? zJ6M1KTf^%X`nHsFvojwISQpfGOG3rIp?njpbd~!)W7VMd%}GB@FM{l2XxZRY`gafg zD0f8@AW`@AeEH+fAHaWrqe(99nz`xwK5$clq4oM71oHnh2^*pW{_c2Vz#?ef8}Zhd zzfBN^sehfZ_CNZ{@OwNmXi{~SFOXC#QtLNIkq1Yt!CPb!E@wQ15WIlS>r(IDuEJ#; z>nQ&tv9mnNSI(5L5a&$mSm;vP){r*&-tl|9uT4h9pfz%i`7Lq1;npoxH-hUdJCXIY zp`0L1hyKh%nbC~F;n7Tfch^;53FK~>&dq4|fz(v2ljj-?@+MTgPwULSr*dJhkWw2U zxmcGtsQ1#-9zP;;!EKzqysoTav8ckn<0Zu|-4?PoJFJP3*tE5hjEn-kv6SnU^jW@M z!9i%|)TZ{VA_IwW!gxm&Rwj`1e3&D*ih$e;ML@T>qtA5d?SK?I1W7xq@%T&Ck+xSn zPx*3w`}=d9srZhWAyJxNb%9&etEB$AHzTFYJ55fZnlI_$)v@A(qrah5&t4>mfE&r7 zA7K(QBFen<8PHS|&$MCAOdVl;D+Px4?T?V9_{O%Jc1Cztd0kwRD?_0EjFHRN#@55n zc`Tn#|Fh0P%zcwL#tL2kUql_b{@kpWM-Us8|7zcPFr(CFJ)hp6s9IpHnK8$I9xofP zcHT5~>vP1A1YZ6|k-w`3dUukRLgPs7D&-Bd*MkB4)rh0D$$d-MKC_y-X9npJZ zK^g}I#XU!ZfC-}oBS2)p+c~laW0#|z#6j`g5tG{=OCNKgtIar|Bs(Dwvc4Q^Lw2xx z+z%LWYS9G7+$&!X1Spcs+0CRX?gkdT>YF2ZNVOPMj!K1l@F>jXA(I{>$u#at>ts9# ziFB)ZMfW&R0i(KDSE{@D_4;)ugUNN^#b-K4&@4q|Y2)Fh0~j+P#n172TjC_YRFSny z(S(6Y>-34soe=vd^*leoMnQIUpH(2Ad5fY+D3VA}!t{noJh_nAVsiEi;WN=7UoWD` zRlz=jX6X|&0xpp)f>0i#L5V}3N{_R#hwy2nmF|mPBn88Xddm`#OS_Ecp%>u7P;UAqT(|wKvAS0w5W;heV9~0S2$=O(K zOL*eE6tO#^I(Ma1dO>+*{^lkRCBpqL>%Yh&rIF;(UxIllmk?#dxB8>rz(L%m!=lbB z12;K`UOJfG>Q7n?-&}(%eBR7_4C3H7QgWb5iiRs$0;tU}t24OyE(H0@Y?0)5l|HZ@z28u?{pix(z}- zl`?>0R15iOQfi58;2P=2EI~6|Pg%T5bgG8?&1{pL9YkX!*vU8{(3O2LrJ*l$wE&IJ zW2X|5UPU9`pp*=*3qMBmO!b2QL79QW`n)g}di_vw*`za;eUq3#{Uam`#8jDWth0PC zf_{)EZ!D17@wG?!u3~@?9X=n5c>2`%Ig$B6Ra-JT?mp>Vh4ma;bk1$l8-?PcclAfI z*h{hP*te7emt@z4Eo=Rs0Ya3|X35;#oF-`@-nI<|fDaf49?SJ3;|q4Hiq}5I(BkeM z1RA_fR+6Lj{QiE<9VSq!^_2uzq6h83QK^gBV5>ns+&8g$BI_21rF>Xl0V?=7Yb_(j3l z-sY^+Y2Rsgd7{=&uT6Zp~+jau~nZEn~L?jAXU8F|Jr4aqy^ZfOu~751jnePB%!cWOJ%lu-0%; zY(swXs2*5paIr!gMnp0Sh}2rh2;s@o*dE96f=ghBCFR}T8oKLv#P)3AO%B2sb z5#GKV^m@t??f0IB&vEChG$ye@{80A85zzU-b>>1VA@2lsBw3ecBQx%Ih9H^H_D~%Y zaRbh9B4Z!`NmLUNZLwuq34aBrte*W|-F;LmCy)|;IpLbhQN-$@M{d_`JJ?1^4;R6& z1`>yKZM%_*U#z6hv!V_)svgHad?b9Ms+T2Tz(8Sh zI{)r+KC9@_cb`b)M*#;rW83-rb4^p=ZcMOP_^tTg@8Ew>Hr=iX=t1DrdpeHWaC(#= ze4 zGVXYDa7+&_@xlAVIks%8T|I;eX>DPkNHsest5&RWcA-UtUoVSr8Tg%3o31~NH>%6D zh(7xzVg^FJW1SE=fs|46hH=1T1J`$-Xq2h)&!Bp229UE-zx_~pScpInUG%GA)qJTV zNlnA{06G5`jZhxN6PBf=@vp>UB;K@vD$-qK>ulmmqv&UqQ!aNVKNov%zH*i`xZD}S zkIAPvR7fvL2<*>-L^|72u*TD!mH>qzoukf+r+wANf<#@b_a52LD1df5)l|7=RB7;P z<33e+V>olQ>pd~7Og^pi`NMvS65SJ$$tk8FRHj%gIOUJTER_MOMzkMr0>cD~M*6Uy z+I>?WbJs?%EgVSObgRJ$)BAoREx!*zmW!^@ej8Qe2)O;Jg|AOq%>zB#)G7?4JR;=h z`Pi-S-!zy;`n|%)c_rZZKJf9`6i7QC%lbI{FZyPCJ}$s_e&sZ*6ml^Tg_<% z7M1u=WaqIC1s3Xbb0dl0&i?b>lnE|ULzCw=K;;p6JNM%n4-J9JZw*^UVP(kQz4FRu zIN4RhsOmA_bs_@$I6KzVZsq-pzfoF zG3EugNpEednDDV#<5?*XQj5sTf^OoYtuJqMrerCSvw=TqWNIVpxUl-Fomm#&%RF2B z_j?kJ0lr5ShWr;7Ka)BcONe;<-k--;S`7ce=6NWgaCP$ge)pYxJ>eLMShRY$pESSw zZR7iCj~R7f*4(^VpZzOq$y9k=?yRnlQ8Q}N+-J3tbNs-{ly1wsuF>@D!Ms6hrS3;3 zclr`$+%va*_n+#EpqRm)rSI*{-hWnKH}O|AKQ!LvhXl0W23HlfJ3cs98PjCXmf~Xk zINg4RMih1f7TkOc?9B42l_}%nQk0`h=OZKLukc*Xjla)D zT)B|QsiLGwzq_kY3 zaht4M2%kc~lf=oguWbe5w@wGXrjsG#D5}(_6I>Vcdm|e}9j$CK!Nw_3z{S>;1kI5= zX^#B@wK^5mh~>A6A;hI(R55&zBr4S#&POv|qHW6B;}>Pd&V4XUe%E8h>@E|9Paj}8 zhRZ9UMTqb0F8}@LY$6CE?*kvQeg6xGhI&1~o39Y%EMJtK$l3>T)n=gF>=JL1hDS+^ zW2#d?WQSD!BZ|O>YxjJnSGq|OayVe~){uyAI9Uyl!HRS z)P!T`H}77_Rn6OZZY7D~O(?M-CTPvY#YY11 zbCkiilDGMmwg0s1NF4t_0xLGQ1hO0l@AIF!EW8#4y>U2qWgYT~6J}xd#MjwTCU-8& z@$OpkPiw(A2vw7Vjq*^7ZgDqO$VMKBmrOCfMBhuci^KRMB}vENQ239PYDYi~G_tSa_H14&N^En{Z}YbI9^17m||ZTHDqKqNAViLb?G@*N_DP0aK|Rw)onCNgK1 zk%P$-QL4qnq*-48jS!px!g?cExTN&tfgp+zqe5fs^lsvU*P)r2;qdY=`WkmXFDFQ*m z(h05bh-Xl4VKf_|d_@FO!4b&Q*h!G)^nr94FQ<94w2MQRM|?Dj8bRPs5B_Y!&ook` zJsNk+ndAD~a5=~z3sQuph;tm`6W2r$;{D-+A+q#fnRJbKLWo}#w=`$d;KnPcVG&e% zC^YgoE4t1gW3a6E!PcE03Sj8nl7xid;_kj&N64CJj6~d9eF4~liI?~4Uh>t3pex2( zHRABgJtXun+j3N|v9y$WynuY#!SEmTS$s!wnF(h~6TvJ{O%8KueMekji7bo^nX#zR z)^9uDDrX^-L`L&q67k`{FZ|E3j-S7)Rif(8e(xX-}b11vsuWk~%r%ulfwB zyA1c>*CT&2o5LE=NmoZ7Y!^mf-c^WvMB$Yf7;LY*w2Pj`wvP$ir5z-RG_zhmJ!3UR z?q;VkpYbI)b02U+xr^>M`#l=h_b(P;A|5IDU?c8#K}*xIL1Y~|ob@q18<~KLS3Z~6 zpw~)u>bj$0Omx5FdIbN_i&LEFai}RfB+_{S2rNAIb}|AUh6{=8pu!$Af1coW7oqq? zB5O}NPS&qM;~ZReV#$7wS%qg7^Ff9zw_^D-$jI7p-R9d$eEPfs8*an$8fo`ulFxLq zHh3I-p`AQvg>=B|XN@B6jFlx#!hek zp$0kq7+$G;x*{HThQ+V1nZ1*hckTpTjBv6YjB%h=PMRIEyQ#7|G8EC zt&}ZW(0aZP;nRjyc5Q>Zon!`z&2;uJ&y(|V<@S6*Ps{5Cz`~pHWNbF7HO90W~HE+BWATczX^*UlS#H-b2fT zDk4^5UUg5kNpQ?dcg@Oin1ncA;sgx4_5-hTR8|X-bY$15_~@2;#cDyuj+3xM2hW~7 zkkvWWDS8pe_^a*(pR*d4=*aP!(Kn{yeZ?_4RY#^{=QCXXuAqM84eb~>-Mk^uH!0JD zISPOXv{)l}a{haz1It-%h0t8u5;yJ6Z{~rk7V$ql^;^uFx~FERb|h?^OCjm6q@lnF z+Z*~^-HQ*Koc_Ro3{xL-pntdjaaAgYR`{3MV&iG+M?$nAt2S+Knp14k@PXH?aq)DW zBQu3lI{Z$bDE55Uflq{pd3y}EyD8oT3K7dM_oBjfuS}-f-&C2nz+YQxXk9%=cxfV3 z^nJFKx@ET3|0b*Z^K2gFO-23n_3>g@F}o+{+V>se@M*Dj`akF3TtsjMedkk-c5eLu zE-ygmiMyZoYvJ;H$nh(k2TTkjyR^y$DvLEBP0xMM`QrPaV z_}zijQvBeS(FzNp6G4bJ-(m@=-PL}E8(ng&}boav0dz<3NbpiO^pL##Z7Cx|c7 zVKU^k>ICRBaiUl_7|hRZSknp5Y;pGQ|6&Cpu}RJ`97AqUP6cjD_F6o6D)F4Wecl+abOx zMk^BRtLxE<68mO}EE}sT_8$&m?MqsyNv29YrOVG8gF8oxBe%Aq3avz*fw?YHkqau( z9+7`UEf3HGi;(<|5}j+~H3d{02KngmyiYmZ4u(8nVBj;doEF(lTJsckK8ux#B2wyq zAf!lg&#?8xBRnE!(#i?(t?YVky)(@Ff4mRzZQu-zN8MX zZD$4m0-G)@M=q22+~?8U?9c5d|J;;H+y-iUAq08XnoKNWIOULV-^$j z>2-Xe_vn@3J3_)ZUkJCsL~PZZ^YGwgo$ObWJZKUvQxS_&cQap{y@qLM#4-?APvH^a zRU!J0J=#Q6JcJ;D_}?&shiZXrJR{HPdnzjS7u+U<)30o-AO=Xzw7C-=I3!-9P^4dp zF7Qq%d!eQE^k(LMXaIpWc@QnS8gTN#J5V34*n7&$F%le~euS}4*>jv;H|FwpYa#Nu z{QeN5$Sv)fB6rjnPn*lM0{a%8>q#fUVd9)p6lh*Oo(dL8IYnSc4Z)kH|8&8Jk9}}+ z9QR)=(lLPW1O1j|D|LG0w`nyfSwc3dLVltje0NbUD9&p3O7is00m^G=&J<)fJ+FWO zk@4`U@#e)+FE!4Il= z=kDt$W@z8(9K!c(G%AI6K$g!O)`O$r#jDT1_tfhj!rPgu%j*s6E58Y}Zr&&TAIRoi z{cou{E?8Y8@8LaJUiT)GKw+XjNQt*U_3gaPOtm?kLM{GONvaA@0EGgU56PGs3^z|v z`gXt|rJz&OyP3BozNlAe&*|o(o!7ygGO#JkgksOEhm}-8RUrA&ksYe-MJqmfJ5CQ3sfw~w;`Qi(nuc3m_*MCDFN zVqPQnu~~`meJbMQpTTF&E7wXn--=;ESW$Nm;We3NCzS zL(fYJlhBDZxrs;Xo4Pd5q}Sm+wohPF9{7{Q9e+DmP+0uUS=ul7B>}H7TP%|-=iM=O zM)N&+yca={9lEkBG;-$SYlD?f$3P)?b{uHU>6g zzlOmxD90>u@OGDStlifSU2{voyI9^(&p72OGvGo$1u&j zBgsob2-UdXX{BsgA}-%2oLRn)W(z;P-DIMG%a?nQGN;+2>%MX$QtP4D%uhKrPw;a? zb@B!<=rh~rXX_D5pDg4)D(ig)2p#Rd#|Rj8II`mX!cKcS59W6s;= zJ`dbCF};RKMIs9VI3lyb>Kgkf2EGF&k%!9cqA}UyRM^x;JrnM6Dt@n{8u4Ou;^wC>n{YFJT8Z^!m@NWx7bd^dp{}OovWDkd>S)6=I z;gTBThuaxELay{`us4Y*j(oXcBR9sc|$Ay zGSN0nfoxR&-Y~&nE}*Z96M8TvxsdZQXs*892WMokuy8=f3#TzT*-!M{-WAQ6ZSKc* zADFnn4m5&#xR9-WQ(U9sq!UX2`6vQiaiGIfO0>kN&vicFsYvlWyEfBD;tNj#a zt(nc{FQOr6=p(ok8|1o>b5L=w`^b|spH3c%2=tAnt!d*bwS4^ZZ~Uh3XP>&6z9~aU5x!Gnt2F;5nW{?Il9q8!=TXG{#^CJ)u*iq2)0xNnVZt-jA#wqnMV&v*Hn&IM{ zI3&%zK612WJ*yYVqY%z0MlDH=fGFc|4mYxAkc%hZi1$O9D0VtHQQeS_O~ z7wxyA`=;x%%T6ek!jiHGc1zTElr~ z(45c7#k1~is(l(ic(y70bEb9m(eQ9aWcyS95BoU96~>ZN$CLM(WnoL`(@imfD7{(1 z%3Brxm{}%=pOG2CX-*yfQz7suOv{wH`ijtbwT=YjtA(D*GaSkXe)9(_Ro$7Usor|v ztaSvO#1;x2&F!|YhU2E?m8{?u%&FK-_~p+{CR3<>FYEGKg-mXQw^0vdfFf!T8H@P( z@h!{dc9rhaFQ71(`v#QfwwwQ*&jubQE{v`UR(udM<%8k0qln1FPDZFuR z_$XvbsHsfDaYvtY$3Bz{gveXG_cOyyqCDKJq@%Hk72$9FBp>rD&NJZf@4aVaMMU-v z=WI^HwaVWdTj%RT(Z~Lee`?n&huKAw^0R$639lO`70;&igFm#fES-&pTV(;S1b+LS zI$PFwarW}}F_ZbB!sb{x1Rk-7l`-xO5ib3HuLxcCHJj63=xesNwVxVpKK%RmDyv7J zla@TO43#%t{MFkxD55&S-*kC9x&dk7eoOnik_KEGZf6(sg@nF0_drQK=AZtXWakg- zKfXp#g143u;dj@&9!85AER*k+VNrfxGGNxUy-j2gePmC+WIv(&zgnfl$hDnON4g-7 zZz(9B&NZK{C%+Bec!A$BBw05_pr`c6P0rU#MyO_pDMe|Z9A)=)3u|!a<5HuY3v!0F zwAp8Yt}-Lh>GkJs%!D~9-Lf&rJ9M`JrJi2$a0NjNpsf^)ea=g9o_>$XYA(Y9d4-RB zdEJOgA9B9wUS*8g*LecE0$ADle3w#7l$BbEhU^n`q7sIlBE#0Rk75NGYJqU>t@e(+6G>v79d3&uZvF7H|d9^pTD zE)$Y*!ejaLTu>=Ug=9e&Y;XyKbO?u0rX@|V7!Ns>hcg`^@}7b1WVMe$&XPw?Fvl{OG=09o=WeLI<0zjB+ux@dS1X|@*zWBV+qFM&d}kf;x*{{2uB zHOx;E*yoP^JpcUCfOYF10P5?4@iuo4t)bRkZ>2N1SGK(JY&0j4JG(wD zW_GwU@srJ;hBXVMWi%n2gv#c-7L zj`KiTOL%MyM`6zaY>qr(>2czY&)&UWrJbJz$@Lmiw1aST)iE`LoEDBr27QwDdtBb-fG>tb1Q-PS+u3)iD49!I=_E~5nQ>(Arf6`kEgp~~tt7*Wx@kyZA1x{Y>S zFNY@tSI>7Rf*m(8^X!_2tQ%fyRa!Z%LpPX#6m96|hi7Dr*Kc6Ut)&NPu6j52oy*UO ze5sq2Lnm(W0ATL$hvWd!Xv$6FE`bYnT#)9C!5%dwP(XI;0kJsJH-csb;%rda9|KkG##$sBWk~H{Cl|klLPBIH@CGISs zH?5Px+uUY-9MOWgxf_B8G?+NHLh;^&iR%O9O=4VGfING#ry+zbXs@c3<^wq~CU)L} z_XKJ=p>>gBG=Cigw=Y{NmlEi#`3N+pjw12=s3h+L zJ^N()47s74_N4Pz4UFiSAW(Ez914yb_-dyHNz$$z07=nqHI5O}x^82hpq{K81CR(k zv9&4y1>7_|&=Dlk2^FriK%!k)%K132`@)iGzonGFHZcaw{BM79dHFx=`E7ZQM!12Y zrtnk3)qq$s8|$c*U5ZCl=Cqw7G7T#g63 zXdSRaSv6|%+i35Nd7aj1!I*$-h(jgTE7xhx$6MLvk9^{ui6_}9-C{55sNEa zo7Of(5RJ}FRgWh1GMSe>R&+N@it)YZW?RHIq8Tau;LYhLC@k$$(aWIVQ*GV#v7>Z{ zJN_E}bu{eNF*3}~4YMgWw0LyO@%^K;+=|<($i0i@=1 zE&9Q`0Vsf!9#S&>iI=hzw$un1kq3t;pZe3jE-Dc^qV^J*3q@R6qb`aPg4}R@;4VUXsyGwD zxMCX2_pur^j8L$mkK;rxNdx0dK2zpxn*yE>d-Xz^DAWDp(eZmacY$K05|L z6Yb=gifg2RxGN5zOmf3oa@wN&f=BSpG!)Ya$O@U0bWw{L3gv}`iucw_H+0@@mL3v^ zFC)<+C&x)mZ!C3D(@h8o5fWP#PL8GK2Dq9H1(|Bx$vMx(z$f(rtXfGRv_#c~K>_rO z3%SezOznxiLf`d3s;_?^^{x;uV8Ys~;Zg2)@=2*1-5%GXOrB$(!%WW1wl$zRM_-97 z%Sydrf1Z)jdfDg0Z0s8q*G4>X18y-YAuiz^>b+F2M%{ug{wgJH?vmoEEITV0I?jvJ z8;5wp2s*{i9p<$1TcEG$a6;XbbCn;u#j>fR8q3W!##4S`4BwM1qeXKsWoEkf^crgJ z38fvMKB)MK@`BeaaYvje=pCc}K{S+rjmQt@Ff}-(h4thfJ=4!%^4Ss73KEwZWv;Zq zK6~moU>L_ptJyjo^JZ$_tsmC+eOR;)UOw!O=n*p_buj)bg28il{7^KgSPjMTX#%I~7(8AzoSsKNFGpNmcifdRVnOds*E z?d_;%z8F;zH!4rsH95gXCKhQ}nd6*eR-2843wFfYwikFH;*BwC+YjW;3ILrHw)ZRr zWTf@`i3b#UfDq?ru^*Joz?iqs)hr<^90{!FIwYA{ST=(jac=$xG4ejhq^%9852@bb zAcxy7*$2d`r~$>r&7SFnhR%!2^utdz29GtZZZB*hF+!zZf-{m4zQ%@*W4W$?B4368tCm?jOUnjVW}&O20*c7iYf>KxV?RlDtGX zBl9nTQssbvW~}Mv3Fw~*K~O$QKFPo);sWyk-?8g&W$%#CM{F5qOVpF0qi^z0a5}Eh z6~#!piQB#ekXXfKw}=Ahc5~MHGCr|iV%Xvgk&nvH_awTOd)ii zWssL$b&A%D^#%T74qU>DjHr7RDk3Q9g%Ftx<8;Fi0MuueavL+RhbaTa+z}6oFA7aZ zE_0t12LIhgt+7%bOtUKhE)vfzwv8d~1{6kb(St9p*|1%8R?3vA31v)uzt3iLZ#Mp@uuei&n>=%O(YM>fEH$u zN4$hF1&qqch1Q-5b^7t_;s8b&cIA?lp6iQUg)(+6z9nV0z;u zmMcQP7pLV!cm<0!++@-fOWE{2<@hwT5FY=t)e9+r! zQ*9?JJnticr^d&exLi_vX=?M>J!9w^RD#xSXN|mB0S+WZP z8EgNLHAsPu^`iN_e%JkYs{eZr6a$j)ac~;%=FZw~ubmtX5{YAtNesEq)HYej0TE|SdWM*NelXNbHVhX0rg=$gM2h@Q|PEsT4 zD#N`5N#pFmg}O?!-z`%0WIwTrnug?D$fCrZ(5&E5FKJwKSG_H(gf!?q%_Q*&@u}R~ zI6;Pmf-UCW!cLV{b_a%{WzghQze-fbs*I>wHSEs zc6mf`!A>Z?ZaTo(20}bh3_h?WM(_^eK5MtY zMrp=H%0x#}K)l&}e$IM9H)3nX;$#F^tHX4S+eqPG<3QAebsf>VdxJ((#qU&Bz;A_d zQ4j3S!5HV={EQku()X0K?t6go__F$XzJWSOUitVbd$8p)>SIs(-#;r#Ff6D*)e;4M z$18`cBdtCIJ8dM6jTQnMRN=D8MDnGOZ+O++C8-fpq$z*~xZ|PC@A4}R-_oTL z;hHq@_&Hr^1Nn+(6+M6Oe8*ioXBlxp6IsoFx3vqE!*_yU-zucKrS%@p$*RtVoeaek}A zZ0czt3a)Gsnm{gdg6w065)sQ4uV|hTJqwZpB!qDT%1_k6Q9(0P8OsSa zMfmHkGn;eestD5N2RK5bx>Rb%h-yZkQLFuM+t2P}qbeAf6;1L#mZe~Ha2;@u`BAbm z7)l@_0P#7yZCQm0$7s4@I4<(n(QekDirt0sbKs3JukHra{iO$xVl6`C2G*q~%bhmc zaR_a0OK9o+T4B(+elmV_+Un|ewT-2KFL?8e{qXMk&nJK#m=gRIcSdBt&dcYf$Y_|* z!`JL{94FZFJ~7>C_JY*?TL4Ax3`ryBP+2c7T(aGH`eJ~m4ZLJ;7l#j?Eth`4+gX*( z;adZ`9hZ*%tQ+M`i>!nCA>;vt7ZpI7tu{Hy!Z~i?@X%NC%!i`H8u0XY!I_A+o2Sh7 zxJuDsj5;c(2RW??_A^5549qrT-`gxK0_OADZ@`!TDJdvluBVG88G!E8m`;{g8rbxE zYuk&Kn3zQhAuuNK%|}_2%h;w`NAt;CbDbCtwh;>e0UsLiUS!+a2)j3N!3;K7(!+}r z(%!N1xocb$$>d~Dw)8lJ8DsDcc8(qrr0&zq&1YBp5h!}6iUGN5p+BIKD^h#$t0b!N zfXaqHkRgPf89b@msl!0yw%ybMKaGoeclk9rpDc*SZ?UKaU80IlsD_O9EW{y&{~>7^ z{pyr!aAl_af06YKZke|2x7oH`PsU8PZQD(@Z5xyAn(FD9Y-_^gnrgCbWB0zly}$kK zWB(2Jah>-%7tVzUNs%Gj47@OO-Xl(r6x{6_4<&u<-5bAn-kX-om(vHx7Mu&*X2034 zW6qhr^Zo~_ME6oh^k#kK`anHdLj7pxdFOr4*m(T4_jcj?;dSV@L(8{YuO{6WI4UEa zk)|>ZXmc~5@}~9jzA<+qq1hVU8H}H9NA01F)N1)mg2gRoLWNX<_)emz- zKosA_^W1a(a*1r%bb?MU`SFfBH9*=qYl#zqEvXq_y{ypGPhfQ%)Zb5lj zuD{g|zdY;_-*c}K`BHH#B=MKKg#va^Q^bC%$?^;dPWwFH0@Uf0H?)0%Bn3Zsvpb4> zFB;lYdpD%1uMFp91=Kfdf=DDYLRVMrclKQ#W1#6U`X;ATkMVkc&o7OOWA{c_V$T88 zk4u-=72C>?7H_vl+!w(8#UN|PBz{#1M08ECYOlBsCw-FYwGnB&sDFd#Ax2oc$o zDC|^>D>0yosBm!2I7ry*F_j?RsK^bhryktGPq_tbx!ZY&Adn4Tn^Vy1NuV zwAopw*fY?&7-OXUOy}`ZXzCFYuMJJpx=VYGloHDK3uT@cn+H)u!9Ps4$Psx>AMs*` z8+W8L2SdrRni>NiWkpaUyWtOH()v?CLFzy!(TAlxI_ z8L8N!?iS{HWbK32WiR{aJF|uo)_rZNgfMpwqDU(j1vNVx1M`uXg5$*#YoKmS$-O54 z-RCcb;30{Ew>|Pab}o@=SftqyL|{F%@w|PfR&zTZzVp`d!JeeXxJ*;%C%3nE7KWD2 zal~Wh<*&2Fh`VDD;Ndp|!N@9@#QDq4_|*XD`}bPH^BJQC`s4!z1y!&!aO3T+bnf+k zmIX;D!OP%OBj1zSamNed)ebXKg#Kc$`u7Wf;mgXN(Z{nRmDmo!;)xRtjQg^<9vsg0 zI?}XDo&K77D;ig%2!uYo@7Y_EVTeaX4Yf8qa_1gZgSXi|Rh&O+wXy%6?GrnfrarIH1G z?IR2Px!hR`3cA3?J);bC>5hP5b;|Qw4AhIoNa*`5W`_tEb}0hf2YC=*^xgHs8#i#r zcvaLM5zfF!V>tYvqfmt+1~890ZDS$WX1;3H@XC;k`A!IcM=1->HOhKbo%}QfXdiku zm9%1tH41Uuw+rrLL>vX2F|d(LiA;_#s#?g8J*G2k=Au50pz7pb5pRf`f)?5DVGDFS zx;Nh6-#->+cmi`im*sx|`zJKqR2BUz$E5%qw}T*nY;K zV7&9aSLi2C4$2 zWF*lK_e`t&_0<3zQVaXAz>4X^(<*KpK7d2sj(Os~$E@gtOe)nwaM~o}J~pM2k)NJ! z0{@>jb=NBlj7w2sdh2)n5)!+ht~79*oH`Xe;zp_6*xx7w$xO@COrT1&Rhm4K6I5-< zfb>+qm0FD2pYb1EspT*S zpIvVHN5Ar3l>O9OCfqYfsoJoF_9UC?w|WsNnk_<02};_|Q*@Z>v4y7BGMAtfPhz$! zl?RBXdqgsR1)i4%@~G08yg>vUx}UY5kbwNgF$3iRmo^dcGi6MGlN|Ok6uuJA69QT7Jv3$3i zd0g~JIc?E8sO+A3X;ak!g);3eni5~!>cvcZ=bKTZTfKx`l$!@53XGbPVe4WxGnZkZ zO~2rd*M}Xs(52Qal=S{G@IT zLrk$?O5dsO(Ky55CPfP9(41%~&sLL>X`*kRIKN@E5;RNuq5IolKGRnT(Gq{Kp{2l~ z0M7aJ1c?afmhd?7QQ~;drP-O-L!5Z`$yLb;tul7VcHBz+P`so0LZqVb3$pcM;7wHf zAc_@C9SFIXI;~0(ir}{&<}nu1JF7y{V(HJ6-3)u__K$44Pw_?jl@4Ylx`H)y`x`ih;lMTxNDmZLx9@6&S2&XwL4_e!_>>py(ndK-8N67c<4XhGDQjAF2oMv7ogET2l9h0uMvq0kI{_P}rjN4tEq#LR05Viz}$)+6N-@0C<-@EQJa zE9zBxNSMrwPtSw!4s|)!4qav&I*Jk-MId_aGQf(?JLFc@hSY)9j2%@MvUXG}1a=>A z6V0Sno2*q?IBQfT+~I*ycvlS@B!HJ`D?~E_cdm?1ac&UcK2NqKqX)w{|9i39bTO@8 z%35B3fuWJgPCVDK2aPyEqw~jUF^x;IFuFqE?)kbOxjo7xnbUH?uBHKbKH5!%H>~Nj zYy6c~mwCMv-YvXnH|8dNRNN2>*dH~?O}B#Hn9PVey5H$)R$**q75WQ11ifuz_+}v- zf;>S{vq1d$!|)qHHb#e1?_zDO>pWeW#?YGJeVm?i?&S!tf**Cd`A>ODdgq_bpqg=1 zT>SbdigmC#=X{E-PfP!PfPW}O8i)*p&!kJibLe-%T7590bEWs&kI%Vk@S9O#Rth)m z1e|`9OHP#zS7tB`F>M{KV}(88I&;x=sfs>40z93Mf?`shbaKA61ZpbhSc5BqH~DupAW^?Px2ge3htR z(eNcFyXz`(M~(_=m3E?ntgcTZRT ztGv(TE`OL5&)A{qw4;Ch)E^b4`r0#AuO&#aIqfC3qPaHYN4cX+q6}fsI@i8FIj_mO zijg*7R9O-mjuO&fh|`=;*2Z2T)E z{~C>^pVbn#V}y&qV&7oy9ZSKts=Wmz10lAmH-S;~x!q7JD@E+cJb8@CxV90Bu{yQW zw|Oiy{!4L(9vPfi&txiG*4FYi-3A`)Cy|(+f4fS*4`wlC_&C*ooJ zVRd3PbnvDd^fXdE!mXFeI3SvKCS62;qB)cvT)s)!?eXFO8A2v+m*97_3gxgP-30Pk zY}hXupon@Wop?1pu94eGo+5+Lkk6-QKj4!N{l|s+yBT5RmRX*a(wIdS_toHF4jl0y zEF?qEr~ZMtBG9b=@p{1W@V;tv;)|Mo)6>%v7{bCWzR&UxTA_~X{YA)3LnN^2dx+P=H2FGw{^A2*cHWMdAT*2$u4 zKRzUudd`zC7o>H&4q@vW_XZUn{@E2bxRur^3D`v02FQ!>wv9S3ZewOi<9rQ%DUA49 zUFf{geKQ1jkoZZ8jjY4<;P~*ZjA!P2I0a(uy90;I1$6mq5D^5Bp8u}88d8!#pt*6| zNk_~%seWJov15$BZYC55T>wL6G>V*0X{jO{ZSU|K#|pv4$p!=NnZY}yGW@k+i2N$a zl_OdJt`Rm~)B)YKn$ct;NUjgI5iRh1FtLLoAzNVIb1*OiH~Qf#fxuM0|7NOFo7$E0 zCBn|4mU^$^)wd~wAv0v*fb-U*2M!>+AmBN=Z+(6J`m?Ic-}_R?hl~t^(e?v&d`oX> zKtTyj_U7Qf=OW5K2N0iA_lz%oux=0R`G1^yrV~1}g18YL`@NJytryAmCg4*_arMZh zAOW*m#INg}mQp!bwR7N*dloHvy1v1yB9^^h>YMf}R>zZf%s-4(eoDTkdOvR;{Ibqs z57GOY2sd5^IlSn>)K<&SJ9{=OT{Sb9B7zs*Bm^Z)e2nTzs1-xjtMc&-iDVupUwsw; zSID-0jx0c}aKal56Mq#GQ(}l|oRqL6-OLMFL;gXH8xgu0x_K}uH88>%{iHwRPuhzA z(lTK-2UdE*G}S5;>d=Sb3J-iR#zB}~aL{JSO<97J-=E1ik z=4$)M8pp$D;@M5q+bE=K$q7+))okmWcr&*L>|7ZjIbncK&4aUoBX&!uKW@F{aApz} zU$WW|FQVJm5mglXj790W(!$C^9RNfP4U-z zAV>7cw8zzV&)3(zJV#%KAUZs$zJahiX1jF_Lnz&?%iO1M2Bw zCpMRox4D9GMP~d#pt%5220Bq}D!MTQ#KR}zkzytZOz9YdZOuO6elgfk8*@gyD%P@> zAAK~F`$c^&k;NKtSWd_(PUamJSTAx&Lx#b07^C#2ZCWIfNxdbba0O;m1{3%_Ili`- zG;50`8X6PTp@jIjdO3|o%oiZC;S{{%>6o9d7)q`3NEpY3sDb1jtZB6$#3@qbbNqn%96u%C-I(h%{*dJkyRKti4k<=){`Jvb7_GVGxiS=PrvICp zls#Y#%hN_6ZZ|4Mr0JbCK{km&(h~y$`^gQ(ZiZkz+)^QhNG@w@k8(e}KRn@tQv>fD zPd3<=ky{kk((JtWv)rWPa_>*Dw>-M$)vvonIWID8v>D6%mOPoG5EDn9^`Ts>n}oT; zLZ%wP5$fIDB#YOU3-IOLzNaUBYrO|&>pdUR>ix?nouz;MX)1MpHaN+@8YM4kVy3uw zUGQWPdT9_Ep(1!f_QVH3wA=w&e`;Bsl}Wasf@LwJQa;tUF3xYJ2BfI4ycxJBE07ysx!#Uh%K{;*i}HNMDQ&ek@+TpuZI;(@%{ z!N^xqSqRX6E5wZJsw8_Lb#(35YR)oAW;C%|rf(f!+tPm>4Xt=PWmju%MI??fLk$P} z10c*v%E^e0vIfMTI-Mr32X~Dl+zgj`8a>vJBnqembJ65Y0eC)o+=B%^!j;a>Azs%`!9N_fbw z{x!bI&b&FehPHv;_7I6Q7->TfFFr*4ghgD)qn5!@YkEyM6O}Q;7LXzE89<9f1BRYc zqH5S3t;0DtO0Juu=)Ifen51?mY>A-yY+g@P2$Z0D&eRWd?RkINy91jj9Nu&PYoDGK zHh!aTPrP9A^<0tcaE|i)I0iBb-OUM!)gePrCg?29%N6OsJoWjd$b6Ab@veXduk30& z8eYmYf;M6{`vv|hEkwTP>s2|8-e%NPEN55Ei^AZq`>7xqL{q=bt;wE0E!;)@ zaNtuPonxn#OOyMSSJPMz#{i_FgXW1YtxWwxkyAQMg@0F#YFy|^Wh3$P1VZ=E5KK}y zXp`9OG0GUP`&ouRS-kOuqUw)37_4=$2@ZsfscuLgd)AleiyzMkg66%sj^=qY3D9!O zbU1)tGS$BcBIaiBgtQIi;=X;M;uuT~(=kr;@L;-JGjjES})uY^M|v zFLLA|Y*i#Yn_5?^AFo){@aqH=QMAv4xnL-*u3ps|@OBMWaN@99k#x7=;xJHvcX#8+ zMoXk7>7eI0J>JRz%@w8`x5;m=p7E0MjnM*=POq~M#Eyh0F}N{5C+Fm)TNSdGvzt@V z@tB9neN{anR!K5Z_Keq5Dz~(;FeO!NjpK}1Ta?f$AWR1NFUJ>HPz0^xl@IS*pJEXD zZ*zgX?M$@qubN|D^0uTtYWXBz1SaE|F#tUtU5wsdZP=R$%N_sJV3DX=9K zKK)z#{tG$Emwd5f7jNZ)x2aEp87twpCZA;&E+!g1G;DAbEBu96@sc7u- zu_c(*Ip;TMk3<)cOhMAPDLrWai$+)7VAqhGxgJRJx!`~7Cuq(J5$dh$&^9dz!5-d0eZQhbx%XRSHP-u-PEN(M)fbGc8FXR zfO9&x!X3I&n{b4Z~1GB8ih~sXW5@H2BJsoY< zpoXHvsKBeE=7@lUb;k%2zff*XAOU3?9J)zoI4O4{fsRSk@-_A~x&H<=6j$;a)`-n+8CRb7PO8MGgS}#3mXzXFr3R&?G+u~edq@}rI|=}x#+|4 z_2Y=3$J4%)P{fVCt9R_uKnE~#_#?G1r{_P+;-@>RLuzyWXs*D(wN8t^;<-HVeSa_T z$!KHX6$QoF?Hn!c6fQ$aP%|o6>!?@x2pWy#!0pwOOn=R1&eB|)f>*?OZEo0Fyg{1q zDc{BA@HcxaZSf<9w_rrcIydJU02$73r3wAYn)DkQZgT{sVd}&G@dDtxLp*+IMAydM z00x+hTm~cvad&->tz^yyp9*Gz540UPPKjE9k%Pos0hfCbx5G6{`bfJyaXbT~Lmm^+ zQ9S2$^0Oh?(j_l?rD4}y0xWN%^jLn$x^ySKT=@2FN%dJqw%Qwv`v}=K(nsVDtlKf0 zu~w|MkH>~Zisit?W9J#JCglT&33%|27wKyiKez{i+iojGuy;f>{fI?6nQ63?l^ zcQ{8ll7x*5=WMC7f#qMG_u&4jH_9B)K0$4mLRdk~{Tgf;OEl}(Uxm8Xo)kTYS3tqu zcHV!p2LjT`m!HZkSHkQ5dyS?bce=kl(jp}y@@0mb+qxc0^mp@qYiJfg>iAYc)O3}i z?J9NwG&JtdAGGyzL4jw5$Ai8Pg#_8<+_pg}IHRzi z$9sK-`805#MvH8AshlN{`*D)Z(P-HeE`jX^W|hq{doETKK$4unsO8F56RI$o;O1r% z3YpwK3Tuq3ns@13b#vS&fe`Q)jz}t|l*COUB>5~`RLsSo(?3s;F!ZghP=GIcd^}UN z@EAe@Hk`kBoGU{pF+o&Q3Vsq!9hsVfRAP>?PdS66Z=3-NIxkcdQ&Z>4$Q7aa19F|l zUPLy+(S^_vAOU1lSf2n-5K4vKD4 zq?+L?ri}jlt54bqW5rPgVm+tmZo77$iGMf|#z&u^hHOy3i5C%XnY*~{dFi{OUm@R8 zuDkLn<(N3}{u}ZXT&Hfe?qGULUu9NA-%yXzsw_?TL+Ql^Q4KH19qVkHbjag3h8F{k zw$Or%^U3vrPo8B4j`rH`JM}ThD0hOP{I_|S5XcB~(;NwD(7)_lrH>?gxo+ z%a3PZYk|!LI&gruoMQwkc5H9ILjR==*ZMcg^MD@6l64_*SMzRD0fgDPN-+8mF~Cm{ z0tdFVvh~BkHhkWYtb4l4Z8rC%g4^>{W{js%;*kN*CKlXt_9-bqHt`<+6854=k>r5{ zh~2|Og|wt7=2TyR0%GSdGe}+_d&y+WN3i;0waX*^tGmH&Yk~~lNYfwqv zDkZ*c8z^3MO3BIL%b&gkNC8H{w z%QMwN3P<@W^zGvscd>R6ZlmYAy648-2v?%Ro{9gXhgisYyDuBz|5>eD0-+XBqjHV# z`}40wSbWA}Gg7(osIDk+5lOn7v2QS3(4FJ9y@r5&mYE7CY2VKo-@^hmb$1vd z?KgcF$tI5WwN{VnL!#ZZRqoUD&AJn8AU%F2sKS7lMHQExH1-o@3=y+_!tYFb4eq7Y zg{CMw7(RnPK!7bc*^#jp<#n3x{$_1J^|BMd`)nrGGcy3+xLvk$RT00ITST7jn$Nt= z!>7H=k%VD^NH5_n^5&}p-D^&zK~4asbADv>1SL1M4HpV($ZaL@UHipC)SlkX)g8L( z5@#!_mfTgk-XsWhE;-|0G4fR&@QNrQ|ME(O5$(>>RGtR8@7UaFtw=q6gD;x+3dti& z`l$SB)Mj58?6C~>DjJGC?QDPxFqRn-Xd2oiiLY%hW15NnGMMT7EOpoaROkUNd&sp~ z>2--AA$7apkbM&GdaB=1h=~1zgcfARIil9M#8=}VKc{T@qjh(5QEvVAd5Oj73ERlT zl8A_;`(`kDXQ{=0$1&y!u}jFP;6JclLTs}<$Km;E{DIlGS^5DWc$K_|{M+vv)wB#o ztgr*WLL_A?Kx%uw;FytuUbKY`CS}JMLt(z9Y$R0EM+Yej$`34&7R6p z#xDXW1S!DEHWmN35n61dhd}W?IAaL>E+h6tf|5#n9?BlUo-BR$;$Y8z!NSRJjF#GO z#*K^qyXEVj(?-4{uS(D$S>dWxYcXo}xn zvqtRP;0wVBPtly(s7YbXNx@<;TltS%;jEBdEa00=5fQN$fBp&MtyYuJ%75 z!!1-X&^^6%UqGv*t$M-_`%y&#VddGHd`Y_>r?W(<;rhNWm-q)Hh~_-F0$lh9F_`f< zI|qkm^tAZ`kyuwIcJmwDl#Tf&b)t->c6s6=Mi?p2Hj~WrD#nB-cSjJbedV@5rc}6j z-zBAv*MWTMo0fkiQVC;U(c^Vc*TJ1`17k~Whr9RtjZwYdr5Ne1BC&q;y`Y`Jof+Uy z#)N1lr>ilqgES5$zV%f4$yY5&s){zHRuwjQ;Ad)D_iK}v&x93zTwjVzIpfQ+YGF@Xo? z19{qj*WnK;WQ&kiSdY`Ild;X$DGjaztHqKO41WR{cYxy$e7rdy^796gqgLn*RXbw{ z$Ew;H9Ri?|HmM=;0a20x@)Q>TdPWPMjWOyT35{PZyP_TdUPN- zHaRj_mVwc6^fdv`jJw3}wS@$VS+HR=CTOC=^xgYad_P@j{0gS*&z7K@*oPXWH(Y(aYN54TR;$OGKeS4iI;}yJ zL#kSzrE0&8yp&aJB*L?}yPM6FvEmN@H1M<8&c4fL^;AU)+T_Cf$4c}qwrS5>NWFTV zFl0#q-q6$S*9EcMuTn0#S4?@cpmJ|xF1E!uj63oQsk^9W%imd7MW}IrVS&Bb!qiSd z*4spq&X9r|Fay|>66nJfmRp1+%-?^Tib%bOP+7DBCpiqG79BP^dIGnInlp&{_yZOH zqfCD=KrJc>ybgi}x-6qx1FtDb4GbT0@06&q^V;@{GS>@0WjRr1zLXpTl5**%sr!QF z{SV^3(u#vbBca?B)f9nLwhNA_`llxYY~W7Z*L{@CZe!qY>wYe)p zCcV~5-sVBHop0a6!bwbJuGY55h5A~Vo8iQ~q)g{PMq(9q&C4be%V1Cy!y8IdTX271 z;C|Gv6&i~axueAWFeR*muKMQJOz=f8yEL5%+8NUT*TDDM3PzlYOp_M{e<`1QkYnZ2 z+%5OsCb<540bBlJVXkX!9IN3IRB{ALZ0k<^sw}G;DApMo)u#wA70vEvSD5xz;1R`d z*FjXG9qHS(m8=_33M*9GH;<5hHl;p9J}yXh!8jcj>+YuTek?P$*&sGo{>w2CrjO0zzHK?|a2h5b#ZpmwHKG(o5hfCV?lE>s6?+ZQ-qO+cr z2OG%ayFV}MN!m0SmE_8}Notua)=Jgo^#|O@%Q@9N(9K{pcG2X_1MkzWC6ipiS7y|Mrmn&$7Kr2SNI}3EOiD6ne|L!%}l?bZkFw-@9Dn*&oRC zrP+y=XNXo_L>M(Xj&zCN4c#W|8|l61g}xcvj>ujK8&RrOc%}Tn68L5_Uej=7(S+Ov zX`(_T!>{?osaj>z!(DxScF0sP?6B&F>>AzoZbIG^CMZmIwjke$x=@(f4o@KG6TX91 zFfI#sZTbrr!|_IAeOZ~~q7jCGo|PhRIx&Z5p7%M3r#l{!=PI}a$6STa2?f)EfTIKp zzY*q@8#Q-*LcY_?qgB{mK%W8D1R=?`{eqN`Jjm=||loWY8ca|OdXMQsgF9YBn(!Ku> z?>FC`@G_yL%b)#BpoixjA5dYvLNom<{;!))qrsk)U+_&S&|D^i~L>3$?UmjTWzf-bV=n(Xi(pIE*bY@hEHQ5pVc6!RA3l5u{Jveo9l|1vZGK}usrYLwb zrL*cm^|DGKSpwPytIqAPP+e|lycGlE*BUsEC-n{+sG2q(;bM?41{p2@P~C+p^>9L7?(*APZGuPTJJ*==bb z5kA50TCgX2qC5D3o~hj&-hoXl*(^jM{i;~p^H4Bn~_!Wek!5x+>`%}tUdn`YycW;4&KJeQrYXt8z$gAnJn*L>>`I5 z+)(km`+4(nvrSi$Q_%l@zhNA)`ypKS`Lba#e+9|LVs3?H4x-Op8SJC$Ce{m`Ff=MYr&t z&n4=;ou}rY7vs@62jB>;S*+u~Dg6R_=9-em-+fQFt@{dFGGZtih#q(veFt;DH6{Q2 zEZpZ?h@X14)Qm{FyQK2jeBqed&33yy_&Qhw!Emofle(%18!=MmjMpQrinuDwb-F`x z1mdgb35eiFBwo+mQI175Y`Lis*)yWvBp&yGo<8gPyXrp_L{VGZ;AEdWIEgM~CqZt4 zgDMroJCgjEmJX2m4A4j-@QN$Aat)F5Q13Iq22DE`uiMJjE9vuI z15UJDEWlP;+r6px;dN(=n5J$&Z*PTAA&%x{ilQ_3GLm0_6l+pY1L- z=SC7Q0>O)|-~Zd+cpumMyt^7{(0uw9gF03d>VG&ul0cqA5gmyZ%`aS(tL99(H=8`C zBG~GUJC??S?WKGG|HOxBoprIOrcRkfRqe|D(a0fpR^eCcYS#F*jZQMMPZs#+V5sa8 zMJ4Ka_*?h&3_*?;ab5bNYo7>gN(_rxC#2vh{6zZ`Ln-CT*V*loMiNI8sHqN><=~d< z&4fo*=kv#XxCKSr3iD{V`maB$OO}`B|1>x8Itakk{m_NK!dz;O5Wehl+r=zXka1*_ z6kBgIq90erCBVFtWDZ(RVR?w`Dns{tffmIxTZAapp$w?(cy$6hB9X#9znI|Uz#O4x z-bjYC)hl!hXc{S!f#b8)=J;@8Ffh*3z>`FQ)a4v*icj+pbCtUpMHXH| z>6i}qVNLg_H$JxaPA(qYdl60snNBcs>gF>&KNGNB(=Ru7|2u*7DNwRQEdn^Zoc&Gb z=I(AwdL9p-HQas&c(BQ1n%akL5>rJ|^eUv>sHD4VpoLIjQ4^2G+{{!PXrn(FW8_B? zh)cT_io&FqeHH>P$d-o0M61Ux)Ke4xipu-5wyZ8<4wKXQK8q*6F*qvW5R>F~vHD0Z z8d75H=7pHcCxc%o z${@?;J8hIXhC!&R{VTae34*Ifqoe{Jeh(MCGkPzHgJ9TyLM35M88wDV;zd=|8#0v|Ep6F<=k}ugumO%eaxy0RbubIQ-kD^?X=1wB9 zy-g6pbef9yyT%yQM?0hqXhN1UBb;H{5?&3*4n#qq9&(5hp3G`iX?7|{j)uLb3$k?} z7ZtF@k2H*l@|1{=$?5zgv>54S72A#63kSjc)Mj*Uh(jmCBy+TIoe-c6>3wJ-$g6$Z zCH`pL#1@Z^W!1*Rq1VPU)ei_x(jiz5x=Cvxk`4R8krT4{CZp{>+zGMAD-=^MLzC);O^D? z@il_TZ;WSflq01l8;E|Eu@bD1g^0=0;X*=}_!$CLg1&St7a!Z` zenGFJ*WW9$fTq92(N*5HO=3lqMCp5j(J#!v$3D{H=xmEfmUfT8kG*`SfAz3`Or`(u zybc-v-k!=?Vkz{`;eH#Id>|svgSKtxR_h$+rH57fK0&ku`4G(87Yr;J=$_&Fd z@u_C!NYER(u1lZ|nMK7*Zy20oEcvfAJjD~51L<*qRmUF|qXxNOXeY^7bal|qanH*2 zs;zfF%QCUhTTdO%s{F($YJkZn0Qe@a#%6|GkwNzYeYxM69hA&PEjGCtCx@+Rtdq@p zygKr|PQy$QW%^$?RO@Fw^J0ga7JT<*t`Kxp1GK>O)WcAm(FV$=ikjm`ze9ivu*o$z zW)j9wpRh$M7FxuX2pS_R^0QU(F#mSG|5o$I@Xu;<6)q`JDqOMAGi#Px)Ui6Tx>U~* zq^;Po@p2sA`Ev}-0}gE766rPDEz)*MvWWiM*284R;?=CWle~dVUQOnXO-Tq`2B8;X z#>ZzP*6(Z7?yYwmlTRa6EkN;fLuBdn{r0wf8v4H{BO}yesDh*JI8aF~`2&;mY4m#d z&R8u)lZ-UlUQA+EfhOs0YbFYZlKYlN7*x9gD>&1tH zzq>jMM|IvRxN?wyv?`4T=hsDjUZl`7+$Y)+Lxgu`1vysYY`nF92sq4%3K9<0VLzfq z-=K2~BAwwLZ~Eqrfnb_ZsO#0!Q%%J$oGF7UVr3;4N`zhof%%f2I2bC?opU)DjI?53 ztaXm~T8)lPhDF#59gcTf93t{#+UswC1-eP4b`se!YmBaJ|FVgcDV&V*_7CCNA*?W& zI_Ok8u%t8;tgo6-WGj1kh?1{7Q}9hDJUX1(2%3IPLV5tVI5&CLdfSBAp9H{h$Iwfg zJJA_{9eZ8x;B>3-@lVAU)MVPvN9^6X<9q*w179N4?3*oMJM*UDiiQifl*8?Jgili{ z0vjuHz!4$5mzNyG_o;GY`~u_QCb~sd;qp6Jwy^06Vh#y>#Bf`nhS*TTUkFDU%U`eg zqj=u{3~LX{nQ=`-shPnfZ^J(DB2$-GWwbi<4>}f}!_` z19V--FPO`n6&IPbmH3$$7OAc99~8;Lg*xxy5bpjUhQxNVlNz{V30#%27<6A7J`_bR zlKLJ5o;_Y+q8{PyJN{#7EQ{#P{uFFMp=Lr<6rD^QmX7be*CDvq)(TA=NhNop6BdLg zS&KJ5Gh>2OGmWf^UncyC)nhL}@Kl{?RAPb4QjG!h-XmOAa;&Is({i8-QlYVNj%8m$ zPB@)oa(W)d1odGjqixd*RIF+7pLGNcJ&WF}Z=>Vl@p+e&8~p*(FVZCU7y$v#72YPM zrQr2O(4fYkdzZ81pG)ux=a}0!E3PfhP8Vz&+smo@sJvw@rR_s}Xj}ryURM_OQ!6g$ za?ZGQ-(kLFfc>^ciBkN*;g}PTdMM@OFhb&e<3Xt4{2lOl@sx)dt)QtHk@>6sR?#$> zje>3Xmy1Jfz8jR1iD`SIW!=MiGGzr72^vqWiR*V8py(uKT!5&TEkxhh^!IGC){Hnm zDOckU^edB{NbRms$SS28Vl`*N1NnEXbgmjjZBDvT{<;2zzdv@eJY)|t4-5|do-J{@@B z%}oY_;B@)8hKHdsNVy|hjshidHrGW7OT?f+Vth2eqg4P#>K3WMN4-UQLs?e;><(@p zvk&n`vR2Dv&gXX8OF~LDxt>5H&n}PWPv2zaIF^MJnd$TGYAbq>RpB1VZSDgM*ic~J zYw-@WvCZ(RP1XD6)nJ+B-pt&hBtG(tAP>)%8!6fjbe|KSS*{5%@)q$IkxRN&nG{98 zg4~HjGIgwdX6L8bU^TWy^20^&uXY~K=?I&0Gk+xzgVlP>#1})DkqV-TD=Zr^NT0}k zQwh{KFKE)3@|@tAl6a;Ui=tH7Wwk7B$FggEpGh?A-UB6yonlYH7OV+@J|x;b9{?3I z;p_STW$oT3ugB3}@5IsX76XI`UCn%|Fw3_@0J=VGzGO!T_=vfs;4D-LA2j3gN;OtH ztwkCZ8iZM^_svECA3CtXOL)U)zT&*bLFfN?0fc54DfAo@{J9;8b_wI7_yBaM{pe%1 z*&?PR+h~#sv!abDjW)Rp=8baKEJb9)q379Y=Lj%O$?6T!;nE6hgn-7$Sn4$S(^CUg zGM^xaWaT8Y%b&|x>fruGGeahE=eXh;{k1~KA~Q3L7{Ng8t&0HuOPpw`APfQCvpPUR zbR7AZ!>D(`w&>0vdE^&`O!MHxx%zNKNG%!+vRfJ1EOY*i3~n>>-yy*AB&+TixsWZ+ z7^J%4CMRMW0L7^{n)r>@4w55kY2!YYDJ+n|kaCfy`#8_Fn~v9+v1dlmv~rPumJvax zHa%Ed6YpET-X+>b3DWAVnY^*1E>`6j$Cz$ouyoJuSXzq zJ;C8e&&f#;F#+9>2b^)OIK?U@b=WTrz2k?)=&P)u+IqUso!YKs-^srk~7TyRA22Lm z01kX#)&~ItR{o~cK~v)>yZP5omFp2NA~^ud{7tti>^PqhXwYjP3t4@Zyfl4)hqPUW z`XmVnGC@h)WobFR{yOLnNZ^oFgn#a6`>8Y4s>Sy{dVt)@O>bY8II(NvHw)hwuP>Jy zr5x>n^?(7Hn#1STjyzOWATNJT*RIORs=3vLp#A}=-Yey*;+P&NV-Vq0F4Eq@lSELl z@mPWQEuQAtjVyFQXLkOC{>#;uqlw2Vkj#!{?n2T~S!*4wxetDSDui> z^C!%5GUbn&cQotx4MNuQj=2>%_q; zyOx%R&C`~KPpe8uEFkz&gzw}m!u<@%t@853PyZz`k=aS)hMN5okrqQ}H-s#9>bq=g zZ{wpBvz#IW>C+}$B^@mLG5iU>O~dZy9=3~#r=~rJ5>V4N6GwVluu((!IiWwQb&+Xn z;QreQq)kznI59cCjxk`W_PephiIdb_;8C$3@!P(TWw(60lV|j^+wA_`0c| z?8!sNgUV|h2`nuEJI&=#ZgeE7uJ2n~*aq_y6;s)hczt-Owz%D%A-x~ThMdH@`C|E2 zzZrj{^F%V_JMl#^qq*VRcTP`qUo*mINMF@6uwG0!~ZD3G<&A?e5!rQ#beEw`oQw$?lAm){X*3$j+wCQNc8nUK44njMz6ciprrQNRqQkOHf0SX%~{Fqkxnq z;RaS0mO{m~NbU6KNP%oQZ=&CEPU&`d8PWeJ}2t&->?`Ia|R+ttC z;#TS9PT10Oi#6V_-rA>{vI(FSQOyu-)ELxhq`ed)`eI5%9H$ar@s{D@-64c1g%;pb zosu-o9}&n0zkQ{xtukfrI@`L1`v_7)@(aE&_Jb&~@Dz)uh6?g^tkheH)b2PW!-WX% z+V^L?!nQ>@6=tO&RtOE`4GwFAFDQ|Et?jb({e+$G*Lw~R+Nhk)%%2CB-pAi|UN#1C z_Y?oor7=DakXES`=;6lPIj?JX2;Pp6>gK<#9av}ezN5V$rGIQP4aZp2C}nHTuz_* zFnw=sDdJyRmlg%d=NbcWx5v<1SC`i3capxcqa56Hf$#+`AXkpAdsmXIEGdI5)+(mC zd=}=)(t4pJmn*uA=GFsjYE}j}Cs;Dgrz(_8Si+6o!u}Uo=fGZBw{7d#wp}qRuGqG% z3Rj$pZQHhO+qUhBZQbneoPBW5GycIEbN1C|Z>_(L;a0q!>mX}z7Pee(YK7~6ho5c`k*{XhN18(T= z8v4b5=ED_k^fCi;mp3_{i4A&%>CJq%KFS>QIrhinL`2EKdT#`CI77>}76B-! z?5#KaZnUT$a_K~9&TiE7dZSLF0|z2)Hx6|Da&K^VE~prThIy9-wN`a6 zw3tT?F^TqoFSH4OAJ|V;(;o->58lSAs+~^{Xhybt5cvsSZ>){%YFiQE`Q^1c1v8V& zp$@KC50lpE^b7@ zF+maMCtFjYFH^v-t>U2Ga%6$h?1AiM9_qkA)LJz;Mpk9*!XuD8nEv=YUZHrbXrpldQLaQXET*XgBT} z1do2&S+RQ!U6w9RUkZ;1S%IMs^e0%IhO8k#ts4g@GCB?2lWkPY3+H)_iRheNbD2Wl33?Ua_3R^X|pL+x|6zu}EUS6ZrV`gZ_sbFYKB>H~*1XQ`o8dRATp}1lt3i4JgJ!F_*aD5)|jdmdy zWcsK!J+vJbfags^0lLHo%;?XkBZ^_$`BgYA z_h2~0`PbaIg7**JM+OAWJffxvtg4B97rOSygtYg+w4GI04zvxvQb%?wPBczhdBE`9 z&VrJQH*EWFjh(y2Cf84muXfayzqdbKz(@YUNNC$bRS*)id|RZyv@UjWfx7Rboat;_ z&!!!q7lXplYn!1iYBifjsN>ROg(%bxM3n)k%@FkiGnBFfAwIT*#FZ z%PqT-f^GK^KM(yXe-Q-k$hI==Pv$sP{+cD-sgWe<(-F#LKot_KVF8F>4GP8ZTd8)& z9ddF;p0S<<7#hwsL-&yY*^ln2sk^KWtPKVBWQU!|1=<4#yw54%AG?d;0o`tj5Rh3i z@a&dp^{c^ieWwo068Ooff2dzn9vgKYm$JRjZUeo~Y!)4Ro_65Rio?3c=dJ!(J^Hun z`vSpN>8!V?^Dg)bgShQ*<2XsILeBE%bmJZ{KJ70BJkV|m!c%{dImq9kd*17Z{zoxG zR3t?M*@y{3Qj~FD6wCd6z;V=67*5{I^Lrq*v*dvhWk6~Z1}*<`-AIJXq%<&(~JP| zz(uEb!;^D+^33^e+l_0Jjbx$dxQkq{0Jx2wqqP*w6hbtY08ABH|>WB-$+U--xLF@#Nho5k3}LA|KG=025JH$nJKF zgCweH5huTF{d<(^^RyjtAY{kZN5sB)yOK67I978kwHByN*Leq6D&wIFj`;ewMd9FkdD2dceO=TK}z`KDg} z>y@Daud)_j!gE>qIs7O*GMR1+Nqk(RR!LvZCYa3L=Ukx4EETLj-*U=km=|hRL~sx6 zfkr^08E0yAD=8v?esMR$V(p#~e?i?jARbow4=;&^uLZCIL2iwG26NB_;v}Xag4t`A z6HJ&P46R9<^k8vt{i&G`Lr|vWe=HVE5x6G>t-Y?jhQOq zZ$=Lz051fdR*k1gcfC>c8#qmqV}`1ZAIpPLp`zK3m7CQN1+zwEisbN?6Yi(YbU;8d zhBY3cY=CvamDO;W#}Ga55PRlvp^&!8q!3mxWxHY%7Avp;(vggt-D*7DHh%0xkQQ;!9L@2@+x+H+z*HL)u zm#P{o-nsYW&*p8=e5+;jX-ch@C4l$R78bXTFv>o#$!A*QYbHY-&(#??E0RT4tajiP zfMLZl*S#WOB{@3=-96Q7a`A-N%m& z3n(^(0*l$zr(C>v+^v&f}`Om?|xTB<}Z%&(7+4^+Lg^y7b4*8klfULrk5f8CsuT7P_ZhyrL) zbj=%WytOB<51}#>hyL9TD+hBeO|F3s7h@N()U8{@^Z@vrh#X}Y2kQ=mI0^uCoWXZT@4v>XhOVfdj;tA&Ko+e@kzn9*i zC9S>GgTMEo7I<^CndM1{*sKTJi+p#_VeRiZAS@)A8r_0-PxGqi75GHfX_|f&TSis} z#WQNMS$F(5zv~>SwWY@WF_duR$7acbSkQOu5r8VT$k#z zPFg)}&#&jtnh`t%#Act3j~XTz9&-El&z0y*7-WP{Sb$M zkENr&E2j3-oH{>DxYj{|GnN=>K320y()_9Qum0W=1ZSx9oOPZ}-4B5VYzav*bu-s! znU!(cb&7)Y80!j4qICF1PXv-|F(ROC+qsgh;t+XYDaPfGlXa)bYc%rM-?0XwK?j00 zzs2F|OBmC z6s>QBwV0e4%|qQ@b{W+(D59Vs%?4o#_rzk`Ul%HeR`e8&1zK)IZwcMEO@Rc(9Hp?eWsdIXh9mY9SJZbw0vhf|xW)qexDSY$rocLB_$>&p|&I#af;1mhCWD4o5SzqQ^1a z%+tFY&Vj-k2B4Mc(O*F_{46z#EHd&O_^prRkg!N$TD1o!PA~UXi<`{wd0XAL=cl#p z`W@JK*6)6|{LhE9;LiC8bGM^Q&AaoO5ufvC(xF1M+nTSVRtkgeCTjpZq@Nx$A`{(U|i&R2p4ELMH>f}(IP*{L~_UFH7mUfw6= zRTcc%6J#NNxec=e{>SJV3PX&cKfkHkX)JCt!*Xx{g!U=7CHc{0BAN zo~JN_>%61EK!)MfT6Ixs7$m^qQmqxm1h!rn(Z(s|y+PZ-jBTX*5$oS&JL9Sem%9!Y zpmWhCHa>uJ&k_BMEo~JNQ1sG-%%6J}-!K>RbDUHTw`xRVaaJLZPT70yhN^)-_OXKd zbUp4QORRFPWAVviUh}W;-K@n+$E^5SUk9P66kQ=xseJ#5Bm0*|-GWbY?Va`7Lu$jr z?UHP-{cX5!>@CF8?k~b#yKHsfXOrt8soYS7xV&+Ul2g?<+ z%@4%!F`&{WE0HH($jMUow79r=R_2E3i;j?M`m!`QR2O7v zwAS#v;ZC!~o739FTMBgKcRq7Y0xGWE4FL`@hhY<=aoMQp2a8nfloP(v=0LZWMhh1> zV212?8*zLiqx;J8gCWNud*U73?@-zEL84&(6keGQDw+Hl-Tnw&lKA-}7@QHx7~%)W{Q;`bMHN4!`Aa`I0ZMS~bNI6T@!fRZjrZzRubp-q z(ujE-By`QN{!djJ?O%BN2ZqO_PKr`SUw@hDLs`h%z4s$g{svdEJ+%NJ_d+Ly%R*3M zaX-nq%g6Zl6j`TPzez(Sa^U4o!*Mi7M=I#9+g#5UaNMqvb`A#=U{6hFkNY!mvvl|v zFs@#Lft5k$)}JugBIJ3tBnF@mbAn>s@u%@+F;Ul==*(f&{O9-a_2PfSns;h|v8Puc ztVw!-S1_PhqcGrl)C%;VuPZf}DKX&JkdqJ&lZh(rO27sK>4F5!l+|!+t>#SqFhoe_ z`Qbn*HIcwSsZ-8j7@+4*2@S`!mv70HF35r-UKX$T+P~k*Ot0ROASS{=LX|Uxk~S@VM;*9_ zG4J`B3L_bX_~mc!h?wPwbO|GRR%Z!cqoakKll~ID)9~m9{Gzor|0vzVJWj>x6sGRS zzk|h!kTYD-Ro$4Wv4{0?-WC>6N+e%qMPClpF(~>wyfWP9{Jd(!@0~I{5XsoynC3uL zu)+fhF9B0QK^BRck00iqEoLdpH`A{6>fh|4E%V3A1$uD$NAh zK)oE}j0!S9aI>uLW2RVp%uZ2(<*GCdi$y>>}(faLMVrjP;(~(#<~~0(7@+voz2}o z60C&wkFw+5Q9GcvP;e8-5a`IhA--V3^C?w7z;fXctoMxKNp};t`XNfffqpmXh8$&t z(uul&{1v4?h-40Bps0o~Ux_>e8JgIj--$Ni$6eG4e~j}27mPN@2rmETox|*?S3zin z1&d+gMIMJ!$vg0y0K6pFJL4!y9PONq60jTkJm8k&y;l$=5k!pvubrsZOG02q61YkY z(V^Y$?csVTrB_r^-BtZwF6X)1`E|MdF+RKZzkp=Tm|#oQPhJc5w&$5M2;;Y{TFd@2 z%hh@!Vi$&6!qzfI42@Q>HlLS`ceT9ULu~YZzCnpG0Lj{8NZ*&gHl{=o7eH z!|)dUPlKl6gri+k@T#DoFREEdFV$mm77;VBN4fT1e}(J@1*|p1b|AcgmWd8yQbmfE ze7p)E3Y(A}XiV^$V1ZerkOC2{Dge(o4L44eqxr1RZ8lYrEaeI4TW8w4PFm%=7plvK zSco6F`y)(hmVc~u9Yfl>RqP`R0Z?<~c!WJA-m-Fv`7E;FZjHZ=NZTpSzAR|$%j@#@ zpfvdlI@aTcf;Y{4?J8b?hLwhU^~H;7*+{!NO?$k8JLqhJ*0C5Yw5I5oQFN9_#!dqI zC8sg8(1E0uC46oF$0_Y z`aWZ1F)k;ZDQyq523wJ5UkgP-?|RN;1N{w=n~YxVcq{lfzOFXCU%I?sJ-|-bB0Br0 z3HZ9a#kypN`M|!D#;Tzhwqh0hzv4M_}m&!q(M)XypC5dzkJ0k)f4-mP%bP?6I*d--oGO%-mGX_& zFk zmL1L@6LLY1!xIsSV5<;FCM}F;iE>FGn`r|^8Kz9qbYOQM3<*>rofcxnl@ZL>_avh0 z+iV;PfgERz(0STUY7DJM5l2hWnpl$f-J zjYKX57;m%c6Hw=N`V?-0u3B!!PMuJWt7U= zlv1T)zE!EkjRg`sup|wHHx(f8BhH&=jvzO2kfvqggW$QtQ|^pHSQ=cA`i#^Q$FG?e zORvY`_OswlcAP%BJbYB|BKM6$F97RvXPklcSvwXh37<CBm-9`AWF0-4L`VT)g}DuV)g^H8+siTJ2)>f^(yGZF?z+n5Jd5pD$-oF{uR|Zb5fw z955^E*U4`PSKvjt*+Hweu^V=n{GG2u-%(M0q0{x`1E^{}YDQE2-y78oVE>|Np3!f& zpX0my9NV=&Yt>2;({A?kiommZ({K}b5BnvyA@iR69zaD`7kd6}74W1?ZA!>*| zGC_Num-J|_cJHW=OUPk`?>axr-s0jn$FI+rx8L~2;bKjk1XW>eLzfH2Rk&@bn$Z6K z9e;M@)x_(sqL}{#vxNK*coh;{y$k)7@jbqM?X$MuRlaF0Rc-!Ce6D|evrogDUOJa1g3eH(HPUz z8M{g0A}{30Nic>dqq&QsZJ=KC3=>iRqS^q;7RjYC!_oHk%WJh>*O$n4u%r1$vlsg2 z@e<xq? z(UyjJ>K}>bxP!aTyK#zGUOK&0v20Kfy8~E66_gMqR#AG8N;_C6uE9X4o4hMAAV6L0 z{uJh*p^+m7*$}=8`m+n5&=tSBu#u$u>V*bHe(V`kM0X3@69_5y{t$l{X+V#~gYzf? zk@LO{Qc$<)kBZ8*f=S%VK@wI967z=A3wFm88WN*8bF6?20iDXWV1e~!)Z>LnP1@d> z|77Tt)2e^YGfWR{ThC=kiMaNlhdU)fP|jE3ToK@188!*U_n`z72K}x)iZrSnE)gNi z<`38!b}T>~546(N;&32)4k>>xYh9M>^NZB!=zoTpP3yjgHdSXGj@cnHioE1VvUx34 z)NV#k{IPJdZ_l&zqf*Dy4CxUHvRWrl64r&#WX>fKNr2IT{~qw6UorfqP2HA*eiO-s zY|2BSy;S{BZbGsg;#C%)O8A4nLDA8LSeOG52>6&JzvELkskrM@WgK(+f#z>Ke6@db zRo*ppz@Pu%O%Q`kWxV*m(H%2Hv}v4;-EOpzDsgVV}wR_oe+r+TWi+r(9}(9sS-Uri5pvGNMk zKBh3>ue!@z+2>WzfAlJM+{jRO4{mO=<8gkzIKTQlt+ZMuL1;~WKp2M4sRGdNd2*oK zuY|WS-^@h>0$W~6H7)VlaHrh{h?ZbFyNF&4>nzA?h~hTJmqf7QqX4py^Hm%vZj|lu z%Yd|JFM)&4DT4RlsZqgFo%4G6C1(KCCVf1 zO3k(j-@#ac#MeEL>ZG?}4-kxfd?!HfQHV+l@QQeCx!!Sl)>ddH={gpG zCZ8IFCH^8x`ckb3_+W8QcE!(#t0_XtgaFj~o)86#1YY$5g_$cJjS@@^%(c(kmNtyV zS;5&|&X&k($CArIm9*|_2Q_UV$z`+?^`1bi4SM9N1>%JI)-jIH7WqHi7BVYt20p)3 zPe`YqGM}*u6eft>n2QiF@rLAR8B)-oXsAuMBYUg-Tem&0nmf)Rbx}C)`?aF3uJk0Z zqTXk2o&Ns{nZfOPi}{!|PEcNOJuMYbfx^c0mDc&+Vd- zdkIjcAGp+9ip#|L$QvKb8^mlJK=44p%y#E+8^UY?B5CIObsFT1df0hBD}`c^P=x>R zp;Sq?EJtkzBj^W>!P`Ok?;vJd(s2o{h0G-Lh)IwI$i$%|_f7Jy>6j>q%d?|N-p@ZL z5O)c{(SpsXVzP%wtj@HsJ5cWn90Y`fagg6D66=th-AG*@KC4SBOqA50N|GgemDL&& zeW-7em)W)g#pYNHpDA5Yzp`)+wRngJe^#wTs859%xS}<;ssroH`e6#rVa71V7tB8q z(C^DQOv+);rCfl4*W=;b2qf#Y@Qbgr%~Nqx=N(MHqN^X*ih=WUoTCXn&!gU%U3Dr`mV&XR_ z6gFIsrW8V{Rlxd}47qyx?vPBS)ek^fS!6jNDP$(*&@M#aA1A7%JsKFP%tq*z=-)fK z(I?qYNiZgHB*-;DP``&He@r;4qvpNZahJ+XX;nQX<)txaDM9_NUS-9@%9H?k)+0s_ zCI7)JsNKIoyFju;+w8tt=GAS)vvU8#xfAzITd(DOhi+N7{j0#u;Ge}cdMYs4toI&J zdM>BW&PI0oNv{PXf_jfjhwQ;N5H>Yfv}Co*{7z9|#w)fhhx=d70+((Uh=8q;-gJdj zn$sAGi*|MQRrHU6Mr{CX_0>L13v`1#o(O>BN%A)QQ`zj!4BrB)Td2kKOgkYR8y6L&0X=>;m;Q9$OKBMIq`xZS#cX63DfEtgAtP?1&C} zu(;M921t@HNd_;gKAXfsm>*h29t4~aUOCr@v213qBt##)?;MVvPDstdJXzd&88X{y z2PN#`dPpeexrUX5xr(hq%>nWCuNDAJO}s&dm_jwqkokc1FJ1ZP=3NyRo=Xw`2nM6p6$lzINlOC zp!5EPqL3bSeQ39&V^)Wo`)IJ4A@FA#YRieT%^ccv6U|M)e4}Bp*gP-`O=LN0-+p*J z92>7Lxa861)9^SCeS2H}?AYM_Z{Wc<$?Q!K2r?aETlXALh;}@ctwr!TayE)S@-rbI zvBpjpQX8TJw4fBxQ(k#NYb4RXF3kIMM~JYBQdihTONdEK84c6(KA336hAFqff358D zFBx$wj!Vvv)UP2SnFZX3qEuoIBZT@vqP5(~qaF{vRXTZ2U1R#JS4Fr~Sw^VeEwbN9 zd{;+Kz28DDETsf%BwB`2(;Vwqw+f(_or%05UK_VRLG)Hn8I+52@szYt`!57>kw^7y z2#d#r0OWGzR_+(%UZu8kYvfh(%j8wA!-@aic8C}vmrFMbkNMBHzQKE_mKN=_mbpM< zVpdVil^Nwu3Z9_ukt6h7)|jx1Paky0ln01w1m+pV6P=UKEUiVlAnEl*-bRJzUskm1 zXbcOcA*|3SpKx@j6#fwkgY%57&bNbTRVh_tNY(ZD*3~{xJ;YlVu~jCP#fv-8WrW0KVp>WwmTT71Nsxw=E2u5{&K{I#qQSs4wpe zq={U@FgEi(SsrXCFX$S2R5|wYLJo~&AV44*2Yh;B`gw9BN4#8fCgrafD0?t)(2Q|rlHFg9mCZ=YN3?c6R1d-1cED_N(aSz z&74J2Mr7V~9DCeF)=3!}VeGWQjk?N@G&V-++Gu4cyCr3pKwElBO>L(GDj=4?3!Y$) z@a4%X`_4FIp&p|oTe>l~PRmCB z;sCdeWq3GEGHY!i;15nP>cB-=t7dtvxMBBzjO$-c)V)#W31GW?s~EGtLb!j6}|Q(_Yqvi^S9IxC&)^uCQOp*MqFR^%G6&|fYBO}*o|^!To2-=slMddvXpB2>|R zEi~ox{!E>8$8p&M$zJTfWp(vm3 z7bKm3yZGWR8Hs>cM1|4sL*+G#qV(swnEYK%q1M56$sm?L(uea`1}RbmYrF!3XM zVwHboU&osu3?T2;vVoQMnIE%w?J3wB1sWP>2>J z=Kd^^Sf}$)N#R OzcS?kj;UBvDA51obUUBDsyN_N#9ADUu_(3ZMA|fEoDwU zH|p`wRwPxU6}DUY)9O;utDYf{XFQPUohzTEk3JGherqoeMV^~_kcj>e-Q&I~zd~@< zr`2~koU)<1B42r*x~6Z-aBTtvjCWt|-Y8_X>F=Dq$NK+IJuGD|_OiR$SuyGGKX2t!$YbhRNw`7X;hrz7yJorBSe7^5O8*3Wtfqb_8KK?6aH_ zQ6q9JvBV>sQ~)O|-3>UK5yxLE^iahLMhG}nG>Fl*JEheSBmIZ3x~I$DCKENsZQkQD zEkVU{tvDH~TuQzW^o8bjk;CqHR4&B$0X8=x1!!oAAH-r5zdv>|Zf zP{fX~uoB|pY<3Y=_xzzcXev~fopgcU)7=2 zg#~v;s`VV5?#^vE2tPl&UqAZ2Zx{7YVbZ`ov~-qE$shD#bZjg3wi=hXy3<0lY!w|a z3X?REGLHw0D5A$inlXAHlE(z}l3XimDWq2tl5fa1*-kKQ7&}*`9b(aSc@*m-D5z*; z;6H)8F=X`rtkz(OEXqoaB~~1AN-I>?HraHi?>pRZI3b_MBM>D`@hCa`sZ&9?;US2w z5Aj^Y?ymMr;{A&^p@4^Lh4O(~rm0Eb_UfILB{-A$(z57rhSP9(1(Lf1b9J;V!m4 zZ^8d1@6yC}9+{EV9@^T1fia*>_A5xQH3ln!Y_bRMj@5U?tS8=I2wpTO8@GWwwkI<^ z7@47F?ys4W{p1ODIBCc5Xi=J;+0o}K@*Pt=8wZ6$%{Y)r`O#q%8>ctms(AbEvVZ>4 zD{Pi8W7F~RK`q<)fiCj!b3Ll(zfWdBPb4n;=RBzlrx&GG!%=Pc{`X!ZA(jBj!j=dh zanqS#ul~HeZOX#CEI`OMt|)zSywYO=*3_yCu(IeQnYxa6matH2-$16A+e{EPVIN)5 zWHNq*d%Q6;>YgO|5(EsBu*!X@%V!MBy^#3C2B6e zhThubIV;}VW9fx$Bq zax52z}}R`yrPj z<4wFaugy*y$$6{1oCy|jFrDIc_qw?2Knj8H{*_(%c)i?IZHoS~+wBXzqV+IXwEk-y zdF4OPGpSEcB;fmtTgmgV++*ih@BPt+aLfLkx{a(OMuozrF4Ml~ONoJ+RZ+ic0NxHh zb>Wbl4)#R?=fWwIao48J5KsF0Y%75c{I1kAw!5ZWVWsHs$bi^plj1(|Q&N}oX2Cex~_5$hY+PPH6vArVv>Z>ruG)?CF-0?^B%CuVZzJxl5;$V&*dh?wM`Ko{S=th4YR_|Tq zF9C9bhx~680;X-V^6NP~NydH*u~7kVj(Ao<7xj`Z3*RK>yhIUejHtpo+KlX1Wy;tW z;`B8g=_M;ga5To;Lg!oQFspo@FvnWbmI1MD8Ny5R+lq#@YlA>r-D(6s0@5kRM4TO_*?gaHI~`mHH1uL(^tr zzLTp@4D>Zxon4nN( zF_OS`2)4BhWbC{7xUxe5w>NnZFa|QE0rS1@33LKKcepKfskPB9)d?XowKs)Li0yS= z`6Qx05p)`Pk;5G=_z8Fne8*!(r$sR616@3^oFt5d3Rg3?W&;WMu7GqA`}tov4JbhT z$RXew4I8Q+yJ1Iz7m%CAK~s+;*Q2Q9_XTD8J6^AXqjny$lnz&Ra3Iu-+PlV_3=%>w zR>^L9$S0>!0mB!9w~4u!g#M3zu?ejAkTMhS{R?5h*Qy80G zFB?o4$H-6;;{*92NeNbT+htBXArk8ZcvEGFc!V*+^23BogZGiTRf^^eSJFOxHH}Mz zVsGNBG_>XL}=Lj@BoKbW1`AokD2#~P$J~H&-?_9 zxk_p3WJ+m3W=i>#pW(TQ8v zpIrI;tBvi4ulbE9{jfz~??K%SYFA~|W;Z(`mjM*UEh&19CiVWZg|o zFDsUV_rro{xpFgdww;cv^1Wt)az4G)+u?%S+2fX8$R(ALpu7W+Km#PHjDJO?;9eR7 zYjXfax?C>dn-DC;22(~vZC}>pO*<|8aD&cL0xY|A1Q@;a=kIJ#%CnCJhfYKkd_U&2 zpUp)qkaCli;B$(}gG1*EJI+D~x3@H3nQ~jn=lnv6oRpCYVi8j#>lECs*j!A_2Hf`r zOqcldFMT?qvmDYW+F+uVXV3Qp891pOINFgW@Q4ID!A2EbbDjo_WzFS7WK$iU#kT6| zUq8K(f}g#94J29cDCgEfBqQGOKH_g@iw+fFLCAMKN)k)iyNCO3l=Viu2_FjviGg^i@55@QB6-28<#nDx+s z5J!TdLt9eOEpcA?6&60&m~Nf%0m7fjaV;>dTRulg1Y_X;$2^>69?&hnLhg zJ*zRB_&(dp-O5M~_ag6dugPAlD|^OXzdn2e=OIR0c02kED@;r`QbUx@piMJ%%giWz zlE@vTOQVKH&c0^{agnaG>Q<=AX%~O`bQ*cUi&!R0>833M;SC{}^(V`e;fXcS@M)ok zWMNuL9v%${X`ALE=8*}O;RE7Q-unkrC4`anfoJyfrC zt{OJkiB>N^U-q8oQ2oh-yL&w13#dzx>2xDt7%k*#%^MborS6bAzlHqOa{~M&b-Ghc zRdPm>y>rt+VLohuTC)unLgfM~sb0aqr+PMJwLcd;6y)owa{a~G5Op)4CnQ%uOGMn^*&}%LTP^`o^^XUIeixE zD1SUmd%RxP*{t$%?0}|E!t{l!Ppc$sEICy2>7XraYaWS#fGW=qROD#psq4if4fRHk z;z|_s!V?jqU97udg^}S32wh?<665vmoVLS{rY(N^0C_d zr*l95?%w}(HZ-8L+aLdWdwDs%gg_4*9uDq;Gk7uKiE6KVsCvjbT77Bp{iU|faFchj zsh=C=Nr&o{C@a_KMww>IMfGHIcHFmBB@A1k_a#Wb99dFPlEMGGTQDc}A@@^I*y+~B z?sDjd9}@2CI#im!D&hI2v=b#fC@iLji0-8JWM*(15St5q^Sz0`OYK?D1=XLQE6Ul9 znP=@a`VD~yO1;&=c%hBW=lhmUM#f;M+#caj18J`V!CE}q?i91Am6fV*E}OZ(v!h(F z$CT^@E1Ms}1xtURvdWJ*JUVKFK6;5XlrlDd-5S{FQd#c2`tQ;>okI=BZA|3iK~`KC z=#_!i`>na-KlYx?`xJ6nf*G-HZ@=Sh_AtW0?lxS4&&Gho5J~CuJ!{-lIP|7*o%tLa zV?rqgmo9~Vt(!A${r39J1U$O_uA_-7v#M*@W$9_v^y&oeH(@Uyq2VM|xp^1K0Vn)e zWz>J6M{w!>SdVb!wk~(y!J(~9kiF7CXnCu>@?UrHJ}a{G`fzr|*UjzCgm-e?p8Yo2 zuhn&d{`<0a6nNH$P8=*k@PU@s33xsI0*MF}OR+0N>!bLSHPq7Yx30n4()?`Ov{Oq8 z-)RxC0jG~VJ4>l~)f$;fLXt+2#MXIL<3_5E$mqSn+)q89W* zgN8`heq)w|0&K+l`W>?0_5Dt3r>{6oY&$ts1R`08A@)?YOEBKLqkfsB=1oJEc;NTZ zB3l|tS3Kq$q@qgG54RsN;A$(Pbe{O9#O*@i4I2R$uPh&Fo8VKrW>u~n#=!Mwq>~ia zZXE_DnWcmXd14I#QuoY9?(k63YSSvEsF7iG8Ve(}MV0o1?%3CU)8fK7grjC8Kjav- zAJhClvc57Zu5Md4KyYc?B}gE+yE`Nh2qd_>L*wqQL4vzGH11C0E{(eecZbJ!&O7(q zH{RGk_Wz!{=bEdkX4MrPQ4`ShCbp1WwVeyIpiiri$ALkiTW_s|d<*rh_#66|mY(%? zyG{$3cwpkT6R>i)1pey9CnW%BGQpLzc=-dhTf(qG`j)&J^rpoux%sdMPwKvr=Bob&`Uh(KDE9shSa$k&^Z1kk zZhijFWbt`k=|0fca|BA7ssCWov*xavQsTz)BqJPzLY?m=J_soaR;9}0BAc;43Tkt( ztti_|G)mav#{$`b-P-z&EiLuhm@ti79KLCLS<&DJQq}xzL`rLf8)fi?hp){FD(hKS z+wWgD%JW2@KhP*SCv}rNiGaw)#@E?skYoz)rJ-q5c{`WsA=ahJ=^F;(Q@;5->CO^0!l zYACp0E_-E2a7m@OBaQ}?O@{UlE=P*Q)UyH%4v(vA?3Cp5!MZo$h9G{+_C*Ut)l9aD zIY>iiFS>3N(6wj9-FLWy{gkA0)0D_2uwY-xhom{juhvw^b%~JyEej2ebG~@3&%(ww zQ|(=avE;eMGjryqL1+^WLTmPODKBv~7_YJNIyd#%v)i?Q3jU~Xr}g$ab%FknH4yL= zL*n<}habgHn#}9kGWzKR(7NV)B_p77o_nH)RZnwOEjuSq9v*E)jHxrd)0!Muzfk@) zcvu`Zjj=+atP=;yFG=IqPcgC`Ce3g6P7lkTL`?aFkl#{!&-0E4Wd;|Oz2hF?&{sOE z$Zr0&A*MY91@%40bQa;-DWTnEH{xAk+uhReGlI&nDZ9$7x={&Ro&_v7oWIZJVLR7?6H&>vY=-6VHaFUDzz~WzGjSUFCu7Rvr{!;k2%9z`7 zg+^T7(Oy+H6bY9{adaW1H!0-TuW9ux_TgA|Pa2d3B@C`LvSRc0Lik7^*4pxci)bI2F6YXxY2* zq+!jxQ%jjv_w$~A#bi(g!^6b|Gl?z&k_c{A`?28d23n*hmVR7Ktr-Y#-bRNz#a?Lj zk}&yyIP7cF7^;zZ>qD%qI;G=4$tr}Vt_hCGmF&QrLY^|4(D7PK^EtMgU_ZOr0ygnz zy`BSWPmH~N-kSeugngnL;CiAgq3Bx$i$#9^=V|7*%T3Ppw-*h^^tT@JhNRl??lgtV zS|*G`eW;nZIe54g=jkj5cRh$de1rj%BO!3j{&pZU2$|oONB594aY|pKD#sySMAH1e z3IVQJ@pnUq|_Iq093gY63r*Zj2mKjsg6#+ydM@8A~Ydd-V(Ud@LF4V%Z^u?iSvLOZV z#|VqG`=hD|m9{S&t@s%V%hX1xS%E4+9lzJ3_UG3o0lS1vrC3hFtYzOeIA8lzWj^qx zs9|jmTV9E@Ko{=k%xRHZR<8I3orRzgu~KT7R2Jg@%vt@B=lh;K)fhTg4sd11l7qro zLk6ht;X~Fgo!mD~!=dzH&p--EZtR9cPbo1{&b;}iT9{WPXa2wZCUu9p7zS{>HYy%Y z(kG~`G}(o(X3m5J9)=Xc0LPz1|NPS-(7M~9#U@z{@X@TgF9<6YSqin8i@1_XD5dJE;1%~otisZg#si;s z#n)?!Ys;V|@vTrN3~SY{9W^BVrkP{%MkPx0X({k02%ATR-hRSG8q9aQ8-s>F&FNX=t0%2-Zy>}MkPmx*31@sjfMxo zb+^;wWZ-dFZq4`g@>0zy(a5QB`ZCF?BtbSOVQ?l7IvH1!jb@022~l{=EGJf-a*`SG zD@5UP&ULFy^!bKfqs;s6zTBy?Gi?btL zdqO50S&Y0g2?GC*hd~R*;#o(jRiP5&Rkdb4{+vt)D$D)OpYcl><7F}6#;tzWMTFlJ zJC-$l*hZoa&QDuOg;C*Nl*3aVk#fy}^$3V?Wj7H5?!L`{s2w?p2cw&xSE})Mq)rhg z8*)ENmi;C)dLe;Uc;eHWfz0E>5pYskzw>J7q4&et!#4}s#AWFLWGli545OXPWiBT& z&z!oJWOqTB?+bmT>;j5gl=|i!B#9(Y49bfOvhjA(*VTG7fqd1?@$EmA8=`U|-N2^b_0=)Y0Tg z=ig;X(2RTbd?~Csv}2lVZKuNmssWhoVdKAF9v1YFX>5NX=8}FJGh9+~be}$~3dC%5 z3s5|YhVD0DPxE6{v%N)#oVq?f5C&!aHr!e8t4=sualvDKMnp#KMkBM#0M7Odr513q zP}_QQ3!M(|pyZt0RFmv_qvthDd{SZ<)GE0#V>jE2htpE7yz+Y|e~-%CU9`;FyyfcJ zOnnTN7pfDKwRm#SRX`%7;ShnhkMHEon~}Zkiw>k@m`BFKIBSzfhj?XALk z7?hN#KNb5x&>6 zWu(X!?Qoy{Mi}#^O_LcKS_{U+_rea4uj@46mLd z#L$u4wV*D3`wJNlx6w@|RrGD0MF8-^bKa4s>cLifSAgB#ew*_?>p}WPpPE$-CcQsU zDc$1;Z*&+Ai)wxU`yV?K47ZomD9}S!(0GhJJTHjn(qeE2{ttYG2h#UN6`5G}5Xtag z`(0F$_6CPo%T{l+rjI2CniT;?ZLDUx^`f~xJDIWcPhlcE>%H};e)|owYJ7;gZ zyAY4rQ-}E7@73hzEc)vvpZnj#wpv`DvEt&VCQ?{Nx>s|$w(4IzQGXI#6D&h+@SYd7 z)SlHK6z1($QJL>qNiEzgV)1a6%U|ql_*S0GakI+g+n~Y>~DBc&bw*15rq{z zVVx1{>XRH#@k~>qxhHFTO%@#k(@w&kmc){%y-%9VIex{qCbnTilOgM=y~8lCfQvY< ztdgjMN-*d3pBEmg?3>W@pQ|%pe~bq&BO&yEA=GPCT*32}YgN;N!CNEY4{qj&zUv7s zy%87OdnWCqjJYr5QLMU^66uPyQa{?C9$Ox{t=`tje)9cw{rnEP6LpYO@VnRfG-=Pf z-(HKiO^M=?^_IN5TW+$w=m~$lBMhhm3&mH@FOU9u9&i*ncNHQcf8Zqx{Qg#97^MJ( zuj*R^NlC@(E2b%?NMyM(!oTGg0u%ozgO(POg-KPkZJIBT5#CwMtSL!q zQ|nk1rN;~tKCN)hf?qbvpY_?1xQ&g|DmN}FgMz!7z@=lc^%572Jo!sRv00uedp0-F z2!+VtF=~v+1%`LveD?3$Z?HJV;*Ms!AE$GM_g6Kl3Q#)bcZQ(8lu6V#7OE88NL(5* z7I=(kLG&ikidt4xLjod2|HRi7j-K38X|o4eMP5bB^t9yp6KkDK6KDo(&^ndV?`tcy zISV***%O3|vxQrsQI(%4N-j$wlHb;0E0(MG~o4B^G>6m9C z9gDVd*a|v^!2-?*$RMjGP&4+pEn5}XLp=Umuf{y}4qPoYdoe2UgGk3hz@Z&ig2&2h zs-uv=$NBBXCit`TguLo%1u~W16w5ByTkwiH%`@5u`Sbf%N$~+|&!-TFO94@XdCK%W zbTzz$2_0X1F_|XAEpyJRc2K#|w0KdEQU@;`nSzi`u1*IfhHfo{XQpPbEy5)X2hidT z2UX7+Ntds6zqPbGxyMDJ<1!`U%)*7lWWIfWIpVz|4N&Mj>u9(+zC;BGoOd<)^}QNO z>q&1Q26okNchZMk!K-_sb>4S+KD$;Q-s~KA`$%ujj+YdElwsfUiW&HRpobYpB zSw`M9{d>3=fud_@vnShjxfOCD_D=_kVcDg#n0oD?Cv;Tc@y^%XTrDwuVXX<`+y zR8#tP2^-q{3skwO8AI;^vG6W?EZBJz(&)bi#|)2mq6sY%eEHxN$wjcUefFO0jpnEG zg+E0=@T4-d^DRdls>_ zy5{@B_-vu4qt-trQt))lA5(Gjz{qWM+&&(7bMw=1Mmodn!|PZ610AtL?K97(%?^*# z2&aJ}u4DK#;=!kh|8;jp_fzoP!qWA)co-q8$`O@(-HOmTC?zG9zd2#Ca}4J#vK$&| z{Q8q|k&_gtS+BolOuZv6ww3atZ*@asK(z+OiGY)}9Le-^JKBhwizD>MNyEX(O661^ zVgS~t)2Qm6w-qoUT+Fv3Gst80n<{q_ZzD1!BN-HhpIWb2uVk$v=L2_02-las6#htZxUV;) zVr_A26&cO%NO{5dkykD=T=1cPKtf2PI^*-vu;HajpSM%vp}6Ht^+wZ@;9e>Z0dd zCKq|WIORUoaPRPb)6_|5Ly*f-Io>pcpcPN_9d#ei^CScs!P1&_Ly|E}9Qyw{b7rdx zt5)mJm@NOf>RtDEgAY|1do%Uftj&5&-xt`wqhWe|anx8pO?|2VZ#f2F{oaow07=%? zBaXM&z?t`L?R(1n*78CdC%X&g+GPoXZ$$i3?bui5jM$0|kU-lGcgp6kQ8lkLTeNTz+u(8SDL&XpOkDBbX|u0E!7Fs6}G>oAqcUaWrSW`X-cqj-Qe3dH23xaoENb zG{=uEV&xL0v692o-XNp$0Y`D$*9db;4+L%fW&Aj;8A{pj&8rhKM69e2=|Ln+4{%(Z zY zpDKbEnF$Y`$`v~uqXD*j;55_H4#&`m#DQ;QX|D)FnsLi)#8RR^(~~PPh*cmEe7;@7 z8+0F*Oc`8sKYnm%`jDSG(1reZq;Dj@RZ%A5_8#&UT%sJNV&=LwQ6aWnUvUT2*XO;G zu22OFc2GB{|J{eA?;v8~M)gTBYu}GJD9L{HChZT$?IC^Y%Ss+GX*&+fuFy?^fFn2^ zT2D3Kan!G@?Q`)1> z*u!x`7O0HToc@40FiX@=0q--8MS=`4Q#yo82zC2`+RjXe%{S>__F0$Qx<{C46d#XG z)Dvsp0#}F~UJTTl{?!V}c_8RTOlxOi420B2h#_L6R={sYV;~8{d_6vNePpw?KwBHW z_0#%6I^MT{-)rqg^AgIxWO{FlXanBszzRk4w_Y$y+){jLZN91?^F$~moar-NFuwEH zGP6#l+`Ds63G%(E^i;$8ZVB!MbiSOAQbO3CxtZ?*`6dW{< z{T%ExtJ)R%c<~=CfLqP+g-@-pqB#2lWXw`ttu0<^PSX*+zR!K^6D!(GUkmZHcJ`f6 zE3=+gv*x;~pPtvA#xq~~ zbvao$93_X55FWN4?80l098c%H{?y>8F9s{~Ga<5nUR zKfj4(Dj??e|E=-oBX3cg4WxpOA5eC#Msk zXEMEQ^;@-_fZi7^@Kr+h!;wyJ#{U`-1G@5Jgxp{5yZzwPvxFWMguGo(EMpX`DBvq~ zwUHFqT$C>Lfq(0nLv-uxYS8(LY=v)9=fMm%c5F=u%_R^uS9*9my0qUe=_F%!T3Qb8 zqDDN;#sG7G%_yC=b@={ZCGkdyuq<)g{+7WPnr1%OqrYXm-VS_=KiaG=>#>%R2+=SJ zK08PNFFJG$wUIC6VS)^VjlXW(ZkmIKIk)gLp##{J&lA5Xfah&yqlSjI@*-mFw2wj( z6xq*u^h3x@{51484vM>HtOu3b$-E<@i5x}R!UgcxL`hF3wK-=s6u~jks1DP83c-{D z6bKt6DTI6L(1pTYjL@KSC@xqH%~0}W&7rCAIjh{CJXM}!K4D3;iG8XZrenLXfAOWa z#B8rsv#_SG3(&KthGeT_aJs;`yR%8$dKRy9IDJlwyFP?jMFv$=mu^v?48OXrc=KFD znI5Ir6AG})oCn*MWa%&syVX2~Zug$K4!jSGXLI<`NhbeqGdavg;amqhB&Q+%}a~J z#kYDo(md+XFJoSt!ga9S*rwvo91wQH0HtYfGy#!~T!cx?DJ8ofkkofK8pRZu-i8dg zv52ubo017EqYh#r1`=9njhd@n<+Uh zx4%bC(3NThFMUqVjlzVnZfpkLN{#L(y&xS*TmJN?fG@(P+%UrZUOs4K@y6Z&Q~?@= zFr-?sSr24C9b2}$ND_No&K{T^voUkYCF|-al~?U!rP{V5gjh8|qUO;_Yz2)uT=rD` zr6Z(`heBUVJ5C-OrXI^R2nnfmfik14-vn1DjphZ~e=~Rx8=~B{1}ZugYCNqZi0GQk zNB5f>gw$nVDe|bBS}1BrPrf!1PadbBC~;1PGrV+KB8AcJCETQQp1=#Avxi*OUXAwB zyXZdTGQUhSzofqi`S7jS-mSeZ{TJ`u4)2OOg1nt>UOqFYY`l)!zJNC?s(4O&gVV!8 zdEVuN5!yE{yDcnqGuk}C;vthk)e*p-t&$J@BNE4d-_R>X_Y7bVbsFQVW!JW_a8Xw_ zho5ArGh=Ww;IWk?80}#vy1MLWL@_b`6vB7YB29U=gf;3iT>XI3RHixBds$-n5(fC3 z@Bx#+8ndXUgAA~|ilB@0I;TL|dZ@plfC!sR1iQ2Ak=ahW87dMOSk6Z6(6~_JhU*d{ zM<~*roIG4e0=~^NvXy?GbI3_X?fQt7Kc2G!kG+NeG4K>V&xVz1Mh9udnI{dGA}D%8 zQt99;VfFpxItKl%IK0-DCC29s9<9E%pJcb5^kr=+1IZps zDVvsP&S$PoEz@W0YvoCM`b18pLp1^zmG9I$oqrN=(pxyrIl_7|xBlIKE!l86%q=&0 zWMyKdy0s7iq3OcdM^I`Y?YRd(k<-CSfTGUbQX0xWg6DjJ@fc&fz2#b%?(FkGaFL;P<*Oxgz<{NwYL!o2?TCUTt=c( zgV{c_C$*WlL(linq=!Lt90p2vbi*=6y*vhiV`Hf`nJ^)}jUBrcAw@zj1R2Z|Xg*i> zzZ|P-y#9TEqd|j)#Jok9oxm_vdmV3gy1K3&=?denGX--3<|(*3!x=_!1x#_n=m&zH zVx80nT3F6dwDD^DTDla_D2#)pzwqOdDJ15iX9f`1;o_`h@BDHla-+~eGYyQRKB$YG zI(W0GQbGM08{%wm**)Mz(B=g%18P{cVAipj@p%!Ih%M&pRjz*4qS<>cSdF3vb^IwD8?^VEXD zd;NjCvws47UD49`>-S`?{!)3Cbsc~#!|gsH2(b;eU03C)a7Y#=OM|9warF_|Is{ibxd{X@m%;Jv~H7*Q?byjyAvN9>MsgF(v#=PGWQPAmQWq{DP< zfuZP0@^&}aD?Fq+MH_re!v(ecFVI5o{Zx8~F3==5-ZjFuJgq!!>YTlXukTur=YBj= z0M|p7W+89~Og0W64 zEt-J8P5pL*m9*j5)^8d9VqW!y0*k#RWw6lz&}b^C zSY_~qKpiwonO3HpS?SlLqVvjR(e&FKwV`_MsPMUxHtVMY(AMFkuUm=Isxp(X^Uf-} zI3lat=fMOaovCqIIOk!jjnsY#<%lHJn0Tif6gVB)KGT%jnIq`2KInl9OWmEjF4<`s zl&ZF))})d*(CR%sths3J5NKISEO`h>oIpDo|B^1_P$MUDvW3MoZnW{Glz-6&G=OR4`9V z%}=oNNiV~Relzjc#G_U1rucGq;r83{`gVv^$4*WN>Eq889&aFjqlc}J^}j0cuPOi~ zH=52a9ZW;6Iyc0*I-i;+-YeimwDSW61Xy%6bR|WY!=XB!zNDBcGP1z*gAj$;Sti)n;S%|E3owuKGcOrGghEJ zFSibwPlbS zLP7ZWA;nIT>ksC^7^UHd+khrZpYQn{!h&e5Ax#rS_77$CJH*OBTMbbLI&r{yf+TO){Q#M;psEp^)uJ?{b@Ch(+jL}>(SVWDotg_<>JtJ zCABQLK`{*bXb{hL?~$?b==le&qxNHl?vctoOAJZG4W{$$3|!mAJZ!)*{UO{ui}&sH z6rt5Ad{T^5x$^oYcvrK2Cspz@t zX2zfuBDAXOs=;7dI~`GAx3si|#^u#LlUeCp8avYIebWu!nPv`p`)9Ms6`I`cWGRYB zbsSAqyY1z`x%v>^r>L0#WtA zz}|G~hkU~R=yv$lm$NVp3&B~9q15D&p%|0!&DelmgI&)Wat}00VR}_6{bFt$m!Szu z*AzqhD5VhjU8T#;rz)zcisDH=q%dtx-SGwnGKNq5LquOwDfXa6%N*Gl!oI^)X@Glx~x@fCT`MbDj1ErRyd-H1hs6SmnvebS0YZ%%krgb zAz%B}7aK@&NX+xv&qjvZ`0~D95V=4AtBfy-*L%hvFlU>^Xq<6SN;^Ils9-X_z_JY1 zg1~w>xK(n&LybprU#%?3I8P1%s!j<*WDyoY2{0zPF}z!8Pr8Tyi+RiAs%PV03BzyriIS%=z~R{{|FJ^rHCmA z0`4zUwn8<*WSAJ3KKJ2Oo);IOC_KBo8I3d^Wuu|uxm5XGm_>O|cs1(Z@c+%{{%qILD0B&xp8bABqyz9|;z79yAuv21EGdmo_w9iOr>r6Bn&s2{|7E z7kc-p!t`1KAh{hP(AvhRt*fzw!q&l0-$WN&;^4)(QM5s)y9X@~eyUglkt2Mc44hZ@ z)zIuuTooI4zZ;70_0eS5eh%pD)6t`KqrNpHPL8i3$P(&3 zWk7T9=I^b<9h&vZ=XV#9A)%nadR&k;Tx99#!g9?_E8VFbyh!ku7yhlGciGcOB@hel zbu&{C^7D#2F-5136MwP#Sl@3{Np&J$sR@E<@T-o_iL99KWe`#Qe7Xuz4)ZeYE2>;-MK@g7@f@R=!0UPSg9Pja8EGY$bjUy&^6tapIkHXM*jOC17vQh|U$b^AyXdc7f?QwNJdo;)4}>o#ch2fkE#&8W!`+ zg7|m0ir^*JT}Z|Lr3=;|!e`A<>qqiV^mZvXcbZ1aydkx}Yp)!F(Ja8vgXKi*zaRXA z3SL0>O+i6ivm!)(U#1KIu9f8-P{4=W;1bu^1*ojGp$$Pp(dP#}@D`Rr@#(vFsGVtL zi!J(Hy3xm3%5Z_Cj6TBX;|0J;L*t|C5AZO@(Lz^$puYNaB}HGW*(UGqgGtV+!GNW# zY+$_G&cm=PH&nsot_bB_A}G|Ji<({Lr0quVw0|VEtw?k(b(zTPZ~ceakT?xvgt$_C-l9e#K4}C z^g^da+3vVG-7Gqx*EHVZ*A=A6EzCn2H|ersw?2l|AO*Bj_N-~y)OGiR=RP(PxT1WK z?-=_dY;w_>oqS~uC%MuVD-P_v>Fj+X4|;YIyPim0(9}-bgs(j2Ap1+d9{j;CZ%TP6 z>dL}INYD!W>}7ihxf1V*%0lNh~h2&P#TImFkqn$Y#(v9*-K2g1mGs05C|6>Ci3W z;DXapPIs%0ssZMyF|YTov&oLpk>bGhSX-I#iFuew6S8nyq*`#FC={>Keq@PA5^N%& zTnAsB^Lt;Ok8Z0@x$Q0ixa6x&I?w*EF#Ek9x*-t1=Y&>BXWoEKV3R_sTra*w8*Q50 zM_+djo3$Lz)=$nB!T|!dl3zlXQYJ!0bMsQM4y{)acf}Q&_h7q;JQX3~dFBk~e2@ht zWtUd1=T3$MCY=PZlkgHCX_mzG=bS*TQU!e zr?6i-M9|^8KVLXhYWkOo2ZjgDgx#4ggl;l z=&mX~<4s!fd$jDS%Rjq)VAUz72XCql#>JEav1&OpZINGeCxJ|_W+vats58mUF_Cg9 ztYkbKnlO()MF+@nl5;w6mf*kGR@9_yQ?1jSlE*B%+UDenJ%M5Nk|lRqw@N`b+gFW^ z_<3bD7!qFRMZEcw!-WH1u=B!^JYxY^(te3?HGntY3xO5Zuwn!asH`krxev5hCB4+B z9TAWf?oMjvG+y4>Ni7TVBYk0X#?I!bVT;fXi!SPdz%>eQwqj~CcSIL z$0I1eeEn0yB84~xW17kdD?+gLd#+n|?}W+N*`ca3Kr z8Ht2B&?hO^*|wW|SHUznRM9?(z9A85`I}BG;HuE{UOc$c2ltu!c2SWSsNK0FwHNrj z&6S+Cfd#BtbtZ}>m%}GI`pVEV;TZNo`ghOuzN%HZ0+7&Bo-^Ce1SZt)OXbtjCF1Ll zJ9%=Q4j)qhlmq3J29N8BjHj~V#wrfW#9r!UsOqu&aneIsh7SA==@|Xt!iVrpjc;|{ zAboyVkEMALPHB_CVOdMFsYNZklW#G?M~D~NM={G}LCN7b1HVu==79-mZT<%uF`7an z5;j(i&J}1gubbzWS+2|PjnSJB=u@}-e4hHwo~gzV-Rb_bxRm(`VWkQ9f;I4bE>J~F z_HsV}s1hW#O6||TDN7rGN*spQ{`sC5WRN?*x-+7|#^3p~JGq{T0DPoT#DGb~t2B}~ z?=atRBb$R=I>x#(V6uw{`6U_)s%}Td;EzNjC)xn`AvWdpTw=wWbMkQAuw_hI=?6Gla+;ck7CV>225fO0o z3<4I#!wF=pudJE^tlL8mSMGCiNcJOu1W$$fRGr5tOdH zfh=vjH2#;?B=O@%^ph5TI2ZxMXm<$B9t?hdosQ7;6o43YOggOS^g&iw_u}N*0N4!$K=R5evnVmDR7Z-+*xHHRww({4?s07fC@q!&#Hcy$WOZ|g4 zm|e!&j7mdNZPFikYA*6=wT^)9v*)CeEOQ_9k@EZOd$r*+|5LB{^cH0sf16?xH!W~(YCpnX zI`28%6u3CLMJufwV8ovs!9cDcX!+r(=x#8J{?{0`T`V7PijufKJ^(#N*t%h)(|tHL zr94pBJqv5`d~53V+3D9+`u*spb=Bi|Y5r-b zL@ZAhz!BpA_>5GXZ)wY;h@VJu{hgJws0V(ru42=tVV&7XMBYup-bp{a>Ly9u0xKV# zXNtrHp4TE>Uc~-G$)JXz)@)!eoJ?Fxfq7>!oIn$-vKbS!p%wMw8~JhnI=Q%&&>iXj(GqV?W(dDPNY^+as=PCuKHxA2vAU74q~_61QsiQbp%ywD8sL@Pi)R`_b_T zm0M3C^1~J_Axv64(oeZ%M*!HqKAV(1P!ni4Pk(?qT{<1;#`#H#jRc8u`6m|bx71OB zE0fA!Xx`6NmKb2pkLw|yQJNtm5}$~=>>Z6zedp;7H;;A;w?ocnSJep*lA3cK%*elJ z0tb?_Bi|gYZbST;gpQ-+5rGvxa{bC}B+MMFkmyu+C$g!HWU^e1Z4Hpz6!^{q9PJ-= z%**e&{67E3cW#uV_;3Tbb-kW#E+MWm{{tO%+Mg`ZM3WIuz9TFY7n{1z2b(ulKD}|s zTC+2y;?czF%gjZ|NjK}T7Ov<))#nlCQg}^mg@_Wy^Px{m zudR%gCDBb+8_Rl%w zWGF4LG4C31+n*xO;a(e{Ca_B%bhpvRZZy_;#A#>^NW-cpO;1AzFR<4F=M?U*P$rHB z2%JH~fmxWNhV0c}6-NUczv1d(7hOCXzHZ?K3EW!bC(|wWl5WZd(MDTFpWzD~4oq?I zUT^4bT5jGEws9~|sSWZJA!Nc!L7;`_kJi$HwGr~`br z8>l!sAc}DBz9>7e(Mb*|8Banol>Jj#6#kG*IhPj8PW`PUYn+gxO#&Ow=dQ${3JQ*X^=aQ72o8mi&DhYqv6dm($?w=id|p3{r*$!?}0 zh9plDq(=*6?5|g**PAD6E4u&Hhq?-2Glp>|ByBPhJ)VUOoT$)5IOrk=>NS&G58$9_OW zW@lWsu}z^2W(hS7pZXnQ(Mv=*HWV%#ls>~nrL_|tEpJfNVvf} za16Ku3AeO}B%`c1dpYHgm&s~=LDH_7w~Z(z9agU5j=Je)c#%elB=iVCg{~t~tJT^) zQm@y$;Cn?wBIqf!a7>>6xNVr_$zw76)om` za6lA4+;3}B+$>?4VxzWZ1(-(X*+Piyv0s>HIbzi^k!^p_M~iUWk2;1E+Cx~q1E+@f zk~xzP29?q6(0_k1o+-=G!_~1&ovF3@$#$u>slph)jjZ2dg%kgT4XPzlw;D1|q zJ&NwaLh?K6w10`;H{I8@@V?gX2)Ds)aHt*%;qL)vSV?c`qoR^gnwqc963!pRC$hW< zh8NkbPL|neGiusMz^kS+)`QK%R_EJ6;WggWE^AEtDKOmu`}#~|*BDodfDxK68KAPP z8H(0sqh(p-E!J_wJ)})lJPv^z{u6w@bZ?#n_`UtNEfr+@tGiqudYM=sgJE>p}{jv46Dp3S?sL{LnJi%F%jBpQ`M)EH zSGYf&$F(4_{uKU1F)!br6zbAb~{FZTWIsP^J>N0 z#?P{{9w&gc9DP|^U`GFJO`1ZkuUaR5Ep}9U8@sCmd4WT3Bj79z&GEI?Hi#=rKD3Mi z>EG%2KATHLJNvpeT48M;OX9-LBTfWLOXKLpAtv1;S$ zC&i~<(&XO6Pl6~haxCM`&`c-ewY~8FoKJkMxsrSLXIpj`y90oz=iY+Y&A8?Ej{ir6 zLuvQC(>p;X{BXXnz4Er7^*XwFvVKGN`IN<9lojp?zrfnq6aPl+F#`C7H;uKR$t^Ba z9{;Ky-3gxR1GML3@>{hG9UxCBDaHJ9#pB|ZW+wPK%sQK5dH8mL6ij@_~kV+;X+vXkVlJ-WSe`^(%XeB#<~Fu`R|!Qtajv3=S1Hh z;SK_$AgF19)&peBK2QHliCKi}+L>7|bMWsrif2x{ueSe?n_+=nH6kOJ;?EvYQwq+3%PI`NLP*~vu8@r@+!!zA6SS!UPayU>|%h4zgy9s4HFjHTA!yn^Zl{xY+5ak| zD|<=B@0N{}@v`{Amr{Sz>Kc1O%qKEM6{oHag?zJod6Ohv@@P0_y>GO`kSs!$O{zK)! z@L#6Swox9z=&bjy-oL#{5mP?>)|!EM2asFrH>psx;&Zc3KYER~vcd<)Z^M9fPd8sm zP)9;~aR>g~gcicK&^)Fku^B$5lIjLI^jn`9-rKIOlWqKc`eqol8<5%l89I1`$@DKZ z+U08@p25lq&Q4fIFZ}vjM+Cj80-uZG`pr&l=k?0|+MB~j_3_qnd(;2!j3Itq_3zr7 z%|9cxZ(S1C4p|Sgn?ZK>HX@cH$QpgfCwhc&tMt@)yAFsmM~Ib0 zh8=JDZ8Wy|Vbxga&)S}PkjNtJ4=i#F5XGw|{Q?_ug|`>^05zmT^f>S242rb@r5RY{_O;Ri7Jq`Zl!yclN&(UwBs=#i`-uS(w&CIn+RI8i7eBSAYP!)pDRGH~ z7)Oa02sasq1B6)*tE6VBK7lDrQpgOI`%u>I^Rs^2^f$g5DeoHHRe9z9J{~~C0>oJo zQ}8+!3i_?rvNn!>mlE7t9g@o9eJz>1k~&@~XKA6n%L95A=*6$gt#dL}DK`>R#M77~ z0WE-3|A(x%Y>RVSx2=KT?(PuWp>TJChXi+bclW|2xCbY=ySux)Yj7!?!`$oLXU%iH zKcGI8Jfp_AM{ljCrMCe7_zCeC8LH`7||&9(UmvJzWCVH(tf+!;x~y|BAm3T zFqGbtFpq736T^qA(!jHuVn-n9jrAfNiWhAZABd`DZbSu~h+D@>hoVqRY50a7e^B`LrMlec6=|HmjjjyT{ z^{M|ud<*8lH|$(RxV`RwGM?Gi(v3M=Pu*WoUj2=H|4TbZ6LfiM(`Ao2x;=h2V>r6^ z5p4djx~L6}U^sEXw)5LaMM0mZ(|#>qa%$R1;!wQ$1BkOqkR8t-;U6e$SEx-)s8bj< z8udNYWxwHH4vE#8t))Uk|mp&HpXhr+X**`cS%fyLR;IW<(lEJeX$ z#q+}oh6hH?(-LWZKrKy8-rYUPSDf>3j%vW56-)pD7$STZwG73GC>2GRplt`1HMaAW zIN^K42gPftuwCN5_$?dGw%rCKYm>!AXG2-Lnd#iEdk-a~sA>7Kd0jV5+@nI&9O)3duH?@*Bs zDInJ8)u_sAkv;qEywoHT!EZpV;W4*3^%+nPWHUO&Txt~UZ|<_}-Tlrq+Xh{pLk~RnL0&GP zDaE&<>FXIt(mIvS`L2ldxX`p9d;0h|aNj`4;0TW5-KJCoo76c_c*k!wWTXZ!5N5+j zGD_ta*YWqr|CbP<#$p|cL5)eug5r{|ycrsoW5D3Lo>fVV6D|3QH?QCk-4p!FGILrh z#cQjlMt?9E{NX8w9vbYlY}W(b3-k=2loVEHm!jsoim;QE7|+UCb#~#ow|;(cOs|sV zH=$x^q(*vMqL9;Ot05>{BkJ`)caSn@m|cKZUO_{dwXE^EPgl0CKT8vBe4O^szp`mOa1IiJ7I2oW9rLvckgXQuSH&Cy^}KmVaNRZuW6)G7+ZS8-H17&jzKmVS zy8o#AoUMa4+Z_)o=^Ni(|K8AFeqKhSzy{st7=5^2p8tEYSox`da5yK)($jqc$vX>z zP85kYuXVO0l=T?u!fi0_-%HCF9UQsMwAU1uNi~Xh>20?$87ie4u?m&Q(zni%$S2!H zl{Xr0&ws{CyqVd@D{L3>V{OL3U`eo*>n*XR+2y>oDCE+grzjdzr&ivH`em z6cLW`a@|N(AIJz;=e*Ut*Nm{?5SXZ*H-o{Pme+7yFy!JX!wUUE=u|-iTb}v(T-AqJ zLEJVKNIfP}Ci&#S39PA}uH8uAR}0ET15)YF>KwquP0E(FNM`ko2ZtSk(A9+|dJok_ zVpyX(nhh=-66vmv4�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 F`RJ4kAxtfARMm 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%0Af7}!^ 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 z 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%0AVaSSA8n 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 z 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%0D>(Xu9=y0DFL?LUaEWnJD`Vzm==hj z9SToCI{it8dJ`hCAke+G@TZ;Mc9G-F{m_cuge}AsrQ!>eNSd8GKS{~2kvJ7 z44&Pkkh5Q_@~y>^7rMG}+osJdFZ-YpyDK+O2)Qa-Dc7G;B zl;b=lgZ#)ODd;@<+KlXGGa;4cXF;EF1OXo%-gX`R&^1PR3TB1fQ!9ls)y{+p7!E8c zLDqMoKj>5p;fMh^O_Hh6#5Th1jqkq4d-31QTnxjN`EBbS8{VRK(WSsdSMF2}lSqPK^5R3UbT$u8QndYsZ_`1 z+{u)*D>AL2laOZNxpKbY>808WmpuEqV(X?%qHTMj6uQPDP91C0a33LonKTkrWu)_8 z#!_|rH&Hi#c2jRw+CiQmcJB>o+XOnU~^PFngGFJ7X`OG{{Imya)fO;RC#(z|PEt~>5-9yOTXo-Cb=TC{m# zjWMu&WLy-*S2UUSkPHzax|?1iU3um>bRm8$)7pD9BAenrXxSeZ(5>rt>)YEfA-zk7 zJe{!H8-R_9jm{>AenFQXz|D*46#e*nu|k`4d> literal 0 HcmV?d00001 From dc44ed4f1ff34854563535b7eea08786749ac40b Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:20:28 +0100 Subject: [PATCH 43/59] add ecosystem excalidraw Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/pace.excalidraw | 1300 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1300 insertions(+) create mode 100644 crates/pace.excalidraw diff --git a/crates/pace.excalidraw b/crates/pace.excalidraw new file mode 100644 index 00000000..33991fef --- /dev/null +++ b/crates/pace.excalidraw @@ -0,0 +1,1300 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://marketplace.visualstudio.com/items?itemName=pomdtr.excalidraw-editor", + "elements": [ + { + "type": "rectangle", + "version": 1051, + "versionNonce": 1545238859, + "isDeleted": false, + "id": "tM7qo1qvT6iCQSrBzWh4S", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18270.637964102305, + "y": 6885.0705690142595, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "width": 467.85714285714494, + "height": 249.28571428571377, + "seed": 2126969291, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "8lKV9ippicf8jSLDeTDc_" + }, + { + "id": "JaaM_Q8KPd65d_XLWIy5H", + "type": "arrow" + }, + { + "id": "3bC8t3lY7r8U_iD60G2xt", + "type": "arrow" + }, + { + "id": "9v-DwcYzOPyEhvqe43f4S", + "type": "arrow" + } + ], + "updated": 1711736235449, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 991, + "versionNonce": 1957894123, + "isDeleted": false, + "id": "8lKV9ippicf8jSLDeTDc_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18439.881318304462, + "y": 6987.213426157116, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 129.37043445284218, + "height": 45, + "seed": 1044204229, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736235449, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace-rs", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tM7qo1qvT6iCQSrBzWh4S", + "originalText": "pace-rs", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 464, + "versionNonce": 1687965451, + "isDeleted": false, + "id": "TXq2OqWLQyf90BWAjNJJf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18982.66177362611, + "y": 7878.0467594904485, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 427573829, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "rhatcvwFNDaJIdZB2aRR2" + }, + { + "id": "JaaM_Q8KPd65d_XLWIy5H", + "type": "arrow" + }, + { + "id": "DmT7fM35Jkro7gi4CwLjV", + "type": "arrow" + }, + { + "id": "2sEGnJIa_Tw0UsRPWjooE", + "type": "arrow" + }, + { + "id": "KygNHOII4YE0NsSC9VRe0", + "type": "arrow" + }, + { + "id": "9CgduZ8cBQtWZgqAsE2Sp", + "type": "arrow" + }, + { + "id": "c2guM95anTFv9XWw8Cp2q", + "type": "arrow" + } + ], + "updated": 1711736180651, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 412, + "versionNonce": 1106523563, + "isDeleted": false, + "id": "rhatcvwFNDaJIdZB2aRR2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19062.85793674287, + "y": 7964.832473776164, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 182.46481662362422, + "height": 45, + "seed": 2080596587, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736180651, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_core", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TXq2OqWLQyf90BWAjNJJf", + "originalText": "pace_core", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 462, + "versionNonce": 2030785931, + "isDeleted": false, + "id": "mgPVbyNloshnv-FUYisNP", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19556.471297435648, + "y": 7595.546759490453, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 279782181, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "e-KRZnbVCkxmR7DjCYbMW" + }, + { + "id": "2inE77MDCxUU2eTZZsQ0N", + "type": "arrow" + }, + { + "id": "KygNHOII4YE0NsSC9VRe0", + "type": "arrow" + }, + { + "id": "s93yqN-VXLPIlE7rMqmug", + "type": "arrow" + } + ], + "updated": 1711736193108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 420, + "versionNonce": 381387019, + "isDeleted": false, + "id": "e-KRZnbVCkxmR7DjCYbMW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19637.914559360644, + "y": 7682.332473776169, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 179.9706190071462, + "height": 45, + "seed": 1988480427, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736182134, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_time", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mgPVbyNloshnv-FUYisNP", + "originalText": "pace_time", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 687, + "versionNonce": 1494593227, + "isDeleted": false, + "id": "ZyUdkNnhMgXouKQKtZdzw", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19824.56653553088, + "y": 8109.118188061881, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 1731857771, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "uI91Ze6km-1Qgloy_uiVK" + }, + { + "id": "DmT7fM35Jkro7gi4CwLjV", + "type": "arrow" + }, + { + "id": "2inE77MDCxUU2eTZZsQ0N", + "type": "arrow" + }, + { + "id": "3euXcOYnOet5CLkuQfuZm", + "type": "arrow" + } + ], + "updated": 1711736197067, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 655, + "versionNonce": 202074539, + "isDeleted": false, + "id": "uI91Ze6km-1Qgloy_uiVK", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19898.311318567637, + "y": 8195.903902347594, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 195.36757678363145, + "height": 45, + "seed": 1263014597, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736148519, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_error", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZyUdkNnhMgXouKQKtZdzw", + "originalText": "pace_error", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 584, + "versionNonce": 1241183403, + "isDeleted": false, + "id": "H2nQkbRLhThymO2gq-6SA", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18998.376059340408, + "y": 6909.475330919021, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 1578321323, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "JKw6Fka1rhYs9IZYcBS2i" + }, + { + "id": "0uVxqaBYM3PL3btgoyHyt", + "type": "arrow" + }, + { + "id": "c2guM95anTFv9XWw8Cp2q", + "type": "arrow" + }, + { + "id": "9v-DwcYzOPyEhvqe43f4S", + "type": "arrow" + } + ], + "updated": 1711736232498, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 560, + "versionNonce": 2074945355, + "isDeleted": false, + "id": "JKw6Fka1rhYs9IZYcBS2i", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19055.56513648023, + "y": 6996.261045204735, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 228.47898857750246, + "height": 45, + "seed": 871202437, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736232498, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_service", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "H2nQkbRLhThymO2gq-6SA", + "originalText": "pace_service", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 717, + "versionNonce": 368991461, + "isDeleted": false, + "id": "d-UItuVV1OxpBnHLSdCSR", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 17856.947487911835, + "y": 7415.189616633308, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 592231077, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "iyTwjXWeoJ_GeGuuzsXq5" + } + ], + "updated": 1711736134786, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 706, + "versionNonce": 978024517, + "isDeleted": false, + "id": "iyTwjXWeoJ_GeGuuzsXq5", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 17919.369530328535, + "y": 7501.975330919022, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 218.01305802374412, + "height": 45, + "seed": 283995691, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736134786, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_server", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "d-UItuVV1OxpBnHLSdCSR", + "originalText": "pace_server", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 999, + "versionNonce": 602440427, + "isDeleted": false, + "id": "RsIzHYLG8TzWQr8DnEfp5", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19852.78082124517, + "y": 6893.046759490449, + "strokeColor": "#1e1e1e", + "backgroundColor": "#e9ecef", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 1265502795, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "iPy_SZbSRtE4fz62LFeCD" + }, + { + "id": "0uVxqaBYM3PL3btgoyHyt", + "type": "arrow" + }, + { + "id": "3euXcOYnOet5CLkuQfuZm", + "type": "arrow" + }, + { + "id": "2sEGnJIa_Tw0UsRPWjooE", + "type": "arrow" + }, + { + "id": "s93yqN-VXLPIlE7rMqmug", + "type": "arrow" + } + ], + "updated": 1711736274513, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 985, + "versionNonce": 1431235979, + "isDeleted": false, + "id": "iPy_SZbSRtE4fz62LFeCD", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19901.042095570865, + "y": 6979.832473776163, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 246.33459420575673, + "height": 45, + "seed": 1913050085, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736274513, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_storage", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RsIzHYLG8TzWQr8DnEfp5", + "originalText": "pace_storage", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "rectangle", + "version": 630, + "versionNonce": 181234277, + "isDeleted": false, + "id": "czADXrtUBMGnnu0EMFNCd", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18368.018916483263, + "y": 7423.284854728545, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "width": 342.8571428571413, + "height": 218.57142857142935, + "seed": 85245003, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "sSvOMwPllQxFiACHwqppD" + }, + { + "id": "3bC8t3lY7r8U_iD60G2xt", + "type": "arrow" + }, + { + "id": "9CgduZ8cBQtWZgqAsE2Sp", + "type": "arrow" + } + ], + "updated": 1711736239398, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 634, + "versionNonce": 752670149, + "isDeleted": false, + "id": "sSvOMwPllQxFiACHwqppD", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18467.103898495756, + "y": 7510.07056901426, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "width": 144.68717883215726, + "height": 45, + "seed": 282870245, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1711736239398, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "pace_cli", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "czADXrtUBMGnnu0EMFNCd", + "originalText": "pace_cli", + "lineHeight": 1.25, + "baseline": 37 + }, + { + "type": "arrow", + "version": 2121, + "versionNonce": 2069055179, + "isDeleted": false, + "id": "0uVxqaBYM3PL3btgoyHyt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19353.61415457852, + "y": 7014.362302903005, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 483.9285714285652, + "height": 1.396201362697866, + "seed": 844762859, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736274513, + "link": null, + "locked": false, + "startBinding": { + "elementId": "H2nQkbRLhThymO2gq-6SA", + "focus": -0.02897112233130823, + "gap": 12.380952380969575 + }, + "endBinding": { + "elementId": "RsIzHYLG8TzWQr8DnEfp5", + "focus": -0.09195700445627356, + "gap": 15.238095238087226 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 483.9285714285652, + -1.396201362697866 + ] + ] + }, + { + "type": "arrow", + "version": 2687, + "versionNonce": 79190315, + "isDeleted": false, + "id": "JaaM_Q8KPd65d_XLWIy5H", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18587.283750899896, + "y": 7145.3086642523585, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 510.9039690631944, + "height": 728.9285714285797, + "seed": 1452357579, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736235449, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tM7qo1qvT6iCQSrBzWh4S", + "focus": 0.038204332155746694, + "gap": 10.952380952385283 + }, + "endBinding": { + "elementId": "TXq2OqWLQyf90BWAjNJJf", + "focus": 0.09420564116423788, + "gap": 3.8095238095102104 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 510.9039690631944, + 728.9285714285797 + ] + ] + }, + { + "type": "arrow", + "version": 2577, + "versionNonce": 496756869, + "isDeleted": false, + "id": "3bC8t3lY7r8U_iD60G2xt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18528.73369262869, + "y": 7141.975330919026, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 5.912691550332966, + "height": 275.11904761902497, + "seed": 187010917, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736239398, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tM7qo1qvT6iCQSrBzWh4S", + "focus": -0.11423223700366737, + "gap": 7.619047619052253 + }, + "endBinding": { + "elementId": "czADXrtUBMGnnu0EMFNCd", + "focus": -0.10995817009520573, + "gap": 6.190476190493428 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -5.912691550332966, + 275.11904761902497 + ] + ] + }, + { + "type": "arrow", + "version": 1677, + "versionNonce": 1612224747, + "isDeleted": false, + "id": "DmT7fM35Jkro7gi4CwLjV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19219.09034505468, + "y": 8112.448460125291, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 597.8571428571558, + "height": 134.73299814853908, + "seed": 731557797, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736264042, + "link": null, + "locked": false, + "startBinding": { + "elementId": "TXq2OqWLQyf90BWAjNJJf", + "focus": 0.36874982671100137, + "gap": 15.830272063412849 + }, + "endBinding": { + "elementId": "ZyUdkNnhMgXouKQKtZdzw", + "focus": -0.3116721472570393, + "gap": 7.619047619047706 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 176.90476190476693, + 117.02687079372936 + ], + [ + 597.8571428571558, + 134.73299814853908 + ] + ] + }, + { + "type": "arrow", + "version": 1486, + "versionNonce": 529552389, + "isDeleted": false, + "id": "2inE77MDCxUU2eTZZsQ0N", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19750.256592584647, + "y": 7826.856283299974, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 182.13752831582678, + "height": 274.6428571428578, + "seed": 739271051, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736189176, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mgPVbyNloshnv-FUYisNP", + "focus": 0.24012243594642627, + "gap": 12.738095238091773 + }, + "endBinding": { + "elementId": "ZyUdkNnhMgXouKQKtZdzw", + "focus": 0.05710372346795993, + "gap": 7.619047619049525 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 182.13752831582678, + 274.6428571428578 + ] + ] + }, + { + "type": "arrow", + "version": 2227, + "versionNonce": 1216499723, + "isDeleted": false, + "id": "3euXcOYnOet5CLkuQfuZm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19992.816172340958, + "y": 7121.856283299968, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 1.1849871818412794, + "height": 973.6904761905062, + "seed": 1104514501, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736274513, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RsIzHYLG8TzWQr8DnEfp5", + "focus": 0.18213416095774063, + "gap": 10.238095238089045 + }, + "endBinding": { + "elementId": "ZyUdkNnhMgXouKQKtZdzw", + "focus": -0.026307987333239663, + "gap": 13.571428571407523 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.1849871818412794, + 973.6904761905062 + ] + ] + }, + { + "type": "arrow", + "version": 1925, + "versionNonce": 368052555, + "isDeleted": false, + "id": "2sEGnJIa_Tw0UsRPWjooE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19849.209392673747, + "y": 7093.634497860888, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 602.8128737277402, + "height": 776.555118772415, + "seed": 369477669, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736274513, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RsIzHYLG8TzWQr8DnEfp5", + "focus": 0.40617013508570504, + "gap": 3.5714285714248035 + }, + "endBinding": { + "elementId": "TXq2OqWLQyf90BWAjNJJf", + "focus": 0.005354752342787572, + "gap": 7.8571428571458455 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -602.8128737277402, + 776.555118772415 + ] + ] + }, + { + "type": "arrow", + "version": 1198, + "versionNonce": 575138405, + "isDeleted": false, + "id": "KygNHOII4YE0NsSC9VRe0", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19332.185583149938, + "y": 7945.207866643787, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 220.2920030980422, + "height": 136.92301191526076, + "seed": 360086661, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736186677, + "link": null, + "locked": false, + "startBinding": { + "elementId": "TXq2OqWLQyf90BWAjNJJf", + "focus": 0.31769684109495916, + "gap": 6.66666666668425 + }, + "endBinding": { + "elementId": "mgPVbyNloshnv-FUYisNP", + "focus": 0.0258608890380365, + "gap": 3.993711187666122 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 220.2920030980422, + -136.92301191526076 + ] + ] + }, + { + "type": "arrow", + "version": 1053, + "versionNonce": 1252126501, + "isDeleted": false, + "id": "9CgduZ8cBQtWZgqAsE2Sp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18542.0665355309, + "y": 7645.348064744582, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 420.1076434318493, + "height": 331.3891709363579, + "seed": 26437003, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736250281, + "link": null, + "locked": false, + "startBinding": { + "elementId": "czADXrtUBMGnnu0EMFNCd", + "focus": 0.07307590522028012, + "gap": 3.491781444608023 + }, + "endBinding": { + "elementId": "TXq2OqWLQyf90BWAjNJJf", + "focus": -0.09332561198817191, + "gap": 20.48759466336378 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 41.428571428547, + 286.62726617443786 + ], + [ + 420.1076434318493, + 331.3891709363579 + ] + ] + }, + { + "type": "arrow", + "version": 845, + "versionNonce": 873834955, + "isDeleted": false, + "id": "c2guM95anTFv9XWw8Cp2q", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19169.856640522972, + "y": 7137.094378538086, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 5.959020579139178, + "height": 727.142857142856, + "seed": 1772993189, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736232498, + "link": null, + "locked": false, + "startBinding": { + "elementId": "H2nQkbRLhThymO2gq-6SA", + "focus": -0.006239451746593869, + "gap": 9.047619047634726 + }, + "endBinding": { + "elementId": "TXq2OqWLQyf90BWAjNJJf", + "focus": 0.05105780869098277, + "gap": 13.809523809506572 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -5.959020579139178, + 727.142857142856 + ] + ] + }, + { + "type": "arrow", + "version": 614, + "versionNonce": 866380517, + "isDeleted": false, + "id": "9v-DwcYzOPyEhvqe43f4S", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 18741.59034505469, + "y": 7015.843849879741, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 247.73809523809905, + "height": 0.22165181620675867, + "seed": 996457413, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736238068, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tM7qo1qvT6iCQSrBzWh4S", + "focus": 0.050800000350119695, + "gap": 3.0952380952403473 + }, + "endBinding": { + "elementId": "H2nQkbRLhThymO2gq-6SA", + "focus": 0.030156679204429684, + "gap": 9.047619047620174 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 247.73809523809905, + -0.22165181620675867 + ] + ] + }, + { + "type": "arrow", + "version": 433, + "versionNonce": 129004171, + "isDeleted": false, + "id": "s93yqN-VXLPIlE7rMqmug", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 19953.71168186351, + "y": 7124.47533091902, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "width": 230.18324020348882, + "height": 447.5, + "seed": 1769290635, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1711736274513, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RsIzHYLG8TzWQr8DnEfp5", + "focus": 0.03345478645740184, + "gap": 12.857142857141298 + }, + "endBinding": { + "elementId": "mgPVbyNloshnv-FUYisNP", + "focus": -0.3194040752375057, + "gap": 23.5714285714339 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -230.18324020348882, + 447.5 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file From babe3660be90a1711d396de5935ea46dcd70cafa Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 22:55:59 +0100 Subject: [PATCH 44/59] refactor to sea-orm Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .gitignore | 3 +- Cargo.lock | 1474 +++++++++++++++-- Cargo.toml | 8 +- config/pace.toml | 8 +- crates/cli/src/commands/adjust.rs | 12 +- crates/cli/src/commands/begin.rs | 2 +- crates/cli/src/commands/end.rs | 2 +- crates/cli/src/commands/now.rs | 2 +- crates/cli/src/commands/reflect.rs | 6 +- crates/core/Cargo.toml | 7 +- crates/core/src/domain/activity.rs | 31 +- crates/core/src/storage.rs | 29 +- crates/error/Cargo.toml | 3 +- crates/error/src/lib.rs | 28 +- crates/service/Cargo.toml | 4 +- crates/service/src/activity_tracker.rs | 2 +- crates/service/src/lib.rs | 23 +- crates/storage/Cargo.toml | 21 +- crates/storage/src/entity/activities.rs | 102 ++ .../src/entity/activities_categories.rs | 54 + crates/storage/src/entity/activities_tags.rs | 54 + crates/storage/src/entity/activity_kinds.rs | 32 + crates/storage/src/entity/activity_status.rs | 32 + crates/storage/src/entity/categories.rs | 34 + crates/storage/src/entity/descriptions.rs | 32 + crates/storage/src/entity/mod.rs | 12 + crates/storage/src/entity/prelude.rs | 10 + crates/storage/src/entity/tags.rs | 32 + crates/storage/src/lib.rs | 20 +- crates/storage/src/migration.rs | 348 +--- .../create_activities_20240325143710.rs | 80 - ...te_activities_categories_20240326130013.rs | 64 - .../create_activities_tags_20240326125630.rs | 55 - ...ate_activity_kind_values_20240327162015.rs | 37 - .../create_activity_kinds_20240326124253.rs | 31 - .../create_activity_status_20240326125819.rs | 31 - ...e_activity_status_values_20240327163645.rs | 37 - .../create_categories_20240326125937.rs | 32 - .../create_descriptions_20240329131712.rs | 35 - .../src/migration/create_schema_migrations.rs | 34 - .../migration/create_tags_20240326125555.rs | 31 - .../m20240325_000001_create_activities.rs | 83 + .../migration/m20240326_000001_create_tags.rs | 28 + .../m20240326_000002_create_categories.rs | 39 + ...m20240326_000003_create_activity_status.rs | 38 + .../m20240326_000004_create_activity_kinds.rs | 38 + ...m20240326_000005_create_activities_tags.rs | 57 + ...326_000006_create_activities_categories.rs | 67 + ...27_000001_create_activity_status_values.rs | 38 + ...0327_000002_create_activity_kind_values.rs | 37 + .../m20240329_000001_create_descriptions.rs | 38 + crates/storage/src/storage.rs | 24 - crates/storage/src/storage/in_memory.rs | 59 +- crates/storage/src/storage/sqlite.rs | 127 +- crates/time/Cargo.toml | 5 +- crates/time/src/storage.rs | 2 +- crates/time/src/time_frame.rs | 2 +- src/commands.rs | 6 +- src/commands/resume.rs | 4 +- 59 files changed, 2426 insertions(+), 1160 deletions(-) create mode 100644 crates/storage/src/entity/activities.rs create mode 100644 crates/storage/src/entity/activities_categories.rs create mode 100644 crates/storage/src/entity/activities_tags.rs create mode 100644 crates/storage/src/entity/activity_kinds.rs create mode 100644 crates/storage/src/entity/activity_status.rs create mode 100644 crates/storage/src/entity/categories.rs create mode 100644 crates/storage/src/entity/descriptions.rs create mode 100644 crates/storage/src/entity/mod.rs create mode 100644 crates/storage/src/entity/prelude.rs create mode 100644 crates/storage/src/entity/tags.rs delete mode 100644 crates/storage/src/migration/create_activities_20240325143710.rs delete mode 100644 crates/storage/src/migration/create_activities_categories_20240326130013.rs delete mode 100644 crates/storage/src/migration/create_activities_tags_20240326125630.rs delete mode 100644 crates/storage/src/migration/create_activity_kind_values_20240327162015.rs delete mode 100644 crates/storage/src/migration/create_activity_kinds_20240326124253.rs delete mode 100644 crates/storage/src/migration/create_activity_status_20240326125819.rs delete mode 100644 crates/storage/src/migration/create_activity_status_values_20240327163645.rs delete mode 100644 crates/storage/src/migration/create_categories_20240326125937.rs delete mode 100644 crates/storage/src/migration/create_descriptions_20240329131712.rs delete mode 100644 crates/storage/src/migration/create_schema_migrations.rs delete mode 100644 crates/storage/src/migration/create_tags_20240326125555.rs create mode 100644 crates/storage/src/migration/m20240325_000001_create_activities.rs create mode 100644 crates/storage/src/migration/m20240326_000001_create_tags.rs create mode 100644 crates/storage/src/migration/m20240326_000002_create_categories.rs create mode 100644 crates/storage/src/migration/m20240326_000003_create_activity_status.rs create mode 100644 crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs create mode 100644 crates/storage/src/migration/m20240326_000005_create_activities_tags.rs create mode 100644 crates/storage/src/migration/m20240326_000006_create_activities_categories.rs create mode 100644 crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs create mode 100644 crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs create mode 100644 crates/storage/src/migration/m20240329_000001_create_descriptions.rs diff --git a/.gitignore b/.gitignore index 7ed3d28b..942620a6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,4 @@ logs/* .cargo/config.toml # Database -db/activities.pace.sqlite3 -/sea-orm \ No newline at end of file +db/activities.pace.sqlite3* diff --git a/Cargo.lock b/Cargo.lock index 023b8758..7984140e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -63,6 +74,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -77,6 +89,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "allocator-api2" version = "0.2.16" @@ -152,6 +170,12 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "assert_cmd" version = "2.0.14" @@ -167,6 +191,48 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "async-trait" +version = "0.1.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -197,6 +263,29 @@ dependencies = [ "backtrace", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bigdecimal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -208,6 +297,21 @@ name = "bitflags" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "block-buffer" @@ -218,6 +322,30 @@ dependencies = [ "generic-array", ] +[[package]] +name = "borsh" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0901fc8eb0aca4c83be0106d6f2db17d86a08dfc2c25f0e84464bf381158add6" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51670c3aa053938b0ee3bd67c3817e471e626151131b934038e83c5bf8de48f5" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.55", + "syn_derive", +] + [[package]] name = "bstr" version = "0.2.17" @@ -246,12 +374,46 @@ version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytecount" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + [[package]] name = "canonical-path" version = "2.0.2" @@ -270,6 +432,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" version = "0.4.35" @@ -327,7 +495,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.0", + "strsim", "terminal_size", ] @@ -400,6 +568,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -415,6 +589,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -434,6 +623,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.19" @@ -451,49 +649,37 @@ dependencies = [ ] [[package]] -name = "darling" -version = "0.14.4" +name = "der" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ - "darling_core", - "darling_macro", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] -name = "darling_core" -version = "0.14.4" +name = "deranged" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "powerfmt", + "serde", ] [[package]] -name = "darling_macro" -version = "0.14.4" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "darling_core", + "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - [[package]] name = "derive_more" version = "0.99.17" @@ -538,7 +724,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -579,11 +767,20 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "either" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +dependencies = [ + "serde", +] [[package]] name = "encode_unicode" @@ -608,26 +805,31 @@ dependencies = [ ] [[package]] -name = "eyre" -version = "0.6.12" +name = "etcetera" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ - "indenter", - "once_cell", + "cfg-if", + "home", + "windows-sys 0.48.0", ] [[package]] -name = "fallible-iterator" -version = "0.3.0" +name = "event-listener" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" +name = "eyre" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] [[package]] name = "fastrand" @@ -635,6 +837,12 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -650,12 +858,32 @@ dependencies = [ "num-traits", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "fs-err" version = "2.11.0" @@ -665,6 +893,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.30" @@ -707,6 +941,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.30" @@ -840,13 +1085,22 @@ dependencies = [ "walkdir", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash", + "ahash 0.8.11", "allocator-api2", ] @@ -856,7 +1110,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -864,6 +1118,9 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "heck" @@ -871,6 +1128,45 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "human-panic" version = "1.2.3" @@ -931,6 +1227,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "ignore" version = "0.4.22" @@ -960,7 +1266,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -1056,6 +1362,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" @@ -1128,6 +1437,16 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.1" @@ -1187,6 +1506,12 @@ dependencies = [ "syn 2.0.55", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1197,7 +1522,28 @@ dependencies = [ ] [[package]] -name = "normalize-line-endings" +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "normalize-line-endings" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" @@ -1212,12 +1558,60 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -1225,6 +1619,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", ] [[package]] @@ -1268,6 +1673,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-float" +version = "3.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +dependencies = [ + "num-traits", +] + [[package]] name = "os_info" version = "3.8.2" @@ -1279,6 +1693,30 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ouroboros" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "overload" version = "0.1.1" @@ -1325,7 +1763,7 @@ dependencies = [ "serde", "serde_derive", "similar-asserts", - "strum", + "strum 0.26.2", "tempfile", "thiserror", "toml 0.8.12", @@ -1374,13 +1812,12 @@ dependencies = [ "parking_lot", "rayon", "rstest", - "rusqlite", "serde", "serde_derive", "serde_json", "similar-asserts", "simplelog", - "strum", + "strum 0.26.2", "strum_macros", "tabled", "tera", @@ -1397,8 +1834,7 @@ dependencies = [ "chrono", "displaydoc", "miette", - "rusqlite", - "sea-query", + "sea-orm", "serde_json", "tera", "thiserror", @@ -1439,11 +1875,11 @@ dependencies = [ "pace_time", "parking_lot", "rayon", - "rusqlite", - "sea-query", - "sea-query-rusqlite", - "strum", + "sea-orm", + "sea-orm-migration", + "strum 0.26.2", "thiserror", + "tokio", "toml 0.8.12", "tracing", "typed-builder", @@ -1464,7 +1900,6 @@ dependencies = [ "humantime", "pace_error", "rstest", - "rusqlite", "serde", "serde_derive", "thiserror", @@ -1518,12 +1953,27 @@ dependencies = [ "regex", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1635,6 +2085,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.30" @@ -1683,6 +2154,15 @@ dependencies = [ "termtree", ] +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1716,6 +2196,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quote" version = "1.0.35" @@ -1725,6 +2225,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1845,6 +2351,79 @@ version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rstest" version = "0.18.2" @@ -1875,18 +2454,19 @@ dependencies = [ ] [[package]] -name = "rusqlite" -version = "0.30.0" +name = "rust_decimal" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" dependencies = [ - "bitflags 2.5.0", - "chrono", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", ] [[package]] @@ -1917,6 +2497,36 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[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 = "rustversion" version = "1.0.14" @@ -1944,28 +2554,137 @@ 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 = "sea-bae" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.55", +] + +[[package]] +name = "sea-orm" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8814e37dc25de54398ee62228323657520b7f29713b8e238649385dbe473ee0" +dependencies = [ + "async-stream", + "async-trait", + "bigdecimal", + "chrono", + "futures", + "log", + "ouroboros", + "rust_decimal", + "sea-orm-macros", + "sea-query", + "sea-query-binder", + "serde", + "serde_json", + "sqlx", + "strum 0.25.0", + "thiserror", + "time", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "sea-orm-cli" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "620bc560062ae251b1366bde43b3f1508445cab5c2c8cbdb397034638ab1b357" +dependencies = [ + "chrono", + "clap", + "dotenvy", + "glob", + "regex", + "sea-schema", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "sea-orm-macros" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e115c6b078e013aa963cc2d38c196c2c40b05f03d0ac872fe06b6e0d5265603" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "sea-bae", + "syn 2.0.55", + "unicode-ident", +] + +[[package]] +name = "sea-orm-migration" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8269bc6ff71afd6b78aa4333ac237a69eebd2cdb439036291e64fb4b8db23c" +dependencies = [ + "async-trait", + "clap", + "dotenvy", + "futures", + "sea-orm", + "sea-orm-cli", + "sea-schema", + "tracing", + "tracing-subscriber", +] + [[package]] name = "sea-query" version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" dependencies = [ + "bigdecimal", "chrono", + "derivative", "inherent", - "sea-query-attr", + "ordered-float", + "rust_decimal", "sea-query-derive", + "serde_json", + "time", + "uuid", ] [[package]] -name = "sea-query-attr" -version = "0.1.1" +name = "sea-query-binder" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878cf3d57f0e5bfacd425cdaccc58b4c06d68a7b71c63fc28710a20c88676808" +checksum = "36bbb68df92e820e4d5aeb17b4acd5cc8b5d18b2c36a4dd6f4626aabfa7ab1b9" dependencies = [ - "darling", - "heck 0.4.1", - "quote", - "syn 1.0.109", + "bigdecimal", + "chrono", + "rust_decimal", + "sea-query", + "serde_json", + "sqlx", + "time", + "uuid", ] [[package]] @@ -1982,15 +2701,34 @@ dependencies = [ ] [[package]] -name = "sea-query-rusqlite" -version = "0.5.0" +name = "sea-schema" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e74efa64c7ba4d62ed221bfd6bf8a685b1bbc37e29c51b1039405fc6c33a2dd" +checksum = "30d148608012d25222442d1ebbfafd1228dbc5221baf4ec35596494e27a2394e" dependencies = [ - "rusqlite", + "futures", "sea-query", + "sea-schema-derive", +] + +[[package]] +name = "sea-schema-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f686050f76bffc4f635cda8aea6df5548666b830b52387e8bc7de11056d11e" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "secrecy" version = "0.8.0" @@ -2042,120 +2780,426 @@ dependencies = [ ] [[package]] -name = "serde_spanned" -version = "0.6.5" +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "similar" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +dependencies = [ + "bstr 0.2.17", + "unicode-segmentation", +] + +[[package]] +name = "similar-asserts" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e041bb827d1bfca18f213411d51b665309f1afb37a04a5d1464530e13779fc0f" +dependencies = [ + "console", + "serde", + "similar", +] + +[[package]] +name = "simplelog" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" +dependencies = [ + "log", + "termcolor", + "time", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slug" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" +dependencies = [ + "deunicode", + "wasm-bindgen", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ - "serde", + "base64ct", + "der", ] [[package]] -name = "sha2" -version = "0.10.8" +name = "sqlformat" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "itertools", + "nom", + "unicode_categories", ] [[package]] -name = "sharded-slab" -version = "0.1.7" +name = "sqlx" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ - "lazy_static", + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", ] [[package]] -name = "shell-words" -version = "1.1.0" +name = "sqlx-core" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +dependencies = [ + "ahash 0.8.11", + "atoi", + "bigdecimal", + "byteorder", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rust_decimal", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", + "webpki-roots", +] [[package]] -name = "similar" -version = "2.4.0" +name = "sqlx-macros" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ - "bstr 0.2.17", - "unicode-segmentation", + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", ] [[package]] -name = "similar-asserts" -version = "1.5.0" +name = "sqlx-macros-core" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e041bb827d1bfca18f213411d51b665309f1afb37a04a5d1464530e13779fc0f" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ - "console", + "dotenvy", + "either", + "heck 0.4.1", + "hex", + "once_cell", + "proc-macro2", + "quote", "serde", - "similar", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", ] [[package]] -name = "simplelog" -version = "0.12.2" +name = "sqlx-mysql" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16257adbfaef1ee58b1363bdc0664c9b8e1e30aed86049635fb5f147d065a9c0" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ + "atoi", + "base64", + "bigdecimal", + "bitflags 2.5.0", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", "log", - "termcolor", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "rust_decimal", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", "time", + "tracing", + "uuid", + "whoami", ] [[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "slab" -version = "0.4.9" +name = "sqlx-postgres" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ - "autocfg", + "atoi", + "base64", + "bigdecimal", + "bitflags 2.5.0", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "num-bigint", + "once_cell", + "rand", + "rust_decimal", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "time", + "tracing", + "uuid", + "whoami", ] [[package]] -name = "slug" -version = "0.1.5" +name = "sqlx-sqlite" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bd94acec9c8da640005f8e135a39fc0372e74535e6b368b7a04b875f784c8c4" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" dependencies = [ - "deunicode", - "wasm-bindgen", + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "time", + "tracing", + "url", + "urlencoding", + "uuid", ] [[package]] -name = "smallvec" -version = "1.13.2" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "smawk" -version = "0.3.2" +name = "stringprep" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +dependencies = [ + "finl_unicode", + "unicode-bidi", + "unicode-normalization", +] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] -name = "strsim" -version = "0.11.0" +name = "strum" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" [[package]] name = "strum" @@ -2179,6 +3223,12 @@ dependencies = [ "syn 2.0.55", ] +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "supports-color" version = "3.0.0" @@ -2222,6 +3272,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "synstructure" version = "0.12.6" @@ -2258,6 +3320,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.10.1" @@ -2401,6 +3469,48 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.5.11" @@ -2420,7 +3530,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.9", ] [[package]] @@ -2432,6 +3542,17 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.22.9" @@ -2442,7 +3563,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.5", ] [[package]] @@ -2612,6 +3733,12 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -2624,6 +3751,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.11.0" @@ -2642,6 +3778,35 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8parse" version = "0.2.1" @@ -2655,6 +3820,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "getrandom", + "serde", ] [[package]] @@ -2700,6 +3866,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.92" @@ -2764,6 +3936,22 @@ 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 = "whoami" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "wildmatch" version = "2.3.3" @@ -2942,6 +4130,15 @@ version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.6.5" @@ -2951,6 +4148,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yaml-rust" version = "0.4.5" diff --git a/Cargo.toml b/Cargo.toml index d8b03ce3..c09548c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,9 +55,8 @@ parking_lot = "0.12.1" predicates = "3.1.0" rayon = "1.10.0" rstest = "0.18.2" -rusqlite = "0.30.0" -sea-query = "0.30.7" -sea-query-rusqlite = "0.5.0" +sea-orm = { version = "0.12.15" } +sea-orm-migration = "0.12.15" serde = "1.0.197" serde_derive = "1.0.197" serde_json = "1.0.114" @@ -69,6 +68,7 @@ tabled = "0.15.0" tempfile = "3.10.1" tera = "1.19.1" thiserror = "1.0.58" +tokio = { version = "1.37.0", default-features = false } toml = "0.8.12" tracing = "0.1.40" typed-builder = "0.18.1" @@ -116,7 +116,7 @@ pace_cli = { workspace = true } pace_core = { workspace = true, features = ["cli"] } pace_error = { workspace = true } pace_service = { workspace = true } -pace_time = { workspace = true, features = ["cli", "db"] } +pace_time = { workspace = true, features = ["cli"] } serde = { workspace = true } serde_derive = { workspace = true } thiserror = { workspace = true } diff --git a/config/pace.toml b/config/pace.toml index 2ec2302b..126dd5e2 100644 --- a/config/pace.toml +++ b/config/pace.toml @@ -12,9 +12,11 @@ default-timezone = "UTC" # Supported values: "sqlite", "mysql", "postgres", "mssql" # If you choose "sqlite", the url should be the path to the database file # Currently, only "sqlite" is supported -kind = 'sqlite' -# In case of a SQLite database, this is the url: `/path/to/database` -url = './db/activities.pace.sqlite3' +kind = "sqlite" +# In case of a SQLite database, this is the url: `/path/to/database?mode=rwc` +# '?mode=rwc' is required for read-write connections +# Otherwise, this is the connection string: `username:password@host/database` +url = "./db/activities.pace.sqlite3?mode=rwc" # For completeness, here is the file storage configuration # diff --git a/crates/cli/src/commands/adjust.rs b/crates/cli/src/commands/adjust.rs index c7915652..7ac65156 100644 --- a/crates/cli/src/commands/adjust.rs +++ b/crates/cli/src/commands/adjust.rs @@ -171,25 +171,25 @@ impl AdjustCommandOptions { .most_recent_active_activity()? .ok_or_else(|| ActivityLogErrorKind::NoActiveActivityToAdjust)?; - debug!("Most recent active activity item: {:?}", activity_item); + debug!("Most recent active activity item: {activity_item:?}"); let guid = *activity_item.guid(); let mut activity = activity_item.activity().clone(); if let Some(category) = category { - debug!("Setting category to: {:?}", category); + debug!("Setting category to: {category:?}"); _ = activity.set_category(category.clone().into()); } if let Some(description) = description { - debug!("Setting description to: {:?}", description); + debug!("Setting description to: {description:?}"); _ = activity.set_description(description.clone()); } if start.is_some() { - debug!("Setting start time to: {:?}", date_time); + debug!("Setting start time to: {date_time:?}"); _ = activity.set_begin(date_time); } @@ -198,7 +198,7 @@ impl AdjustCommandOptions { let tags = tags.iter().cloned().collect::(); if *override_tags { - debug!("Overriding tags with: {:?}", tags); + debug!("Overriding tags with: {tags:?}"); _ = activity.set_tags(Some(tags)); } else { let merged_tags = activity.tags_mut().as_mut().map_or_else( @@ -206,7 +206,7 @@ impl AdjustCommandOptions { |existing_tags| existing_tags.union(&tags).cloned().collect(), ); - debug!("Setting merged tags: {:?}", merged_tags); + debug!("Setting merged tags: {merged_tags:?}"); _ = activity.set_tags(Some(merged_tags)); } diff --git a/crates/cli/src/commands/begin.rs b/crates/cli/src/commands/begin.rs index 7836776a..6f6c958f 100644 --- a/crates/cli/src/commands/begin.rs +++ b/crates/cli/src/commands/begin.rs @@ -152,7 +152,7 @@ impl BeginCommandOptions { let activity_item = activity_store.begin_activity(activity)?; - debug!("Started Activity: {:?}", activity_item); + debug!("Started Activity: {activity_item:?}"); activity_store.sync()?; diff --git a/crates/cli/src/commands/end.rs b/crates/cli/src/commands/end.rs index 14dfb608..4b2b1f9f 100644 --- a/crates/cli/src/commands/end.rs +++ b/crates/cli/src/commands/end.rs @@ -95,7 +95,7 @@ impl EndCommandOptions { ))? .validate()?; - debug!("Parsed date time: {:?}", date_time); + debug!("Parsed date time: {date_time:?}"); let activity_store = ActivityStore::with_storage(storage)?; diff --git a/crates/cli/src/commands/now.rs b/crates/cli/src/commands/now.rs index c9c12f8f..99490c5e 100644 --- a/crates/cli/src/commands/now.rs +++ b/crates/cli/src/commands/now.rs @@ -43,7 +43,7 @@ impl NowCommandOptions { .map_or_else( || "No activities are currently running.".to_string(), |activities| { - debug!("Current Activities: {:?}", activities); + debug!("Current Activities: {activities:?}"); // Get the activity items let activity_items = activities diff --git a/crates/cli/src/commands/reflect.rs b/crates/cli/src/commands/reflect.rs index cc6bc983..3b72ce7d 100644 --- a/crates/cli/src/commands/reflect.rs +++ b/crates/cli/src/commands/reflect.rs @@ -154,7 +154,7 @@ impl ReflectCommandOptions { let activity_tracker = ActivityTracker::with_activity_store(activity_store); - debug!("Displaying reflection for time frame: {}", time_frame); + debug!("Displaying reflection for time frame: {time_frame}"); let filter_opts = FilterOptions::builder() .category(category.clone()) @@ -175,7 +175,7 @@ impl ReflectCommandOptions { Some(ReflectionsFormatKind::Json) => { let json = serde_json::to_string_pretty(&reflection)?; - debug!("Reflection: {}", json); + debug!("Reflection: {json}"); // write to file if export file is specified if let Some(export_file) = export_file { @@ -208,7 +208,7 @@ impl ReflectCommandOptions { .map_err(TemplatingErrorKind::RenderingToTemplateFailed)? }; - debug!("Reflection: {}", templated); + debug!("Reflection: {templated}"); // write to file if export file is specified if let Some(export_file) = export_file { diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 3bf61189..41a05c4e 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -20,11 +20,9 @@ include = [ ] [features] -default = ["cli", "db"] +default = ["cli"] cli = ["clap"] clap = ["dep:clap"] -db = ["rusqlite"] -rusqlite = ["dep:rusqlite"] [dependencies] chrono = { workspace = true, features = ["serde"] } @@ -38,10 +36,9 @@ itertools = { workspace = true } merge = { workspace = true } once_cell = { workspace = true } pace_error = { workspace = true } -pace_time = { workspace = true, features = ["rusqlite"] } +pace_time = { workspace = true } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } -rusqlite = { workspace = true, optional = true, features = ["chrono"] } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index 859a7634..a4997180 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -336,10 +336,7 @@ impl Activity { /// an already ended/archived/etc. activity #[must_use] pub fn new_from_self(&self) -> Self { - debug!( - "Creating a new activity from the current activity: {:?}.", - self - ); + debug!("Creating a new activity from the current activity: {self:?}."); Self::builder() .description(self.description.clone()) @@ -353,7 +350,7 @@ impl Activity { /// If the activity is held pub fn is_paused(&self) -> bool { - debug!("Checking if activity is held: {:?}", self); + debug!("Checking if activity is held: {self:?}"); self.status.is_paused() } @@ -362,7 +359,7 @@ impl Activity { /// [`is_active_intermission`] for that #[must_use] pub fn is_in_progress(&self) -> bool { - debug!("Checking if activity is active: {:?}", self); + debug!("Checking if activity is active: {self:?}"); self.activity_end_options().is_none() && (!self.kind.is_intermission() || !self.kind.is_pomodoro_intermission()) && self.status.is_in_progress() @@ -370,13 +367,13 @@ impl Activity { /// Make the activity active pub fn make_active(&mut self) { - debug!("Making activity active: {:?}", self); + debug!("Making activity active: {self:?}"); self.status = ActivityStatusKind::InProgress; } /// Make the activity inactive pub fn make_inactive(&mut self) { - debug!("Making activity inactive: {:?}", self); + debug!("Making activity inactive: {self:?}"); self.status = ActivityStatusKind::Created; } @@ -384,7 +381,7 @@ impl Activity { /// This is only possible if the activity is not active and has ended pub fn archive(&mut self) { if !self.is_in_progress() && self.is_completed() { - debug!("Archiving activity: {:?}", self); + debug!("Archiving activity: {self:?}"); self.status = ActivityStatusKind::Archived; } } @@ -393,21 +390,21 @@ impl Activity { /// This is only possible if the activity is archived pub fn unarchive(&mut self) { if self.is_archived() { - debug!("Unarchiving activity: {:?}", self); + debug!("Unarchiving activity: {self:?}"); self.status = ActivityStatusKind::Unarchived; } } /// If the activity is endable, meaning if it is active or held pub fn is_completable(&self) -> bool { - debug!("Checking if activity is endable: {:?}", self); + debug!("Checking if activity is endable: {self:?}"); self.is_in_progress() || self.is_paused() } /// If the activity is an active intermission #[must_use] pub fn is_active_intermission(&self) -> bool { - debug!("Checking if activity is an active intermission: {:?}", self); + debug!("Checking if activity is an active intermission: {self:?}"); self.activity_end_options().is_none() && (self.kind.is_intermission() || self.kind.is_pomodoro_intermission()) && self.status.is_in_progress() @@ -416,21 +413,21 @@ impl Activity { /// If the activity is archived #[must_use] pub fn is_archived(&self) -> bool { - debug!("Checking if activity is archived: {:?}", self); + debug!("Checking if activity is archived: {self:?}"); self.status.is_archived() } /// If the activity is inactive #[must_use] pub fn is_inactive(&self) -> bool { - debug!("Checking if activity is inactive: {:?}", self); + debug!("Checking if activity is inactive: {self:?}"); self.status.is_created() } /// If the activity has ended and is not archived #[must_use] pub fn is_completed(&self) -> bool { - debug!("Checking if activity has ended: {:?}", self); + debug!("Checking if activity has ended: {self:?}"); self.activity_end_options().is_some() && (!self.kind.is_intermission() || !self.kind.is_pomodoro_intermission()) && !self.is_archived() @@ -440,7 +437,7 @@ impl Activity { /// If the activity is resumable #[must_use] pub fn is_resumable(&self) -> bool { - debug!("Checking if activity is resumable: {:?}", self); + debug!("Checking if activity is resumable: {self:?}"); self.is_inactive() || self.is_archived() || self.is_paused() || self.is_completed() } @@ -646,7 +643,7 @@ impl ActivityGroup { pub fn add_session(&mut self, session: ActivitySession) { debug!("Adding session to activity session"); - debug!("Session: {:#?}", session); + debug!("Session: {session:#?}"); self.intermission_duration += *session.intermission_duration(); self.adjusted_duration -= *session.adjusted_duration(); diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index 0c57a8e1..f855940d 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -1,5 +1,5 @@ -#[cfg(feature = "rusqlite")] -pub mod rusqlite; +// #[cfg(feature = "rusqlite")] +// pub mod rusqlite; use itertools::Itertools; use std::{ @@ -585,10 +585,7 @@ pub trait ActivityQuerying: ActivityReadOps { }; if filtered.len() > count { - debug!( - "Found more than {} recent activities, dropping some...", - count - ); + debug!("Found more than {count} recent activities, dropping some..."); Ok(Some( (*filtered) @@ -667,24 +664,21 @@ pub trait ActivityQuerying: ActivityReadOps { let activity_item = self.read_activity(*activity).ok()?; if activity_item.activity().parent_id() == Some(activity_id) { - debug!("Found intermission for activity: {}", activity_id); + debug!("Found intermission for activity: {activity_id}"); Some(activity_item) } else { - debug!("Not an intermission for activity: {}", activity_id); + debug!("Not an intermission for activity: {activity_id}"); None } }) .collect::>(); if intermissions.is_empty() { - debug!("No intermissions found for activity: {}", activity_id); + debug!("No intermissions found for activity: {activity_id}"); return Ok(None); } - debug!( - "Activity with id {:?} has intermissions: {:?}", - activity_id, intermissions - ); + debug!("Activity with id {activity_id:?} has intermissions: {intermissions:?}"); Ok(Some(intermissions)) } @@ -717,20 +711,17 @@ pub trait ActivityQuerying: ActivityReadOps { .parent_id() == Some(activity_id) { - debug!("Found active intermission for activity: {}", activity_id); + debug!("Found active intermission for activity: {activity_id}"); Some(*active_intermission_id) } else { - debug!("No active intermission found for activity: {}", activity_id); + debug!("No active intermission found for activity: {activity_id}"); None } }) .collect::>() }); - debug!( - "Activity with id {:?} has active intermissions: {:?}", - activity_id, guids - ); + debug!("Activity with id {activity_id:?} has active intermissions: {guids:?}"); Ok(guids) } diff --git a/crates/error/Cargo.toml b/crates/error/Cargo.toml index 8532abc2..d9f28e62 100644 --- a/crates/error/Cargo.toml +++ b/crates/error/Cargo.toml @@ -17,8 +17,7 @@ description = "pace-error - library for error handling in pace ecosystem" chrono = { workspace = true } displaydoc = { workspace = true } miette = { workspace = true, features = ["fancy"] } -rusqlite = { workspace = true } -sea-query = { workspace = true } +sea-orm = { workspace = true } serde_json = { workspace = true } tera = { workspace = true } thiserror = { workspace = true } diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index 2c2c2493..0e84f5ff 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -199,8 +199,12 @@ pub enum ConfigErrorKind { #[non_exhaustive] #[derive(Error, Debug, Display)] pub enum DatabaseStorageErrorKind { - /// Error connecting to database: {0} - {1} - ConnectionFailed(String, String), + /// Error connecting to database {url}: {source} + ConnectionFailed { + url: String, + #[source] + source: sea_orm::error::DbErr, + }, /// No connection string provided NoConnectionString, @@ -212,7 +216,7 @@ pub enum DatabaseStorageErrorKind { ActivityNotFound { guid: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::SqlErr, }, /// Failed to create activity: {0} @@ -227,12 +231,10 @@ pub enum DatabaseStorageErrorKind { /// Database storage not implemented, yet! StorageNotImplemented, - /// Database migration failed. Version: {version}, Query: {query}, Source: {source} + /// Database migration failed: {source} MigrationFailed { - version: String, - query: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::DbErr, }, /// No migrations found for table: {table} @@ -244,7 +246,7 @@ pub enum DatabaseStorageErrorKind { table: String, query: String, #[source] - source: sea_query::error::Error, + source: sea_orm::error::SqlErr, }, /// No migrations to rollback @@ -259,7 +261,7 @@ pub enum DatabaseStorageErrorKind { table: String, query: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::SqlErr, }, /// Selection query failed for migration version: {version}, table: {table}, query: {query}, source: {source} @@ -268,21 +270,21 @@ pub enum DatabaseStorageErrorKind { table: String, query: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::SqlErr, }, /// Row does not contain migration version: {version}, source: {source} RowDoesNotContainMigrationVersion { version: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::SqlErr, }, /// Failed to read activity {guid}: {source} ActivityReadFailed { guid: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::SqlErr, }, /// There is no item contained with id {0} @@ -293,7 +295,7 @@ pub enum DatabaseStorageErrorKind { version: String, query: String, #[source] - source: rusqlite::Error, + source: sea_orm::error::SqlErr, }, } diff --git a/crates/service/Cargo.toml b/crates/service/Cargo.toml index 1e39f21d..4d110205 100644 --- a/crates/service/Cargo.toml +++ b/crates/service/Cargo.toml @@ -15,10 +15,10 @@ description = "pace-service - service support library for pace" [dependencies] getset = { workspace = true } -pace_core = { workspace = true, features = ["db"] } +pace_core = { workspace = true } pace_error = { workspace = true } pace_storage = { workspace = true } -pace_time = { workspace = true, features = ["rusqlite"] } +pace_time = { workspace = true } tracing = { workspace = true } typed-builder = { workspace = true } wildmatch = { workspace = true } diff --git a/crates/service/src/activity_tracker.rs b/crates/service/src/activity_tracker.rs index 0aaeff56..3f741791 100644 --- a/crates/service/src/activity_tracker.rs +++ b/crates/service/src/activity_tracker.rs @@ -43,7 +43,7 @@ impl ActivityTracker { let summary = ReflectionSummary::new(time_range_opts, summary_groups); - debug!("Generated reflection: {:#?}", summary); + debug!("Generated reflection: {summary:#?}"); Ok(Some(summary)) } diff --git a/crates/service/src/lib.rs b/crates/service/src/lib.rs index 7bb3e77a..966fe27f 100644 --- a/crates/service/src/lib.rs +++ b/crates/service/src/lib.rs @@ -8,12 +8,12 @@ pub mod activity_tracker; use std::sync::Arc; -use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, DatabaseEngineKind, PaceConfig}; +use pace_core::prelude::{ActivityLogStorageKind, ActivityStorage, PaceConfig}; use pace_error::{DatabaseStorageErrorKind, PaceResult}; use tracing::debug; use pace_storage::storage::{ - file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SqliteActivityStorage, + file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::DatabaseActivityStorage, }; /// Get the storage backend from the configuration. @@ -32,23 +32,16 @@ use pace_storage::storage::{ pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult> { let storage: Arc = match config.storage().storage() { ActivityLogStorageKind::File { location } => Arc::new(TomlActivityStorage::new(location)?), - ActivityLogStorageKind::Database { kind, url } => match kind { - DatabaseEngineKind::Sqlite => { - debug!("Connecting to database: {}", url); - - Arc::new(SqliteActivityStorage::new(url.clone())?) - } - engine => { - return Err( - DatabaseStorageErrorKind::UnsupportedDatabaseEngine(engine.to_string()).into(), - ) - } - }, + ActivityLogStorageKind::Database { kind, url } => { + debug!("Connecting to SQLite database: {url}"); + + Arc::new(DatabaseActivityStorage::new(*kind, url)?) + } ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), }; - debug!("Using storage backend: {:?}", storage); + debug!("Using storage backend: {storage:?}"); Ok(storage) } diff --git a/crates/storage/Cargo.toml b/crates/storage/Cargo.toml index a3466bdf..0794d360 100644 --- a/crates/storage/Cargo.toml +++ b/crates/storage/Cargo.toml @@ -19,17 +19,6 @@ include = [ "Cargo.toml", ] -# TODO: With our limited scope, we don't feature gate anything -# [features] -# default = ["db"] -# db = ["rusqlite"] -# rusqlite = [ -# "dep:rusqlite", -# "dep:libsqlite3-sys", -# "dep:sea-query", -# "dep:sea-query-rusqlite", -# ] - [dependencies] chrono = { workspace = true, features = ["serde"] } displaydoc = { workspace = true } @@ -37,16 +26,16 @@ getset = { workspace = true } itertools = { workspace = true } libsqlite3-sys = { workspace = true, features = ["bundled"] } merge = { workspace = true } -pace_core = { workspace = true, features = ["db"] } +pace_core = { workspace = true } pace_error = { workspace = true } -pace_time = { workspace = true, features = ["db"] } +pace_time = { workspace = true } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } -rusqlite = { workspace = true, features = ["bundled", "chrono"] } -sea-query = { workspace = true, features = ["derive", "attr", "with-chrono", "backend-sqlite"] } -sea-query-rusqlite = { workspace = true, features = ["with-chrono"] } +sea-orm = { workspace = true, features = ["sqlx-sqlite", "runtime-tokio-rustls", "macros", "mock", "with-chrono", "debug-print"] } +sea-orm-migration = { workspace = true } strum = { workspace = true } thiserror = { workspace = true } +tokio = { workspace = true, default-features = false, features = ["rt-multi-thread"] } toml = { workspace = true, features = ["indexmap", "preserve_order"] } tracing = { workspace = true } typed-builder = { workspace = true } diff --git a/crates/storage/src/entity/activities.rs b/crates/storage/src/entity/activities.rs new file mode 100644 index 00000000..bd171069 --- /dev/null +++ b/crates/storage/src/entity/activities.rs @@ -0,0 +1,102 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "activities")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub description_guid: String, + pub begin: String, + pub end: Option, + pub duration: Option, + pub kind_guid: String, + pub status_guid: String, + pub parent_guid: Option, +} + +#[derive(DeriveIden)] +pub enum Activities { + Table, + Guid, + DescriptionGuid, + Begin, + End, + Duration, + KindGuid, + StatusGuid, + ParentGuid, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm( + belongs_to = "Entity", + from = "Column::ParentGuid", + to = "Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + SelfRef, + #[sea_orm(has_many = "super::activities_categories::Entity")] + ActivitiesCategories, + #[sea_orm(has_many = "super::activities_tags::Entity")] + ActivitiesTags, + #[sea_orm( + belongs_to = "super::activity_kinds::Entity", + from = "Column::KindGuid", + to = "super::activity_kinds::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + ActivityKinds, + #[sea_orm( + belongs_to = "super::activity_status::Entity", + from = "Column::StatusGuid", + to = "super::activity_status::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + ActivityStatus, + #[sea_orm( + belongs_to = "super::descriptions::Entity", + from = "Column::DescriptionGuid", + to = "super::descriptions::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + Descriptions, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::ActivitiesCategories.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::ActivitiesTags.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::ActivityKinds.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::ActivityStatus.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Descriptions.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/activities_categories.rs b/crates/storage/src/entity/activities_categories.rs new file mode 100644 index 00000000..e57fe09f --- /dev/null +++ b/crates/storage/src/entity/activities_categories.rs @@ -0,0 +1,54 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "activities_categories")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub activity_guid: String, + pub category_guid: String, +} + +#[derive(DeriveIden)] +pub enum ActivitiesCategories { + Table, + Guid, + ActivityGuid, + CategoryGuid, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm( + belongs_to = "super::activities::Entity", + from = "Column::ActivityGuid", + to = "super::activities::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + Activities, + #[sea_orm( + belongs_to = "super::categories::Entity", + from = "Column::CategoryGuid", + to = "super::categories::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + Categories, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Activities.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Categories.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/activities_tags.rs b/crates/storage/src/entity/activities_tags.rs new file mode 100644 index 00000000..9b167057 --- /dev/null +++ b/crates/storage/src/entity/activities_tags.rs @@ -0,0 +1,54 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "activities_tags")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub tag_guid: String, + pub activity_guid: String, +} + +#[derive(DeriveIden)] +pub enum ActivitiesTags { + Table, + Guid, + TagGuid, + ActivityGuid, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm( + belongs_to = "super::activities::Entity", + from = "Column::ActivityGuid", + to = "super::activities::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + Activities, + #[sea_orm( + belongs_to = "super::tags::Entity", + from = "Column::TagGuid", + to = "super::tags::Column::Guid", + on_update = "NoAction", + on_delete = "NoAction" + )] + Tags, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Activities.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Tags.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/activity_kinds.rs b/crates/storage/src/entity/activity_kinds.rs new file mode 100644 index 00000000..8b3efdba --- /dev/null +++ b/crates/storage/src/entity/activity_kinds.rs @@ -0,0 +1,32 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "activity_kinds")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub kind: String, +} + +#[derive(DeriveIden)] +pub enum ActivityKinds { + Table, + Guid, + Kind, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::activities::Entity")] + Activities, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Activities.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/activity_status.rs b/crates/storage/src/entity/activity_status.rs new file mode 100644 index 00000000..71f83fae --- /dev/null +++ b/crates/storage/src/entity/activity_status.rs @@ -0,0 +1,32 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "activity_status")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub status: String, +} + +#[derive(DeriveIden)] +pub enum ActivityStatus { + Table, + Guid, + Status, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::activities::Entity")] + Activities, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Activities.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/categories.rs b/crates/storage/src/entity/categories.rs new file mode 100644 index 00000000..4121fa16 --- /dev/null +++ b/crates/storage/src/entity/categories.rs @@ -0,0 +1,34 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "categories")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub category: String, + pub description: Option, +} + +#[derive(DeriveIden)] +pub enum Categories { + Table, + Guid, + Category, + Description, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::activities_categories::Entity")] + ActivitiesCategories, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::ActivitiesCategories.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/descriptions.rs b/crates/storage/src/entity/descriptions.rs new file mode 100644 index 00000000..6fc29696 --- /dev/null +++ b/crates/storage/src/entity/descriptions.rs @@ -0,0 +1,32 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "descriptions")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub description: String, +} + +#[derive(DeriveIden)] +pub enum Descriptions { + Table, + Guid, + Description, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::activities::Entity")] + Activities, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Activities.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/mod.rs b/crates/storage/src/entity/mod.rs new file mode 100644 index 00000000..9a23065d --- /dev/null +++ b/crates/storage/src/entity/mod.rs @@ -0,0 +1,12 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +pub mod prelude; + +pub mod activities; +pub mod activities_categories; +pub mod activities_tags; +pub mod activity_kinds; +pub mod activity_status; +pub mod categories; +pub mod descriptions; +pub mod tags; diff --git a/crates/storage/src/entity/prelude.rs b/crates/storage/src/entity/prelude.rs new file mode 100644 index 00000000..1d1eac15 --- /dev/null +++ b/crates/storage/src/entity/prelude.rs @@ -0,0 +1,10 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +pub use super::activities::Entity as Activities; +pub use super::activities_categories::Entity as ActivitiesCategories; +pub use super::activities_tags::Entity as ActivitiesTags; +pub use super::activity_kinds::Entity as ActivityKinds; +pub use super::activity_status::Entity as ActivityStatus; +pub use super::categories::Entity as Categories; +pub use super::descriptions::Entity as Descriptions; +pub use super::tags::Entity as Tags; diff --git a/crates/storage/src/entity/tags.rs b/crates/storage/src/entity/tags.rs new file mode 100644 index 00000000..338b1cd2 --- /dev/null +++ b/crates/storage/src/entity/tags.rs @@ -0,0 +1,32 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 + +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] +#[sea_orm(table_name = "tags")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub guid: String, + pub tag: String, +} + +#[derive(DeriveIden)] +pub enum Tags { + Table, + Guid, + Tag, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::activities_tags::Entity")] + ActivitiesTags, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::ActivitiesTags.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 2ac9eaff..d3dd4d64 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,5 +1,21 @@ -pub mod convert; -pub mod entities; +// pub mod convert; +// pub mod entities; +pub mod entity; pub mod migration; pub mod query; pub mod storage; + +use std::sync::OnceLock; + +use tokio::runtime::Runtime; + +#[allow(clippy::expect_used)] +fn runtime() -> &'static Runtime { + static RUNTIME: OnceLock = OnceLock::new(); + RUNTIME.get_or_init(|| { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime") + }) +} diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 44b894e6..7afb4ee9 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -1,320 +1,32 @@ -mod create_activities_20240325143710; -mod create_activities_categories_20240326130013; -mod create_activities_tags_20240326125630; -mod create_activity_kind_values_20240327162015; -mod create_activity_kinds_20240326124253; -mod create_activity_status_20240326125819; -mod create_activity_status_values_20240327163645; -mod create_categories_20240326125937; -mod create_descriptions_20240329131712; -mod create_schema_migrations; -mod create_tags_20240326125555; - -use rusqlite::Connection; -use sea_query::{Cond, Expr, Iden, Query, SqliteQueryBuilder}; -use std::collections::VecDeque; -use tracing::debug; -use ulid::Ulid; - -use pace_error::{DatabaseStorageErrorKind, PaceResult}; - -use crate::entities::schema_migrations::SchemaMigrationsIden; - -pub trait SQLiteMigration { - fn version(&self) -> String; - fn up(&self) -> String; - fn down(&self) -> String; -} - -pub struct SQLiteMigrator<'conn> { - iterator: Box>>, - applied: VecDeque>, - connection: &'conn Connection, -} - -impl<'conn> SQLiteMigrator<'conn> { - /// Create a new `SQLiteMigrator` - /// - /// # Arguments - /// - /// * `connection` - The [`rusqlite::Connection`] - /// - /// # Errors - /// - /// Returns an error if the initial migration fails - /// - /// # Returns - /// - /// Returns a new `SQLiteMigrator` - pub fn new(connection: &'conn Connection) -> PaceResult { - let mut migrator = Self { - iterator: Self::load(), - applied: VecDeque::default(), - connection, - }; - - migrator.init()?; - - Ok(migrator) - } - - fn init(&mut self) -> PaceResult<()> { - let migration = - self.iterator - .next() - .ok_or(DatabaseStorageErrorKind::NoMigrationsFound { - table: SchemaMigrationsIden::Table.to_string(), - })?; - let query = migration.up(); - - _ = match self.connection.execute(&query, []) { - Ok(val) => val, - Err(rusqlite::Error::SqlInputError { msg, .. }) if msg.contains("already exists") => { - debug!("Table already exists"); - 0 - } - Err(err) => { - return Err(DatabaseStorageErrorKind::MigrationFailed { - version: migration.version(), - query: query.to_string(), - source: err, - } - .into()); - } - }; - - self.applied.push_back(migration); - - Ok(()) - } - - /// Load all migrations from the directory - /// - /// # Attention - /// - /// These are loaded in order, so make sure to keep the order correct. - /// The first migration should be the migration table creation. - fn load() -> Box>> { - let migrations: Vec> = vec![ - Box::new(create_schema_migrations::Migration), - Box::new(create_activities_20240325143710::Migration), - Box::new(create_activity_kinds_20240326124253::Migration), - Box::new(create_tags_20240326125555::Migration), - Box::new(create_activities_tags_20240326125630::Migration), - Box::new(create_activity_status_20240326125819::Migration), - Box::new(create_categories_20240326125937::Migration), - Box::new(create_activities_categories_20240326130013::Migration), - Box::new(create_activity_kind_values_20240327162015::Migration), - Box::new(create_activity_status_values_20240327163645::Migration), - Box::new(create_descriptions_20240329131712::Migration), - ]; - - Box::new(migrations.into_iter()) - } - - /// Push migration version to `schema_migrations` table - /// - /// # Errors - /// - /// Returns an error if the migration version cannot be pushed - /// - /// # Returns - /// - /// Returns `Ok(())` if the migration version is pushed successfully - fn push_migration_version(&self, version: String) -> PaceResult<()> { - let query = Query::insert() - .into_table(SchemaMigrationsIden::Table) - .columns([SchemaMigrationsIden::Guid, SchemaMigrationsIden::Version]) - .values([Ulid::new().to_string().into(), version.clone().into()]) - .map_err( - |source| DatabaseStorageErrorKind::BuildingMigrationQueryFailed { - version: version.clone(), - table: SchemaMigrationsIden::Table.to_string(), - query: source.to_string(), - source, - }, - )? - .to_owned(); - - let query = query.to_string(SqliteQueryBuilder); - - if self.connection.execute(&query, []).map_err(|err| { - DatabaseStorageErrorKind::MigrationFailed { - version, - query, - source: err, - } - })? > 1 - { - return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); - } - - Ok(()) - } - - /// Remove migration version from `schema_migrations` table - /// - /// # Errors - /// - /// Returns an error if the migration version cannot be removed - /// - /// # Returns - /// - /// Returns `Ok(())` if the migration version is removed successfully - fn remove_migration_version(&self, version: String) -> PaceResult<()> { - let query = Query::delete() - .from_table(SchemaMigrationsIden::Table) - .cond_where( - Cond::any().add(Expr::col(SchemaMigrationsIden::Version).eq(version.clone())), - ) - .to_owned(); - - let query = query.to_string(SqliteQueryBuilder); - - if self.connection.execute(&query, []).map_err(|source| { - DatabaseStorageErrorKind::MigrationFailed { - version, - query, - source, - } - })? > 1 - { - return Err(DatabaseStorageErrorKind::MigrationAffectedMultipleRows.into()); - } - - Ok(()) - } - - /// Migrate to the latest version - /// - /// # Errors - /// - /// Returns an error if the migration fails - /// - /// # Returns - /// - /// Returns `Ok(())` if the migration is successful - pub fn up(&mut self) -> PaceResult<()> { - while let Some(migration) = self.iterator.next() { - let query = migration.up(); - - // check if migration already exists in schema_migrations table - if self.check_migration_exists(&migration.version())? { - debug!("Migration already exists"); - continue; - }; - - if query.is_empty() { - continue; - } - - // check if query contains multiple queries - // if so, run each query separately - if query.contains("; ") { - self.connection.execute_batch(&query).map_err(|source| { - DatabaseStorageErrorKind::AddingValuesToDatabaseTableFailed { - version: migration.version(), - query: query.to_string(), - source, - } - })?; - } else { - _ = match self.connection.execute(&query, []) { - Ok(val) => val, - Err(rusqlite::Error::SqlInputError { msg, .. }) - if msg.contains("already exists") => - { - debug!("Table already exists"); - 0 - } - Err(err) => { - return Err(DatabaseStorageErrorKind::MigrationFailed { - version: migration.version(), - query: query.to_string(), - source: err, - } - .into()); - } - }; - } - - self.push_migration_version(migration.version())?; - - self.applied.push_back(migration); - } - - Ok(()) - } - - fn check_migration_exists(&self, version: &str) -> PaceResult { - let query = Query::select() - .from(SchemaMigrationsIden::Table) - .columns([SchemaMigrationsIden::Version]) - .cond_where(Expr::col(SchemaMigrationsIden::Version).eq(version)) - .to_string(SqliteQueryBuilder); - - let mut stmt = self.connection.prepare(&query).map_err(|source| { - DatabaseStorageErrorKind::CheckingMigrationExistsFailed { - version: version.to_string(), - table: SchemaMigrationsIden::Table.to_string(), - query: query.to_string(), - source, - } - })?; - - let mut rows = - stmt.query([]) - .map_err(|source| DatabaseStorageErrorKind::SelectionQueryFailed { - version: version.to_string(), - table: SchemaMigrationsIden::Table.to_string(), - query: query.to_string(), - source, - })?; - - Ok(rows - .next() - .map_err( - |source| DatabaseStorageErrorKind::RowDoesNotContainMigrationVersion { - version: version.to_string(), - source, - }, - )? - .is_some()) - } - - /// Rollback the most recent migration - /// - /// # Errors - /// - /// Returns an error if there are no migrations to rollback - /// - /// # Returns - /// - /// Returns the version of the migration that was rolled back - pub fn down(&mut self) -> PaceResult { - let migration = self - .applied - .pop_back() - .ok_or(DatabaseStorageErrorKind::NoMigrationsToRollback)?; - - let query = migration.down(); - - _ = self.connection.execute(&query, []).map_err(|source| { - DatabaseStorageErrorKind::MigrationFailed { - version: migration.version(), - query: query.to_string(), - source, - } - })?; - - self.remove_migration_version(migration.version())?; - - Ok(migration.version()) - } - - /// List applied migrations - #[must_use] - pub fn status(&self) -> Vec { - self.applied.iter().map(|m| m.version()).collect() +mod m20240325_000001_create_activities; +mod m20240326_000001_create_tags; +mod m20240326_000002_create_categories; +mod m20240326_000003_create_activity_status; +mod m20240326_000004_create_activity_kinds; +mod m20240326_000005_create_activities_tags; +mod m20240326_000006_create_activities_categories; +mod m20240327_000001_create_activity_status_values; +mod m20240327_000002_create_activity_kind_values; +mod m20240329_000001_create_descriptions; + +pub use sea_orm_migration::prelude::{async_trait, MigrationTrait, MigratorTrait}; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![ + Box::new(m20240325_000001_create_activities::Migration), + Box::new(m20240326_000001_create_tags::Migration), + Box::new(m20240326_000002_create_categories::Migration), + Box::new(m20240326_000003_create_activity_status::Migration), + Box::new(m20240326_000004_create_activity_kinds::Migration), + Box::new(m20240326_000005_create_activities_tags::Migration), + Box::new(m20240326_000006_create_activities_categories::Migration), + Box::new(m20240327_000001_create_activity_status_values::Migration), + Box::new(m20240327_000002_create_activity_kind_values::Migration), + Box::new(m20240329_000001_create_descriptions::Migration), + ] } } diff --git a/crates/storage/src/migration/create_activities_20240325143710.rs b/crates/storage/src/migration/create_activities_20240325143710.rs deleted file mode 100644 index 67847391..00000000 --- a/crates/storage/src/migration/create_activities_20240325143710.rs +++ /dev/null @@ -1,80 +0,0 @@ -use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; - -use crate::{ - entities::{ - activities::ActivitiesIden, activity_kinds::ActivityKindsIden, - activity_status::ActivityStatusIden, description::DescriptionsIden, - }, - migration::SQLiteMigration, -}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240325143710".to_string() - } - - fn up(&self) -> String { - Table::create() - .table(ActivitiesIden::Table) - .if_not_exists() - .col( - ColumnDef::new(ActivitiesIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col( - ColumnDef::new(ActivitiesIden::DescriptionGuid) - .text() - .not_null(), - ) - .col( - ColumnDef::new(ActivitiesIden::Begin) - .timestamp_with_time_zone() - .not_null(), - ) - .col( - ColumnDef::new(ActivitiesIden::End) - .timestamp_with_time_zone() - .null(), - ) - .col(ColumnDef::new(ActivitiesIden::Duration).integer().null()) - .col(ColumnDef::new(ActivitiesIden::KindGuid).text().not_null()) - .col(ColumnDef::new(ActivitiesIden::StatusGuid).text().not_null()) - .col(ColumnDef::new(ActivitiesIden::ParentGuid).text().null()) - .foreign_key( - ForeignKey::create() - .name("fk_activities_parent_guid") - .from(ActivitiesIden::Table, ActivitiesIden::ParentGuid) - .to(ActivitiesIden::Table, ActivitiesIden::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_kind") - .from(ActivitiesIden::Table, ActivitiesIden::KindGuid) - .to(ActivityKindsIden::Table, ActivityKindsIden::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_status") - .from(ActivitiesIden::Table, ActivitiesIden::StatusGuid) - .to(ActivityStatusIden::Table, ActivityStatusIden::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_description") - .from(ActivitiesIden::Table, ActivitiesIden::DescriptionGuid) - .to(DescriptionsIden::Table, DescriptionsIden::Guid), - ) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(ActivitiesIden::Table) - .if_exists() - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_activities_categories_20240326130013.rs b/crates/storage/src/migration/create_activities_categories_20240326130013.rs deleted file mode 100644 index ca748b8e..00000000 --- a/crates/storage/src/migration/create_activities_categories_20240326130013.rs +++ /dev/null @@ -1,64 +0,0 @@ -use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; - -use crate::{ - entities::{ - activities::ActivitiesIden, activities_categories::ActivitiesCategoriesIden, - categories::CategoriesIden, - }, - migration::SQLiteMigration, -}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240326130013".to_string() - } - - fn up(&self) -> String { - Table::create() - .table(ActivitiesCategoriesIden::Table) - .if_not_exists() - .col( - ColumnDef::new(ActivitiesCategoriesIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col( - ColumnDef::new(ActivitiesCategoriesIden::ActivityGuid) - .text() - .not_null(), - ) - .col( - ColumnDef::new(ActivitiesCategoriesIden::CategoryGuid) - .text() - .not_null(), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_categories_category_guid") - .from( - ActivitiesCategoriesIden::Table, - ActivitiesCategoriesIden::CategoryGuid, - ) - .to(CategoriesIden::Table, CategoriesIden::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_categories_activity_guid") - .from( - ActivitiesCategoriesIden::Table, - ActivitiesCategoriesIden::ActivityGuid, - ) - .to(ActivitiesIden::Table, ActivitiesIden::Guid), - ) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(ActivitiesCategoriesIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_activities_tags_20240326125630.rs b/crates/storage/src/migration/create_activities_tags_20240326125630.rs deleted file mode 100644 index 432332bc..00000000 --- a/crates/storage/src/migration/create_activities_tags_20240326125630.rs +++ /dev/null @@ -1,55 +0,0 @@ -use sea_query::{ColumnDef, ForeignKey, SqliteQueryBuilder, Table}; - -use crate::{ - entities::{activities::ActivitiesIden, activities_tags::ActivitiesTagsIden, tags::TagsIden}, - migration::SQLiteMigration, -}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240326125630".to_string() - } - - fn up(&self) -> String { - Table::create() - .if_not_exists() - .table(ActivitiesTagsIden::Table) - .col( - ColumnDef::new(ActivitiesTagsIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col( - ColumnDef::new(ActivitiesTagsIden::TagGuid) - .text() - .not_null(), - ) - .col( - ColumnDef::new(ActivitiesTagsIden::ActivityGuid) - .text() - .not_null(), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_tags_tag_guid") - .from(ActivitiesTagsIden::Table, ActivitiesTagsIden::TagGuid) - .to(TagsIden::Table, TagsIden::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_tags_activity_guid") - .from(ActivitiesTagsIden::Table, ActivitiesTagsIden::ActivityGuid) - .to(ActivitiesIden::Table, ActivitiesIden::Guid), - ) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(ActivitiesTagsIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_activity_kind_values_20240327162015.rs b/crates/storage/src/migration/create_activity_kind_values_20240327162015.rs deleted file mode 100644 index 22a34847..00000000 --- a/crates/storage/src/migration/create_activity_kind_values_20240327162015.rs +++ /dev/null @@ -1,37 +0,0 @@ -use itertools::Itertools; -use pace_core::prelude::ActivityKind; -use sea_query::{Query, SqliteQueryBuilder}; -use strum::IntoEnumIterator; -use ulid::Ulid; - -use crate::{entities::activity_kinds::ActivityKindsIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240327162015".to_string() - } - - fn up(&self) -> String { - let activity_kinds = ActivityKind::iter() - .map(|kind| { - Query::insert() - .into_table(ActivityKindsIden::Table) - .columns([ActivityKindsIden::Guid, ActivityKindsIden::Kind]) - .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) - .to_owned() - .to_string(SqliteQueryBuilder) - }) - .collect_vec(); - - activity_kinds.join("; ") - } - - fn down(&self) -> String { - Query::delete() - .from_table(ActivityKindsIden::Table) - .to_owned() - .to_string(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_activity_kinds_20240326124253.rs b/crates/storage/src/migration/create_activity_kinds_20240326124253.rs deleted file mode 100644 index e3bf2bca..00000000 --- a/crates/storage/src/migration/create_activity_kinds_20240326124253.rs +++ /dev/null @@ -1,31 +0,0 @@ -use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; - -use crate::{entities::activity_kinds::ActivityKindsIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240326124253".to_string() - } - - fn up(&self) -> String { - Table::create() - .if_not_exists() - .table(ActivityKindsIden::Table) - .col( - ColumnDef::new(ActivityKindsIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(ActivityKindsIden::Kind).text().not_null()) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(ActivityKindsIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_activity_status_20240326125819.rs b/crates/storage/src/migration/create_activity_status_20240326125819.rs deleted file mode 100644 index 34318ff5..00000000 --- a/crates/storage/src/migration/create_activity_status_20240326125819.rs +++ /dev/null @@ -1,31 +0,0 @@ -use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; - -use crate::{entities::activity_status::ActivityStatusIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240326125819".to_string() - } - - fn up(&self) -> String { - Table::create() - .if_not_exists() - .table(ActivityStatusIden::Table) - .col( - ColumnDef::new(ActivityStatusIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(ActivityStatusIden::Status).text().not_null()) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(ActivityStatusIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_activity_status_values_20240327163645.rs b/crates/storage/src/migration/create_activity_status_values_20240327163645.rs deleted file mode 100644 index 4eb28a82..00000000 --- a/crates/storage/src/migration/create_activity_status_values_20240327163645.rs +++ /dev/null @@ -1,37 +0,0 @@ -use itertools::Itertools; -use pace_core::prelude::ActivityStatusKind; -use sea_query::{Query, SqliteQueryBuilder}; -use strum::IntoEnumIterator; -use ulid::Ulid; - -use crate::{entities::activity_status::ActivityStatusIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240327163645".to_string() - } - - fn up(&self) -> String { - let activity_kinds = ActivityStatusKind::iter() - .map(|kind| { - Query::insert() - .into_table(ActivityStatusIden::Table) - .columns([ActivityStatusIden::Guid, ActivityStatusIden::Status]) - .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) - .to_owned() - .to_string(SqliteQueryBuilder) - }) - .collect_vec(); - - activity_kinds.join("; ") - } - - fn down(&self) -> String { - Query::delete() - .from_table(ActivityStatusIden::Table) - .to_owned() - .to_string(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_categories_20240326125937.rs b/crates/storage/src/migration/create_categories_20240326125937.rs deleted file mode 100644 index f15ac5ef..00000000 --- a/crates/storage/src/migration/create_categories_20240326125937.rs +++ /dev/null @@ -1,32 +0,0 @@ -use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; - -use crate::{entities::categories::CategoriesIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240326125937".to_string() - } - - fn up(&self) -> String { - Table::create() - .if_not_exists() - .table(CategoriesIden::Table) - .col( - ColumnDef::new(CategoriesIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(CategoriesIden::Category).text().not_null()) - .col(ColumnDef::new(CategoriesIden::Description).text().null()) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(CategoriesIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_descriptions_20240329131712.rs b/crates/storage/src/migration/create_descriptions_20240329131712.rs deleted file mode 100644 index a685d804..00000000 --- a/crates/storage/src/migration/create_descriptions_20240329131712.rs +++ /dev/null @@ -1,35 +0,0 @@ -use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; - -use crate::{entities::description::DescriptionsIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240329131712".to_string() - } - - fn up(&self) -> String { - Table::create() - .if_not_exists() - .table(DescriptionsIden::Table) - .col( - ColumnDef::new(DescriptionsIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col( - ColumnDef::new(DescriptionsIden::Description) - .text() - .not_null(), - ) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(DescriptionsIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_schema_migrations.rs b/crates/storage/src/migration/create_schema_migrations.rs deleted file mode 100644 index a3758951..00000000 --- a/crates/storage/src/migration/create_schema_migrations.rs +++ /dev/null @@ -1,34 +0,0 @@ -use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; - -use crate::{entities::schema_migrations::SchemaMigrationsIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - String::default() - } - - fn up(&self) -> String { - Table::create() - .table(SchemaMigrationsIden::Table) - .col( - ColumnDef::new(SchemaMigrationsIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col( - ColumnDef::new(SchemaMigrationsIden::Version) - .integer() - .not_null(), - ) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(SchemaMigrationsIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/create_tags_20240326125555.rs b/crates/storage/src/migration/create_tags_20240326125555.rs deleted file mode 100644 index c47c19b5..00000000 --- a/crates/storage/src/migration/create_tags_20240326125555.rs +++ /dev/null @@ -1,31 +0,0 @@ -use sea_query::{ColumnDef, SqliteQueryBuilder, Table}; - -use crate::{entities::tags::TagsIden, migration::SQLiteMigration}; - -pub struct Migration; - -impl SQLiteMigration for Migration { - fn version(&self) -> String { - "20240326125555".to_string() - } - - fn up(&self) -> String { - Table::create() - .if_not_exists() - .table(TagsIden::Table) - .col( - ColumnDef::new(TagsIden::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(TagsIden::Tag).text().not_null()) - .build(SqliteQueryBuilder) - } - - fn down(&self) -> String { - Table::drop() - .table(TagsIden::Table) - .build(SqliteQueryBuilder) - } -} diff --git a/crates/storage/src/migration/m20240325_000001_create_activities.rs b/crates/storage/src/migration/m20240325_000001_create_activities.rs new file mode 100644 index 00000000..f6877753 --- /dev/null +++ b/crates/storage/src/migration/m20240325_000001_create_activities.rs @@ -0,0 +1,83 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::activities::Activities; +use crate::entity::activity_kinds::ActivityKinds; +use crate::entity::activity_status::ActivityStatus; +use crate::entity::descriptions::Descriptions; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Activities::Table) + .if_not_exists() + .col( + ColumnDef::new(Activities::Guid) + .text() + .not_null() + .primary_key(), + ) + .col( + ColumnDef::new(Activities::DescriptionGuid) + .text() + .not_null(), + ) + .col( + ColumnDef::new(Activities::Begin) + .timestamp_with_time_zone() + .not_null(), + ) + .col( + ColumnDef::new(Activities::End) + .timestamp_with_time_zone() + .null(), + ) + .col(ColumnDef::new(Activities::Duration).integer().null()) + .col(ColumnDef::new(Activities::KindGuid).text().not_null()) + .col(ColumnDef::new(Activities::StatusGuid).text().not_null()) + .col(ColumnDef::new(Activities::ParentGuid).text().null()) + .foreign_key( + ForeignKey::create() + .name("fk_activities_parent_guid") + .from(Activities::Table, Activities::ParentGuid) + .to(Activities::Table, Activities::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_kind") + .from(Activities::Table, Activities::KindGuid) + .to(ActivityKinds::Table, ActivityKinds::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_status") + .from(Activities::Table, Activities::StatusGuid) + .to(ActivityStatus::Table, ActivityStatus::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_description") + .from(Activities::Table, Activities::DescriptionGuid) + .to(Descriptions::Table, Descriptions::Guid), + ) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(Activities::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/migration/m20240326_000001_create_tags.rs b/crates/storage/src/migration/m20240326_000001_create_tags.rs new file mode 100644 index 00000000..03b393a6 --- /dev/null +++ b/crates/storage/src/migration/m20240326_000001_create_tags.rs @@ -0,0 +1,28 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::tags::Tags; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .if_not_exists() + .table(Tags::Table) + .col(ColumnDef::new(Tags::Guid).text().not_null().primary_key()) + .col(ColumnDef::new(Tags::Tag).text().not_null()) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop().table(Tags::Table).if_exists().to_owned()) + .await + } +} diff --git a/crates/storage/src/migration/m20240326_000002_create_categories.rs b/crates/storage/src/migration/m20240326_000002_create_categories.rs new file mode 100644 index 00000000..f2fd9786 --- /dev/null +++ b/crates/storage/src/migration/m20240326_000002_create_categories.rs @@ -0,0 +1,39 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::categories::Categories; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .if_not_exists() + .table(Categories::Table) + .col( + ColumnDef::new(Categories::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(Categories::Category).text().not_null()) + .col(ColumnDef::new(Categories::Description).text().null()) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(Categories::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs new file mode 100644 index 00000000..3c73ed52 --- /dev/null +++ b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs @@ -0,0 +1,38 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::activity_status::ActivityStatus; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .if_not_exists() + .table(ActivityStatus::Table) + .col( + ColumnDef::new(ActivityStatus::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(ActivityStatus::Status).text().not_null()) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(ActivityStatus::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs new file mode 100644 index 00000000..cbdfe40a --- /dev/null +++ b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs @@ -0,0 +1,38 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::activity_kinds::ActivityKinds; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .if_not_exists() + .table(ActivityKinds::Table) + .col( + ColumnDef::new(ActivityKinds::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(ActivityKinds::Kind).text().not_null()) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(ActivityKinds::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs b/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs new file mode 100644 index 00000000..1febdc36 --- /dev/null +++ b/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs @@ -0,0 +1,57 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::activities::Activities; +use crate::entity::activities_tags::ActivitiesTags; +use crate::entity::tags::Tags; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .if_not_exists() + .table(ActivitiesTags::Table) + .col( + ColumnDef::new(ActivitiesTags::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(ActivitiesTags::TagGuid).text().not_null()) + .col( + ColumnDef::new(ActivitiesTags::ActivityGuid) + .text() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_tags_tag_guid") + .from(ActivitiesTags::Table, ActivitiesTags::TagGuid) + .to(Tags::Table, Tags::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_tags_activity_guid") + .from(ActivitiesTags::Table, ActivitiesTags::ActivityGuid) + .to(Activities::Table, Activities::Guid), + ) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(ActivitiesTags::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs b/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs new file mode 100644 index 00000000..0968b8d6 --- /dev/null +++ b/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs @@ -0,0 +1,67 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::activities::Activities; +use crate::entity::activities_categories::ActivitiesCategories; +use crate::entity::categories::Categories; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(ActivitiesCategories::Table) + .if_not_exists() + .col( + ColumnDef::new(ActivitiesCategories::Guid) + .text() + .not_null() + .primary_key(), + ) + .col( + ColumnDef::new(ActivitiesCategories::ActivityGuid) + .text() + .not_null(), + ) + .col( + ColumnDef::new(ActivitiesCategories::CategoryGuid) + .text() + .not_null(), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_categories_category_guid") + .from( + ActivitiesCategories::Table, + ActivitiesCategories::CategoryGuid, + ) + .to(Categories::Table, Categories::Guid), + ) + .foreign_key( + ForeignKey::create() + .name("fk_activities_categories_activity_guid") + .from( + ActivitiesCategories::Table, + ActivitiesCategories::ActivityGuid, + ) + .to(Activities::Table, Activities::Guid), + ) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(ActivitiesCategories::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs new file mode 100644 index 00000000..04744e5b --- /dev/null +++ b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs @@ -0,0 +1,38 @@ +use itertools::Itertools; +use pace_core::prelude::ActivityStatusKind; +use strum::IntoEnumIterator; +use ulid::Ulid; + +use sea_orm_migration::prelude::*; + +use crate::entity::activity_status::ActivityStatus; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let activity_kinds = ActivityStatusKind::iter() + .map(|kind| { + Query::insert() + .into_table(ActivityStatus::Table) + .columns([ActivityStatus::Guid, ActivityStatus::Status]) + .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) + .to_owned() + }) + .collect_vec(); + + for kind in activity_kinds { + manager.exec_stmt(kind).await?; + } + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .exec_stmt(Query::delete().from_table(ActivityStatus::Table).to_owned()) + .await + } +} diff --git a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs new file mode 100644 index 00000000..e71561c8 --- /dev/null +++ b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs @@ -0,0 +1,37 @@ +use itertools::Itertools; +use pace_core::prelude::ActivityKind; +use sea_orm_migration::prelude::*; +use strum::IntoEnumIterator; +use ulid::Ulid; + +use crate::entity::activity_kinds::ActivityKinds; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + let activity_kinds = ActivityKind::iter() + .map(|kind| { + Query::insert() + .into_table(ActivityKinds::Table) + .columns([ActivityKinds::Guid, ActivityKinds::Kind]) + .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) + .to_owned() + }) + .collect_vec(); + + for kind in activity_kinds { + manager.exec_stmt(kind).await?; + } + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .exec_stmt(Query::delete().from_table(ActivityKinds::Table).to_owned()) + .await + } +} diff --git a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs new file mode 100644 index 00000000..ae522d3d --- /dev/null +++ b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs @@ -0,0 +1,38 @@ +use sea_orm_migration::prelude::*; + +use crate::entity::descriptions::Descriptions; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .if_not_exists() + .table(Descriptions::Table) + .col( + ColumnDef::new(Descriptions::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(Descriptions::Description).text().not_null()) + .to_owned(), + ) + .await + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table( + Table::drop() + .table(Descriptions::Table) + .if_exists() + .to_owned(), + ) + .await + } +} diff --git a/crates/storage/src/storage.rs b/crates/storage/src/storage.rs index 38eddf0d..f08b661b 100644 --- a/crates/storage/src/storage.rs +++ b/crates/storage/src/storage.rs @@ -5,27 +5,3 @@ pub mod file; pub mod in_memory; pub mod sqlite; - -use rusqlite::{Error, Row}; - -/// Trait for `SQLite` entities. -/// -/// This trait is used to convert a `SQLite` row into a struct. -pub trait SQLiteEntity { - /// Convert a `SQLite` row into a struct. - /// - /// # Arguments - /// - /// * `row` - A [`rusqlite::Row`]. - /// - /// # Errors - /// - /// Returns an error if the conversion fails. - /// - /// # Returns - /// - /// Returns a struct. - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized; -} diff --git a/crates/storage/src/storage/in_memory.rs b/crates/storage/src/storage/in_memory.rs index 231cfc0d..faad0100 100644 --- a/crates/storage/src/storage/in_memory.rs +++ b/crates/storage/src/storage/in_memory.rs @@ -119,7 +119,7 @@ impl ActivityReadOps for InMemoryActivityStorage { drop(activities); - debug!("Activity with id {:?} found: {:?}", activity_id, activity); + debug!("Activity with id {activity_id:?} found: {activity:?}"); Ok((activity_id, activity).into()) } @@ -150,7 +150,7 @@ impl ActivityReadOps for InMemoryActivityStorage { drop(activity_log); - debug!("Filtered activities: {:?}", filtered); + debug!("Filtered activities: {filtered:?}"); if filtered.is_empty() { return Ok(None); @@ -230,14 +230,14 @@ impl ActivityWriteOps for InMemoryActivityStorage { activity_id.to_string(), ))?; - debug!("Original activity: {:?}", original_activity); + debug!("Original activity: {original_activity:?}"); drop(activities); let mut activities = self.log.write(); let _ = activities.entry(activity_id).and_modify(|activity| { - debug!("Updating activity: {:?}", activity); + debug!("Updating activity: {activity:?}"); activity.merge(updated_activity); }); @@ -290,7 +290,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { calculate_duration(&begin_time, end_opts.end_time())?, ); - debug!("End options: {:?}", end_opts); + debug!("End options: {end_opts:?}"); let mut activities = self.log.write(); @@ -310,7 +310,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { return Ok(None); }; - debug!("Most recent activity: {:?}", most_recent); + debug!("Most recent activity: {most_recent:?}"); let activity = self.end_activity(*most_recent.guid(), end_opts)?; @@ -334,7 +334,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { drop(activities); - debug!("Endable activities: {:?}", endable_activities); + debug!("Endable activities: {endable_activities:?}"); // There are no active activities if endable_activities.is_empty() { @@ -349,7 +349,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { }) .collect::>>()?; - debug!("Ended activities: {:?}", ended_activities); + debug!("Ended activities: {ended_activities:?}"); if ended_activities.len() != endable_activities.len() { debug!("Not all activities were ended."); @@ -397,7 +397,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { }) .collect::>>()?; - debug!("Ended intermissions: {:?}", ended_intermissions); + debug!("Ended intermissions: {ended_intermissions:?}"); if ended_intermissions.len() != active_intermissions.len() { debug!("Not all intermissions were ended."); @@ -417,7 +417,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { ) -> PaceResult { let resumable_activity = self.read_activity(activity_id)?; - debug!("Resumable activity: {:?}", resumable_activity); + debug!("Resumable activity: {resumable_activity:?}"); // If the activity is active, return early with an error if resumable_activity.activity().is_in_progress() { @@ -441,7 +441,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { // so you can't have multiple intermissions at once, only one at a time. let ended_intermission_ids = self.end_all_active_intermissions(resume_opts.into())?; - debug!("Ended intermission ids: {:?}", ended_intermission_ids); + debug!("Ended intermission ids: {ended_intermission_ids:?}"); // Update the activity to be active again let mut editable_activity = resumable_activity.clone(); @@ -451,7 +451,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { .set_status(ActivityStatusKind::InProgress) .clone(); - debug!("Updated activity: {:?}", updated_activity); + debug!("Updated activity: {updated_activity:?}"); let _ = self.update_activity( *resumable_activity.guid(), @@ -471,7 +471,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { // Get ActivityItem for activity that let active_activity = self.read_activity(activity_id)?; - debug!("Active activity: {:?}", active_activity); + debug!("Active activity: {active_activity:?}"); // make sure, the activity is not already ended or archived if !active_activity.activity().is_in_progress() { @@ -517,10 +517,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { let active_intermission_ids = self.end_all_active_intermissions(hold_opts.clone().into())?; - debug!( - "Ended active intermission ids: {:?}", - active_intermission_ids - ); + debug!("Ended active intermission ids: {active_intermission_ids:?}"); // Create a new intermission for the active activity let activity_kind_opts = ActivityKindOptions::with_parent_id(*active_activity.guid()); @@ -541,7 +538,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { let created_intermission_item = self.begin_activity(intermission)?; - debug!("Created intermission: {:?}", created_intermission_item); + debug!("Created intermission: {created_intermission_item:?}"); // Update the active activity to be held let mut editable_activity = active_activity.clone(); @@ -551,7 +548,7 @@ impl ActivityStateManagement for InMemoryActivityStorage { .set_status(ActivityStatusKind::Paused) .clone(); - debug!("Updated activity: {:?}", updated_activity); + debug!("Updated activity: {updated_activity:?}"); let _ = self.update_activity( *active_activity.guid(), @@ -623,7 +620,7 @@ impl ActivityQuerying for InMemoryActivityStorage { |mut acc: BTreeMap>, (activity_id, activity)| { let begin_date = activity.begin().date_naive(); - debug!("Begin date: {:?}", begin_date); + debug!("Begin date: {begin_date:?}"); acc.entry(begin_date) .or_default() @@ -648,14 +645,14 @@ impl ActivityQuerying for InMemoryActivityStorage { return Ok(None); }; - debug!("Intermissions: {:?}", intermissions); + debug!("Intermissions: {intermissions:?}"); Some(intermissions.into_iter().try_fold( BTreeMap::new(), |mut acc: BTreeMap>, intermission_id| { let intermission = self.read_activity(intermission_id)?; - debug!("Intermission: {:?}", intermission); + debug!("Intermission: {intermission:?}"); let parent_id = intermission .activity() @@ -669,11 +666,11 @@ impl ActivityQuerying for InMemoryActivityStorage { intermission_id.to_string(), ))?; - debug!("Parent id: {:?}", parent_id); + debug!("Parent id: {parent_id:?}"); let parent_activity = self.read_activity(parent_id)?; - debug!("Parent activity: {:?}", parent_activity); + debug!("Parent activity: {parent_activity:?}"); acc.entry(parent_id).or_default().push(parent_activity); @@ -697,7 +694,7 @@ impl ActivityQuerying for InMemoryActivityStorage { if let Some(category) = keyword_opts.category() { let category = category.to_lowercase(); - debug!("Category: {:?}", category); + debug!("Category: {category:?}"); if activity .category() @@ -744,10 +741,8 @@ impl ActivityQuerying for InMemoryActivityStorage { BTreeMap::new(), |mut acc: BTreeMap>, (activity_id, activity)| { debug!( - "Activity kind: {:?} for item {:?} with id {:?}", - activity.kind(), - activity, - activity_id + "Activity kind: {:?} for item {activity:?} with id {activity_id:?}", + activity.kind() ); acc.entry(*activity.kind()) @@ -770,10 +765,8 @@ impl ActivityQuerying for InMemoryActivityStorage { BTreeMap::new(), |mut acc: BTreeMap>, (activity_id, activity)| { debug!( - "Activity status: {:?} for item {:?} with id {:?}", - activity.status(), - activity, - activity_id + "Activity status: {:?} for item {activity:?} with id {activity_id:?}", + activity.status() ); acc.entry(*activity.status()) diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index a9495cae..619672a8 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -1,11 +1,12 @@ -use std::collections::BTreeMap; +use std::{collections::BTreeMap, fs::File, path::PathBuf}; use itertools::Itertools; -use rusqlite::Connection; -use sea_query::{Expr, Query, SqliteQueryBuilder}; +use sea_orm::{Database, DatabaseConnection}; +use tokio::runtime::Runtime; use tracing::debug; use pace_core::{ + config::DatabaseEngineKind, options::{ DeleteOptions, EndOptions, HoldOptions, KeywordOptions, ResumeOptions, UpdateOptions, }, @@ -19,33 +20,74 @@ use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use crate::{ - convert::Convert, - entities::activities::{Activities, ActivitiesIden}, - migration::SQLiteMigrator, - storage::SQLiteEntity, + migration::{Migrator, MigratorTrait}, + runtime, }; #[derive(Debug)] -pub struct SqliteActivityStorage { - connection: Connection, +pub struct DatabaseActivityStorage { + connection: DatabaseConnection, } -impl SqliteActivityStorage { - pub fn new(url: String) -> PaceResult { - let connection = Connection::open(url.as_str()) - .map_err(|err| DatabaseStorageErrorKind::ConnectionFailed(url, err.to_string()))?; +impl DatabaseActivityStorage { + /// Create a new database activity storage instance. + /// + /// # Arguments + /// + /// * `kind` - The database engine kind. + /// * `url` - The database connection URL. + /// + /// # Errors + /// + /// This function returns an error if the database connection engine is not supported. + /// + /// # Panics + /// + /// This function panics if the database connection fails as its a critical operation. + /// + /// # Returns + /// + /// A new database activity storage instance. + #[allow(clippy::expect_used)] + pub fn new(kind: DatabaseEngineKind, url: &str) -> PaceResult { + let connection_string = match kind { + DatabaseEngineKind::Sqlite => { + debug!("Connecting to SQLite database: {url}"); + + let path = PathBuf::from(&url); + + if !path.exists() { + _ = File::create(&path)?; + } + + format!("sqlite://{url}") + } + engine => { + return Err( + DatabaseStorageErrorKind::UnsupportedDatabaseEngine(engine.to_string()).into(), + ) + } + }; - Ok(Self { connection }) + runtime().block_on(async { + let connection = Database::connect(connection_string) + .await + .expect("Failed to connect to the database"); + + Ok(Self { connection }) + }) } } -impl ActivityStorage for SqliteActivityStorage { +impl ActivityStorage for DatabaseActivityStorage { fn setup(&self) -> PaceResult<()> { - let mut migrate = SQLiteMigrator::new(&self.connection)?; - - migrate.up()?; + runtime().block_on(async { + Migrator::up(&self.connection, None) + .await + .map_err(|source| DatabaseStorageErrorKind::MigrationFailed { source })?; - Ok(()) + Ok(()) + }) } fn teardown(&self) -> PaceResult<()> { @@ -58,7 +100,7 @@ impl ActivityStorage for SqliteActivityStorage { } } -impl SyncStorage for SqliteActivityStorage { +impl SyncStorage for DatabaseActivityStorage { fn sync(&self) -> PaceResult<()> { // We sync activities to the database in each operation // so we don't need to do anything here @@ -67,44 +109,9 @@ impl SyncStorage for SqliteActivityStorage { } } -impl ActivityReadOps for SqliteActivityStorage { +impl ActivityReadOps for DatabaseActivityStorage { #[tracing::instrument] fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { - let query = Query::select() - .from(ActivitiesIden::Table) - .cond_where(Expr::col(ActivitiesIden::Guid).eq(activity_id.to_string())) - .limit(1) - .to_string(SqliteQueryBuilder); - - debug!("Read activity query: {query}"); - - let mut stmt = self.connection.prepare(&query).map_err(|source| { - DatabaseStorageErrorKind::ActivityReadFailed { - guid: activity_id.to_string(), - source, - } - })?; - - let activity_item_iter = stmt - .query_map([&activity_id], |row| Ok(Activities::from_row(row))) - .map_err(|source| DatabaseStorageErrorKind::ActivityReadFailed { - guid: activity_id.to_string(), - source, - })?; - - let database_item = activity_item_iter - .filter_map_ok(std::result::Result::ok) - .next() - .ok_or(DatabaseStorageErrorKind::NoItemContained( - activity_id.to_string(), - ))? - .map_err(|source| DatabaseStorageErrorKind::ActivityNotFound { - guid: activity_id.to_string(), - source, - })?; - - debug!("Read activity: {:?}", database_item); - // TODO: Now we need to get the rest of the data from the database // and return the ActivityItem // @@ -128,7 +135,7 @@ impl ActivityReadOps for SqliteActivityStorage { // .filter_map_ok(|item| item.ok()) // .collect::, _>>()?; - // debug!("Listed activities: {:?}", activities); + // debug!("Listed activities: {activities:?}"); // if activities.is_empty() { // return Ok(None); @@ -154,7 +161,7 @@ impl ActivityReadOps for SqliteActivityStorage { } } -impl ActivityWriteOps for SqliteActivityStorage { +impl ActivityWriteOps for DatabaseActivityStorage { fn create_activity(&self, _activity: Activity) -> PaceResult { // let tx = self.connection.transaction()?; @@ -199,7 +206,7 @@ impl ActivityWriteOps for SqliteActivityStorage { todo!("implement delete_activity for sqlite") } } -impl ActivityStateManagement for SqliteActivityStorage { +impl ActivityStateManagement for DatabaseActivityStorage { fn hold_activity( &self, _activity_id: ActivityGuid, @@ -253,7 +260,7 @@ impl ActivityStateManagement for SqliteActivityStorage { todo!() } } -impl ActivityQuerying for SqliteActivityStorage { +impl ActivityQuerying for DatabaseActivityStorage { fn group_activities_by_duration_range( &self, ) -> PaceOptResult>> { diff --git a/crates/time/Cargo.toml b/crates/time/Cargo.toml index 40aaba1e..977bf548 100644 --- a/crates/time/Cargo.toml +++ b/crates/time/Cargo.toml @@ -20,11 +20,9 @@ include = [ ] [features] -default = ["cli", "db"] +default = ["cli"] cli = ["clap"] -db = ["rusqlite"] clap = ["dep:clap"] -rusqlite = ["dep:rusqlite"] [dependencies] chrono = { workspace = true, features = ["serde"] } @@ -35,7 +33,6 @@ displaydoc = { workspace = true } getset = { workspace = true } humantime = { workspace = true } pace_error = { workspace = true } -rusqlite = { workspace = true, optional = true, features = ["chrono"] } serde = { workspace = true } serde_derive = { workspace = true } thiserror = { workspace = true } diff --git a/crates/time/src/storage.rs b/crates/time/src/storage.rs index 86b1d615..73ed6a43 100644 --- a/crates/time/src/storage.rs +++ b/crates/time/src/storage.rs @@ -1 +1 @@ -pub mod rusqlite; +// pub mod rusqlite; diff --git a/crates/time/src/time_frame.rs b/crates/time/src/time_frame.rs index fafa7868..ba62066f 100644 --- a/crates/time/src/time_frame.rs +++ b/crates/time/src/time_frame.rs @@ -276,7 +276,7 @@ pub(crate) fn time_frame_from_date_and_time_flags_with_time_zone_kind( _ => PaceTimeFrame::default(), }; - debug!("Converted Time frame: {:?}", time_frame); + debug!("Converted Time frame: {time_frame:?}"); Ok(time_frame) } diff --git a/src/commands.rs b/src/commands.rs index 91621f4d..b8c91cc2 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -134,7 +134,7 @@ impl Override for EntryPoint { fn override_config(&self, mut config: PaceConfig) -> Result { // Override the activity log file if it's set if let Some(activity_log_file) = &self.activity_log { - debug!("Overriding activity log file with: {:?}", activity_log_file); + debug!("Overriding activity log file with: {activity_log_file:?}"); // Handle not existing activity log file and parent directory match (activity_log_file.parent(), activity_log_file.exists()) { @@ -151,7 +151,7 @@ impl Override for EntryPoint { config.set_activity_log_path(activity_log_file); }; - debug!("Overridden config: {:?}", config); + debug!("Overridden config: {config:?}"); Ok(config) } @@ -208,7 +208,7 @@ impl Configurable for EntryPoint { _ => None, }; - debug!("Using config path: {:?}", config_path); + debug!("Using config path: {config_path:?}"); config_path } diff --git a/src/commands/resume.rs b/src/commands/resume.rs index 0acad6f9..f69ff9ef 100644 --- a/src/commands/resume.rs +++ b/src/commands/resume.rs @@ -124,11 +124,11 @@ impl ResumeCmd { let new_activity = activity_item.activity().new_from_self(); - debug!("New Activity: {:?}", new_activity); + debug!("New Activity: {new_activity:?}"); let new_stored_activity = activity_store.begin_activity(new_activity)?; - debug!("Started Activity: {:?}", new_stored_activity); + debug!("Started Activity: {new_stored_activity:?}"); format!("Resumed {}", new_stored_activity.activity()) } From 826fc8345d8f96aab743b9688b34739570da8404 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Fri, 29 Mar 2024 22:57:45 +0100 Subject: [PATCH 45/59] update ER Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- db/Entity-Relationship.png | Bin 22198 -> 24148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/Entity-Relationship.png b/db/Entity-Relationship.png index 2fc119f020b8c38b0b48a4fce7f555d78931e2b0..c14e97dca0c8b7ccd16020dcda8b06ea5b68e9c8 100644 GIT binary patch literal 24148 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 From d2340a071eb44ee76f21a7221a4fe3ff597ed8c5 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 00:10:45 +0100 Subject: [PATCH 46/59] rename entity idens Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/error/src/lib.rs | 10 ++--- crates/storage/src/entity/activities.rs | 7 +-- .../src/entity/activities_categories.rs | 2 +- crates/storage/src/entity/activities_tags.rs | 2 +- crates/storage/src/entity/activity_kinds.rs | 2 +- crates/storage/src/entity/activity_status.rs | 2 +- crates/storage/src/entity/categories.rs | 2 +- crates/storage/src/entity/descriptions.rs | 2 +- crates/storage/src/entity/tags.rs | 2 +- .../m20240325_000001_create_activities.rs | 44 +++++++++---------- .../migration/m20240326_000001_create_tags.rs | 15 ++++--- .../m20240326_000002_create_categories.rs | 12 ++--- ...m20240326_000003_create_activity_status.rs | 10 ++--- .../m20240326_000004_create_activity_kinds.rs | 10 ++--- ...m20240326_000005_create_activities_tags.rs | 28 +++++++----- ...326_000006_create_activities_categories.rs | 28 ++++++------ ...27_000001_create_activity_status_values.rs | 12 +++-- ...0327_000002_create_activity_kind_values.rs | 12 +++-- .../m20240329_000001_create_descriptions.rs | 14 +++--- crates/storage/src/storage/sqlite.rs | 33 +++++++++----- 20 files changed, 138 insertions(+), 111 deletions(-) diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index 0e84f5ff..18fa23de 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -212,12 +212,8 @@ pub enum DatabaseStorageErrorKind { /// This database engine is currently not supported: {0} UnsupportedDatabaseEngine(String), - /// Activity with id {guid} not found: {source} - ActivityNotFound { - guid: String, - #[source] - source: sea_orm::error::SqlErr, - }, + /// Activity with id {guid} not found + ActivityNotFound { guid: String }, /// Failed to create activity: {0} ActivityCreationFailed(String), @@ -284,7 +280,7 @@ pub enum DatabaseStorageErrorKind { ActivityReadFailed { guid: String, #[source] - source: sea_orm::error::SqlErr, + source: sea_orm::error::DbErr, }, /// There is no item contained with id {0} diff --git a/crates/storage/src/entity/activities.rs b/crates/storage/src/entity/activities.rs index bd171069..0dbb2dc4 100644 --- a/crates/storage/src/entity/activities.rs +++ b/crates/storage/src/entity/activities.rs @@ -1,5 +1,6 @@ //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 +use chrono::{DateTime, FixedOffset}; use sea_orm::entity::prelude::*; #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] @@ -8,8 +9,8 @@ pub struct Model { #[sea_orm(primary_key, auto_increment = false)] pub guid: String, pub description_guid: String, - pub begin: String, - pub end: Option, + pub begin: DateTime, + pub end: Option>, pub duration: Option, pub kind_guid: String, pub status_guid: String, @@ -17,7 +18,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum Activities { +pub enum ActivitiesEnum { Table, Guid, DescriptionGuid, diff --git a/crates/storage/src/entity/activities_categories.rs b/crates/storage/src/entity/activities_categories.rs index e57fe09f..acd6f8bc 100644 --- a/crates/storage/src/entity/activities_categories.rs +++ b/crates/storage/src/entity/activities_categories.rs @@ -12,7 +12,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum ActivitiesCategories { +pub enum ActivitiesCategoriesEnum { Table, Guid, ActivityGuid, diff --git a/crates/storage/src/entity/activities_tags.rs b/crates/storage/src/entity/activities_tags.rs index 9b167057..0ca6f845 100644 --- a/crates/storage/src/entity/activities_tags.rs +++ b/crates/storage/src/entity/activities_tags.rs @@ -12,7 +12,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum ActivitiesTags { +pub enum ActivitiesTagsEnum { Table, Guid, TagGuid, diff --git a/crates/storage/src/entity/activity_kinds.rs b/crates/storage/src/entity/activity_kinds.rs index 8b3efdba..26222e6f 100644 --- a/crates/storage/src/entity/activity_kinds.rs +++ b/crates/storage/src/entity/activity_kinds.rs @@ -11,7 +11,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum ActivityKinds { +pub enum ActivityKindsEnum { Table, Guid, Kind, diff --git a/crates/storage/src/entity/activity_status.rs b/crates/storage/src/entity/activity_status.rs index 71f83fae..b3bf9845 100644 --- a/crates/storage/src/entity/activity_status.rs +++ b/crates/storage/src/entity/activity_status.rs @@ -11,7 +11,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum ActivityStatus { +pub enum ActivityStatusEnum { Table, Guid, Status, diff --git a/crates/storage/src/entity/categories.rs b/crates/storage/src/entity/categories.rs index 4121fa16..0d76cee8 100644 --- a/crates/storage/src/entity/categories.rs +++ b/crates/storage/src/entity/categories.rs @@ -12,7 +12,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum Categories { +pub enum CategoriesEnum { Table, Guid, Category, diff --git a/crates/storage/src/entity/descriptions.rs b/crates/storage/src/entity/descriptions.rs index 6fc29696..078e74a7 100644 --- a/crates/storage/src/entity/descriptions.rs +++ b/crates/storage/src/entity/descriptions.rs @@ -11,7 +11,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum Descriptions { +pub enum DescriptionsEnum { Table, Guid, Description, diff --git a/crates/storage/src/entity/tags.rs b/crates/storage/src/entity/tags.rs index 338b1cd2..be6aad5f 100644 --- a/crates/storage/src/entity/tags.rs +++ b/crates/storage/src/entity/tags.rs @@ -11,7 +11,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum Tags { +pub enum TagsEnum { Table, Guid, Tag, diff --git a/crates/storage/src/migration/m20240325_000001_create_activities.rs b/crates/storage/src/migration/m20240325_000001_create_activities.rs index f6877753..1a0c4d70 100644 --- a/crates/storage/src/migration/m20240325_000001_create_activities.rs +++ b/crates/storage/src/migration/m20240325_000001_create_activities.rs @@ -1,9 +1,9 @@ use sea_orm_migration::prelude::*; -use crate::entity::activities::Activities; -use crate::entity::activity_kinds::ActivityKinds; -use crate::entity::activity_status::ActivityStatus; -use crate::entity::descriptions::Descriptions; +use crate::entity::activities::ActivitiesEnum; +use crate::entity::activity_kinds::ActivityKindsEnum; +use crate::entity::activity_status::ActivityStatusEnum; +use crate::entity::descriptions::DescriptionsEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -14,56 +14,56 @@ impl MigrationTrait for Migration { manager .create_table( Table::create() - .table(Activities::Table) + .table(ActivitiesEnum::Table) .if_not_exists() .col( - ColumnDef::new(Activities::Guid) + ColumnDef::new(ActivitiesEnum::Guid) .text() .not_null() .primary_key(), ) .col( - ColumnDef::new(Activities::DescriptionGuid) + ColumnDef::new(ActivitiesEnum::DescriptionGuid) .text() .not_null(), ) .col( - ColumnDef::new(Activities::Begin) + ColumnDef::new(ActivitiesEnum::Begin) .timestamp_with_time_zone() .not_null(), ) .col( - ColumnDef::new(Activities::End) + ColumnDef::new(ActivitiesEnum::End) .timestamp_with_time_zone() .null(), ) - .col(ColumnDef::new(Activities::Duration).integer().null()) - .col(ColumnDef::new(Activities::KindGuid).text().not_null()) - .col(ColumnDef::new(Activities::StatusGuid).text().not_null()) - .col(ColumnDef::new(Activities::ParentGuid).text().null()) + .col(ColumnDef::new(ActivitiesEnum::Duration).integer().null()) + .col(ColumnDef::new(ActivitiesEnum::KindGuid).text().not_null()) + .col(ColumnDef::new(ActivitiesEnum::StatusGuid).text().not_null()) + .col(ColumnDef::new(ActivitiesEnum::ParentGuid).text().null()) .foreign_key( ForeignKey::create() .name("fk_activities_parent_guid") - .from(Activities::Table, Activities::ParentGuid) - .to(Activities::Table, Activities::Guid), + .from(ActivitiesEnum::Table, ActivitiesEnum::ParentGuid) + .to(ActivitiesEnum::Table, ActivitiesEnum::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_kind") - .from(Activities::Table, Activities::KindGuid) - .to(ActivityKinds::Table, ActivityKinds::Guid), + .from(ActivitiesEnum::Table, ActivitiesEnum::KindGuid) + .to(ActivityKindsEnum::Table, ActivityKindsEnum::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_status") - .from(Activities::Table, Activities::StatusGuid) - .to(ActivityStatus::Table, ActivityStatus::Guid), + .from(ActivitiesEnum::Table, ActivitiesEnum::StatusGuid) + .to(ActivityStatusEnum::Table, ActivityStatusEnum::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_description") - .from(Activities::Table, Activities::DescriptionGuid) - .to(Descriptions::Table, Descriptions::Guid), + .from(ActivitiesEnum::Table, ActivitiesEnum::DescriptionGuid) + .to(DescriptionsEnum::Table, DescriptionsEnum::Guid), ) .to_owned(), ) @@ -74,7 +74,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(Activities::Table) + .table(ActivitiesEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000001_create_tags.rs b/crates/storage/src/migration/m20240326_000001_create_tags.rs index 03b393a6..91ba5b91 100644 --- a/crates/storage/src/migration/m20240326_000001_create_tags.rs +++ b/crates/storage/src/migration/m20240326_000001_create_tags.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::tags::Tags; +use crate::entity::tags::TagsEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,9 +12,14 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(Tags::Table) - .col(ColumnDef::new(Tags::Guid).text().not_null().primary_key()) - .col(ColumnDef::new(Tags::Tag).text().not_null()) + .table(TagsEnum::Table) + .col( + ColumnDef::new(TagsEnum::Guid) + .text() + .not_null() + .primary_key(), + ) + .col(ColumnDef::new(TagsEnum::Tag).text().not_null()) .to_owned(), ) .await @@ -22,7 +27,7 @@ impl MigrationTrait for Migration { async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager - .drop_table(Table::drop().table(Tags::Table).if_exists().to_owned()) + .drop_table(Table::drop().table(TagsEnum::Table).if_exists().to_owned()) .await } } diff --git a/crates/storage/src/migration/m20240326_000002_create_categories.rs b/crates/storage/src/migration/m20240326_000002_create_categories.rs index f2fd9786..5dd62094 100644 --- a/crates/storage/src/migration/m20240326_000002_create_categories.rs +++ b/crates/storage/src/migration/m20240326_000002_create_categories.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::categories::Categories; +use crate::entity::categories::CategoriesEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,15 +12,15 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(Categories::Table) + .table(CategoriesEnum::Table) .col( - ColumnDef::new(Categories::Guid) + ColumnDef::new(CategoriesEnum::Guid) .text() .not_null() .primary_key(), ) - .col(ColumnDef::new(Categories::Category).text().not_null()) - .col(ColumnDef::new(Categories::Description).text().null()) + .col(ColumnDef::new(CategoriesEnum::Category).text().not_null()) + .col(ColumnDef::new(CategoriesEnum::Description).text().null()) .to_owned(), ) .await @@ -30,7 +30,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(Categories::Table) + .table(CategoriesEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs index 3c73ed52..d64f6164 100644 --- a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs +++ b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::activity_status::ActivityStatus; +use crate::entity::activity_status::ActivityStatusEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,14 +12,14 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(ActivityStatus::Table) + .table(ActivityStatusEnum::Table) .col( - ColumnDef::new(ActivityStatus::Guid) + ColumnDef::new(ActivityStatusEnum::Guid) .text() .not_null() .primary_key(), ) - .col(ColumnDef::new(ActivityStatus::Status).text().not_null()) + .col(ColumnDef::new(ActivityStatusEnum::Status).text().not_null()) .to_owned(), ) .await @@ -29,7 +29,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivityStatus::Table) + .table(ActivityStatusEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs index cbdfe40a..0e445d78 100644 --- a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs +++ b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::activity_kinds::ActivityKinds; +use crate::entity::activity_kinds::ActivityKindsEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,14 +12,14 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(ActivityKinds::Table) + .table(ActivityKindsEnum::Table) .col( - ColumnDef::new(ActivityKinds::Guid) + ColumnDef::new(ActivityKindsEnum::Guid) .text() .not_null() .primary_key(), ) - .col(ColumnDef::new(ActivityKinds::Kind).text().not_null()) + .col(ColumnDef::new(ActivityKindsEnum::Kind).text().not_null()) .to_owned(), ) .await @@ -29,7 +29,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivityKinds::Table) + .table(ActivityKindsEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs b/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs index 1febdc36..c83bf584 100644 --- a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs +++ b/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs @@ -1,8 +1,8 @@ use sea_orm_migration::prelude::*; -use crate::entity::activities::Activities; -use crate::entity::activities_tags::ActivitiesTags; -use crate::entity::tags::Tags; +use crate::entity::activities::ActivitiesEnum; +use crate::entity::activities_tags::ActivitiesTagsEnum; +use crate::entity::tags::TagsEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -14,30 +14,34 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(ActivitiesTags::Table) + .table(ActivitiesTagsEnum::Table) .col( - ColumnDef::new(ActivitiesTags::Guid) + ColumnDef::new(ActivitiesTagsEnum::Guid) .text() .not_null() .primary_key(), ) - .col(ColumnDef::new(ActivitiesTags::TagGuid).text().not_null()) .col( - ColumnDef::new(ActivitiesTags::ActivityGuid) + ColumnDef::new(ActivitiesTagsEnum::TagGuid) + .text() + .not_null(), + ) + .col( + ColumnDef::new(ActivitiesTagsEnum::ActivityGuid) .text() .not_null(), ) .foreign_key( ForeignKey::create() .name("fk_activities_tags_tag_guid") - .from(ActivitiesTags::Table, ActivitiesTags::TagGuid) - .to(Tags::Table, Tags::Guid), + .from(ActivitiesTagsEnum::Table, ActivitiesTagsEnum::TagGuid) + .to(TagsEnum::Table, TagsEnum::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_tags_activity_guid") - .from(ActivitiesTags::Table, ActivitiesTags::ActivityGuid) - .to(Activities::Table, Activities::Guid), + .from(ActivitiesTagsEnum::Table, ActivitiesTagsEnum::ActivityGuid) + .to(ActivitiesEnum::Table, ActivitiesEnum::Guid), ) .to_owned(), ) @@ -48,7 +52,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivitiesTags::Table) + .table(ActivitiesTagsEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs b/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs index 0968b8d6..01483f86 100644 --- a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs +++ b/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs @@ -1,8 +1,8 @@ use sea_orm_migration::prelude::*; -use crate::entity::activities::Activities; -use crate::entity::activities_categories::ActivitiesCategories; -use crate::entity::categories::Categories; +use crate::entity::activities::ActivitiesEnum; +use crate::entity::activities_categories::ActivitiesCategoriesEnum; +use crate::entity::categories::CategoriesEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -13,21 +13,21 @@ impl MigrationTrait for Migration { manager .create_table( Table::create() - .table(ActivitiesCategories::Table) + .table(ActivitiesCategoriesEnum::Table) .if_not_exists() .col( - ColumnDef::new(ActivitiesCategories::Guid) + ColumnDef::new(ActivitiesCategoriesEnum::Guid) .text() .not_null() .primary_key(), ) .col( - ColumnDef::new(ActivitiesCategories::ActivityGuid) + ColumnDef::new(ActivitiesCategoriesEnum::ActivityGuid) .text() .not_null(), ) .col( - ColumnDef::new(ActivitiesCategories::CategoryGuid) + ColumnDef::new(ActivitiesCategoriesEnum::CategoryGuid) .text() .not_null(), ) @@ -35,19 +35,19 @@ impl MigrationTrait for Migration { ForeignKey::create() .name("fk_activities_categories_category_guid") .from( - ActivitiesCategories::Table, - ActivitiesCategories::CategoryGuid, + ActivitiesCategoriesEnum::Table, + ActivitiesCategoriesEnum::CategoryGuid, ) - .to(Categories::Table, Categories::Guid), + .to(CategoriesEnum::Table, CategoriesEnum::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_categories_activity_guid") .from( - ActivitiesCategories::Table, - ActivitiesCategories::ActivityGuid, + ActivitiesCategoriesEnum::Table, + ActivitiesCategoriesEnum::ActivityGuid, ) - .to(Activities::Table, Activities::Guid), + .to(ActivitiesEnum::Table, ActivitiesEnum::Guid), ) .to_owned(), ) @@ -58,7 +58,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivitiesCategories::Table) + .table(ActivitiesCategoriesEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs index 04744e5b..52ab605d 100644 --- a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs +++ b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs @@ -5,7 +5,7 @@ use ulid::Ulid; use sea_orm_migration::prelude::*; -use crate::entity::activity_status::ActivityStatus; +use crate::entity::activity_status::ActivityStatusEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -16,8 +16,8 @@ impl MigrationTrait for Migration { let activity_kinds = ActivityStatusKind::iter() .map(|kind| { Query::insert() - .into_table(ActivityStatus::Table) - .columns([ActivityStatus::Guid, ActivityStatus::Status]) + .into_table(ActivityStatusEnum::Table) + .columns([ActivityStatusEnum::Guid, ActivityStatusEnum::Status]) .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) .to_owned() }) @@ -32,7 +32,11 @@ impl MigrationTrait for Migration { async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager - .exec_stmt(Query::delete().from_table(ActivityStatus::Table).to_owned()) + .exec_stmt( + Query::delete() + .from_table(ActivityStatusEnum::Table) + .to_owned(), + ) .await } } diff --git a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs index e71561c8..8d64bb14 100644 --- a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs +++ b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs @@ -4,7 +4,7 @@ use sea_orm_migration::prelude::*; use strum::IntoEnumIterator; use ulid::Ulid; -use crate::entity::activity_kinds::ActivityKinds; +use crate::entity::activity_kinds::ActivityKindsEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -15,8 +15,8 @@ impl MigrationTrait for Migration { let activity_kinds = ActivityKind::iter() .map(|kind| { Query::insert() - .into_table(ActivityKinds::Table) - .columns([ActivityKinds::Guid, ActivityKinds::Kind]) + .into_table(ActivityKindsEnum::Table) + .columns([ActivityKindsEnum::Guid, ActivityKindsEnum::Kind]) .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) .to_owned() }) @@ -31,7 +31,11 @@ impl MigrationTrait for Migration { async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager - .exec_stmt(Query::delete().from_table(ActivityKinds::Table).to_owned()) + .exec_stmt( + Query::delete() + .from_table(ActivityKindsEnum::Table) + .to_owned(), + ) .await } } diff --git a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs index ae522d3d..29d1bd0a 100644 --- a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs +++ b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::descriptions::Descriptions; +use crate::entity::descriptions::DescriptionsEnum; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,14 +12,18 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(Descriptions::Table) + .table(DescriptionsEnum::Table) .col( - ColumnDef::new(Descriptions::Guid) + ColumnDef::new(DescriptionsEnum::Guid) .text() .not_null() .primary_key(), ) - .col(ColumnDef::new(Descriptions::Description).text().not_null()) + .col( + ColumnDef::new(DescriptionsEnum::Description) + .text() + .not_null(), + ) .to_owned(), ) .await @@ -29,7 +33,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(Descriptions::Table) + .table(DescriptionsEnum::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index 619672a8..ea82ea43 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -1,7 +1,7 @@ use std::{collections::BTreeMap, fs::File, path::PathBuf}; use itertools::Itertools; -use sea_orm::{Database, DatabaseConnection}; +use sea_orm::{Database, DatabaseConnection, EntityTrait, ModelTrait, QueryFilter}; use tokio::runtime::Runtime; use tracing::debug; @@ -20,6 +20,7 @@ use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use crate::{ + entity::{activities, activity_status, descriptions, prelude::Activities, tags}, migration::{Migrator, MigratorTrait}, runtime, }; @@ -112,17 +113,24 @@ impl SyncStorage for DatabaseActivityStorage { impl ActivityReadOps for DatabaseActivityStorage { #[tracing::instrument] fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { - // TODO: Now we need to get the rest of the data from the database - // and return the ActivityItem - // - // Missing data: - // Description (1:1) (in extra table for deduplication) - // ActivityStatus (1:N) - // ActivityKind (1:N) - // Categories (M:N) - // Tags (M:N) - - Ok(ActivityItem::default()) + runtime().block_on(async { + let Ok(Some(activity)) = Activities::find_by_id(activity_id.to_string()) + .one(&self.connection) + .await + else { + return Err(DatabaseStorageErrorKind::ActivityNotFound { + guid: activity_id.to_string(), + } + .into()); + }; + + let description = activity + .find_related(descriptions::Entity) + .one(&self.connection) + .await; + + Ok(ActivityItem::default()) + }) } #[tracing::instrument] @@ -260,6 +268,7 @@ impl ActivityStateManagement for DatabaseActivityStorage { todo!() } } + impl ActivityQuerying for DatabaseActivityStorage { fn group_activities_by_duration_range( &self, From 02e70cfeeacdb93598f8cea1660dc55aa2234a7a Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 00:14:02 +0100 Subject: [PATCH 47/59] ignore marvin attack in audit toml Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .cargo/audit.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/.cargo/audit.toml b/.cargo/audit.toml index 85b91746..9db3c846 100644 --- a/.cargo/audit.toml +++ b/.cargo/audit.toml @@ -1,6 +1,7 @@ [advisories] ignore = [ "RUSTSEC-2024-0320", # ignore yaml-rust being unmaintained + "RUSTSEC-2023-0071", # marvin attack, we need to wait for a fix ] # advisory IDs to ignore e.g. ["RUSTSEC-2019-0001", ...] informational_warnings = [ "unmaintained", From 6b1f01cabc1e824e841eb5d6a1d1d24fc4f8f599 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 00:32:33 +0100 Subject: [PATCH 48/59] updating snapshots Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- ...cli__now_no_activities_snapshot_passes.snap | 15 --------------- ..._reflect_current_month_snapshot_passes.snap | 18 ------------------ ...__reflect_current_week_snapshot_passes.snap | 18 ------------------ .../cli__reflect_today_snapshot_passes.snap | 17 ----------------- .../cli__version_snapshot_passes.snap | 13 ------------- ..._cli__adjust_activity_snapshot_passes.snap} | 6 +++--- ...> journey__cli__begin_snapshot_passes.snap} | 6 +++--- ..._with_active_activity_snapshot_passes.snap} | 6 +++--- ..._with_active_activity_snapshot_passes.snap} | 6 +++--- ...cli__now_no_activities_snapshot_passes.snap | 17 +++++++++++++++++ ..._with_active_activity_snapshot_passes.snap} | 6 +++--- ...ey__cli__reflect_date_snapshot_passes.snap} | 4 ++-- ...tegory_case_sensitive_snapshot_passes.snap} | 4 ++-- ..._filter_category_full_snapshot_passes.snap} | 4 ++-- ...b_back_case_sensitive_snapshot_passes.snap} | 4 ++-- ...er_category_glob_back_snapshot_passes.snap} | 4 ++-- ...r_category_glob_front_snapshot_passes.snap} | 4 ++-- ..._cli__reflect_from_to_snapshot_passes.snap} | 4 ++-- ...me_with_held_activity_snapshot_passes.snap} | 6 +++--- 19 files changed, 49 insertions(+), 113 deletions(-) delete mode 100644 tests/journey/snapshots/cli__now_no_activities_snapshot_passes.snap delete mode 100644 tests/journey/snapshots/cli__reflect_current_month_snapshot_passes.snap delete mode 100644 tests/journey/snapshots/cli__reflect_current_week_snapshot_passes.snap delete mode 100644 tests/journey/snapshots/cli__reflect_today_snapshot_passes.snap delete mode 100644 tests/journey/snapshots/cli__version_snapshot_passes.snap rename tests/journey/snapshots/{cli__adjust_activity_snapshot_passes.snap => journey__cli__adjust_activity_snapshot_passes.snap} (70%) rename tests/journey/snapshots/{cli__begin_snapshot_passes.snap => journey__cli__begin_snapshot_passes.snap} (76%) rename tests/journey/snapshots/{cli__end_with_active_activity_snapshot_passes.snap => journey__cli__end_with_active_activity_snapshot_passes.snap} (70%) rename tests/journey/snapshots/{cli__hold_with_active_activity_snapshot_passes.snap => journey__cli__hold_with_active_activity_snapshot_passes.snap} (70%) create mode 100644 tests/journey/snapshots/journey__cli__now_no_activities_snapshot_passes.snap rename tests/journey/snapshots/{cli__now_with_active_activity_snapshot_passes.snap => journey__cli__now_with_active_activity_snapshot_passes.snap} (69%) rename tests/journey/snapshots/{cli__reflect_date_snapshot_passes.snap => journey__cli__reflect_date_snapshot_passes.snap} (97%) rename tests/journey/snapshots/{cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap => journey__cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap} (96%) rename tests/journey/snapshots/{cli__reflect_from_to_filter_category_full_snapshot_passes.snap => journey__cli__reflect_from_to_filter_category_full_snapshot_passes.snap} (97%) rename tests/journey/snapshots/{cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap => journey__cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap} (96%) rename tests/journey/snapshots/{cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap => journey__cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap} (98%) rename tests/journey/snapshots/{cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap => journey__cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap} (97%) rename tests/journey/snapshots/{cli__reflect_from_to_snapshot_passes.snap => journey__cli__reflect_from_to_snapshot_passes.snap} (98%) rename tests/journey/snapshots/{cli__resume_with_held_activity_snapshot_passes.snap => journey__cli__resume_with_held_activity_snapshot_passes.snap} (70%) diff --git a/tests/journey/snapshots/cli__now_no_activities_snapshot_passes.snap b/tests/journey/snapshots/cli__now_no_activities_snapshot_passes.snap deleted file mode 100644 index 5e02fb8b..00000000 --- a/tests/journey/snapshots/cli__now_no_activities_snapshot_passes.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/cli.rs -info: - program: pace - args: - - "--activity-log-file" - - "C:\\Users\\dailyuse\\backup\\PARA\\Personal\\2 Areas\\Developer\\Maintenance\\pace\\pace-rs\\pace\\./tests/generated\\.tmpjGkvhs\\activities.pace.toml" - - now ---- -success: true -exit_code: 0 ------ stdout ----- -No activities are currently running. - ------ stderr ----- diff --git a/tests/journey/snapshots/cli__reflect_current_month_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_current_month_snapshot_passes.snap deleted file mode 100644 index 9c169953..00000000 --- a/tests/journey/snapshots/cli__reflect_current_month_snapshot_passes.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: tests/cli.rs -info: - program: pace - args: - - "--config" - - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "./tests/fixtures/activity_tracker/activities.pace.toml" - - reflect - - "--current-month" ---- -success: true -exit_code: 0 ------ stdout ----- -No activities found for the specified time frame - ------ stderr ----- diff --git a/tests/journey/snapshots/cli__reflect_current_week_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_current_week_snapshot_passes.snap deleted file mode 100644 index 0307d06c..00000000 --- a/tests/journey/snapshots/cli__reflect_current_week_snapshot_passes.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: tests/cli.rs -info: - program: pace - args: - - "--config" - - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "./tests/fixtures/activity_tracker/activities.pace.toml" - - reflect - - "--current-week" ---- -success: true -exit_code: 0 ------ stdout ----- -No activities found for the specified time frame - ------ stderr ----- diff --git a/tests/journey/snapshots/cli__reflect_today_snapshot_passes.snap b/tests/journey/snapshots/cli__reflect_today_snapshot_passes.snap deleted file mode 100644 index c427e131..00000000 --- a/tests/journey/snapshots/cli__reflect_today_snapshot_passes.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: tests/cli.rs -info: - program: pace - args: - - "--config" - - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "./tests/fixtures/activity_tracker/activities.pace.toml" - - reflect ---- -success: true -exit_code: 0 ------ stdout ----- -No activities found for the specified time frame - ------ stderr ----- diff --git a/tests/journey/snapshots/cli__version_snapshot_passes.snap b/tests/journey/snapshots/cli__version_snapshot_passes.snap deleted file mode 100644 index 549df925..00000000 --- a/tests/journey/snapshots/cli__version_snapshot_passes.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/cli.rs -info: - program: pace - args: - - "--version" ---- -success: true -exit_code: 0 ------ stdout ----- -pace 0.11.0 - ------ stderr ----- diff --git a/tests/journey/snapshots/cli__adjust_activity_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__adjust_activity_snapshot_passes.snap similarity index 70% rename from tests/journey/snapshots/cli__adjust_activity_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__adjust_activity_snapshot_passes.snap index 2f79f961..fdb6851d 100644 --- a/tests/journey/snapshots/cli__adjust_activity_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__adjust_activity_snapshot_passes.snap @@ -1,12 +1,12 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "D:\\a\\pace\\pace\\./tests/generated\\.tmpzdxfi8\\activities.pace.toml" + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmpeeQ1O3\\activities.pace.toml" - now --- success: true diff --git a/tests/journey/snapshots/cli__begin_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__begin_snapshot_passes.snap similarity index 76% rename from tests/journey/snapshots/cli__begin_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__begin_snapshot_passes.snap index 102a55a2..19e25af1 100644 --- a/tests/journey/snapshots/cli__begin_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__begin_snapshot_passes.snap @@ -1,12 +1,12 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "D:\\a\\pace\\pace\\./tests/generated\\.tmpwF7i1d\\activities.pace.toml" + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmpg9o2J7\\activities.pace.toml" - begin - MyActivity - "--tags" diff --git a/tests/journey/snapshots/cli__end_with_active_activity_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__end_with_active_activity_snapshot_passes.snap similarity index 70% rename from tests/journey/snapshots/cli__end_with_active_activity_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__end_with_active_activity_snapshot_passes.snap index 2785e08a..bac5dfdd 100644 --- a/tests/journey/snapshots/cli__end_with_active_activity_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__end_with_active_activity_snapshot_passes.snap @@ -1,12 +1,12 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "D:\\a\\pace\\pace\\./tests/generated\\.tmp6Eme4G\\activities.pace.toml" + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmp9oVkZI\\activities.pace.toml" - end --- success: true diff --git a/tests/journey/snapshots/cli__hold_with_active_activity_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__hold_with_active_activity_snapshot_passes.snap similarity index 70% rename from tests/journey/snapshots/cli__hold_with_active_activity_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__hold_with_active_activity_snapshot_passes.snap index 1ad52678..15650b2b 100644 --- a/tests/journey/snapshots/cli__hold_with_active_activity_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__hold_with_active_activity_snapshot_passes.snap @@ -1,12 +1,12 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "D:\\a\\pace\\pace\\./tests/generated\\.tmpBmC4F5\\activities.pace.toml" + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmpXuhKFY\\activities.pace.toml" - hold --- success: true diff --git a/tests/journey/snapshots/journey__cli__now_no_activities_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__now_no_activities_snapshot_passes.snap new file mode 100644 index 00000000..519ee04d --- /dev/null +++ b/tests/journey/snapshots/journey__cli__now_no_activities_snapshot_passes.snap @@ -0,0 +1,17 @@ +--- +source: tests/journey/cli.rs +info: + program: pace + args: + - "--config" + - tests/fixtures/configs/pace.toml + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmpOOtqVl\\activities.pace.toml" + - now +--- +success: true +exit_code: 0 +----- stdout ----- +No activities are currently running. + +----- stderr ----- diff --git a/tests/journey/snapshots/cli__now_with_active_activity_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__now_with_active_activity_snapshot_passes.snap similarity index 69% rename from tests/journey/snapshots/cli__now_with_active_activity_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__now_with_active_activity_snapshot_passes.snap index 24f28c90..a3fa973b 100644 --- a/tests/journey/snapshots/cli__now_with_active_activity_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__now_with_active_activity_snapshot_passes.snap @@ -1,12 +1,12 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "D:\\a\\pace\\pace\\./tests/generated\\.tmpJC8IWS\\activities.pace.toml" + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmp3ZXwGR\\activities.pace.toml" - now --- success: true diff --git a/tests/journey/snapshots/cli__reflect_date_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_date_snapshot_passes.snap similarity index 97% rename from tests/journey/snapshots/cli__reflect_date_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_date_snapshot_passes.snap index e78f3ed3..96fd615d 100644 --- a/tests/journey/snapshots/cli__reflect_date_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_date_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--date" diff --git a/tests/journey/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap similarity index 96% rename from tests/journey/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap index ff334dcf..ea822906 100644 --- a/tests/journey/snapshots/cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_case_sensitive_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--from" diff --git a/tests/journey/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_full_snapshot_passes.snap similarity index 97% rename from tests/journey/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_full_snapshot_passes.snap index da01f74e..a66f01f6 100644 --- a/tests/journey/snapshots/cli__reflect_from_to_filter_category_full_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_full_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--from" diff --git a/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap similarity index 96% rename from tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap index f125891d..3407e0ab 100644 --- a/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_back_case_sensitive_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--from" diff --git a/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap similarity index 98% rename from tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap index c237c4c7..d56fc703 100644 --- a/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_back_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--from" diff --git a/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap similarity index 97% rename from tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap index ca8549be..fad2e481 100644 --- a/tests/journey/snapshots/cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_from_to_filter_category_glob_front_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--from" diff --git a/tests/journey/snapshots/cli__reflect_from_to_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_from_to_snapshot_passes.snap similarity index 98% rename from tests/journey/snapshots/cli__reflect_from_to_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__reflect_from_to_snapshot_passes.snap index 01cb4d18..7ed1f421 100644 --- a/tests/journey/snapshots/cli__reflect_from_to_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__reflect_from_to_snapshot_passes.snap @@ -1,11 +1,11 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" + - "--activity-log" - "./tests/fixtures/activity_tracker/activities.pace.toml" - reflect - "--from" diff --git a/tests/journey/snapshots/cli__resume_with_held_activity_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__resume_with_held_activity_snapshot_passes.snap similarity index 70% rename from tests/journey/snapshots/cli__resume_with_held_activity_snapshot_passes.snap rename to tests/journey/snapshots/journey__cli__resume_with_held_activity_snapshot_passes.snap index c0de7f40..ea1f8c2d 100644 --- a/tests/journey/snapshots/cli__resume_with_held_activity_snapshot_passes.snap +++ b/tests/journey/snapshots/journey__cli__resume_with_held_activity_snapshot_passes.snap @@ -1,12 +1,12 @@ --- -source: tests/cli.rs +source: tests/journey/cli.rs info: program: pace args: - "--config" - tests/fixtures/configs/pace.toml - - "--activity-log-file" - - "D:\\a\\pace\\pace\\./tests/generated\\.tmpA4sfe0\\activities.pace.toml" + - "--activity-log" + - "D:\\a\\pace\\pace\\./tests/generated\\.tmp5yU7TA\\activities.pace.toml" - resume --- success: true From 0a76ba719470da4b11caffb53f7c466fc64efba3 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 00:51:24 +0100 Subject: [PATCH 49/59] updating snapshots Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- ..._reflect_current_month_snapshot_passes.snap | 18 ++++++++++++++++++ ...__reflect_current_week_snapshot_passes.snap | 18 ++++++++++++++++++ ...ey__cli__reflect_today_snapshot_passes.snap | 17 +++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 tests/journey/snapshots/journey__cli__reflect_current_month_snapshot_passes.snap create mode 100644 tests/journey/snapshots/journey__cli__reflect_current_week_snapshot_passes.snap create mode 100644 tests/journey/snapshots/journey__cli__reflect_today_snapshot_passes.snap diff --git a/tests/journey/snapshots/journey__cli__reflect_current_month_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_current_month_snapshot_passes.snap new file mode 100644 index 00000000..9bd6bbfb --- /dev/null +++ b/tests/journey/snapshots/journey__cli__reflect_current_month_snapshot_passes.snap @@ -0,0 +1,18 @@ +--- +source: tests/journey/cli.rs +info: + program: pace + args: + - "--config" + - tests/fixtures/configs/pace.toml + - "--activity-log" + - "./tests/fixtures/activity_tracker/activities.pace.toml" + - reflect + - current-month +--- +success: true +exit_code: 0 +----- stdout ----- +No activities found for the specified time frame + +----- stderr ----- diff --git a/tests/journey/snapshots/journey__cli__reflect_current_week_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_current_week_snapshot_passes.snap new file mode 100644 index 00000000..170db283 --- /dev/null +++ b/tests/journey/snapshots/journey__cli__reflect_current_week_snapshot_passes.snap @@ -0,0 +1,18 @@ +--- +source: tests/journey/cli.rs +info: + program: pace + args: + - "--config" + - tests/fixtures/configs/pace.toml + - "--activity-log" + - "./tests/fixtures/activity_tracker/activities.pace.toml" + - reflect + - current-week +--- +success: true +exit_code: 0 +----- stdout ----- +No activities found for the specified time frame + +----- stderr ----- diff --git a/tests/journey/snapshots/journey__cli__reflect_today_snapshot_passes.snap b/tests/journey/snapshots/journey__cli__reflect_today_snapshot_passes.snap new file mode 100644 index 00000000..009cd635 --- /dev/null +++ b/tests/journey/snapshots/journey__cli__reflect_today_snapshot_passes.snap @@ -0,0 +1,17 @@ +--- +source: tests/journey/cli.rs +info: + program: pace + args: + - "--config" + - tests/fixtures/configs/pace.toml + - "--activity-log" + - "./tests/fixtures/activity_tracker/activities.pace.toml" + - reflect +--- +success: true +exit_code: 0 +----- stdout ----- +No activities found for the specified time frame + +----- stderr ----- From 063b226b1dd0c46e85084c2d04d8b664c4273b0e Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 00:53:56 +0100 Subject: [PATCH 50/59] fix toml parse test Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/domain/id.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/core/src/domain/id.rs b/crates/core/src/domain/id.rs index d862fd24..b53dc82a 100644 --- a/crates/core/src/domain/id.rs +++ b/crates/core/src/domain/id.rs @@ -38,7 +38,7 @@ impl FromStr for Guid { impl Display for Guid { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "Ulid: {}", self.0.to_string()) + write!(f, "{}", self.0.to_string()) } } From df635c78087a58b276df2d5bcdd495d118d8bf92 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:04:57 +0100 Subject: [PATCH 51/59] fix tests Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- tests/integration/config.rs | 4 ++-- tests/integration/util.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/config.rs b/tests/integration/config.rs index 2959c0a8..06d413d8 100644 --- a/tests/integration/config.rs +++ b/tests/integration/config.rs @@ -13,7 +13,7 @@ fn test_find_root_projects_file() -> TestResult<()> { // navigate to the test directory for the fixtures let root = current_dir - .join("../../tests/fixtures/project1/subproject-a/") + .join("tests/fixtures/project1/subproject-a/") .canonicalize()?; // get the path to the projects config file @@ -22,7 +22,7 @@ fn test_find_root_projects_file() -> TestResult<()> { assert_eq!( projects_config_path, current_dir - .join("../../tests/fixtures/project1/projects.pace.toml") + .join("tests/fixtures/project1/projects.pace.toml") .canonicalize()? ); diff --git a/tests/integration/util.rs b/tests/integration/util.rs index 26a9f1cc..c1a014b6 100644 --- a/tests/integration/util.rs +++ b/tests/integration/util.rs @@ -174,7 +174,7 @@ pub fn setup_activity_store(kind: &ActivityStoreTestKind) -> TestResult TestResult { let fixture_path = - Path::new("../../tests/fixtures/activity_tracker/activities.pace.toml").canonicalize()?; + Path::new("tests/fixtures/activity_tracker/activities.pace.toml").canonicalize()?; Ok(ActivityStore::with_storage(Arc::new( TomlActivityStorage::new(fixture_path)?, From e73d00fef9eb81d06209777ec2b9f24fc9b2179c Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:18:53 +0100 Subject: [PATCH 52/59] fix lifetime issue in async trait with ugly workaround (for now) Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .../src/migration/m20240325_000001_create_activities.rs | 4 ++-- crates/storage/src/migration/m20240326_000001_create_tags.rs | 4 ++-- .../src/migration/m20240326_000002_create_categories.rs | 4 ++-- .../src/migration/m20240326_000003_create_activity_status.rs | 4 ++-- .../src/migration/m20240326_000004_create_activity_kinds.rs | 4 ++-- .../src/migration/m20240326_000005_create_activities_tags.rs | 4 ++-- .../m20240326_000006_create_activities_categories.rs | 4 ++-- .../m20240327_000001_create_activity_status_values.rs | 4 ++-- .../migration/m20240327_000002_create_activity_kind_values.rs | 4 ++-- .../src/migration/m20240329_000001_create_descriptions.rs | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/crates/storage/src/migration/m20240325_000001_create_activities.rs b/crates/storage/src/migration/m20240325_000001_create_activities.rs index 1a0c4d70..d4948f6e 100644 --- a/crates/storage/src/migration/m20240325_000001_create_activities.rs +++ b/crates/storage/src/migration/m20240325_000001_create_activities.rs @@ -10,7 +10,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -70,7 +70,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() diff --git a/crates/storage/src/migration/m20240326_000001_create_tags.rs b/crates/storage/src/migration/m20240326_000001_create_tags.rs index 91ba5b91..35e5bf60 100644 --- a/crates/storage/src/migration/m20240326_000001_create_tags.rs +++ b/crates/storage/src/migration/m20240326_000001_create_tags.rs @@ -7,7 +7,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -25,7 +25,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table(Table::drop().table(TagsEnum::Table).if_exists().to_owned()) .await diff --git a/crates/storage/src/migration/m20240326_000002_create_categories.rs b/crates/storage/src/migration/m20240326_000002_create_categories.rs index 5dd62094..cf1f26d6 100644 --- a/crates/storage/src/migration/m20240326_000002_create_categories.rs +++ b/crates/storage/src/migration/m20240326_000002_create_categories.rs @@ -7,7 +7,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -26,7 +26,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() diff --git a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs index d64f6164..7f63cad7 100644 --- a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs +++ b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs @@ -7,7 +7,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -25,7 +25,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() diff --git a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs index 0e445d78..c729a61c 100644 --- a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs +++ b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs @@ -7,7 +7,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -25,7 +25,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() diff --git a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs b/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs index c83bf584..afe85b6e 100644 --- a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs +++ b/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs @@ -9,7 +9,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -48,7 +48,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() diff --git a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs b/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs index 01483f86..92687539 100644 --- a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs +++ b/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs @@ -9,7 +9,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -54,7 +54,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() diff --git a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs index 52ab605d..165c7e0d 100644 --- a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs +++ b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs @@ -12,7 +12,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { let activity_kinds = ActivityStatusKind::iter() .map(|kind| { Query::insert() @@ -30,7 +30,7 @@ impl MigrationTrait for Migration { Ok(()) } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .exec_stmt( Query::delete() diff --git a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs index 8d64bb14..677f7854 100644 --- a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs +++ b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs @@ -11,7 +11,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { let activity_kinds = ActivityKind::iter() .map(|kind| { Query::insert() @@ -29,7 +29,7 @@ impl MigrationTrait for Migration { Ok(()) } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .exec_stmt( Query::delete() diff --git a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs index 29d1bd0a..cb4f992f 100644 --- a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs +++ b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs @@ -7,7 +7,7 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .create_table( Table::create() @@ -29,7 +29,7 @@ impl MigrationTrait for Migration { .await } - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager .drop_table( Table::drop() From c33a60f1309c8123a08d1db5f6db53169adf4145 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:29:43 +0100 Subject: [PATCH 53/59] fix clippy Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/storage/src/entity/activities.rs | 2 +- crates/storage/src/storage/sqlite.rs | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/crates/storage/src/entity/activities.rs b/crates/storage/src/entity/activities.rs index 0dbb2dc4..7d41e99a 100644 --- a/crates/storage/src/entity/activities.rs +++ b/crates/storage/src/entity/activities.rs @@ -1,8 +1,8 @@ +#![allow(unused_qualifications)] //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 use chrono::{DateTime, FixedOffset}; use sea_orm::entity::prelude::*; - #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] #[sea_orm(table_name = "activities")] pub struct Model { diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index ea82ea43..55bc61a0 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -1,8 +1,7 @@ use std::{collections::BTreeMap, fs::File, path::PathBuf}; -use itertools::Itertools; -use sea_orm::{Database, DatabaseConnection, EntityTrait, ModelTrait, QueryFilter}; -use tokio::runtime::Runtime; +// use itertools::Itertools; +use sea_orm::{Database, DatabaseConnection, EntityTrait, ModelTrait}; use tracing::debug; use pace_core::{ @@ -20,7 +19,7 @@ use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use crate::{ - entity::{activities, activity_status, descriptions, prelude::Activities, tags}, + entity::{descriptions, prelude::Activities}, migration::{Migrator, MigratorTrait}, runtime, }; @@ -124,12 +123,14 @@ impl ActivityReadOps for DatabaseActivityStorage { .into()); }; - let description = activity + let _description = activity .find_related(descriptions::Entity) .one(&self.connection) .await; - Ok(ActivityItem::default()) + todo!("implement read_activity for sqlite"); + + // Ok(ActivityItem::default()) }) } From 07619e3672d547c05563d824d44a122a13f99c27 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:34:34 +0100 Subject: [PATCH 54/59] remove outdated ignored dirs from codecov Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .github/codecov.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index 3fd0a6bb..a6a6faa3 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -13,8 +13,6 @@ coverage: ignore: - "tests" # Test files aren't important for coverage - - "crates/testing" # Testing crate contains Test helpers which aren't important for coverage - - "crates/cli" # CLI crate contains prompts to the user, which we currently deem not important for coverage - "src/" # Contains only a slim wrapper around pace_core based on abscissa, which we currently deem not important for coverage # Make comments less noisy From a6a07dd30adeeb0c1acd47e7cf47bd88cd2ea79d Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:35:01 +0100 Subject: [PATCH 55/59] remove outdated ignored dirs from codecov Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- .github/codecov.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/codecov.yml b/.github/codecov.yml index a6a6faa3..e8186e6c 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -13,7 +13,6 @@ coverage: ignore: - "tests" # Test files aren't important for coverage - - "src/" # Contains only a slim wrapper around pace_core based on abscissa, which we currently deem not important for coverage # Make comments less noisy comment: From 909348fb463f6949b236f32314cb674b7e3bafd2 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:38:32 +0100 Subject: [PATCH 56/59] update ecosystem overview Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/ecosystem.png | Bin 1009671 -> 259621 bytes crates/pace.excalidraw | 126 ++++++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/crates/ecosystem.png b/crates/ecosystem.png index 97acc73280f9fdc1e4665f651b95a2b3bc00e57e..7947abb05afc38dc38e35571018d42e93d386f94 100644 GIT binary patch literal 259621 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

ZE=YbNNCe6DJiXFCh@ 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 literal 1009671 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

e#u>prBo-@^$KHJ6U)t0GJc$2 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�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 F`RJ4kAxtfARMm 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%0Af7}!^ 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 z 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%0AVaSSA8n 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 z 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%0D>(Xu9=y0DFL?LUaEWnJD`Vzm==hj z9SToCI{it8dJ`hCAke+G@TZ;Mc9G-F{m_cuge}AsrQ!>eNSd8GKS{~2kvJ7 z44&Pkkh5Q_@~y>^7rMG}+osJdFZ-YpyDK+O2)Qa-Dc7G;B zl;b=lgZ#)ODd;@<+KlXGGa;4cXF;EF1OXo%-gX`R&^1PR3TB1fQ!9ls)y{+p7!E8c zLDqMoKj>5p;fMh^O_Hh6#5Th1jqkq4d-31QTnxjN`EBbS8{VRK(WSsdSMF2}lSqPK^5R3UbT$u8QndYsZ_`1 z+{u)*D>AL2laOZNxpKbY>808WmpuEqV(X?%qHTMj6uQPDP91C0a33LonKTkrWu)_8 z#!_|rH&Hi#c2jRw+CiQmcJB>o+XOnU~^PFngGFJ7X`OG{{Imya)fO;RC#(z|PEt~>5-9yOTXo-Cb=TC{m# zjWMu&WLy-*S2UUSkPHzax|?1iU3um>bRm8$)7pD9BAenrXxSeZ(5>rt>)YEfA-zk7 zJe{!H8-R_9jm{>AenFQXz|D*46#e*nu|k`4d> diff --git a/crates/pace.excalidraw b/crates/pace.excalidraw index 33991fef..b6d30d81 100644 --- a/crates/pace.excalidraw +++ b/crates/pace.excalidraw @@ -145,8 +145,8 @@ }, { "type": "text", - "version": 412, - "versionNonce": 1106523563, + "version": 416, + "versionNonce": 1690423332, "isDeleted": false, "id": "rhatcvwFNDaJIdZB2aRR2", "fillStyle": "solid", @@ -155,29 +155,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 19062.85793674287, - "y": 7964.832473776164, + "x": 19070.33638539892, + "y": 7964.832473776163, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 182.46481662362422, + "width": 167.50791931152344, "height": 45, "seed": 2080596587, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736180651, + "updated": 1711759006596, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_core", + "text": "pace-core", "textAlign": "center", "verticalAlign": "middle", "containerId": "TXq2OqWLQyf90BWAjNJJf", - "originalText": "pace_core", + "originalText": "pace-core", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "rectangle", @@ -227,8 +227,8 @@ }, { "type": "text", - "version": 420, - "versionNonce": 381387019, + "version": 424, + "versionNonce": 1488545316, "isDeleted": false, "id": "e-KRZnbVCkxmR7DjCYbMW", "fillStyle": "solid", @@ -237,29 +237,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 19637.914559360644, - "y": 7682.332473776169, + "x": 19645.387913602986, + "y": 7682.332473776168, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 179.9706190071462, + "width": 165.02391052246094, "height": 45, "seed": 1988480427, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736182134, + "updated": 1711759000883, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_time", + "text": "pace-time", "textAlign": "center", "verticalAlign": "middle", "containerId": "mgPVbyNloshnv-FUYisNP", - "originalText": "pace_time", + "originalText": "pace-time", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "rectangle", @@ -309,8 +309,8 @@ }, { "type": "text", - "version": 655, - "versionNonce": 202074539, + "version": 659, + "versionNonce": 2145876772, "isDeleted": false, "id": "uI91Ze6km-1Qgloy_uiVK", "fillStyle": "solid", @@ -319,29 +319,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 19898.311318567637, - "y": 8195.903902347594, + "x": 19905.79714705955, + "y": 8195.903902347596, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 195.36757678363145, + "width": 180.3959197998047, "height": 45, "seed": 1263014597, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736148519, + "updated": 1711759003805, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_error", + "text": "pace-error", "textAlign": "center", "verticalAlign": "middle", "containerId": "ZyUdkNnhMgXouKQKtZdzw", - "originalText": "pace_error", + "originalText": "pace-error", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "rectangle", @@ -391,8 +391,8 @@ }, { "type": "text", - "version": 560, - "versionNonce": 2074945355, + "version": 564, + "versionNonce": 1478903836, "isDeleted": false, "id": "JKw6Fka1rhYs9IZYcBS2i", "fillStyle": "solid", @@ -401,29 +401,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 19055.56513648023, - "y": 6996.261045204735, + "x": 19063.046696198668, + "y": 6996.261045204736, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 228.47898857750246, + "width": 213.515869140625, "height": 45, "seed": 871202437, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736232498, + "updated": 1711758992428, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_service", + "text": "pace-service", "textAlign": "center", "verticalAlign": "middle", "containerId": "H2nQkbRLhThymO2gq-6SA", - "originalText": "pace_service", + "originalText": "pace-service", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "rectangle", @@ -461,8 +461,8 @@ }, { "type": "text", - "version": 706, - "versionNonce": 978024517, + "version": 710, + "versionNonce": 1404824228, "isDeleted": false, "id": "iyTwjXWeoJ_GeGuuzsXq5", "fillStyle": "solid", @@ -471,29 +471,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 17919.369530328535, - "y": 7501.975330919022, + "x": 17926.856116103103, + "y": 7501.975330919023, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 218.01305802374412, + "width": 203.03988647460938, "height": 45, "seed": 283995691, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736134786, + "updated": 1711758979334, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_server", + "text": "pace-server", "textAlign": "center", "verticalAlign": "middle", "containerId": "d-UItuVV1OxpBnHLSdCSR", - "originalText": "pace_server", + "originalText": "pace-server", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "rectangle", @@ -547,8 +547,8 @@ }, { "type": "text", - "version": 985, - "versionNonce": 1431235979, + "version": 989, + "versionNonce": 1902612772, "isDeleted": false, "id": "iPy_SZbSRtE4fz62LFeCD", "fillStyle": "solid", @@ -557,29 +557,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 19901.042095570865, - "y": 6979.832473776163, + "x": 19908.523441440833, + "y": 6979.832473776164, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 246.33459420575673, + "width": 231.3719024658203, "height": 45, "seed": 1913050085, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736274513, + "updated": 1711758996683, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_storage", + "text": "pace-storage", "textAlign": "center", "verticalAlign": "middle", "containerId": "RsIzHYLG8TzWQr8DnEfp5", - "originalText": "pace_storage", + "originalText": "pace-storage", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "rectangle", @@ -625,8 +625,8 @@ }, { "type": "text", - "version": 634, - "versionNonce": 752670149, + "version": 638, + "versionNonce": 1782054940, "isDeleted": false, "id": "sSvOMwPllQxFiACHwqppD", "fillStyle": "solid", @@ -635,29 +635,29 @@ "roughness": 1, "opacity": 100, "angle": 0, - "x": 18467.103898495756, - "y": 7510.07056901426, + "x": 18474.575532040253, + "y": 7510.0705690142595, "strokeColor": "#1e1e1e", "backgroundColor": "#ffec99", - "width": 144.68717883215726, + "width": 129.74391174316406, "height": 45, "seed": 282870245, "groupIds": [], "frameId": null, "roundness": null, "boundElements": [], - "updated": 1711736239398, + "updated": 1711758982012, "link": null, "locked": false, "fontSize": 36, "fontFamily": 1, - "text": "pace_cli", + "text": "pace-cli", "textAlign": "center", "verticalAlign": "middle", "containerId": "czADXrtUBMGnnu0EMFNCd", - "originalText": "pace_cli", + "originalText": "pace-cli", "lineHeight": 1.25, - "baseline": 37 + "baseline": 32 }, { "type": "arrow", From ad25fc74cb990a84f435a080475a3e010c2033f7 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Tue, 2 Apr 2024 22:51:49 +0200 Subject: [PATCH 57/59] Denormalize database schema for easier usage of enums Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- Cargo.lock | 1 + crates/core/Cargo.toml | 1 + crates/core/src/domain/activity.rs | 21 ++- crates/core/src/domain/status.rs | 17 +- crates/storage/src/entities.rs | 172 ------------------ crates/storage/src/entities/activities.rs | 61 ------- .../src/entities/activities_categories.rs | 44 ----- .../storage/src/entities/activities_tags.rs | 44 ----- crates/storage/src/entities/activity_kinds.rs | 41 ----- .../storage/src/entities/activity_status.rs | 41 ----- crates/storage/src/entities/categories.rs | 43 ----- crates/storage/src/entities/description.rs | 41 ----- .../storage/src/entities/schema_migrations.rs | 35 ---- crates/storage/src/entities/tags.rs | 41 ----- .../storage/src/{entity/mod.rs => entity.rs} | 3 - crates/storage/src/entity/activities.rs | 65 ++----- .../src/entity/activities_categories.rs | 2 +- crates/storage/src/entity/activities_tags.rs | 2 +- crates/storage/src/entity/activity_kinds.rs | 32 ---- crates/storage/src/entity/activity_status.rs | 32 ---- crates/storage/src/entity/categories.rs | 2 +- crates/storage/src/entity/descriptions.rs | 32 ---- crates/storage/src/entity/prelude.rs | 3 - crates/storage/src/entity/tags.rs | 2 +- crates/storage/src/lib.rs | 1 + crates/storage/src/migration.rs | 18 +- .../m20240325_000001_create_activities.rs | 54 ++---- .../migration/m20240326_000001_create_tags.rs | 15 +- .../m20240326_000002_create_categories.rs | 12 +- ...20240326_000003_create_activities_tags.rs} | 28 ++- ...m20240326_000003_create_activity_status.rs | 38 ---- ...26_000004_create_activities_categories.rs} | 28 +-- .../m20240326_000004_create_activity_kinds.rs | 38 ---- ...27_000001_create_activity_status_values.rs | 42 ----- ...0327_000002_create_activity_kind_values.rs | 41 ----- .../m20240329_000001_create_descriptions.rs | 42 ----- crates/storage/src/repository.rs | 74 ++++++++ crates/storage/src/repository/category.rs | 32 ++++ crates/storage/src/storage/sqlite.rs | 10 +- db/Entity-Relationship.png | Bin 24148 -> 18141 bytes 40 files changed, 218 insertions(+), 1033 deletions(-) delete mode 100644 crates/storage/src/entities.rs delete mode 100644 crates/storage/src/entities/activities.rs delete mode 100644 crates/storage/src/entities/activities_categories.rs delete mode 100644 crates/storage/src/entities/activities_tags.rs delete mode 100644 crates/storage/src/entities/activity_kinds.rs delete mode 100644 crates/storage/src/entities/activity_status.rs delete mode 100644 crates/storage/src/entities/categories.rs delete mode 100644 crates/storage/src/entities/description.rs delete mode 100644 crates/storage/src/entities/schema_migrations.rs delete mode 100644 crates/storage/src/entities/tags.rs rename crates/storage/src/{entity/mod.rs => entity.rs} (72%) delete mode 100644 crates/storage/src/entity/activity_kinds.rs delete mode 100644 crates/storage/src/entity/activity_status.rs delete mode 100644 crates/storage/src/entity/descriptions.rs rename crates/storage/src/migration/{m20240326_000005_create_activities_tags.rs => m20240326_000003_create_activities_tags.rs} (59%) delete mode 100644 crates/storage/src/migration/m20240326_000003_create_activity_status.rs rename crates/storage/src/migration/{m20240326_000006_create_activities_categories.rs => m20240326_000004_create_activities_categories.rs} (62%) delete mode 100644 crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs delete mode 100644 crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs delete mode 100644 crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs delete mode 100644 crates/storage/src/migration/m20240329_000001_create_descriptions.rs create mode 100644 crates/storage/src/repository.rs create mode 100644 crates/storage/src/repository/category.rs diff --git a/Cargo.lock b/Cargo.lock index 7984140e..3c9b4223 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1812,6 +1812,7 @@ dependencies = [ "parking_lot", "rayon", "rstest", + "sea-orm", "serde", "serde_derive", "serde_json", diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 41a05c4e..b09794da 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -39,6 +39,7 @@ pace_error = { workspace = true } pace_time = { workspace = true } parking_lot = { workspace = true, features = ["deadlock_detection"] } rayon = { workspace = true } +sea-orm = { workspace = true } serde = { workspace = true } serde_derive = { workspace = true } serde_json = { workspace = true } diff --git a/crates/core/src/domain/activity.rs b/crates/core/src/domain/activity.rs index a4997180..6919dc91 100644 --- a/crates/core/src/domain/activity.rs +++ b/crates/core/src/domain/activity.rs @@ -8,7 +8,7 @@ use pace_time::{ date_time::PaceDateTime, duration::{calculate_duration, duration_to_str, PaceDuration}, }; -use strum::EnumIter; +use sea_orm::DeriveActiveEnum; use serde_derive::{Deserialize, Serialize}; use std::fmt::Display; @@ -84,28 +84,35 @@ impl From<(ActivityGuid, Activity)> for ActivityItem { PartialOrd, Ord, EnumString, - EnumIter, + sea_orm::EnumIter, strum::Display, + DeriveActiveEnum, )] #[serde(rename_all = "kebab-case")] #[strum(serialize_all = "kebab-case")] +#[sea_orm(rs_type = "i32", db_type = "Integer")] // #[serde(untagged)] pub enum ActivityKind { /// A generic activity #[default] + #[sea_orm(num_value = 0)] Activity, - /// A task - Task, - /// A break + #[sea_orm(num_value = 1)] Intermission, + /// A pomodoro break + #[sea_orm(num_value = 2)] + PomodoroIntermission, + /// A pomodoro work session + #[sea_orm(num_value = 3)] PomodoroWork, - /// A pomodoro break - PomodoroIntermission, + /// A task + #[sea_orm(num_value = 4)] + Task, } #[allow(clippy::trivially_copy_pass_by_ref)] diff --git a/crates/core/src/domain/status.rs b/crates/core/src/domain/status.rs index 7afe2e42..f452eb30 100644 --- a/crates/core/src/domain/status.rs +++ b/crates/core/src/domain/status.rs @@ -1,5 +1,6 @@ +use sea_orm::DeriveActiveEnum; use serde_derive::{Deserialize, Serialize}; -use strum::{EnumIter, EnumString}; +use strum::EnumString; #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "kebab-case")] @@ -29,37 +30,47 @@ pub enum TaskStatus { PartialOrd, Ord, EnumString, - EnumIter, + sea_orm::EnumIter, strum::Display, + DeriveActiveEnum, )] #[serde(rename_all = "kebab-case")] #[strum(serialize_all = "kebab-case")] +#[sea_orm(rs_type = "i32", db_type = "Integer")] pub enum ActivityStatusKind { /// The initial state of an activity once it's created in the system but not yet started. #[default] + #[sea_orm(num_value = 0)] Created, /// The activity is scheduled to start at a specific time. /// It remains in this state until the activity begins. + #[sea_orm(num_value = 1)] Scheduled, /// The active state of an activity. It transitions to this state from "Scheduled" when /// the activity begins or from "Paused" when it's resumed. The start time is recorded /// upon entering this state for the first time, and the resume time is noted for /// subsequent entries. + #[sea_orm(num_value = 2)] InProgress, /// Represents an activity that has been temporarily halted. /// This could apply to tasks being paused for a break or intermission. /// The activity can move back to "InProgress" when work on it resumes. + #[sea_orm(num_value = 3)] Paused, /// The final state of an activity, indicating it has been finished. /// The end time of the activity is recorded, marking its completion. + #[sea_orm(num_value = 4)] Completed, + #[sea_orm(num_value = 98)] + Unarchived, + + #[sea_orm(num_value = 99)] Archived, - Unarchived, // TODO: Do we need this or can be unarchiving done without it? } #[allow(clippy::trivially_copy_pass_by_ref)] diff --git a/crates/storage/src/entities.rs b/crates/storage/src/entities.rs deleted file mode 100644 index 85d9e227..00000000 --- a/crates/storage/src/entities.rs +++ /dev/null @@ -1,172 +0,0 @@ -use pace_core::prelude::{ - Activity, ActivityEndOptions, ActivityGuid, ActivityKind, ActivityStatusKind, -}; -use typed_builder::TypedBuilder; -use ulid::Ulid; - -use crate::entities::activities::Activities as SQLiteActivity; - -pub mod activities; -pub mod activities_categories; -pub mod activities_tags; -pub mod activity_kinds; -pub mod activity_status; -pub mod categories; -pub mod description; -pub mod schema_migrations; -pub mod tags; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder)] -pub struct SQLiteActivityItem { - guid: Ulid, - activity: SQLiteActivity, -} - -impl SQLiteActivityItem { - #[must_use] - pub const fn new(guid: Ulid, activity: SQLiteActivity) -> Self { - Self { guid, activity } - } -} - -// impl SqliteActivity { -// pub fn to_sql_prepare_statement(&self) -> &'static str { -// "INSERT INTO activities (id, category, description, begin, end, duration, kind, status, tags, parent_id) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)" -// } - -// pub fn to_sql_execute_statement(&self) -> PaceResult<(ActivityGuid, Vec<&dyn ToSql>)> { -// let category = if let Some(category) = self.category() { -// category.to_sql()? -// } else { -// "NULL".to_sql()? -// }; - -// let (end, duration) = if let Some(end_opts) = self.activity_end_options().as_ref() { -// let (end, duration) = end_opts.as_tuple(); -// (end.to_sql()?, duration.to_sql()?) -// } else { -// ("NULL".to_sql()?, "NULL".to_sql()?) -// }; - -// let parent_id = if let Some(parent_id) = self.parent_id() { -// parent_id.to_sql()? -// } else { -// "NULL".to_sql()? -// }; - -// let tags = if let Some(tags) = self.tags() { -// let tags = tags -// .iter() -// .map(|tag| tag.to_string()) -// .collect::>(); - -// tags.join(",").to_sql()? -// } else { -// "NULL".to_sql()? -// }; - -// let guid = ActivityGuid::new(); - -// Ok(( -// guid, -// vec![ -// // TODO: We create a new ID here, that should probably happen -// // TODO: somewhere else and needs a refactoring -// &guid, -// &category, -// &self.description(), -// &self.begin(), -// &end, -// &duration, -// &self.kind(), -// &self.status(), -// &tags, -// &parent_id, -// ], -// )) -// } -// } - -// impl SqliteActivityFilterKind { -// pub fn to_sql_statement(&self) -> &'static str { -// match self { -// Self::Everything => "SELECT * FROM activities", -// ActivityFilterKind::OnlyActivities => todo!(), -// ActivityFilterKind::Active => "SELECT * FROM activities WHERE status = 'in-progress'", -// ActivityFilterKind::ActiveIntermission => todo!(), -// ActivityFilterKind::Archived => "SELECT * FROM activities WHERE status = 'archived'", -// ActivityFilterKind::Ended => "SELECT * FROM activities WHERE status = 'completed'", -// ActivityFilterKind::Held => "SELECT * FROM activities WHERE status = 'paused'", -// ActivityFilterKind::Intermission => todo!(), -// ActivityFilterKind::TimeRange(opts) => todo!(), -// } -// } -// } - -// impl TryFrom> for SqliteActivityEndOptions { -// type Error = rusqlite::Error; - -// fn try_from(row: &Row<'_>) -> Result { -// Ok(Self::new(row.get("end")?, row.get("duration")?)) -// } -// } - -// impl TryFrom> for SqliteActivityKindOptions { -// type Error = rusqlite::Error; - -// fn try_from(row: &Row<'_>) -> Result { -// Ok(Self::with_parent_id(row.get("parent_id")?)) -// } -// } - -// impl TryFrom> for SqliteActivity { -// type Error = rusqlite::Error; - -// fn try_from(row: &Row<'_>) -> Result { -// let begin_time: PaceDateTime = row.get("begin")?; - -// let description: String = row.get("description")?; - -// let tags_string: String = row.get("tags")?; - -// let tags = tags_string -// .split(',') -// .map(|tag| tag.to_string()) -// .collect::>(); - -// Ok(Activity::builder() -// .category(Some(row.get("category")?)) // TODO: Check for None -// .description(description) -// .begin(begin_time) -// .activity_end_options(Some(ActivityEndOptions::from_row(row)?)) // TODO: Check for None -// .kind(row.get("kind")?) -// .activity_kind_options(Some(ActivityKindOptions::from_row(row)?)) // TODO: Check for None -// .tags(tags) -// .status(row.get("status")?) -// .build()) -// } -// } - -// impl TryFrom> for SqliteActivityGuid { -// type Error = rusqlite::Error; - -// fn try_from(row: &Row<'_>) -> Result { -// Ok(row.get("guid")?) -// } -// } - -// impl TryFrom> for SqliteActivityItem { -// type Error = rusqlite::Error; - -// fn try_from(row: &Row<'_>) -> Result { -// let activity_end_opts = ActivityEndOptions::from_row(row)?; - -// let activity_kind_opts = ActivityKindOptions::from_row(row)?; - -// let activity = Activity::from_row(row)?; - -// let guid = ActivityGuid::from_row(row)?; - -// Ok(Self::builder().guid(guid).activity(activity).build()) -// } -// } diff --git a/crates/storage/src/entities/activities.rs b/crates/storage/src/entities/activities.rs deleted file mode 100644 index 34146620..00000000 --- a/crates/storage/src/entities/activities.rs +++ /dev/null @@ -1,61 +0,0 @@ -use chrono::FixedOffset; -use getset::Getters; -use pace_core::prelude::{ - ActivityGuid, ActivityItem, ActivityKindGuid, ActivityStatusGuid, DescriptionGuid, -}; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct Activities { - pub guid: ActivityGuid, - pub description_guid: DescriptionGuid, - pub begin: chrono::DateTime, - pub end: Option>, - pub kind_guid: ActivityKindGuid, - pub duration: Option, - pub status_guid: ActivityStatusGuid, - pub parent_guid: Option, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - SelfRef, - ActivitiesCategories, - ActivitiesTags, - ActivityKinds, - ActivityStatus, - Descriptions, -} - -impl SQLiteEntity for Activities { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for Activities { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - description_guid: row.get("description")?, - begin: row.get("begin")?, - end: row.get("end")?, - duration: row.get("duration")?, - kind_guid: row.get("kind")?, - status_guid: row.get("status")?, - parent_guid: row.get("parent_guid")?, - }) - } -} diff --git a/crates/storage/src/entities/activities_categories.rs b/crates/storage/src/entities/activities_categories.rs deleted file mode 100644 index a01d6ce8..00000000 --- a/crates/storage/src/entities/activities_categories.rs +++ /dev/null @@ -1,44 +0,0 @@ -use getset::Getters; -use pace_core::prelude::Guid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct ActivitiesCategories { - pub guid: Guid, - pub category_guid: Guid, - pub activity_guid: Guid, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - Activities, - Categories, -} - -impl SQLiteEntity for ActivitiesCategories { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for ActivitiesCategories { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - category_guid: row.get("category_guid")?, - activity_guid: row.get("activity_guid")?, - }) - } -} diff --git a/crates/storage/src/entities/activities_tags.rs b/crates/storage/src/entities/activities_tags.rs deleted file mode 100644 index 24211530..00000000 --- a/crates/storage/src/entities/activities_tags.rs +++ /dev/null @@ -1,44 +0,0 @@ -use getset::Getters; -use pace_core::prelude::Guid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct ActivitiesTags { - pub guid: Guid, - pub tag_guid: Guid, - pub activity_guid: Guid, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - Activities, - Tags, -} - -impl SQLiteEntity for ActivitiesTags { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for ActivitiesTags { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - tag_guid: row.get("tag_guid")?, - activity_guid: row.get("activity_guid")?, - }) - } -} diff --git a/crates/storage/src/entities/activity_kinds.rs b/crates/storage/src/entities/activity_kinds.rs deleted file mode 100644 index 8716655e..00000000 --- a/crates/storage/src/entities/activity_kinds.rs +++ /dev/null @@ -1,41 +0,0 @@ -use getset::Getters; -use pace_core::prelude::ActivityKindGuid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct ActivityKinds { - pub guid: ActivityKindGuid, - pub kind: String, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - Activities, -} - -impl SQLiteEntity for ActivityKinds { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for ActivityKinds { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - kind: row.get("kind")?, - }) - } -} diff --git a/crates/storage/src/entities/activity_status.rs b/crates/storage/src/entities/activity_status.rs deleted file mode 100644 index bb412f8a..00000000 --- a/crates/storage/src/entities/activity_status.rs +++ /dev/null @@ -1,41 +0,0 @@ -use getset::Getters; -use pace_core::prelude::ActivityStatusGuid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct ActivityStatus { - pub guid: ActivityStatusGuid, - pub status: String, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - Activities, -} - -impl SQLiteEntity for ActivityStatus { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for ActivityStatus { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - status: row.get("status")?, - }) - } -} diff --git a/crates/storage/src/entities/categories.rs b/crates/storage/src/entities/categories.rs deleted file mode 100644 index 5bd286b3..00000000 --- a/crates/storage/src/entities/categories.rs +++ /dev/null @@ -1,43 +0,0 @@ -use getset::Getters; -use pace_core::prelude::CategoryGuid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct Categories { - pub guid: CategoryGuid, - pub category: String, - pub description: Option, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - ActivitiesCategories, -} - -impl SQLiteEntity for Categories { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for Categories { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - category: row.get("category")?, - description: row.get("description")?, - }) - } -} diff --git a/crates/storage/src/entities/description.rs b/crates/storage/src/entities/description.rs deleted file mode 100644 index c112e081..00000000 --- a/crates/storage/src/entities/description.rs +++ /dev/null @@ -1,41 +0,0 @@ -use getset::Getters; -use pace_core::prelude::{DescriptionGuid, PaceDescription}; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct Descriptions { - pub guid: DescriptionGuid, - pub description: PaceDescription, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - Activities, -} - -impl SQLiteEntity for Descriptions { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for Descriptions { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - description: row.get("description")?, - }) - } -} diff --git a/crates/storage/src/entities/schema_migrations.rs b/crates/storage/src/entities/schema_migrations.rs deleted file mode 100644 index a77a5dfb..00000000 --- a/crates/storage/src/entities/schema_migrations.rs +++ /dev/null @@ -1,35 +0,0 @@ -use getset::Getters; -use pace_core::prelude::Guid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct SchemaMigrations { - pub guid: Guid, - pub version: i64, -} - -impl SQLiteEntity for SchemaMigrations { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for SchemaMigrations { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - version: row.get("version")?, - }) - } -} diff --git a/crates/storage/src/entities/tags.rs b/crates/storage/src/entities/tags.rs deleted file mode 100644 index 69b7b084..00000000 --- a/crates/storage/src/entities/tags.rs +++ /dev/null @@ -1,41 +0,0 @@ -use getset::Getters; -use pace_core::prelude::TagGuid; -use rusqlite::{Error, Row}; -use sea_query::enum_def; -use strum::EnumIter; -use typed_builder::TypedBuilder; - -use crate::storage::SQLiteEntity; - -#[derive(Clone, Debug, PartialEq, Eq, TypedBuilder, Getters)] -#[getset(get = "pub")] -#[enum_def] -pub struct Tags { - pub guid: TagGuid, - pub tag: String, -} - -#[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation { - ActivitiesTags, -} - -impl SQLiteEntity for Tags { - fn from_row(row: &Row<'_>) -> Result - where - Self: Sized, - { - Self::try_from(row) - } -} - -impl TryFrom<&Row<'_>> for Tags { - type Error = Error; - - fn try_from(row: &Row<'_>) -> Result { - Ok(Self { - guid: row.get("guid")?, - tag: row.get("tag")?, - }) - } -} diff --git a/crates/storage/src/entity/mod.rs b/crates/storage/src/entity.rs similarity index 72% rename from crates/storage/src/entity/mod.rs rename to crates/storage/src/entity.rs index 9a23065d..6542341d 100644 --- a/crates/storage/src/entity/mod.rs +++ b/crates/storage/src/entity.rs @@ -5,8 +5,5 @@ pub mod prelude; pub mod activities; pub mod activities_categories; pub mod activities_tags; -pub mod activity_kinds; -pub mod activity_status; pub mod categories; -pub mod descriptions; pub mod tags; diff --git a/crates/storage/src/entity/activities.rs b/crates/storage/src/entity/activities.rs index 7d41e99a..e1fad052 100644 --- a/crates/storage/src/entity/activities.rs +++ b/crates/storage/src/entity/activities.rs @@ -1,33 +1,40 @@ #![allow(unused_qualifications)] //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 -use chrono::{DateTime, FixedOffset}; +use chrono::{DateTime, FixedOffset, Utc}; +use pace_core::domain::{activity::ActivityKind, status::ActivityStatusKind}; use sea_orm::entity::prelude::*; #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] #[sea_orm(table_name = "activities")] pub struct Model { #[sea_orm(primary_key, auto_increment = false)] pub guid: String, - pub description_guid: String, + pub description: String, pub begin: DateTime, pub end: Option>, pub duration: Option, - pub kind_guid: String, - pub status_guid: String, + pub kind: ActivityKind, + pub status: ActivityStatusKind, pub parent_guid: Option, + pub created_at: DateTime, + pub updated_at: DateTime, + pub deleted_at: DateTime, } #[derive(DeriveIden)] -pub enum ActivitiesEnum { +pub enum Activities { Table, Guid, - DescriptionGuid, + Description, Begin, End, Duration, - KindGuid, - StatusGuid, + Kind, + Status, ParentGuid, + CreatedAt, + UpdatedAt, + DeletedAt, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] @@ -44,30 +51,6 @@ pub enum Relation { ActivitiesCategories, #[sea_orm(has_many = "super::activities_tags::Entity")] ActivitiesTags, - #[sea_orm( - belongs_to = "super::activity_kinds::Entity", - from = "Column::KindGuid", - to = "super::activity_kinds::Column::Guid", - on_update = "NoAction", - on_delete = "NoAction" - )] - ActivityKinds, - #[sea_orm( - belongs_to = "super::activity_status::Entity", - from = "Column::StatusGuid", - to = "super::activity_status::Column::Guid", - on_update = "NoAction", - on_delete = "NoAction" - )] - ActivityStatus, - #[sea_orm( - belongs_to = "super::descriptions::Entity", - from = "Column::DescriptionGuid", - to = "super::descriptions::Column::Guid", - on_update = "NoAction", - on_delete = "NoAction" - )] - Descriptions, } impl Related for Entity { @@ -82,22 +65,4 @@ impl Related for Entity { } } -impl Related for Entity { - fn to() -> RelationDef { - Relation::ActivityKinds.def() - } -} - -impl Related for Entity { - fn to() -> RelationDef { - Relation::ActivityStatus.def() - } -} - -impl Related for Entity { - fn to() -> RelationDef { - Relation::Descriptions.def() - } -} - impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/activities_categories.rs b/crates/storage/src/entity/activities_categories.rs index acd6f8bc..e57fe09f 100644 --- a/crates/storage/src/entity/activities_categories.rs +++ b/crates/storage/src/entity/activities_categories.rs @@ -12,7 +12,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum ActivitiesCategoriesEnum { +pub enum ActivitiesCategories { Table, Guid, ActivityGuid, diff --git a/crates/storage/src/entity/activities_tags.rs b/crates/storage/src/entity/activities_tags.rs index 0ca6f845..9b167057 100644 --- a/crates/storage/src/entity/activities_tags.rs +++ b/crates/storage/src/entity/activities_tags.rs @@ -12,7 +12,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum ActivitiesTagsEnum { +pub enum ActivitiesTags { Table, Guid, TagGuid, diff --git a/crates/storage/src/entity/activity_kinds.rs b/crates/storage/src/entity/activity_kinds.rs deleted file mode 100644 index 26222e6f..00000000 --- a/crates/storage/src/entity/activity_kinds.rs +++ /dev/null @@ -1,32 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "activity_kinds")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false)] - pub guid: String, - pub kind: String, -} - -#[derive(DeriveIden)] -pub enum ActivityKindsEnum { - Table, - Guid, - Kind, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation { - #[sea_orm(has_many = "super::activities::Entity")] - Activities, -} - -impl Related for Entity { - fn to() -> RelationDef { - Relation::Activities.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/activity_status.rs b/crates/storage/src/entity/activity_status.rs deleted file mode 100644 index b3bf9845..00000000 --- a/crates/storage/src/entity/activity_status.rs +++ /dev/null @@ -1,32 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "activity_status")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false)] - pub guid: String, - pub status: String, -} - -#[derive(DeriveIden)] -pub enum ActivityStatusEnum { - Table, - Guid, - Status, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation { - #[sea_orm(has_many = "super::activities::Entity")] - Activities, -} - -impl Related for Entity { - fn to() -> RelationDef { - Relation::Activities.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/categories.rs b/crates/storage/src/entity/categories.rs index 0d76cee8..4121fa16 100644 --- a/crates/storage/src/entity/categories.rs +++ b/crates/storage/src/entity/categories.rs @@ -12,7 +12,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum CategoriesEnum { +pub enum Categories { Table, Guid, Category, diff --git a/crates/storage/src/entity/descriptions.rs b/crates/storage/src/entity/descriptions.rs deleted file mode 100644 index 078e74a7..00000000 --- a/crates/storage/src/entity/descriptions.rs +++ /dev/null @@ -1,32 +0,0 @@ -//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15 - -use sea_orm::entity::prelude::*; - -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] -#[sea_orm(table_name = "descriptions")] -pub struct Model { - #[sea_orm(primary_key, auto_increment = false)] - pub guid: String, - pub description: String, -} - -#[derive(DeriveIden)] -pub enum DescriptionsEnum { - Table, - Guid, - Description, -} - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation { - #[sea_orm(has_many = "super::activities::Entity")] - Activities, -} - -impl Related for Entity { - fn to() -> RelationDef { - Relation::Activities.def() - } -} - -impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/storage/src/entity/prelude.rs b/crates/storage/src/entity/prelude.rs index 1d1eac15..cb3a2939 100644 --- a/crates/storage/src/entity/prelude.rs +++ b/crates/storage/src/entity/prelude.rs @@ -3,8 +3,5 @@ pub use super::activities::Entity as Activities; pub use super::activities_categories::Entity as ActivitiesCategories; pub use super::activities_tags::Entity as ActivitiesTags; -pub use super::activity_kinds::Entity as ActivityKinds; -pub use super::activity_status::Entity as ActivityStatus; pub use super::categories::Entity as Categories; -pub use super::descriptions::Entity as Descriptions; pub use super::tags::Entity as Tags; diff --git a/crates/storage/src/entity/tags.rs b/crates/storage/src/entity/tags.rs index be6aad5f..338b1cd2 100644 --- a/crates/storage/src/entity/tags.rs +++ b/crates/storage/src/entity/tags.rs @@ -11,7 +11,7 @@ pub struct Model { } #[derive(DeriveIden)] -pub enum TagsEnum { +pub enum Tags { Table, Guid, Tag, diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index d3dd4d64..50a17d9b 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -3,6 +3,7 @@ pub mod entity; pub mod migration; pub mod query; +pub mod repository; pub mod storage; use std::sync::OnceLock; diff --git a/crates/storage/src/migration.rs b/crates/storage/src/migration.rs index 7afb4ee9..efc289ed 100644 --- a/crates/storage/src/migration.rs +++ b/crates/storage/src/migration.rs @@ -1,13 +1,8 @@ mod m20240325_000001_create_activities; mod m20240326_000001_create_tags; mod m20240326_000002_create_categories; -mod m20240326_000003_create_activity_status; -mod m20240326_000004_create_activity_kinds; -mod m20240326_000005_create_activities_tags; -mod m20240326_000006_create_activities_categories; -mod m20240327_000001_create_activity_status_values; -mod m20240327_000002_create_activity_kind_values; -mod m20240329_000001_create_descriptions; +mod m20240326_000003_create_activities_tags; +mod m20240326_000004_create_activities_categories; pub use sea_orm_migration::prelude::{async_trait, MigrationTrait, MigratorTrait}; @@ -20,13 +15,8 @@ impl MigratorTrait for Migrator { Box::new(m20240325_000001_create_activities::Migration), Box::new(m20240326_000001_create_tags::Migration), Box::new(m20240326_000002_create_categories::Migration), - Box::new(m20240326_000003_create_activity_status::Migration), - Box::new(m20240326_000004_create_activity_kinds::Migration), - Box::new(m20240326_000005_create_activities_tags::Migration), - Box::new(m20240326_000006_create_activities_categories::Migration), - Box::new(m20240327_000001_create_activity_status_values::Migration), - Box::new(m20240327_000002_create_activity_kind_values::Migration), - Box::new(m20240329_000001_create_descriptions::Migration), + Box::new(m20240326_000003_create_activities_tags::Migration), + Box::new(m20240326_000004_create_activities_categories::Migration), ] } } diff --git a/crates/storage/src/migration/m20240325_000001_create_activities.rs b/crates/storage/src/migration/m20240325_000001_create_activities.rs index d4948f6e..c1b8e6f1 100644 --- a/crates/storage/src/migration/m20240325_000001_create_activities.rs +++ b/crates/storage/src/migration/m20240325_000001_create_activities.rs @@ -1,9 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::activities::ActivitiesEnum; -use crate::entity::activity_kinds::ActivityKindsEnum; -use crate::entity::activity_status::ActivityStatusEnum; -use crate::entity::descriptions::DescriptionsEnum; +use crate::entity::activities::Activities; #[derive(DeriveMigrationName)] pub struct Migration; @@ -14,56 +11,37 @@ impl MigrationTrait for Migration { manager .create_table( Table::create() - .table(ActivitiesEnum::Table) + .table(Activities::Table) .if_not_exists() .col( - ColumnDef::new(ActivitiesEnum::Guid) + ColumnDef::new(Activities::Guid) .text() .not_null() .primary_key(), ) + .col(ColumnDef::new(Activities::Description).text().not_null()) .col( - ColumnDef::new(ActivitiesEnum::DescriptionGuid) - .text() - .not_null(), - ) - .col( - ColumnDef::new(ActivitiesEnum::Begin) + ColumnDef::new(Activities::Begin) .timestamp_with_time_zone() .not_null(), ) .col( - ColumnDef::new(ActivitiesEnum::End) + ColumnDef::new(Activities::End) .timestamp_with_time_zone() .null(), ) - .col(ColumnDef::new(ActivitiesEnum::Duration).integer().null()) - .col(ColumnDef::new(ActivitiesEnum::KindGuid).text().not_null()) - .col(ColumnDef::new(ActivitiesEnum::StatusGuid).text().not_null()) - .col(ColumnDef::new(ActivitiesEnum::ParentGuid).text().null()) + .col(ColumnDef::new(Activities::Duration).integer().null()) + .col(ColumnDef::new(Activities::Kind).integer().not_null()) + .col(ColumnDef::new(Activities::Status).integer().not_null()) + .col(ColumnDef::new(Activities::ParentGuid).text().null()) + .col(ColumnDef::new(Activities::CreatedAt).timestamp().not_null()) + .col(ColumnDef::new(Activities::UpdatedAt).timestamp().null()) + .col(ColumnDef::new(Activities::DeletedAt).timestamp().null()) .foreign_key( ForeignKey::create() .name("fk_activities_parent_guid") - .from(ActivitiesEnum::Table, ActivitiesEnum::ParentGuid) - .to(ActivitiesEnum::Table, ActivitiesEnum::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_kind") - .from(ActivitiesEnum::Table, ActivitiesEnum::KindGuid) - .to(ActivityKindsEnum::Table, ActivityKindsEnum::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_status") - .from(ActivitiesEnum::Table, ActivitiesEnum::StatusGuid) - .to(ActivityStatusEnum::Table, ActivityStatusEnum::Guid), - ) - .foreign_key( - ForeignKey::create() - .name("fk_activities_description") - .from(ActivitiesEnum::Table, ActivitiesEnum::DescriptionGuid) - .to(DescriptionsEnum::Table, DescriptionsEnum::Guid), + .from(Activities::Table, Activities::ParentGuid) + .to(Activities::Table, Activities::Guid), ) .to_owned(), ) @@ -74,7 +52,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivitiesEnum::Table) + .table(Activities::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000001_create_tags.rs b/crates/storage/src/migration/m20240326_000001_create_tags.rs index 35e5bf60..b6ada7de 100644 --- a/crates/storage/src/migration/m20240326_000001_create_tags.rs +++ b/crates/storage/src/migration/m20240326_000001_create_tags.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::tags::TagsEnum; +use crate::entity::tags::Tags; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,14 +12,9 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(TagsEnum::Table) - .col( - ColumnDef::new(TagsEnum::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(TagsEnum::Tag).text().not_null()) + .table(Tags::Table) + .col(ColumnDef::new(Tags::Guid).text().not_null().primary_key()) + .col(ColumnDef::new(Tags::Tag).text().not_null()) .to_owned(), ) .await @@ -27,7 +22,7 @@ impl MigrationTrait for Migration { async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { manager - .drop_table(Table::drop().table(TagsEnum::Table).if_exists().to_owned()) + .drop_table(Table::drop().table(Tags::Table).if_exists().to_owned()) .await } } diff --git a/crates/storage/src/migration/m20240326_000002_create_categories.rs b/crates/storage/src/migration/m20240326_000002_create_categories.rs index cf1f26d6..1c917300 100644 --- a/crates/storage/src/migration/m20240326_000002_create_categories.rs +++ b/crates/storage/src/migration/m20240326_000002_create_categories.rs @@ -1,6 +1,6 @@ use sea_orm_migration::prelude::*; -use crate::entity::categories::CategoriesEnum; +use crate::entity::categories::Categories; #[derive(DeriveMigrationName)] pub struct Migration; @@ -12,15 +12,15 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(CategoriesEnum::Table) + .table(Categories::Table) .col( - ColumnDef::new(CategoriesEnum::Guid) + ColumnDef::new(Categories::Guid) .text() .not_null() .primary_key(), ) - .col(ColumnDef::new(CategoriesEnum::Category).text().not_null()) - .col(ColumnDef::new(CategoriesEnum::Description).text().null()) + .col(ColumnDef::new(Categories::Category).text().not_null()) + .col(ColumnDef::new(Categories::Description).text().null()) .to_owned(), ) .await @@ -30,7 +30,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(CategoriesEnum::Table) + .table(Categories::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs b/crates/storage/src/migration/m20240326_000003_create_activities_tags.rs similarity index 59% rename from crates/storage/src/migration/m20240326_000005_create_activities_tags.rs rename to crates/storage/src/migration/m20240326_000003_create_activities_tags.rs index afe85b6e..f11d5719 100644 --- a/crates/storage/src/migration/m20240326_000005_create_activities_tags.rs +++ b/crates/storage/src/migration/m20240326_000003_create_activities_tags.rs @@ -1,8 +1,8 @@ use sea_orm_migration::prelude::*; -use crate::entity::activities::ActivitiesEnum; -use crate::entity::activities_tags::ActivitiesTagsEnum; -use crate::entity::tags::TagsEnum; +use crate::entity::activities::Activities; +use crate::entity::activities_tags::ActivitiesTags; +use crate::entity::tags::Tags; #[derive(DeriveMigrationName)] pub struct Migration; @@ -14,34 +14,30 @@ impl MigrationTrait for Migration { .create_table( Table::create() .if_not_exists() - .table(ActivitiesTagsEnum::Table) + .table(ActivitiesTags::Table) .col( - ColumnDef::new(ActivitiesTagsEnum::Guid) + ColumnDef::new(ActivitiesTags::Guid) .text() .not_null() .primary_key(), ) + .col(ColumnDef::new(ActivitiesTags::TagGuid).text().not_null()) .col( - ColumnDef::new(ActivitiesTagsEnum::TagGuid) - .text() - .not_null(), - ) - .col( - ColumnDef::new(ActivitiesTagsEnum::ActivityGuid) + ColumnDef::new(ActivitiesTags::ActivityGuid) .text() .not_null(), ) .foreign_key( ForeignKey::create() .name("fk_activities_tags_tag_guid") - .from(ActivitiesTagsEnum::Table, ActivitiesTagsEnum::TagGuid) - .to(TagsEnum::Table, TagsEnum::Guid), + .from(ActivitiesTags::Table, ActivitiesTags::TagGuid) + .to(Tags::Table, Tags::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_tags_activity_guid") - .from(ActivitiesTagsEnum::Table, ActivitiesTagsEnum::ActivityGuid) - .to(ActivitiesEnum::Table, ActivitiesEnum::Guid), + .from(ActivitiesTags::Table, ActivitiesTags::ActivityGuid) + .to(Activities::Table, Activities::Guid), ) .to_owned(), ) @@ -52,7 +48,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivitiesTagsEnum::Table) + .table(ActivitiesTags::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs b/crates/storage/src/migration/m20240326_000003_create_activity_status.rs deleted file mode 100644 index 7f63cad7..00000000 --- a/crates/storage/src/migration/m20240326_000003_create_activity_status.rs +++ /dev/null @@ -1,38 +0,0 @@ -use sea_orm_migration::prelude::*; - -use crate::entity::activity_status::ActivityStatusEnum; - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .if_not_exists() - .table(ActivityStatusEnum::Table) - .col( - ColumnDef::new(ActivityStatusEnum::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(ActivityStatusEnum::Status).text().not_null()) - .to_owned(), - ) - .await - } - - async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .drop_table( - Table::drop() - .table(ActivityStatusEnum::Table) - .if_exists() - .to_owned(), - ) - .await - } -} diff --git a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs b/crates/storage/src/migration/m20240326_000004_create_activities_categories.rs similarity index 62% rename from crates/storage/src/migration/m20240326_000006_create_activities_categories.rs rename to crates/storage/src/migration/m20240326_000004_create_activities_categories.rs index 92687539..677524a1 100644 --- a/crates/storage/src/migration/m20240326_000006_create_activities_categories.rs +++ b/crates/storage/src/migration/m20240326_000004_create_activities_categories.rs @@ -1,8 +1,8 @@ use sea_orm_migration::prelude::*; -use crate::entity::activities::ActivitiesEnum; -use crate::entity::activities_categories::ActivitiesCategoriesEnum; -use crate::entity::categories::CategoriesEnum; +use crate::entity::activities::Activities; +use crate::entity::activities_categories::ActivitiesCategories; +use crate::entity::categories::Categories; #[derive(DeriveMigrationName)] pub struct Migration; @@ -13,21 +13,21 @@ impl MigrationTrait for Migration { manager .create_table( Table::create() - .table(ActivitiesCategoriesEnum::Table) + .table(ActivitiesCategories::Table) .if_not_exists() .col( - ColumnDef::new(ActivitiesCategoriesEnum::Guid) + ColumnDef::new(ActivitiesCategories::Guid) .text() .not_null() .primary_key(), ) .col( - ColumnDef::new(ActivitiesCategoriesEnum::ActivityGuid) + ColumnDef::new(ActivitiesCategories::ActivityGuid) .text() .not_null(), ) .col( - ColumnDef::new(ActivitiesCategoriesEnum::CategoryGuid) + ColumnDef::new(ActivitiesCategories::CategoryGuid) .text() .not_null(), ) @@ -35,19 +35,19 @@ impl MigrationTrait for Migration { ForeignKey::create() .name("fk_activities_categories_category_guid") .from( - ActivitiesCategoriesEnum::Table, - ActivitiesCategoriesEnum::CategoryGuid, + ActivitiesCategories::Table, + ActivitiesCategories::CategoryGuid, ) - .to(CategoriesEnum::Table, CategoriesEnum::Guid), + .to(Categories::Table, Categories::Guid), ) .foreign_key( ForeignKey::create() .name("fk_activities_categories_activity_guid") .from( - ActivitiesCategoriesEnum::Table, - ActivitiesCategoriesEnum::ActivityGuid, + ActivitiesCategories::Table, + ActivitiesCategories::ActivityGuid, ) - .to(ActivitiesEnum::Table, ActivitiesEnum::Guid), + .to(Activities::Table, Activities::Guid), ) .to_owned(), ) @@ -58,7 +58,7 @@ impl MigrationTrait for Migration { manager .drop_table( Table::drop() - .table(ActivitiesCategoriesEnum::Table) + .table(ActivitiesCategories::Table) .if_exists() .to_owned(), ) diff --git a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs b/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs deleted file mode 100644 index c729a61c..00000000 --- a/crates/storage/src/migration/m20240326_000004_create_activity_kinds.rs +++ /dev/null @@ -1,38 +0,0 @@ -use sea_orm_migration::prelude::*; - -use crate::entity::activity_kinds::ActivityKindsEnum; - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .if_not_exists() - .table(ActivityKindsEnum::Table) - .col( - ColumnDef::new(ActivityKindsEnum::Guid) - .text() - .not_null() - .primary_key(), - ) - .col(ColumnDef::new(ActivityKindsEnum::Kind).text().not_null()) - .to_owned(), - ) - .await - } - - async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .drop_table( - Table::drop() - .table(ActivityKindsEnum::Table) - .if_exists() - .to_owned(), - ) - .await - } -} diff --git a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs b/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs deleted file mode 100644 index 165c7e0d..00000000 --- a/crates/storage/src/migration/m20240327_000001_create_activity_status_values.rs +++ /dev/null @@ -1,42 +0,0 @@ -use itertools::Itertools; -use pace_core::prelude::ActivityStatusKind; -use strum::IntoEnumIterator; -use ulid::Ulid; - -use sea_orm_migration::prelude::*; - -use crate::entity::activity_status::ActivityStatusEnum; - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - let activity_kinds = ActivityStatusKind::iter() - .map(|kind| { - Query::insert() - .into_table(ActivityStatusEnum::Table) - .columns([ActivityStatusEnum::Guid, ActivityStatusEnum::Status]) - .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) - .to_owned() - }) - .collect_vec(); - - for kind in activity_kinds { - manager.exec_stmt(kind).await?; - } - - Ok(()) - } - - async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .exec_stmt( - Query::delete() - .from_table(ActivityStatusEnum::Table) - .to_owned(), - ) - .await - } -} diff --git a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs b/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs deleted file mode 100644 index 677f7854..00000000 --- a/crates/storage/src/migration/m20240327_000002_create_activity_kind_values.rs +++ /dev/null @@ -1,41 +0,0 @@ -use itertools::Itertools; -use pace_core::prelude::ActivityKind; -use sea_orm_migration::prelude::*; -use strum::IntoEnumIterator; -use ulid::Ulid; - -use crate::entity::activity_kinds::ActivityKindsEnum; - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - let activity_kinds = ActivityKind::iter() - .map(|kind| { - Query::insert() - .into_table(ActivityKindsEnum::Table) - .columns([ActivityKindsEnum::Guid, ActivityKindsEnum::Kind]) - .values_panic([Ulid::new().to_string().into(), kind.to_string().into()]) - .to_owned() - }) - .collect_vec(); - - for kind in activity_kinds { - manager.exec_stmt(kind).await?; - } - - Ok(()) - } - - async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .exec_stmt( - Query::delete() - .from_table(ActivityKindsEnum::Table) - .to_owned(), - ) - .await - } -} diff --git a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs b/crates/storage/src/migration/m20240329_000001_create_descriptions.rs deleted file mode 100644 index cb4f992f..00000000 --- a/crates/storage/src/migration/m20240329_000001_create_descriptions.rs +++ /dev/null @@ -1,42 +0,0 @@ -use sea_orm_migration::prelude::*; - -use crate::entity::descriptions::DescriptionsEnum; - -#[derive(DeriveMigrationName)] -pub struct Migration; - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .if_not_exists() - .table(DescriptionsEnum::Table) - .col( - ColumnDef::new(DescriptionsEnum::Guid) - .text() - .not_null() - .primary_key(), - ) - .col( - ColumnDef::new(DescriptionsEnum::Description) - .text() - .not_null(), - ) - .to_owned(), - ) - .await - } - - async fn down(&self, manager: &'life1 SchemaManager<'_>) -> Result<(), DbErr> { - manager - .drop_table( - Table::drop() - .table(DescriptionsEnum::Table) - .if_exists() - .to_owned(), - ) - .await - } -} diff --git a/crates/storage/src/repository.rs b/crates/storage/src/repository.rs new file mode 100644 index 00000000..5159dc9d --- /dev/null +++ b/crates/storage/src/repository.rs @@ -0,0 +1,74 @@ +pub mod category; + +use pace_error::{PaceOptResult, PaceResult}; + +pub trait Repository { + /// Read a single entity by its id. + /// + /// # Arguments + /// + /// * `id` - The id of the entity to read. + /// + /// # Errors + /// + /// Returns an error if there was a problem reading the entity. + /// + /// # Returns + /// + /// Returns the entity if it exists or None if it does not. + fn read(&self, id: &str) -> PaceOptResult; + + /// Read all entities of a given type. + /// + /// # Errors + /// + /// Returns an error if there was a problem reading the entities. + /// + /// # Returns + /// + /// Returns a vector of all entities of the given type or an + /// empty vector if there are none. + fn read_all(&self) -> PaceOptResult>; + + /// Create a new entity of a given type. + /// + /// # Arguments + /// + /// * `entity` - The entity to create. + /// + /// # Errors + /// + /// Returns an error if there was a problem creating the entity. + /// + /// # Returns + /// + /// Returns the id of the created entity. + fn create(&self, entity: &T) -> PaceResult; + + /// Update an existing entity of a given type. + /// + /// # Arguments + /// + /// * `id` - The id of the entity to update. + /// * `entity` - The entity to update. + /// + /// # Errors + /// + /// Returns an error if there was a problem updating the entity. + /// + /// # Returns + /// + /// Returns nothing if the entity was updated successfully. + fn update(&self, id: &str, entity: &T) -> PaceResult<()>; + + /// Delete an existing entity of a given type. + /// + /// # Arguments + /// + /// * `id` - The id of the entity to delete. + /// + /// # Errors + /// + /// Returns an error if there was a problem deleting the entity. + fn delete(&self, id: &str) -> PaceResult<()>; +} diff --git a/crates/storage/src/repository/category.rs b/crates/storage/src/repository/category.rs new file mode 100644 index 00000000..5d064af1 --- /dev/null +++ b/crates/storage/src/repository/category.rs @@ -0,0 +1,32 @@ +use pace_error::{PaceOptResult, PaceResult}; +use sea_orm::{sea_query::Query, DatabaseConnection}; + +use crate::entity::categories::{Entity as CategoryEntity, Model as CategoryModel}; +use crate::entity::tags::Entity as TagEntity; +use crate::repository::Repository; + +pub struct CategoryRepository { + connection: DatabaseConnection, +} + +impl Repository for CategoryRepository { + fn read(&self, id: &str) -> PaceOptResult { + unimplemented!() + } + + fn read_all(&self) -> PaceOptResult> { + unimplemented!() + } + + fn create(&self, entity: &CategoryEntity) -> PaceResult { + unimplemented!() + } + + fn update(&self, id: &str, entity: &CategoryEntity) -> PaceResult<()> { + unimplemented!() + } + + fn delete(&self, id: &str) -> PaceResult<()> { + unimplemented!() + } +} diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index 55bc61a0..3beb2759 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -19,7 +19,7 @@ use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use crate::{ - entity::{descriptions, prelude::Activities}, + entity::prelude::Activities, migration::{Migrator, MigratorTrait}, runtime, }; @@ -123,10 +123,10 @@ impl ActivityReadOps for DatabaseActivityStorage { .into()); }; - let _description = activity - .find_related(descriptions::Entity) - .one(&self.connection) - .await; + // let _description = activity + // .find_related(descriptions::Entity) + // .one(&self.connection) + // .await; todo!("implement read_activity for sqlite"); diff --git a/db/Entity-Relationship.png b/db/Entity-Relationship.png index c14e97dca0c8b7ccd16020dcda8b06ea5b68e9c8..ef5d6c81a3a56b492994cee5831196e27001ff84 100644 GIT binary patch literal 18141 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 Oo=D3}WlKDN_kRFTT6~=V literal 24148 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 Date: Wed, 3 Apr 2024 01:21:40 +0200 Subject: [PATCH 58/59] add repositories Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/error/src/lib.rs | 20 +++++ .../m20240325_000001_create_activities.rs | 20 +++++ .../migration/m20240326_000001_create_tags.rs | 10 +++ .../m20240326_000002_create_categories.rs | 10 +++ crates/storage/src/repository.rs | 35 ++++++-- crates/storage/src/repository/activity.rs | 81 +++++++++++++++++++ crates/storage/src/repository/category.rs | 79 ++++++++++++++---- crates/storage/src/repository/tag.rs | 81 +++++++++++++++++++ 8 files changed, 315 insertions(+), 21 deletions(-) create mode 100644 crates/storage/src/repository/activity.rs create mode 100644 crates/storage/src/repository/tag.rs diff --git a/crates/error/src/lib.rs b/crates/error/src/lib.rs index 18fa23de..6fbda321 100644 --- a/crates/error/src/lib.rs +++ b/crates/error/src/lib.rs @@ -293,6 +293,26 @@ pub enum DatabaseStorageErrorKind { #[source] source: sea_orm::error::SqlErr, }, + + /// Failed to read item {item_type}::{item_id} from database: {source} + RepositoryReadFailed { + source: sea_orm::DbErr, + item_type: String, + item_id: String, + }, + + /// Failed to delete item {item_type}::{item_id} from database: {source} + RepositoryDeleteFailed { + source: sea_orm::prelude::DbErr, + item_type: String, + item_id: String, + }, + + /// Failed to create item {item_type} in database: {source} + RepositoryCreateFailed { + source: sea_orm::prelude::DbErr, + item_type: String, + }, } /// [`TomlFileStorageErrorKind`] describes the errors that can happen while dealing with the Toml file storage. diff --git a/crates/storage/src/migration/m20240325_000001_create_activities.rs b/crates/storage/src/migration/m20240325_000001_create_activities.rs index c1b8e6f1..5105ad79 100644 --- a/crates/storage/src/migration/m20240325_000001_create_activities.rs +++ b/crates/storage/src/migration/m20240325_000001_create_activities.rs @@ -45,6 +45,26 @@ impl MigrationTrait for Migration { ) .to_owned(), ) + .await?; + + manager + .create_index( + Index::create() + .table(Activities::Table) + .name("idx_activities_parent_guid") + .col(Activities::ParentGuid) + .to_owned(), + ) + .await?; + + manager + .create_index( + Index::create() + .table(Activities::Table) + .name("idx_activities_description") + .col(Activities::Description) + .to_owned(), + ) .await } diff --git a/crates/storage/src/migration/m20240326_000001_create_tags.rs b/crates/storage/src/migration/m20240326_000001_create_tags.rs index b6ada7de..38493bd1 100644 --- a/crates/storage/src/migration/m20240326_000001_create_tags.rs +++ b/crates/storage/src/migration/m20240326_000001_create_tags.rs @@ -17,6 +17,16 @@ impl MigrationTrait for Migration { .col(ColumnDef::new(Tags::Tag).text().not_null()) .to_owned(), ) + .await?; + + manager + .create_index( + Index::create() + .table(Tags::Table) + .name("idx_tags_tag") + .col(Tags::Tag) + .to_owned(), + ) .await } diff --git a/crates/storage/src/migration/m20240326_000002_create_categories.rs b/crates/storage/src/migration/m20240326_000002_create_categories.rs index 1c917300..bf6ad4a5 100644 --- a/crates/storage/src/migration/m20240326_000002_create_categories.rs +++ b/crates/storage/src/migration/m20240326_000002_create_categories.rs @@ -23,6 +23,16 @@ impl MigrationTrait for Migration { .col(ColumnDef::new(Categories::Description).text().null()) .to_owned(), ) + .await?; + + manager + .create_index( + Index::create() + .table(Categories::Table) + .name("idx_categories_category") + .col(Categories::Category) + .to_owned(), + ) .await } diff --git a/crates/storage/src/repository.rs b/crates/storage/src/repository.rs index 5159dc9d..e4373f58 100644 --- a/crates/storage/src/repository.rs +++ b/crates/storage/src/repository.rs @@ -1,8 +1,10 @@ +pub mod activity; pub mod category; +pub mod tag; use pace_error::{PaceOptResult, PaceResult}; -pub trait Repository { +pub(crate) trait Repository { /// Read a single entity by its id. /// /// # Arguments @@ -16,7 +18,7 @@ pub trait Repository { /// # Returns /// /// Returns the entity if it exists or None if it does not. - fn read(&self, id: &str) -> PaceOptResult; + async fn read(&self, id: &str) -> PaceOptResult; /// Read all entities of a given type. /// @@ -28,7 +30,7 @@ pub trait Repository { /// /// Returns a vector of all entities of the given type or an /// empty vector if there are none. - fn read_all(&self) -> PaceOptResult>; + async fn read_all(&self) -> PaceOptResult>; /// Create a new entity of a given type. /// @@ -43,7 +45,7 @@ pub trait Repository { /// # Returns /// /// Returns the id of the created entity. - fn create(&self, entity: &T) -> PaceResult; + async fn create(&self, model: &T) -> PaceResult; /// Update an existing entity of a given type. /// @@ -59,7 +61,7 @@ pub trait Repository { /// # Returns /// /// Returns nothing if the entity was updated successfully. - fn update(&self, id: &str, entity: &T) -> PaceResult<()>; + async fn update(&self, id: &str, model: &T) -> PaceResult<()>; /// Delete an existing entity of a given type. /// @@ -70,5 +72,26 @@ pub trait Repository { /// # Errors /// /// Returns an error if there was a problem deleting the entity. - fn delete(&self, id: &str) -> PaceResult<()>; + /// + /// # Returns + /// + /// Returns the deleted entity if it exists. + async fn delete(&self, id: &str) -> PaceOptResult; +} + +pub struct SeaOrmRepository<'conn> { + activity: activity::ActivityRepository<'conn, sea_orm::DatabaseConnection>, + category: category::CategoryRepository<'conn, sea_orm::DatabaseConnection>, + tag: tag::TagRepository<'conn, sea_orm::DatabaseConnection>, +} + +impl<'conn> SeaOrmRepository<'conn> { + #[must_use] + pub const fn new(connection: &'conn sea_orm::DatabaseConnection) -> Self { + Self { + activity: activity::ActivityRepository::new(connection), + category: category::CategoryRepository::new(connection), + tag: tag::TagRepository::new(connection), + } + } } diff --git a/crates/storage/src/repository/activity.rs b/crates/storage/src/repository/activity.rs new file mode 100644 index 00000000..ef06e55d --- /dev/null +++ b/crates/storage/src/repository/activity.rs @@ -0,0 +1,81 @@ +use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; +use sea_orm::{EntityTrait, IntoActiveModel}; + +use crate::entity::activities::{Entity as ActivityEntity, Model as ActivityModel}; +use crate::repository::Repository; + +pub struct ActivityRepository<'conn, C> { + connection: &'conn C, +} + +impl<'conn, C> ActivityRepository<'conn, C> { + pub const fn new(connection: &'conn C) -> Self { + Self { connection } + } +} + +impl<'conn> Repository for ActivityRepository<'conn, sea_orm::DatabaseConnection> { + async fn read(&self, id: &str) -> PaceOptResult { + Ok(ActivityEntity::find_by_id(id) + .one(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryReadFailed { + source, + item_type: "activity".to_string(), + item_id: id.to_string(), + })?) + } + + async fn read_all(&self) -> PaceOptResult> { + let items = ActivityEntity::find() + .all(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryReadFailed { + source, + item_type: "activity".to_string(), + item_id: "all".to_string(), + })?; + + if items.is_empty() { + return Ok(None); + } + + Ok(Some(items)) + } + + async fn create(&self, model: &ActivityModel) -> PaceResult { + // TODO: What else should we do with ActiveModel here? + let active_model = model.clone().into_active_model(); + + let id = ActivityEntity::insert(active_model) + .exec(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryCreateFailed { + source, + item_type: "activity".to_string(), + })? + .last_insert_id; + + Ok(id) + } + + async fn update(&self, id: &str, model: &ActivityModel) -> PaceResult<()> { + unimplemented!() + } + + async fn delete(&self, id: &str) -> PaceOptResult { + let item = self.read(id).await?; + + // TODO: Unused result here, what should we do with the rows affected? + _ = ActivityEntity::delete_by_id(id) + .exec(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryDeleteFailed { + source, + item_type: "activity".to_string(), + item_id: id.to_string(), + })?; + + Ok(item) + } +} diff --git a/crates/storage/src/repository/category.rs b/crates/storage/src/repository/category.rs index 5d064af1..bdb70c55 100644 --- a/crates/storage/src/repository/category.rs +++ b/crates/storage/src/repository/category.rs @@ -1,32 +1,81 @@ -use pace_error::{PaceOptResult, PaceResult}; -use sea_orm::{sea_query::Query, DatabaseConnection}; +use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; +use sea_orm::{EntityTrait, IntoActiveModel}; use crate::entity::categories::{Entity as CategoryEntity, Model as CategoryModel}; -use crate::entity::tags::Entity as TagEntity; use crate::repository::Repository; -pub struct CategoryRepository { - connection: DatabaseConnection, +pub struct CategoryRepository<'conn, C> { + connection: &'conn C, } -impl Repository for CategoryRepository { - fn read(&self, id: &str) -> PaceOptResult { - unimplemented!() +impl<'conn, C> CategoryRepository<'conn, C> { + pub const fn new(connection: &'conn C) -> Self { + Self { connection } } +} - fn read_all(&self) -> PaceOptResult> { - unimplemented!() +impl<'conn> Repository for CategoryRepository<'conn, sea_orm::DatabaseConnection> { + async fn read(&self, id: &str) -> PaceOptResult { + Ok(CategoryEntity::find_by_id(id) + .one(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryReadFailed { + source, + item_type: "category".to_string(), + item_id: id.to_string(), + })?) } - fn create(&self, entity: &CategoryEntity) -> PaceResult { - unimplemented!() + async fn read_all(&self) -> PaceOptResult> { + let items = CategoryEntity::find() + .all(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryReadFailed { + source, + item_type: "category".to_string(), + item_id: "all".to_string(), + })?; + + if items.is_empty() { + return Ok(None); + } + + Ok(Some(items)) } - fn update(&self, id: &str, entity: &CategoryEntity) -> PaceResult<()> { - unimplemented!() + async fn create(&self, model: &CategoryModel) -> PaceResult { + // TODO: What else should we do with ActiveModel here? + let active_model = model.clone().into_active_model(); + + let id = CategoryEntity::insert(active_model) + .exec(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryCreateFailed { + source, + item_type: "category".to_string(), + })? + .last_insert_id; + + Ok(id) } - fn delete(&self, id: &str) -> PaceResult<()> { + async fn update(&self, id: &str, model: &CategoryModel) -> PaceResult<()> { unimplemented!() } + + async fn delete(&self, id: &str) -> PaceOptResult { + let item = self.read(id).await?; + + // TODO: Unused result here, what should we do with the rows affected? + _ = CategoryEntity::delete_by_id(id) + .exec(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryDeleteFailed { + source, + item_type: "category".to_string(), + item_id: id.to_string(), + })?; + + Ok(item) + } } diff --git a/crates/storage/src/repository/tag.rs b/crates/storage/src/repository/tag.rs new file mode 100644 index 00000000..a6502e3f --- /dev/null +++ b/crates/storage/src/repository/tag.rs @@ -0,0 +1,81 @@ +use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; +use sea_orm::{EntityTrait, IntoActiveModel}; + +use crate::entity::tags::{Entity as TagEntity, Model as TagModel}; +use crate::repository::Repository; + +pub struct TagRepository<'conn, C> { + connection: &'conn C, +} + +impl<'conn, C> TagRepository<'conn, C> { + pub const fn new(connection: &'conn C) -> Self { + Self { connection } + } +} + +impl<'conn> Repository for TagRepository<'conn, sea_orm::DatabaseConnection> { + async fn read(&self, id: &str) -> PaceOptResult { + Ok(TagEntity::find_by_id(id) + .one(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryReadFailed { + source, + item_type: "tag".to_string(), + item_id: id.to_string(), + })?) + } + + async fn read_all(&self) -> PaceOptResult> { + let items = TagEntity::find() + .all(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryReadFailed { + source, + item_type: "tag".to_string(), + item_id: "all".to_string(), + })?; + + if items.is_empty() { + return Ok(None); + } + + Ok(Some(items)) + } + + async fn create(&self, model: &TagModel) -> PaceResult { + // TODO: What else should we do with ActiveModel here? + let active_model = model.clone().into_active_model(); + + let id = TagEntity::insert(active_model) + .exec(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryCreateFailed { + source, + item_type: "tag".to_string(), + })? + .last_insert_id; + + Ok(id) + } + + async fn update(&self, id: &str, model: &TagModel) -> PaceResult<()> { + unimplemented!() + } + + async fn delete(&self, id: &str) -> PaceOptResult { + let item = self.read(id).await?; + + // TODO: Unused result here, what should we do with the rows affected? + _ = TagEntity::delete_by_id(id) + .exec(self.connection) + .await + .map_err(|source| DatabaseStorageErrorKind::RepositoryDeleteFailed { + source, + item_type: "tag".to_string(), + item_id: id.to_string(), + })?; + + Ok(item) + } +} From 1b9c3f5ffab52d36d208ae12d61bad24034ab2b9 Mon Sep 17 00:00:00 2001 From: simonsan <14062932+simonsan@users.noreply.github.com> Date: Wed, 3 Apr 2024 02:44:18 +0200 Subject: [PATCH 59/59] start read_activity impl Signed-off-by: simonsan <14062932+simonsan@users.noreply.github.com> --- crates/core/src/storage.rs | 82 +++++++------ crates/service/src/lib.rs | 4 +- crates/storage/src/lib.rs | 1 - crates/storage/src/repository.rs | 3 + crates/storage/src/repository/activity.rs | 3 + crates/storage/src/repository/category.rs | 1 + crates/storage/src/repository/tag.rs | 1 + crates/storage/src/storage/file.rs | 2 +- crates/storage/src/storage/in_memory.rs | 142 +++++++++++++++++++--- crates/storage/src/storage/sqlite.rs | 51 ++++---- 10 files changed, 204 insertions(+), 86 deletions(-) diff --git a/crates/core/src/storage.rs b/crates/core/src/storage.rs index f855940d..e24c36ba 100644 --- a/crates/core/src/storage.rs +++ b/crates/core/src/storage.rs @@ -112,7 +112,7 @@ pub trait ActivityReadOps { /// # Returns /// /// The activity that was read from the storage backend. If no activity is found, it should return `Ok(None)`. - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult; + fn read_activity(&self, activity_id: ActivityGuid) -> PaceOptResult; /// List activities from the storage backend. /// @@ -617,19 +617,21 @@ pub trait ActivityQuerying: ActivityReadOps { /// /// If the activity is active, it should return `Ok(true)`. If it is not active, it should return `Ok(false)`. fn is_activity_active(&self, activity_id: ActivityGuid) -> PaceResult { - let activity = self.read_activity(activity_id)?; - - debug!( - "Checking if Activity with id {:?} is active: {}", - activity_id, - if activity.activity().is_in_progress() { - "yes" - } else { - "no" - } - ); - - Ok(activity.activity().is_in_progress()) + if let Some(activity) = self.read_activity(activity_id)? { + debug!( + "Checking if Activity with id {:?} is active: {}", + activity_id, + if activity.activity().is_in_progress() { + "yes" + } else { + "no" + } + ); + + Ok(activity.activity().is_in_progress()) + } else { + Ok(false) + } } /// List all intermissions for an activity id from the storage backend. @@ -661,13 +663,15 @@ pub trait ActivityQuerying: ActivityReadOps { let intermissions = filtered .iter() .filter_map(|activity| { - let activity_item = self.read_activity(*activity).ok()?; - - if activity_item.activity().parent_id() == Some(activity_id) { - debug!("Found intermission for activity: {activity_id}"); - Some(activity_item) + if let Some(activity_item) = self.read_activity(*activity).ok()? { + if activity_item.activity().parent_id() == Some(activity_id) { + debug!("Found intermission for activity: {activity_id}"); + Some(activity_item) + } else { + debug!("Not an intermission for activity: {activity_id}"); + None + } } else { - debug!("Not an intermission for activity: {activity_id}"); None } }) @@ -704,17 +708,15 @@ pub trait ActivityQuerying: ActivityReadOps { let guids = self.list_active_intermissions()?.map(|log| { log.iter() .filter_map(|active_intermission_id| { - if self - .read_activity(*active_intermission_id) - .ok()? - .activity() - .parent_id() - == Some(activity_id) - { - debug!("Found active intermission for activity: {activity_id}"); - Some(*active_intermission_id) + if let Some(activity) = self.read_activity(*active_intermission_id).ok()? { + if activity.activity().parent_id() == Some(activity_id) { + debug!("Found active intermission for activity: {activity_id}"); + Some(*active_intermission_id) + } else { + debug!("No active intermission found for activity: {activity_id}"); + None + } } else { - debug!("No active intermission found for activity: {activity_id}"); None } }) @@ -744,21 +746,23 @@ pub trait ActivityQuerying: ActivityReadOps { return Ok(None); }; - current + Ok(current .into_iter() .sorted() .rev() .find(|activity_id| { self.read_activity(*activity_id) - .map(|activity| { + .ok() + .flatten() + .is_some_and(|activity| { activity.activity().is_in_progress() && activity.activity().kind().is_activity() && !activity.activity().is_active_intermission() }) - .unwrap_or(false) }) .map(|activity_id| self.read_activity(activity_id)) - .transpose() + .transpose()? + .flatten()) } /// Get the latest held activity. @@ -779,21 +783,23 @@ pub trait ActivityQuerying: ActivityReadOps { return Ok(None); }; - current + Ok(current .into_iter() .sorted() .rev() .find(|activity_id| { self.read_activity(*activity_id) - .map(|activity| { + .ok() + .flatten() + .is_some_and(|activity| { activity.activity().is_paused() && activity.activity().kind().is_activity() && !activity.activity().is_active_intermission() }) - .unwrap_or(false) }) .map(|activity_id| self.read_activity(activity_id)) - .transpose() + .transpose()? + .flatten()) } } diff --git a/crates/service/src/lib.rs b/crates/service/src/lib.rs index 966fe27f..fb56e79b 100644 --- a/crates/service/src/lib.rs +++ b/crates/service/src/lib.rs @@ -13,7 +13,7 @@ use pace_error::{DatabaseStorageErrorKind, PaceResult}; use tracing::debug; use pace_storage::storage::{ - file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::DatabaseActivityStorage, + file::TomlActivityStorage, in_memory::InMemoryActivityStorage, sqlite::SQLiteActivityStorage, }; /// Get the storage backend from the configuration. @@ -35,7 +35,7 @@ pub fn get_storage_from_config(config: &PaceConfig) -> PaceResult { debug!("Connecting to SQLite database: {url}"); - Arc::new(DatabaseActivityStorage::new(*kind, url)?) + Arc::new(SQLiteActivityStorage::new(*kind, url)?) } ActivityLogStorageKind::InMemory => Arc::new(InMemoryActivityStorage::new()), _ => return Err(DatabaseStorageErrorKind::StorageNotImplemented.into()), diff --git a/crates/storage/src/lib.rs b/crates/storage/src/lib.rs index 50a17d9b..7a725b0c 100644 --- a/crates/storage/src/lib.rs +++ b/crates/storage/src/lib.rs @@ -1,5 +1,4 @@ // pub mod convert; -// pub mod entities; pub mod entity; pub mod migration; pub mod query; diff --git a/crates/storage/src/repository.rs b/crates/storage/src/repository.rs index e4373f58..98c00fcd 100644 --- a/crates/storage/src/repository.rs +++ b/crates/storage/src/repository.rs @@ -2,6 +2,7 @@ pub mod activity; pub mod category; pub mod tag; +use getset::Getters; use pace_error::{PaceOptResult, PaceResult}; pub(crate) trait Repository { @@ -79,6 +80,8 @@ pub(crate) trait Repository { async fn delete(&self, id: &str) -> PaceOptResult; } +#[derive(Debug, Getters)] +#[getset(get = "pub")] pub struct SeaOrmRepository<'conn> { activity: activity::ActivityRepository<'conn, sea_orm::DatabaseConnection>, category: category::CategoryRepository<'conn, sea_orm::DatabaseConnection>, diff --git a/crates/storage/src/repository/activity.rs b/crates/storage/src/repository/activity.rs index ef06e55d..366d039e 100644 --- a/crates/storage/src/repository/activity.rs +++ b/crates/storage/src/repository/activity.rs @@ -2,8 +2,10 @@ use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use sea_orm::{EntityTrait, IntoActiveModel}; use crate::entity::activities::{Entity as ActivityEntity, Model as ActivityModel}; +use crate::entity::categories::{Entity as CategoryEntity, Model as CategoryModel}; use crate::repository::Repository; +#[derive(Debug)] pub struct ActivityRepository<'conn, C> { connection: &'conn C, } @@ -14,6 +16,7 @@ impl<'conn, C> ActivityRepository<'conn, C> { } } +// TODO!: Implement query for related entities impl<'conn> Repository for ActivityRepository<'conn, sea_orm::DatabaseConnection> { async fn read(&self, id: &str) -> PaceOptResult { Ok(ActivityEntity::find_by_id(id) diff --git a/crates/storage/src/repository/category.rs b/crates/storage/src/repository/category.rs index bdb70c55..3bdc2e73 100644 --- a/crates/storage/src/repository/category.rs +++ b/crates/storage/src/repository/category.rs @@ -4,6 +4,7 @@ use sea_orm::{EntityTrait, IntoActiveModel}; use crate::entity::categories::{Entity as CategoryEntity, Model as CategoryModel}; use crate::repository::Repository; +#[derive(Debug)] pub struct CategoryRepository<'conn, C> { connection: &'conn C, } diff --git a/crates/storage/src/repository/tag.rs b/crates/storage/src/repository/tag.rs index a6502e3f..9d90fb95 100644 --- a/crates/storage/src/repository/tag.rs +++ b/crates/storage/src/repository/tag.rs @@ -4,6 +4,7 @@ use sea_orm::{EntityTrait, IntoActiveModel}; use crate::entity::tags::{Entity as TagEntity, Model as TagModel}; use crate::repository::Repository; +#[derive(Debug)] pub struct TagRepository<'conn, C> { connection: &'conn C, } diff --git a/crates/storage/src/storage/file.rs b/crates/storage/src/storage/file.rs index fde0ddce..fa286d07 100644 --- a/crates/storage/src/storage/file.rs +++ b/crates/storage/src/storage/file.rs @@ -134,7 +134,7 @@ impl ActivityStorage for TomlActivityStorage { impl ActivityReadOps for TomlActivityStorage { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceOptResult { self.cache.read_activity(activity_id) } diff --git a/crates/storage/src/storage/in_memory.rs b/crates/storage/src/storage/in_memory.rs index faad0100..998fb89a 100644 --- a/crates/storage/src/storage/in_memory.rs +++ b/crates/storage/src/storage/in_memory.rs @@ -106,7 +106,7 @@ impl SyncStorage for InMemoryActivityStorage { impl ActivityReadOps for InMemoryActivityStorage { #[tracing::instrument(skip(self))] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceOptResult { let activities = self.log.read(); let activity = @@ -121,7 +121,7 @@ impl ActivityReadOps for InMemoryActivityStorage { debug!("Activity with id {activity_id:?} found: {activity:?}"); - Ok((activity_id, activity).into()) + Ok(Some((activity_id, activity).into())) } #[tracing::instrument(skip(self))] @@ -300,7 +300,9 @@ impl ActivityStateManagement for InMemoryActivityStorage { drop(activities); - self.read_activity(activity_id) + Ok(self + .read_activity(activity_id)? + .ok_or_else(|| ActivityLogErrorKind::ActivityNotFound(activity_id.to_string()))?) } #[tracing::instrument(skip(self))] @@ -415,7 +417,9 @@ impl ActivityStateManagement for InMemoryActivityStorage { activity_id: ActivityGuid, resume_opts: ResumeOptions, ) -> PaceResult { - let resumable_activity = self.read_activity(activity_id)?; + let resumable_activity = self + .read_activity(activity_id)? + .ok_or_else(|| ActivityLogErrorKind::ActivityNotFound(activity_id.to_string()))?; debug!("Resumable activity: {resumable_activity:?}"); @@ -469,7 +473,9 @@ impl ActivityStateManagement for InMemoryActivityStorage { hold_opts: HoldOptions, ) -> PaceResult { // Get ActivityItem for activity that - let active_activity = self.read_activity(activity_id)?; + let active_activity = self + .read_activity(activity_id)? + .ok_or_else(|| ActivityLogErrorKind::ActivityNotFound(activity_id.to_string()))?; debug!("Active activity: {active_activity:?}"); @@ -650,7 +656,9 @@ impl ActivityQuerying for InMemoryActivityStorage { Some(intermissions.into_iter().try_fold( BTreeMap::new(), |mut acc: BTreeMap>, intermission_id| { - let intermission = self.read_activity(intermission_id)?; + let intermission = self.read_activity(intermission_id)?.ok_or_else(|| { + ActivityLogErrorKind::ActivityNotFound(intermission_id.to_string()) + })?; debug!("Intermission: {intermission:?}"); @@ -668,7 +676,9 @@ impl ActivityQuerying for InMemoryActivityStorage { debug!("Parent id: {parent_id:?}"); - let parent_activity = self.read_activity(parent_id)?; + let parent_activity = self + .read_activity(parent_id)? + .ok_or_else(|| ActivityLogErrorKind::ActivityNotFound(parent_id.to_string()))?; debug!("Parent activity: {parent_activity:?}"); @@ -869,7 +879,12 @@ mod tests { "Activity was not created." ); - let stored_activity = storage.read_activity(*item.guid())?; + let stored_activity = storage.read_activity(*item.guid())?.ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + item.guid().to_string() + ) + })?; assert_eq!( activity, @@ -911,7 +926,14 @@ mod tests { "Amount of activities is not the same as the amount of created activities." ); - let stored_activity = storage.read_activity(filtered_activities[0])?; + let stored_activity = storage + .read_activity(filtered_activities[0])? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + filtered_activities[0].to_string() + ) + })?; assert_eq!( activity, @@ -942,7 +964,14 @@ mod tests { let activity_item = storage.create_activity(og_activity.clone())?; - let read_activity = storage.read_activity(*activity_item.guid())?; + let read_activity = storage + .read_activity(*activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item.guid().to_string() + ) + })?; assert_eq!( og_activity, @@ -980,7 +1009,15 @@ mod tests { "Stored activity is not the same as the original activity." ); - let new_stored_activity = storage.read_activity(*activity_item.guid())?; + let new_stored_activity = + storage + .read_activity(*activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item.guid().to_string() + ) + })?; assert_eq!( old_activity.guid(), @@ -1054,7 +1091,14 @@ mod tests { ); // Read activity - let stored_activity = storage.read_activity(*activity_item.guid())?; + let stored_activity = storage + .read_activity(*activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item.guid().to_string() + ) + })?; // Make sure the activity is active now, as begin_activity should make it active automatically activity.make_active(); @@ -1096,7 +1140,15 @@ mod tests { UpdateOptions::default(), )?; - let new_stored_activity = storage.read_activity(*activity_item.guid())?; + let new_stored_activity = + storage + .read_activity(*activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item.guid().to_string() + ) + })?; assert_eq!( new_stored_activity.activity().description(), @@ -1186,7 +1238,14 @@ mod tests { assert!(ended_activity.activity().activity_end_options().is_some()); - let ended_activity = storage.read_activity(*activity_item.guid())?; + let ended_activity = storage + .read_activity(*activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item.guid().to_string() + ) + })?; assert!( ended_activity.activity().is_completed(), @@ -1311,7 +1370,14 @@ mod tests { // Begin the second activity, the first one should be ended automatically now let activity_item2 = storage.begin_activity(activity2)?; - let ended_activity = storage.read_activity(*activity_item.guid())?; + let ended_activity = storage + .read_activity(*activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item.guid().to_string() + ) + })?; assert!( ended_activity.activity().is_completed(), @@ -1329,7 +1395,14 @@ mod tests { "End time was not set." ); - let ended_activity2 = storage.read_activity(*activity_item2.guid())?; + let ended_activity2 = storage + .read_activity(*activity_item2.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + activity_item2.guid().to_string() + ) + })?; assert!( ended_activity2.activity().is_in_progress(), @@ -1394,7 +1467,14 @@ mod tests { assert_eq!(intermission_guids.len(), 1, "Intermission was not created."); - let intermission_item = storage.read_activity(intermission_guids[0])?; + let intermission_item = storage + .read_activity(intermission_guids[0])? + .ok_or_else(|| { + format!( + "Intermission with ID {} was not found.", + intermission_guids[0].to_string() + ) + })?; assert_eq!( *intermission_item.activity().kind(), @@ -1446,7 +1526,14 @@ mod tests { .hold_most_recent_active_activity(hold_opts)? .ok_or("Activity was not held.")?; - let held_activity = storage.read_activity(*active_activity_item.guid())?; + let held_activity = storage + .read_activity(*active_activity_item.guid())? + .ok_or_else(|| { + format!( + "Activity with ID {} was not found.", + active_activity_item.guid().to_string() + ) + })?; assert_eq!( *held_activity.activity().status(), @@ -1481,7 +1568,14 @@ mod tests { "Intermission was created again." ); - let intermission_item = storage.read_activity(intermission_guids[0])?; + let intermission_item = storage + .read_activity(intermission_guids[0])? + .ok_or_else(|| { + format!( + "Intermission with ID {} was not found.", + intermission_guids[0].to_string() + ) + })?; assert_eq!( *intermission_item.activity().kind(), @@ -1538,7 +1632,15 @@ mod tests { "Not all intermissions were ended." ); - let ended_intermission = storage.read_activity(intermission_guids[0])?; + let ended_intermission = + storage + .read_activity(intermission_guids[0])? + .ok_or_else(|| { + format!( + "Intermission with ID {} was not found.", + intermission_guids[0].to_string() + ) + })?; assert!( ended_intermission.activity().is_completed(), diff --git a/crates/storage/src/storage/sqlite.rs b/crates/storage/src/storage/sqlite.rs index 3beb2759..cfa6e194 100644 --- a/crates/storage/src/storage/sqlite.rs +++ b/crates/storage/src/storage/sqlite.rs @@ -1,7 +1,7 @@ use std::{collections::BTreeMap, fs::File, path::PathBuf}; // use itertools::Itertools; -use sea_orm::{Database, DatabaseConnection, EntityTrait, ModelTrait}; +use sea_orm::{ConnectionTrait, Database, DatabaseConnection, EntityTrait, ModelTrait}; use tracing::debug; use pace_core::{ @@ -19,17 +19,17 @@ use pace_error::{DatabaseStorageErrorKind, PaceOptResult, PaceResult}; use pace_time::{date::PaceDate, duration::PaceDurationRange, time_range::TimeRangeOptions}; use crate::{ - entity::prelude::Activities, migration::{Migrator, MigratorTrait}, + repository::{Repository, SeaOrmRepository}, runtime, }; #[derive(Debug)] -pub struct DatabaseActivityStorage { +pub struct SQLiteActivityStorage { connection: DatabaseConnection, } -impl DatabaseActivityStorage { +impl SQLiteActivityStorage { /// Create a new database activity storage instance. /// /// # Arguments @@ -79,7 +79,7 @@ impl DatabaseActivityStorage { } } -impl ActivityStorage for DatabaseActivityStorage { +impl ActivityStorage for SQLiteActivityStorage { fn setup(&self) -> PaceResult<()> { runtime().block_on(async { Migrator::up(&self.connection, None) @@ -100,7 +100,7 @@ impl ActivityStorage for DatabaseActivityStorage { } } -impl SyncStorage for DatabaseActivityStorage { +impl SyncStorage for SQLiteActivityStorage { fn sync(&self) -> PaceResult<()> { // We sync activities to the database in each operation // so we don't need to do anything here @@ -109,26 +109,29 @@ impl SyncStorage for DatabaseActivityStorage { } } -impl ActivityReadOps for DatabaseActivityStorage { +impl ActivityReadOps for SQLiteActivityStorage { #[tracing::instrument] - fn read_activity(&self, activity_id: ActivityGuid) -> PaceResult { + fn read_activity(&self, activity_id: ActivityGuid) -> PaceOptResult { runtime().block_on(async { - let Ok(Some(activity)) = Activities::find_by_id(activity_id.to_string()) - .one(&self.connection) - .await - else { - return Err(DatabaseStorageErrorKind::ActivityNotFound { + let repo = SeaOrmRepository::new(&self.connection); + let activity_model = repo + .activity() + .read(&activity_id.to_string()) + .await? + .ok_or_else(|| DatabaseStorageErrorKind::ActivityNotFound { guid: activity_id.to_string(), - } - .into()); - }; + })?; + + unimplemented!("implement read_activity for sqlite"); - // let _description = activity - // .find_related(descriptions::Entity) - // .one(&self.connection) - // .await; + let activity = Activity::builder() + // TODO: Implement conversion from model to activity + ; - todo!("implement read_activity for sqlite"); + let activity_item = ActivityItem::builder() + .guid(activity_id) + .activity(todo!("activity from model")) + .build(); // Ok(ActivityItem::default()) }) @@ -170,7 +173,7 @@ impl ActivityReadOps for DatabaseActivityStorage { } } -impl ActivityWriteOps for DatabaseActivityStorage { +impl ActivityWriteOps for SQLiteActivityStorage { fn create_activity(&self, _activity: Activity) -> PaceResult { // let tx = self.connection.transaction()?; @@ -215,7 +218,7 @@ impl ActivityWriteOps for DatabaseActivityStorage { todo!("implement delete_activity for sqlite") } } -impl ActivityStateManagement for DatabaseActivityStorage { +impl ActivityStateManagement for SQLiteActivityStorage { fn hold_activity( &self, _activity_id: ActivityGuid, @@ -270,7 +273,7 @@ impl ActivityStateManagement for DatabaseActivityStorage { } } -impl ActivityQuerying for DatabaseActivityStorage { +impl ActivityQuerying for SQLiteActivityStorage { fn group_activities_by_duration_range( &self, ) -> PaceOptResult>> {