List posts

This commit is contained in:
finga 2021-04-14 17:07:10 +02:00
parent 4948195495
commit 099bcaadc6
6 changed files with 142 additions and 8 deletions

View file

@ -535,6 +535,83 @@
} }
#+END_SRC #+END_SRC
**** Create a template to list all posts
***** Add a template for the index page ~templates/index.html.tera~
#+BEGIN_SRC html
{% extends "base" %}
{% block content %}
<h1>simple text board</h1>
<h2>index</h2>
<ul>
{% for post in posts %}
<li>{{ loop.index }} - <a href="post/{{ post.id }}">{{ post.title }}</a> - {{ post.author }}</li>
{% endfor %}
</ul>
{% endblock content %}
#+END_SRC
***** Add serde dependencies to ~Cargo.toml~
#+BEGIN_SRC toml
chrono = { version = "0.4", features = ["serde"] }
...
serde = { version = "1.0", features = ["derive"] }
#+END_SRC
***** Add `Post` to ~src/models.rs~
#+BEGIN_SRC rust
...
use diesel::{QueryResult, RunQueryDsl, SqliteConnection};
use serde::Serialize;
...
#[derive(Debug, Queryable, Serialize)]
pub struct Post {
pub id: i32,
pub parent: Option<i32>,
pub timestamp: NaiveDateTime,
pub author: String,
pub email: String,
pub title: String,
pub content: String,
}
impl Post {
pub fn get_all(connection: &SqliteConnection) -> QueryResult<Vec<Post>> {
posts::table.load::<Post>(connection)
}
}
#+END_SRC
***** Add index template in ~src/main.rs~
#+BEGIN_SRC rust
...
use serde::Serialize;
...
use models::{NewPost, Post};
...
#[derive(Serialize)]
struct Posts {
posts: Vec<Post>,
}
#[get("/")]
fn index(conn: DbCon) -> Template {
Template::render(
"index",
Posts {
posts: Post::get_all(&conn).unwrap(),
},
)
}
#+END_SRC
* Conclusion * Conclusion
** What did we do? ** What did we do?

View file

@ -195,6 +195,7 @@ dependencies = [
"libc", "libc",
"num-integer", "num-integer",
"num-traits", "num-traits",
"serde",
"time", "time",
"winapi 0.3.9", "winapi 0.3.9",
] ]
@ -1124,6 +1125,20 @@ name = "serde"
version = "1.0.119" version = "1.0.119"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bdd36f49e35b61d49efd8aa7fc068fd295961fd2286d0b2ee9a4c7a14e99cc3" checksum = "9bdd36f49e35b61d49efd8aa7fc068fd295961fd2286d0b2ee9a4c7a14e99cc3"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.119"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552954ce79a059ddd5fd68c271592374bd15cab2274970380c000118aeffe1cd"
dependencies = [
"proc-macro2 1.0.24",
"quote 1.0.8",
"syn 1.0.58",
]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
@ -1169,6 +1184,7 @@ dependencies = [
"log 0.4.13", "log 0.4.13",
"rocket", "rocket",
"rocket_contrib", "rocket_contrib",
"serde",
] ]
[[package]] [[package]]

View file

@ -6,9 +6,10 @@ edition = "2018"
[dependencies] [dependencies]
rocket = "0.4" rocket = "0.4"
chrono = "0.4" chrono = { version = "0.4", features = ["serde"] }
diesel = { version = "1.4", features = ["sqlite", "chrono"] } diesel = { version = "1.4", features = ["sqlite", "chrono"] }
log = "0.4" log = "0.4"
serde = { version = "1.0", features = ["derive"] }
[dependencies.rocket_contrib] [dependencies.rocket_contrib]
version = "0.4" version = "0.4"

View file

@ -15,11 +15,12 @@ use rocket::{
routes, uri, FromForm, routes, uri, FromForm,
}; };
use rocket_contrib::{database, templates::Template}; use rocket_contrib::{database, templates::Template};
use serde::Serialize;
mod models; mod models;
mod schema; mod schema;
use models::NewPost; use models::{NewPost, Post};
#[database("sqlite")] #[database("sqlite")]
struct DbCon(SqliteConnection); struct DbCon(SqliteConnection);
@ -32,6 +33,21 @@ struct PostForm {
content: String, content: String,
} }
#[derive(Serialize)]
struct Posts {
posts: Vec<Post>,
}
#[get("/")]
fn index(conn: DbCon) -> Template {
Template::render(
"index",
Posts {
posts: Post::get_all(&conn).unwrap(),
},
)
}
#[get("/create")] #[get("/create")]
fn create_form(flash: Option<FlashMessage>) -> Template { fn create_form(flash: Option<FlashMessage>) -> Template {
let mut context = HashMap::new(); let mut context = HashMap::new();
@ -73,11 +89,6 @@ fn create_post(
} }
} }
#[get("/")]
fn index() -> &'static str {
"Hello, world!"
}
fn main() { fn main() {
rocket::ignite() rocket::ignite()
.mount("/", routes![index, create_form, create_post]) .mount("/", routes![index, create_form, create_post])

View file

@ -1,6 +1,7 @@
use crate::schema::posts::{self, dsl::posts as table_posts}; use crate::schema::posts::{self, dsl::posts as table_posts};
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use diesel::{QueryResult, RunQueryDsl}; use diesel::{QueryResult, RunQueryDsl, SqliteConnection};
use serde::Serialize;
#[derive(Insertable)] #[derive(Insertable)]
#[table_name = "posts"] #[table_name = "posts"]
@ -18,3 +19,20 @@ impl NewPost<'_> {
diesel::insert_into(table_posts).values(self).execute(conn) diesel::insert_into(table_posts).values(self).execute(conn)
} }
} }
#[derive(Debug, Queryable, Serialize)]
pub struct Post {
pub id: i32,
pub parent: Option<i32>,
pub timestamp: NaiveDateTime,
pub author: String,
pub email: String,
pub title: String,
pub content: String,
}
impl Post {
pub fn get_all(connection: &SqliteConnection) -> QueryResult<Vec<Post>> {
posts::table.load::<Post>(connection)
}
}

View file

@ -0,0 +1,11 @@
{% extends "base" %}
{% block content %}
<h1>simple text board</h1>
<h2>index</h2>
<ul>
{% for post in posts %}
<li>{{ loop.index }} - <a href="post/{{ post.id }}">{{ post.title }}</a> - {{ post.author }}</li>
{% endfor %}
</ul>
{% endblock content %}