Plume/src/routes/mod.rs

118 lines
3.0 KiB
Rust
Raw Normal View History

2018-09-01 22:08:26 +02:00
use atom_syndication::{ContentBuilder, Entry, EntryBuilder, LinkBuilder, Person, PersonBuilder};
use diesel::PgConnection;
use rocket::{
http::uri::{FromUriParam, UriDisplay},
response::NamedFile
};
use std::{
fmt,
path::{Path, PathBuf}
};
2018-05-10 20:01:16 +02:00
2018-09-01 22:08:26 +02:00
use plume_models::posts::Post;
macro_rules! may_fail {
($account:expr, $expr:expr, $template:expr, $msg:expr, | $res:ident | $block:block) => {
{
let res = $expr;
if res.is_some() {
let $res = res.unwrap();
$block
} else {
2018-06-18 19:44:18 +02:00
Template::render(concat!("errors/", $template), json!({
"error_message": $msg,
"account": $account
}))
}
}
};
($account:expr, $expr:expr, $msg:expr, | $res:ident | $block:block) => {
may_fail!($account, $expr, "404", $msg, |$res| {
$block
})
};
($account:expr, $expr:expr, | $res:ident | $block:block) => {
may_fail!($account, $expr, "", |$res| {
$block
})
};
}
const ITEMS_PER_PAGE: i32 = 10;
#[derive(FromForm)]
pub struct Page {
page: i32
}
impl UriDisplay for Page {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "page={}", &self.page as &UriDisplay)
}
}
impl FromUriParam<i32> for Page {
type Target = Page;
fn from_uri_param(num: i32) -> Page {
Page { page: num }
}
}
impl Page {
pub fn first() -> Page {
Page {
page: 1
}
}
2018-07-25 14:29:34 +02:00
/// Computes the total number of pages needed to display n_items
pub fn total(n_items: i32) -> i32 {
if n_items % ITEMS_PER_PAGE == 0 {
n_items / ITEMS_PER_PAGE
} else {
(n_items / ITEMS_PER_PAGE) + 1
}
}
pub fn limits(&self) -> (i32, i32) {
((self.page - 1) * ITEMS_PER_PAGE, self.page * ITEMS_PER_PAGE)
}
}
2018-09-01 22:08:26 +02:00
pub fn post_to_atom(post: Post, conn: &PgConnection) -> Entry {
EntryBuilder::default()
.title(post.title.clone())
.content(ContentBuilder::default()
.value(format!("<![CDATA[{}]]>", *post.content.get()))
.src(post.ap_url.clone())
.content_type("html".to_string())
.build().expect("Atom feed: content error"))
.authors(post.get_authors(&*conn)
.into_iter()
.map(|a| PersonBuilder::default()
.name(a.display_name)
.uri(a.ap_url)
.build().expect("Atom feed: author error"))
.collect::<Vec<Person>>())
.links(vec![LinkBuilder::default().href(post.ap_url).build().expect("Atom feed: link error")])
.build().expect("Atom feed: entry error")
}
2018-04-23 12:54:37 +02:00
pub mod blogs;
2018-05-10 11:44:57 +02:00
pub mod comments;
2018-06-18 17:59:49 +02:00
pub mod errors;
pub mod instance;
2018-05-10 18:38:03 +02:00
pub mod likes;
2018-09-02 22:55:42 +02:00
pub mod medias;
2018-05-13 15:35:55 +02:00
pub mod notifications;
2018-04-23 16:25:39 +02:00
pub mod posts;
2018-05-19 11:51:10 +02:00
pub mod reshares;
2018-04-24 11:21:39 +02:00
pub mod session;
2018-04-22 20:13:12 +02:00
pub mod user;
2018-04-24 10:35:45 +02:00
pub mod well_known;
2018-05-10 20:01:16 +02:00
2018-09-02 22:55:42 +02:00
#[get("/static/<file..>", rank = 2)]
2018-05-10 20:01:16 +02:00
fn static_files(file: PathBuf) -> Option<NamedFile> {
NamedFile::open(Path::new("static/").join(file)).ok()
}