diff --git a/src/db/mod.rs b/src/db/mod.rs index 8e8711e..69a37ad 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -7,6 +7,7 @@ use diesel::{ SqliteConnection, }; use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; +use serde::Deserialize; use std::{error::Error, fmt, path::Path}; @@ -67,3 +68,19 @@ pub fn initialize_db(path: impl AsRef, run_migrations: bool) -> Result Self { + Self { + page: 0, + per_page: 10, + } + } +} diff --git a/src/db/models/image.rs b/src/db/models/image.rs index c7e6309..159f1a0 100644 --- a/src/db/models/image.rs +++ b/src/db/models/image.rs @@ -2,7 +2,7 @@ use chrono::NaiveDate; use diesel::prelude::*; use serde::{Deserialize, Serialize}; -use crate::db::{schema::*, DbPool, DbResult}; +use crate::db::{schema::*, DbPool, DbResult, Pagination}; #[derive(Serialize, Queryable, Selectable)] #[diesel(table_name = images)] @@ -25,6 +25,11 @@ pub struct NewImage { note: Option, } +#[derive(Deserialize, Clone, Copy)] +pub struct ImageFilter { + pub plant_id: Option, +} + impl NewImage { pub fn new( plant_id: i32, @@ -56,4 +61,18 @@ impl Image { .first(&mut pool.get()?) .optional()?) } + + pub fn page(pool: &DbPool, page: Pagination, filter: ImageFilter) -> DbResult> { + let mut query = images::table.select(Self::as_select()).into_boxed(); + + if let Some(plant_id) = filter.plant_id { + query = query.filter(images::dsl::plant_id.eq(plant_id)); + } + + Ok(query + .order_by((images::dsl::date_taken.desc(), images::dsl::id.desc())) + .offset((page.page * page.per_page).into()) + .limit(page.per_page.into()) + .get_results(&mut pool.get()?)?) + } }