feat: implement image db pagination
parent
51fa92ba3b
commit
39a15bb094
|
@ -7,6 +7,7 @@ use diesel::{
|
||||||
SqliteConnection,
|
SqliteConnection,
|
||||||
};
|
};
|
||||||
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
|
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
use std::{error::Error, fmt, path::Path};
|
use std::{error::Error, fmt, path::Path};
|
||||||
|
|
||||||
|
@ -67,3 +68,19 @@ pub fn initialize_db(path: impl AsRef<Path>, run_migrations: bool) -> Result<DbP
|
||||||
|
|
||||||
Ok(pool)
|
Ok(pool)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Copy, Clone)]
|
||||||
|
#[serde(default)]
|
||||||
|
pub struct Pagination {
|
||||||
|
page: u32,
|
||||||
|
per_page: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Pagination {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
page: 0,
|
||||||
|
per_page: 10,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ use chrono::NaiveDate;
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::db::{schema::*, DbPool, DbResult};
|
use crate::db::{schema::*, DbPool, DbResult, Pagination};
|
||||||
|
|
||||||
#[derive(Serialize, Queryable, Selectable)]
|
#[derive(Serialize, Queryable, Selectable)]
|
||||||
#[diesel(table_name = images)]
|
#[diesel(table_name = images)]
|
||||||
|
@ -25,6 +25,11 @@ pub struct NewImage {
|
||||||
note: Option<String>,
|
note: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Clone, Copy)]
|
||||||
|
pub struct ImageFilter {
|
||||||
|
pub plant_id: Option<i32>,
|
||||||
|
}
|
||||||
|
|
||||||
impl NewImage {
|
impl NewImage {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
plant_id: i32,
|
plant_id: i32,
|
||||||
|
@ -56,4 +61,18 @@ impl Image {
|
||||||
.first(&mut pool.get()?)
|
.first(&mut pool.get()?)
|
||||||
.optional()?)
|
.optional()?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn page(pool: &DbPool, page: Pagination, filter: ImageFilter) -> DbResult<Vec<Self>> {
|
||||||
|
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()?)?)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue