add pagination
parent
482b70e292
commit
ad4cd6b028
29
src/main.rs
29
src/main.rs
|
@ -24,6 +24,7 @@ use std::vec::Vec;
|
|||
use tera::Context;
|
||||
|
||||
const TITLES: [&str; 4] = ["/* {} */", "# {}", "// {}", "<!-- {} -->"];
|
||||
const MAX_POSTS_PER_PAGE: i64 = 20;
|
||||
|
||||
fn establish_connection() -> PgConnection {
|
||||
dotenv().ok();
|
||||
|
@ -32,21 +33,29 @@ fn establish_connection() -> PgConnection {
|
|||
PgConnection::establish(&database_url).expect(&format!("Error connecting to {}", database_url))
|
||||
}
|
||||
|
||||
pub fn get_posts() -> Vec<Post> {
|
||||
fn get_posts(page: i64) -> (Vec<Post>, i64) {
|
||||
use schema::posts::dsl::*;
|
||||
|
||||
let connection = establish_connection();
|
||||
posts
|
||||
let visible_posts = posts
|
||||
.filter(published.eq(true))
|
||||
.limit(20)
|
||||
.limit(MAX_POSTS_PER_PAGE)
|
||||
.offset(MAX_POSTS_PER_PAGE * (page - 1))
|
||||
.load::<Post>(&connection)
|
||||
.expect("Error loading posts")
|
||||
.expect("Error loading posts");
|
||||
|
||||
let number_of_posts: i64 = posts
|
||||
.filter(published.eq(true))
|
||||
.count()
|
||||
.get_result(&connection)
|
||||
.expect("Error counting the posts");
|
||||
|
||||
(visible_posts, number_of_posts)
|
||||
}
|
||||
|
||||
#[get("/?<page>")]
|
||||
fn index(page: Option<i8>) -> Template {
|
||||
let page = page.unwrap_or_else(|| 0);
|
||||
println!("{}", page);
|
||||
let page = page.unwrap_or_else(|| 1);
|
||||
|
||||
let mut context = Context::new();
|
||||
|
||||
|
@ -54,8 +63,14 @@ fn index(page: Option<i8>) -> Template {
|
|||
let title_fmt = TITLES[rng.gen_range(0, TITLES.len())];
|
||||
let title = str::replace(title_fmt, "{}", "CódigoComentado");
|
||||
|
||||
let (posts, n_posts) = get_posts(page as i64);
|
||||
|
||||
let total_pages = (n_posts as f64 / MAX_POSTS_PER_PAGE as f64).ceil() as i64;
|
||||
|
||||
context.insert("title", &title);
|
||||
context.insert("posts", &get_posts());
|
||||
context.insert("posts", &posts);
|
||||
context.insert("total_pages", &total_pages);
|
||||
context.insert("actual_page", &page);
|
||||
Template::render("index", context)
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,14 @@ article figure img {
|
|||
grid-area: info;
|
||||
}
|
||||
|
||||
article strong {
|
||||
strong {
|
||||
font-family: monospace;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
div.pagination {
|
||||
margin-top: 50px;
|
||||
width: auto;
|
||||
height: 3em;
|
||||
text-align: center;
|
||||
}
|
||||
|
|
|
@ -20,4 +20,14 @@
|
|||
</article>
|
||||
</a>
|
||||
{% endfor %}
|
||||
|
||||
{# Pages #}
|
||||
<div class="pagination">
|
||||
<strong>Pages:</strong>
|
||||
[
|
||||
{% for n in range(start=1, end=total_pages+1) %}
|
||||
<a {% if actual_page != n %} href="?page={{ n }}"{% endif %}>página {{ n }}</a>{% if total_pages != n %}, {% endif %}
|
||||
{% endfor %}
|
||||
]
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
|
Loading…
Reference in New Issue