diff options
| author | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2020-05-28 19:58:23 -0400 |
|---|---|---|
| committer | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2020-05-28 19:58:23 -0400 |
| commit | c4939e02b80bf857419a257be316b5f87eae3445 (patch) | |
| tree | 132545095d855a3e55c5a7b997ef4bd9ade129ed /src/main.rs | |
| parent | 2d8035f4724f38875d0f29faa1069772d6aadb79 (diff) | |
Implement per-image information and display.
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/src/main.rs b/src/main.rs index d53d0d0..2a5b440 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,20 +71,25 @@ struct ImageResult { id: i64, filename: String, thumb_filename: String, + orig_filename: String, tags: Vec<String>, } +fn image_store_filename(id: i64, filename: &str) -> String { + if let Some(n) = filename.rfind('.') { + format!("{id}.{ext}", id = id, ext = &filename[n + 1..]) + } else { + id.to_string() + } +} + /// Return the file name of the thumbnail for the image at `filename`. -fn thumb_filename(filename: &str) -> String { - String::from(format!( - "{}_thumb.png", - // Strip extension. - if let Some(n) = filename.rfind('.') { - &filename[..n] - } else { - &filename[..] - } - )) +fn thumb_filename(id: i64, filename: &str) -> String { + if let Some(n) = filename.rfind('.') { + format!("{id}_thumb.{ext}", id = id, ext = &filename[n + 1..]) + } else { + format!("{id}_thumb", id = id) + } } #[get("/posts?<tags>&<last>")] @@ -111,16 +116,31 @@ fn get_posts(conn: SiteState, tags: String, last: Option<i64>) -> Json<Vec<Image .iter() .map(|image| ImageResult { id: image.id, - filename: image.filename.clone(), - thumb_filename: thumb_filename(&image.filename), + filename: image_store_filename(image.id, &image.filename), + thumb_filename: thumb_filename(image.id, &image.filename), + orig_filename: image.filename.clone(), tags: tb.tags_for_image(image.id).unwrap(), }) .collect(), ) } +#[get("/posts/<id>")] +fn get_post(conn: SiteState, id: i64) -> Json<ImageResult> { + let tb = &conn.inner().lock().unwrap().tb; + let image = tb.image_by_id(id).unwrap(); + + Json(ImageResult { + id: image.id, + filename: image_store_filename(image.id, &image.filename), + thumb_filename: thumb_filename(image.id, &image.filename), + orig_filename: image.filename.clone(), + tags: tb.tags_for_image(image.id).unwrap(), + }) +} + #[post("/posts/<filename>", data = "<data>")] -fn put_posts(conn: SiteState, filename: String, data: Data) -> Json<&str> { +fn put_post(conn: SiteState, filename: String, data: Data) -> Json<&str> { let conn = conn.inner().lock().unwrap(); let path = Path::new(&conn.image_dir).join(filename); data.stream_to_file(&path).unwrap(); @@ -181,19 +201,25 @@ fn display_posts(conn: SiteState, tags: String, last: Option<i64>) -> Template { Template::render("index", context) } +#[get("/posts/<id>")] +fn display_post(conn: SiteState, id: i64) -> Template { + Template::render("image", get_post(conn, id).into_inner()) +} + /// Maybe initialize the directory for storing image symlinks and thumbnails. fn create_image_directory(conn: &DatabaseConnection) { fs::create_dir(&conn.image_dir).ok(); for image in conn.tb.images_by_tags(&vec![][..]).unwrap() { let src = Path::new(&image.orig_dir).join(&image.filename); - let dst = Path::new(&conn.image_dir).join(&image.filename); + let dst = image_store_filename(image.id, &image.filename); + let dst = Path::new(&conn.image_dir).join(dst); symlink(&src, &dst).ok(); - let stem = dst.file_stem().unwrap().to_str().unwrap(); - let thumb_path = Path::new(&conn.image_dir).join(&thumb_filename(&stem)); + let thumb_path = thumb_filename(image.id, &image.filename); + let thumb_path = Path::new(&conn.image_dir).join(&thumb_path); if !thumb_path.exists() { - let im = image::open(&Path::new(&src)).unwrap(); + let im = image::open(src).unwrap(); let out = &mut File::create(&thumb_path).unwrap(); im.thumbnail(100, 100) .write_to(out, ImageFormat::Png) @@ -208,8 +234,8 @@ fn main() { rocket::ignite() .mount("/public", StaticFiles::from("./static/")) .mount("/image", StaticFiles::from(&conn.image_dir)) - .mount("/", routes![index, display_posts]) - .mount("/api", routes![get_posts, put_posts]) + .mount("/", routes![index, display_posts, display_post]) + .mount("/api", routes![get_posts, get_post, put_post]) .attach(Template::fairing()) .manage(Mutex::new(conn)) .launch(); |