feat: add image models

image-uploads
Jef Roosens 2025-01-16 21:06:06 +01:00
parent 3568365c6f
commit c10b9baa95
Signed by: Jef Roosens
GPG Key ID: 02D4C0997E74717B
7 changed files with 95 additions and 2 deletions

33
Cargo.lock generated
View File

@ -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"

View File

@ -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"] }

View File

@ -0,0 +1 @@
drop table images;

View File

@ -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
);

View File

@ -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<String>,
}
#[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<String>,
}
impl NewImage {
pub fn insert(self, pool: &DbPool) -> DbResult<Image> {
Ok(self
.insert_into(images::table)
.returning(Image::as_returning())
.get_result(&mut pool.get()?)?)
}
}

View File

@ -2,3 +2,4 @@ pub mod event;
pub mod plant;
pub mod session;
pub mod user;
pub mod image;

View File

@ -10,6 +10,15 @@ diesel::table! {
}
}
diesel::table! {
images (id) {
id -> Integer,
plant_id -> Integer,
date_taken -> Date,
note -> Nullable<Text>,
}
}
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,
);