album/src/main.rs

199 lines
6.8 KiB
Rust
Raw Normal View History

#[macro_use] extern crate nickel;
2015-11-21 18:21:44 +03:00
#[macro_use] extern crate log;
extern crate env_logger;
2015-11-21 18:21:44 +03:00
extern crate rustorm;
extern crate rustc_serialize;
2015-11-22 15:01:39 +03:00
extern crate typemap;
extern crate plugin;
extern crate image;
extern crate hyper;
extern crate time;
mod models;
2015-11-22 15:01:39 +03:00
use hyper::header::{Expires, HttpDate};
use image::open as image_open;
2015-11-29 20:53:09 +03:00
use image::{FilterType, ImageFormat, GenericImage};
use models::{Photo, Tag, Person, Place, query_for};
use nickel::{MediaType, Nickel, StaticFilesHandler};
use plugin::{Pluggable};
use rustc_serialize::Encodable;
use rustorm::database::{Database};
use std::collections::HashMap;
use time::Duration;
2015-11-21 18:21:44 +03:00
mod env;
use env::dburl;
2015-11-21 18:21:44 +03:00
mod rustormmiddleware;
use rustormmiddleware::{RustormMiddleware, RustormRequestExtensions};
mod requestloggermiddleware;
use requestloggermiddleware::RequestLoggerMiddleware;
#[derive(Debug, Clone, RustcEncodable)]
struct DetailsData {
photo: Photo,
2015-11-28 11:53:12 +03:00
people: Vec<Person>,
places: Vec<Place>,
tags: Vec<Tag>
2015-11-22 15:01:39 +03:00
}
#[derive(Debug, Clone, RustcEncodable)]
struct TagData {
tag: Tag,
photos: Vec<Photo>
}
2015-11-28 11:53:12 +03:00
#[derive(Debug, Clone, RustcEncodable)]
struct PersonData {
person: Person,
photos: Vec<Photo>
}
#[derive(Debug, Clone, RustcEncodable)]
struct PlaceData {
place: Place,
photos: Vec<Photo>
}
2015-11-22 15:01:39 +03:00
fn get_scaled_image(photo: Photo, width: u32, height: u32) -> Vec<u8> {
let path = format!("/home/kaj/Bilder/foto/{}", photo.path);
info!("Should open {}", path);
let img = image_open(path).unwrap();
2015-11-29 20:53:09 +03:00
let img =
if width < img.width() || height < img.height() {
img.resize(width, height, FilterType::Nearest)
} else {
img
};
let img = match photo.rotation {
_x @ 0...44 => img,
_x @ 45...134 => img.rotate90(),
_x @ 135...224 => img.rotate180(),
_x @ 225...314 => img.rotate270(),
_x @ 315...360 => img,
2015-11-29 20:34:54 +03:00
x => {
warn!("Should rotate photo {} deg, which is unsupported", x);
2015-11-29 20:53:09 +03:00
img
2015-11-29 20:34:54 +03:00
}
};
2015-11-22 15:01:39 +03:00
// TODO Put the icon in some kind of cache!
let mut buf : Vec<u8> = Vec::new();
2015-11-29 20:53:09 +03:00
img.save(&mut buf, ImageFormat::JPEG).unwrap();
2015-11-22 15:01:39 +03:00
buf
}
fn main() {
env_logger::init().unwrap();
2015-11-21 18:21:44 +03:00
info!("Initalized logger");
// NOTE pool will need to be mut if we do db writes?
2015-11-22 15:01:39 +03:00
// let pool = ManagedPool::init(&dburl(), 1).unwrap();
2015-11-21 18:21:44 +03:00
info!("Initalized pool");
let mut server = Nickel::new();
server.utilize(RequestLoggerMiddleware);
2015-11-27 01:20:36 +03:00
server.utilize(StaticFilesHandler::new("static/"));
2015-11-22 15:01:39 +03:00
server.utilize(RustormMiddleware::new(&dburl()));
server.utilize(router! {
2015-11-22 15:01:39 +03:00
get "/" => |req, res| {
2015-11-29 22:06:11 +03:00
let photos: Vec<Photo> = query_for::<Photo>()
.filter_gte("grade", &4_i16)
.limit(24)
2015-11-22 15:01:39 +03:00
.collect(req.db_conn()).unwrap();
let mut data = HashMap::new();
2015-11-21 18:21:44 +03:00
data.insert("photos", &photos);
info!("About to render for /");
return res.render("templates/index.tpl", &data);
}
2015-11-22 15:01:39 +03:00
get "/details/:id" => |req, res| {
if let Ok(id) = req.param("id").unwrap().parse::<i32>() {
if let Ok(photo) = req.orm_get::<Photo>("id", &id) {
let people = req.orm_get_related(&photo, "photo_person").unwrap();
let places = req.orm_get_related(&photo, "photo_place").unwrap();
let tags = req.orm_get_related(&photo, "photo_tag").unwrap();
return res.render("templates/details.tpl", &DetailsData {
photo: photo,
2015-11-28 11:53:12 +03:00
people: people,
places: places,
tags: tags
});
}
}
}
2015-11-27 02:02:18 +03:00
get "/tag/" => |req, res| {
let tags: Vec<Tag> = query_for::<Tag>().asc("tag")
.collect(req.db_conn()).unwrap();
let mut data = HashMap::new();
data.insert("tags", &tags);
return res.render("templates/tags.tpl", &data);
}
get "/tag/:tag" => |req, res| {
let slug = req.param("tag").unwrap();
if let Ok(tag) = req.orm_get::<Tag>("slug", &slug) {
let photos = req.orm_get_related(&tag, "photo_tag").unwrap();
return res.render("templates/tag.tpl", &TagData {
tag: tag,
photos: photos
2015-11-28 11:53:12 +03:00
});
}
}
get "/person/" => |req, res| {
let people: Vec<Person> = query_for::<Person>().asc("name")
.collect(req.db_conn()).unwrap();
let mut data = HashMap::new();
data.insert("people", &people);
return res.render("templates/people.tpl", &data);
}
get "/person/:slug" => |req, res| {
let slug = req.param("slug").unwrap();
if let Ok(person) = req.orm_get::<Person>("slug", &slug) {
let photos = req.orm_get_related(&person, "photo_person").unwrap();
2015-11-28 11:53:12 +03:00
return res.render("templates/person.tpl", &PersonData {
person: person,
photos: photos
});
}
}
get "/place/" => |req, res| {
let places: Vec<Place> = query_for::<Place>().asc("place")
.collect(req.db_conn()).unwrap();
let mut data = HashMap::new();
data.insert("places", &places);
return res.render("templates/places.tpl", &data);
}
get "/place/:slug" => |req, res| {
let slug = req.param("slug").unwrap();
if let Ok(place) = req.orm_get::<Place>("slug", &slug) {
let photos = req.orm_get_related(&place, "photo_place").unwrap();
return res.render("templates/place.tpl", &PlaceData {
place: place,
photos: photos
});
}
2015-11-22 15:01:39 +03:00
}
get "/icon/:id" => |req, mut res| {
if let Ok(id) = req.param("id").unwrap().parse::<i32>() {
if let Ok(photo) = req.orm_get::<Photo>("id", &id) {
let buf = get_scaled_image(photo, 200, 180);
res.set(MediaType::Jpeg);
res.set(Expires(HttpDate(time::now() + Duration::days(14))));
return res.send(buf);
}
}
2015-11-22 15:01:39 +03:00
}
get "/view/:id" => |req, mut res| {
if let Ok(id) = req.param("id").unwrap().parse::<i32>() {
if let Ok(photo) = req.orm_get::<Photo>("id", &id) {
let buf = get_scaled_image(photo, 800, 600);
res.set(MediaType::Jpeg);
res.set(Expires(HttpDate(time::now() + Duration::days(14))));
return res.send(buf);
}
}
2015-11-22 15:01:39 +03:00
}
});
server.listen("127.0.0.1:6767");
}