From c10b9baa954869aec49da83fac2a4f13dc879901 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Thu, 16 Jan 2025 21:06:06 +0100 Subject: [PATCH] feat: add image models --- Cargo.lock | 33 ++++++++++++++++++++ Cargo.toml | 2 +- migrations/2025-01-16-195902_images/down.sql | 1 + migrations/2025-01-16-195902_images/up.sql | 9 ++++++ src/db/models/image.rs | 33 ++++++++++++++++++++ src/db/models/mod.rs | 1 + src/db/schema.rs | 18 ++++++++++- 7 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 migrations/2025-01-16-195902_images/down.sql create mode 100644 migrations/2025-01-16-195902_images/up.sql create mode 100644 src/db/models/image.rs diff --git a/Cargo.lock b/Cargo.lock index b8e8b6c..0116774 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,6 +157,7 @@ dependencies = [ "matchit", "memchr", "mime", + "multer", "percent-encoding", "pin-project-lite", "rustversion", @@ -634,6 +635,15 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1053,6 +1063,23 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1533,6 +1560,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "strsim" version = "0.11.1" diff --git a/Cargo.toml b/Cargo.toml index e9f74fc..43b4206 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ name = "calathea" [dependencies] argon2 = "0.5.3" -axum = { version = "0.8.0", features = ["macros"] } +axum = { version = "0.8.0", features = ["macros", "multipart"] } axum-extra = { version = "0.10.0", features = ["cookie"] } chrono = { version = "0.4.39", features = ["serde"] } clap = { version = "4.5.26", features = ["derive", "env"] } diff --git a/migrations/2025-01-16-195902_images/down.sql b/migrations/2025-01-16-195902_images/down.sql new file mode 100644 index 0000000..8d6aff9 --- /dev/null +++ b/migrations/2025-01-16-195902_images/down.sql @@ -0,0 +1 @@ +drop table images; diff --git a/migrations/2025-01-16-195902_images/up.sql b/migrations/2025-01-16-195902_images/up.sql new file mode 100644 index 0000000..191ca73 --- /dev/null +++ b/migrations/2025-01-16-195902_images/up.sql @@ -0,0 +1,9 @@ +create table images ( + id integer primary key not null, + plant_id integer not null + references plants (id) + -- Keep entries in the database so the files can be removed later + on delete set null, + date_taken date not null, + note text +); diff --git a/src/db/models/image.rs b/src/db/models/image.rs new file mode 100644 index 0000000..ae188c6 --- /dev/null +++ b/src/db/models/image.rs @@ -0,0 +1,33 @@ +use diesel::prelude::*; +use serde::{Deserialize, Serialize}; +use chrono::NaiveDate; + +use crate::db::{schema::*, DbPool, DbResult}; + +#[derive(Serialize, Queryable, Selectable)] +#[diesel(table_name = images)] +#[diesel(check_for_backend(diesel::sqlite::Sqlite))] +pub struct Image { + id: i32, + plant_id: i32, + date_taken: NaiveDate, + note: Option, +} + +#[derive(Deserialize, Insertable)] +#[diesel(table_name = images)] +#[diesel(check_for_backend(diesel::sqlite::Sqlite))] +pub struct NewImage { + plant_id: i32, + date_taken: NaiveDate, + note: Option, +} + +impl NewImage { + pub fn insert(self, pool: &DbPool) -> DbResult { + Ok(self + .insert_into(images::table) + .returning(Image::as_returning()) + .get_result(&mut pool.get()?)?) + } +} diff --git a/src/db/models/mod.rs b/src/db/models/mod.rs index 983ea02..0b3e098 100644 --- a/src/db/models/mod.rs +++ b/src/db/models/mod.rs @@ -2,3 +2,4 @@ pub mod event; pub mod plant; pub mod session; pub mod user; +pub mod image; diff --git a/src/db/schema.rs b/src/db/schema.rs index 256f915..71db738 100644 --- a/src/db/schema.rs +++ b/src/db/schema.rs @@ -10,6 +10,15 @@ diesel::table! { } } +diesel::table! { + images (id) { + id -> Integer, + plant_id -> Integer, + date_taken -> Date, + note -> Nullable, + } +} + diesel::table! { plants (id) { id -> Integer, @@ -36,6 +45,13 @@ diesel::table! { } diesel::joinable!(events -> plants (plant_id)); +diesel::joinable!(images -> plants (plant_id)); diesel::joinable!(sessions -> users (user_id)); -diesel::allow_tables_to_appear_in_same_query!(events, plants, sessions, users,); +diesel::allow_tables_to_appear_in_same_query!( + events, + images, + plants, + sessions, + users, +);