diff --git a/src/db/mod.rs b/src/db/mod.rs index 69a37ad..0081462 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -12,7 +12,7 @@ use serde::Deserialize; use std::{error::Error, fmt, path::Path}; pub use models::event::{Event, NewEvent, EVENT_TYPES}; -pub use models::image::{Image, NewImage}; +pub use models::image::{Image, ImageFilter, NewImage}; pub use models::plant::{NewPlant, Plant}; pub use models::session::Session; pub use models::user::{NewUser, User}; diff --git a/src/server/images.rs b/src/server/images.rs index 3f1a1e9..957f587 100644 --- a/src/server/images.rs +++ b/src/server/images.rs @@ -1,14 +1,16 @@ use axum::{ - extract::{DefaultBodyLimit, Multipart, Path, Request, State}, + extract::{DefaultBodyLimit, Multipart, Path, Query, Request, State}, handler::Handler, + http::HeaderMap, response::{Html, IntoResponse}, - routing::{get, post}, + routing::get, Router, }; use chrono::NaiveDate; use futures::TryStreamExt; use image::{codecs::jpeg::JpegEncoder, ImageReader}; use mime::Mime; +use tera::Context; use tokio_util::io::StreamReader; use tower::ServiceExt; use tower_http::services::ServeFile; @@ -17,7 +19,7 @@ use std::{io::BufWriter, path::PathBuf}; use super::error::AppError; use crate::{ - db::{Image, NewImage}, + db::{self, Image, NewImage, Pagination}, IMG_DIR, }; @@ -27,7 +29,7 @@ pub fn app() -> axum::Router { Router::new() .route( "/", - post(post_image.layer(DefaultBodyLimit::max(1024 * 1024 * 20))), + get(get_images).post(post_image.layer(DefaultBodyLimit::max(1024 * 1024 * 20))), ) .route("/{id}/original", get(get_image_original)) .route("/{id}/thumb", get(get_image_thumb)) @@ -58,6 +60,27 @@ async fn get_image( Ok(ServeFile::new_with_mime(path, &mime).oneshot(req).await) } +async fn get_images( + State(ctx): State, + Query(page): Query, + Query(filter): Query, + headers: HeaderMap, +) -> super::Result> { + let images = tokio::task::spawn_blocking(move || db::Image::page(&ctx.pool, page, filter)) + .await + .unwrap()?; + + let mut context = Context::new(); + context.insert("images", &images); + + Ok(Html(super::render_view( + &ctx.tera, + "views/images.html", + &context, + &headers, + )?)) +} + async fn get_image_original( State(ctx): State, Path(id): Path, diff --git a/templates/views/images.html b/templates/views/images.html new file mode 100644 index 0000000..972c23a --- /dev/null +++ b/templates/views/images.html @@ -0,0 +1,10 @@ +

Images

+{% for image in images %} +
+

Date taken: {{ image.date_taken }}

+

Note: {{ image.note }}

+ + + +
+{% endfor %}