From c19c8981d2386f6e16de32d6638fba2d6c524613 Mon Sep 17 00:00:00 2001 From: suri-codes Date: Sun, 29 Mar 2026 09:39:34 -0700 Subject: [PATCH] fix: date's are now all local --- Cargo.lock | 3 --- Cargo.toml | 1 - .../src/m20260318_233726_group_table.rs | 4 ++-- .../src/m20260319_002245_task_table.rs | 8 +++---- .../src/m20260323_002518_zettel_table.rs | 4 ++-- crates/dto/src/entity/group.rs | 17 ++++++++++++--- crates/dto/src/entity/prelude.rs | 2 +- crates/dto/src/entity/task.rs | 21 ++++++++++++++----- crates/dto/src/entity/zettel.rs | 18 ++++++++++++---- crates/dto/src/lib.rs | 2 +- src/types/frontmatter.rs | 21 ++++++++----------- src/types/group.rs | 6 +++--- src/types/task.rs | 10 ++++----- src/types/zettel.rs | 6 +++--- 14 files changed, 74 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d1b1e86..39a5a5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1210,10 +1210,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", - "js-sys", "num-traits", "serde", - "wasm-bindgen", "windows-link 0.2.1", ] @@ -2243,7 +2241,6 @@ version = "0.1.0" dependencies = [ "anyhow", "better-panic", - "chrono", "clap", "color-eyre", "crossterm", diff --git a/Cargo.toml b/Cargo.toml index c4cf730..9122607 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,7 +74,6 @@ clap = { version = "4.5.60", features = ["derive", "cargo", "wrap_help", "unicod kdl = "6.5.0" dto = {path="./crates/dto"} eframe = "0.34.1" -chrono = {version="0.4.41", features=["serde"]} [build-dependencies] anyhow = "1.0.102" diff --git a/crates/dto/migration/src/m20260318_233726_group_table.rs b/crates/dto/migration/src/m20260318_233726_group_table.rs index ad91067..a66db47 100644 --- a/crates/dto/migration/src/m20260318_233726_group_table.rs +++ b/crates/dto/migration/src/m20260318_233726_group_table.rs @@ -31,8 +31,8 @@ impl MigrationTrait for Migration { .not_null() .default(Priority::default().to_string()), ) - .col(timestamp(Group::CreatedAt).default(Expr::current_timestamp())) - .col(timestamp(Group::ModifiedAt).default(Expr::current_timestamp())) + .col(date_time(Group::CreatedAt).default(Expr::current_timestamp())) + .col(date_time(Group::ModifiedAt).default(Expr::current_timestamp())) .col(string(Group::ZettelId).not_null().unique_key()) // foreign key for the zettel related to this group .foreign_key( diff --git a/crates/dto/migration/src/m20260319_002245_task_table.rs b/crates/dto/migration/src/m20260319_002245_task_table.rs index 35e2222..1737b73 100644 --- a/crates/dto/migration/src/m20260319_002245_task_table.rs +++ b/crates/dto/migration/src/m20260319_002245_task_table.rs @@ -30,10 +30,10 @@ impl MigrationTrait for Migration { .not_null() .default(Priority::default().to_string()), ) - .col(timestamp(Task::Due).null()) - .col(timestamp(Task::FinishedAt).null()) - .col(timestamp(Task::CreatedAt).default(Expr::current_timestamp())) - .col(timestamp(Task::ModifiedAt).default(Expr::current_timestamp())) + .col(date_time(Task::Due).null()) + .col(date_time(Task::FinishedAt).null()) + .col(date_time(Task::CreatedAt).default(Expr::current_timestamp())) + .col(date_time(Task::ModifiedAt).default(Expr::current_timestamp())) .col(string(Task::ZettelId).not_null().unique_key()) // foreign key for the zettel related to this task .foreign_key( diff --git a/crates/dto/migration/src/m20260323_002518_zettel_table.rs b/crates/dto/migration/src/m20260323_002518_zettel_table.rs index cd31e8d..800b355 100644 --- a/crates/dto/migration/src/m20260323_002518_zettel_table.rs +++ b/crates/dto/migration/src/m20260323_002518_zettel_table.rs @@ -22,8 +22,8 @@ impl MigrationTrait for Migration { ) .col(string(Zettel::Title).not_null()) .col(string(Zettel::FilePath).not_null()) - .col(timestamp(Zettel::CreatedAt).default(Expr::current_timestamp())) - .col(timestamp(Zettel::ModifiedAt).default(Expr::current_timestamp())) + .col(date_time(Zettel::CreatedAt).default(Expr::current_timestamp())) + .col(date_time(Zettel::ModifiedAt).default(Expr::current_timestamp())) .to_owned(), ) .await?; diff --git a/crates/dto/src/entity/group.rs b/crates/dto/src/entity/group.rs index 6750394..131eee5 100644 --- a/crates/dto/src/entity/group.rs +++ b/crates/dto/src/entity/group.rs @@ -1,8 +1,9 @@ //! `SeaORM` Entity, @generated by sea-orm-codegen 2.0 +use migration::prelude::Local; use migration::types::*; -use sea_orm::entity::prelude::*; use sea_orm::ActiveValue::Set; +use sea_orm::entity::prelude::*; use std::future::ready; use std::pin::Pin; @@ -17,8 +18,8 @@ pub struct Model { pub name: String, pub color: Color, pub priority: Priority, - pub created_at: DateTimeUtc, - pub modified_at: DateTimeUtc, + pub created_at: DateTime, + pub modified_at: DateTime, #[sea_orm(unique)] pub zettel_id: NanoId, pub parent_group_id: Option, @@ -54,6 +55,16 @@ impl ActiveModelBehavior for ActiveModel { Self: Send + 'async_trait, 'life0: 'async_trait, { + let now = Local::now().naive_local(); + + // set modified at + self.modified_at = Set(now); + + // we set the timestamp to non-utc + if insert && self.created_at.is_not_set() { + self.created_at = Set(now); + } + if insert && self.nano_id.is_not_set() { self.nano_id = Set(NanoId::default()); } diff --git a/crates/dto/src/entity/prelude.rs b/crates/dto/src/entity/prelude.rs index ef214b3..de2c434 100644 --- a/crates/dto/src/entity/prelude.rs +++ b/crates/dto/src/entity/prelude.rs @@ -1,6 +1,6 @@ //! `SeaORM` Entity, @generated by sea-orm-codegen 2.0 -#![expect(unused_imports)] +#![expect(unused_imports)] pub use super::group::Entity as Group; pub use super::tag::Entity as Tag; pub use super::task::Entity as Task; diff --git a/crates/dto/src/entity/task.rs b/crates/dto/src/entity/task.rs index 28408b8..3bf9550 100644 --- a/crates/dto/src/entity/task.rs +++ b/crates/dto/src/entity/task.rs @@ -1,8 +1,9 @@ //! `SeaORM` Entity, @generated by sea-orm-codegen 2.0 +use migration::prelude::Local; use migration::types::*; -use sea_orm::entity::prelude::*; use sea_orm::ActiveValue::Set; +use sea_orm::entity::prelude::*; use std::future::ready; use std::pin::Pin; @@ -16,10 +17,10 @@ pub struct Model { pub nano_id: NanoId, pub name: String, pub priority: Priority, - pub due: Option, - pub finished_at: Option, - pub created_at: DateTimeUtc, - pub modified_at: DateTimeUtc, + pub due: Option, + pub finished_at: Option, + pub created_at: DateTime, + pub modified_at: DateTime, #[sea_orm(unique)] pub zettel_id: NanoId, pub group_id: NanoId, @@ -52,6 +53,16 @@ impl ActiveModelBehavior for ActiveModel { Self: Send + 'async_trait, 'life0: 'async_trait, { + let now = Local::now().naive_local(); + + // set modified at + self.modified_at = Set(now); + + // we set the timestamp to non-utc + if insert && self.created_at.is_not_set() { + self.created_at = Set(now); + } + if insert && self.nano_id.is_not_set() { self.nano_id = Set(NanoId::default()); } diff --git a/crates/dto/src/entity/zettel.rs b/crates/dto/src/entity/zettel.rs index 10cd5e9..2a98089 100644 --- a/crates/dto/src/entity/zettel.rs +++ b/crates/dto/src/entity/zettel.rs @@ -1,8 +1,8 @@ //! `SeaORM` Entity, @generated by sea-orm-codegen 2.0 -use migration::types::*; -use sea_orm::entity::prelude::*; +use migration::{prelude::Local, types::*}; use sea_orm::ActiveValue::Set; +use sea_orm::entity::prelude::*; use std::{future::ready, pin::Pin}; #[sea_orm::model] @@ -16,8 +16,8 @@ pub struct Model { pub nano_id: NanoId, pub title: String, pub file_path: String, - pub created_at: DateTimeUtc, - pub modified_at: DateTimeUtc, + pub created_at: DateTime, + pub modified_at: DateTime, #[sea_orm(has_one)] pub group: HasOne, #[sea_orm(has_one)] @@ -37,6 +37,16 @@ impl ActiveModelBehavior for ActiveModel { Self: Send + 'async_trait, 'life0: 'async_trait, { + let now = Local::now().naive_local(); + + // set modified at + self.modified_at = Set(now); + + // we set the timestamp to non-utc + if insert && self.created_at.is_not_set() { + self.created_at = Set(now); + } + if insert && self.nano_id.is_not_set() { self.nano_id = Set(NanoId::default()); } diff --git a/crates/dto/src/lib.rs b/crates/dto/src/lib.rs index bdd6791..f88de67 100644 --- a/crates/dto/src/lib.rs +++ b/crates/dto/src/lib.rs @@ -15,7 +15,7 @@ pub use migration::types::NanoId; /// and add additional functionality to it. pub use migration::types::Priority as PriorityDTO; -pub use sea_orm::entity::prelude::DateTimeUtc; +pub use sea_orm::entity::prelude::DateTime; /// Color type, exporting as DTO because I might /// want to newtype wrap this, might not have to, depending diff --git a/src/types/frontmatter.rs b/src/types/frontmatter.rs index f23fed2..a93d129 100644 --- a/src/types/frontmatter.rs +++ b/src/types/frontmatter.rs @@ -1,23 +1,25 @@ use std::{fmt::Display, path::Path}; -use chrono::{NaiveDateTime, format::StrftimeItems}; +// use chrono::format::StrftimeItems; use color_eyre::eyre::{Result, eyre}; use serde::{Deserialize, Serialize}; use tokio::fs; +use dto::DateTime; + const DATE_FMT_STR: &str = "%Y-%m-%d %I:%M:%S %p"; #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Serialize, Deserialize)] pub struct FrontMatter { pub title: String, - pub created_at: NaiveDateTime, + pub created_at: DateTime, pub tag_strings: Vec, } impl FrontMatter { pub fn new( title: impl Into, - created_at: NaiveDateTime, + created_at: DateTime, tag_strings: Vec>, ) -> Self { let tag_strings = tag_strings.into_iter().map(Into::into).collect(); @@ -85,7 +87,7 @@ impl FrontMatter { .ok_or_else(|| eyre!("Date line doesn't exist!".to_owned()))? .strip_prefix("Date: ") .ok_or_else(|| eyre!("Date line doesn't start with \"Date: \" ".to_owned(),)) - .map(|date_str| NaiveDateTime::parse_from_str(date_str, DATE_FMT_STR))? + .map(|date_str| DateTime::parse_from_str(date_str, DATE_FMT_STR))? .map_err(|err| eyre!(err.to_string()))?; let tag_strings: Vec = lines @@ -107,14 +109,9 @@ impl FrontMatter { impl Display for FrontMatter { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let date_fmt_items = StrftimeItems::new(DATE_FMT_STR); writeln!(f, "---")?; writeln!(f, "Title: {}", self.title)?; - writeln!( - f, - "Date: {}", - self.created_at.format_with_items(date_fmt_items) - )?; + writeln!(f, "Date: {}", self.created_at.format(DATE_FMT_STR))?; write!(f, "Tags: ")?; for tag in &self.tag_strings { @@ -128,7 +125,7 @@ impl Display for FrontMatter { #[cfg(test)] mod tests { - use chrono::NaiveDateTime; + use dto::DateTime; use crate::types::{FrontMatter, frontmatter::DATE_FMT_STR}; @@ -146,7 +143,7 @@ Tags: whoa barber ( FrontMatter::new( "LOL", - NaiveDateTime::parse_from_str("2025-01-01 12:50:19 AM", DATE_FMT_STR).unwrap(), + DateTime::parse_from_str("2025-01-01 12:50:19 AM", DATE_FMT_STR).unwrap(), vec!["whoa", "barber"], ), "", diff --git a/src/types/group.rs b/src/types/group.rs index ef7c6b6..7286b67 100644 --- a/src/types/group.rs +++ b/src/types/group.rs @@ -1,4 +1,4 @@ -use dto::{DateTimeUtc, GroupModelEx, NanoId}; +use dto::{DateTime, GroupModelEx, NanoId}; use crate::types::{Color, Priority, Zettel}; @@ -13,8 +13,8 @@ pub struct Group { pub name: String, pub color: Color, pub priority: Priority, - pub created_at: DateTimeUtc, - pub modified_at: DateTimeUtc, + pub created_at: DateTime, + pub modified_at: DateTime, /// The `Zettel` that is related to this `Group`. /// Can store notes regarding this group in /// the `Zettel` diff --git a/src/types/task.rs b/src/types/task.rs index 3c88ab3..7f9d2f5 100644 --- a/src/types/task.rs +++ b/src/types/task.rs @@ -1,4 +1,4 @@ -use dto::{DateTimeUtc, NanoId, TaskModelEx}; +use dto::{ DateTime, NanoId, TaskModelEx}; use crate::types::{Group, Priority, Zettel}; @@ -12,10 +12,10 @@ pub struct Task { pub id: NanoId, pub name: String, pub priority: Priority, - pub due: Option, - pub finished_at: Option, - pub created_at: DateTimeUtc, - pub modified_at: DateTimeUtc, + pub due: Option, + pub finished_at: Option, + pub created_at: DateTime, + pub modified_at: DateTime, /// Each task has its own related `Zettel`. pub zettel: Zettel, pub group: Group, diff --git a/src/types/zettel.rs b/src/types/zettel.rs index 4a87cd0..0b1cd8b 100644 --- a/src/types/zettel.rs +++ b/src/types/zettel.rs @@ -1,4 +1,4 @@ -use dto::{DateTimeUtc, TagEntity, ZettelActiveModel, ZettelEntity, ZettelModelEx}; +use dto::{DateTime, TagEntity, ZettelActiveModel, ZettelEntity, ZettelModelEx}; use std::path::PathBuf; use color_eyre::eyre::Result; @@ -19,7 +19,7 @@ pub struct Zettel { pub title: String, /// a workspace-local file path, needs to be canonicalized before usage pub file_path: PathBuf, - pub created_at: DateTimeUtc, + pub created_at: DateTime, pub tags: Vec, } @@ -54,7 +54,7 @@ impl Zettel { let front_matter = FrontMatter::new( title, - zettel.created_at.naive_local(), + zettel.created_at, zettel.tags.iter().map(|t| t.name.clone()).collect(), ); -- 2.51.2