From fd694cd75cc43342b9548221de688fe3b34e89f4 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 12 Apr 2024 21:32:21 +0000 Subject: [PATCH] Add message timestamps (#41) Resolves #38 Reviewed-on: https://git.vilunov.me/lavina/lavina/pulls/41 Co-authored-by: Mikhail Co-committed-by: Mikhail --- .pre-commit-config.yaml | 21 ++++++ Cargo.lock | 68 +++++++++++++++++++ crates/lavina-core/Cargo.toml | 1 + .../migrations/2_created_at_for_messages.sql | 1 + crates/lavina-core/src/repo/mod.rs | 5 +- docs/cheatsheet.md | 7 +- 6 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 crates/lavina-core/migrations/2_created_at_for_messages.sql diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0393234 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-toml + - id: end-of-file-fixer + - id: fix-byte-order-marker + - id: mixed-line-ending + - id: trailing-whitespace + + - repo: local + hooks: + - id: fmt + name: fmt + description: Format + entry: cargo fmt + language: system + args: + - --all + types: [ rust ] + pass_filenames: false diff --git a/Cargo.lock b/Cargo.lock index e37a3dc..93eac0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,6 +45,21 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.13" @@ -216,6 +231,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.4", +] + [[package]] name = "clap" version = "4.5.3" @@ -274,6 +303,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpufeatures" version = "0.2.12" @@ -729,6 +764,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.5.0" @@ -818,6 +876,7 @@ name = "lavina-core" version = "0.0.2-dev" dependencies = [ "anyhow", + "chrono", "prometheus", "serde", "sqlx", @@ -2383,6 +2442,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/crates/lavina-core/Cargo.toml b/crates/lavina-core/Cargo.toml index 727835c..941b753 100644 --- a/crates/lavina-core/Cargo.toml +++ b/crates/lavina-core/Cargo.toml @@ -10,3 +10,4 @@ serde.workspace = true tokio.workspace = true tracing.workspace = true prometheus.workspace = true +chrono = "0.4.37" diff --git a/crates/lavina-core/migrations/2_created_at_for_messages.sql b/crates/lavina-core/migrations/2_created_at_for_messages.sql new file mode 100644 index 0000000..c11430a --- /dev/null +++ b/crates/lavina-core/migrations/2_created_at_for_messages.sql @@ -0,0 +1 @@ +alter table messages add column created_at text; \ No newline at end of file diff --git a/crates/lavina-core/src/repo/mod.rs b/crates/lavina-core/src/repo/mod.rs index d81ec0c..e9eee6c 100644 --- a/crates/lavina-core/src/repo/mod.rs +++ b/crates/lavina-core/src/repo/mod.rs @@ -87,14 +87,15 @@ impl Storage { return Err(anyhow!("No such user")); }; sqlx::query( - "insert into messages(room_id, id, content, author_id) - values (?, ?, ?, ?); + "insert into messages(room_id, id, content, author_id, created_at) + values (?, ?, ?, ?, ?); update rooms set message_count = message_count + 1 where id = ?;", ) .bind(room_id) .bind(id) .bind(content) .bind(author_id) + .bind(chrono::Utc::now().to_string()) .bind(room_id) .execute(&mut *executor) .await?; diff --git a/docs/cheatsheet.md b/docs/cheatsheet.md index 1ef20d0..ec9f63f 100644 --- a/docs/cheatsheet.md +++ b/docs/cheatsheet.md @@ -8,11 +8,12 @@ Some useful commands for development and testing. Following commands require `OpenSSL` to be installed. It is provided as `openssl` package in Arch Linux. -Generate self-signed TLS certificate: +Generate self-signed TLS certificate. Mind the common name (CN) field, it should match the domain name of the server. +Example for localhost: openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -noenc \ -keyout certs/xmpp.key -out certs/xmpp.pem \ - -subj "/CN=example.com" + -subj "/CN=localhost" Print content of a TLS certificate: @@ -35,4 +36,4 @@ Connecting: Password should be the same as in storage. Example: - /connect -nocap 127.0.0.1 6667 parolchik1 kek \ No newline at end of file + /connect -nocap 127.0.0.1 6667 parolchik1 kek