diff --git a/src/models/posts.rs b/src/models/posts.rs index 188197aa..9a2f1d01 100644 --- a/src/models/posts.rs +++ b/src/models/posts.rs @@ -77,6 +77,25 @@ impl Post { .expect("Error loading recent posts") } + pub fn get_recents_for_author(conn: &PgConnection, author: &User, limit: i64) -> Vec { + use schema::post_authors; + + let posts = PostAuthor::belonging_to(author).select(post_authors::post_id); + posts::table.filter(posts::id.eq(any(posts))) + .order(posts::creation_date.desc()) + .limit(limit) + .load::(conn) + .expect("Error loading recent posts for author") + } + + pub fn get_recents_for_blog(conn: &PgConnection, blog: &Blog, limit: i64) -> Vec { + posts::table.filter(posts::blog_id.eq(blog.id)) + .order(posts::creation_date.desc()) + .limit(limit) + .load::(conn) + .expect("Error loading recent posts for blog") + } + pub fn get_authors(&self, conn: &PgConnection) -> Vec { use schema::users; use schema::post_authors; diff --git a/src/routes/blogs.rs b/src/routes/blogs.rs index ef774421..83b3c33f 100644 --- a/src/routes/blogs.rs +++ b/src/routes/blogs.rs @@ -1,24 +1,35 @@ use rocket::request::Form; use rocket::response::Redirect; use rocket_contrib::Template; -use std::collections::HashMap; +use serde_json; use activity_pub::ActivityPub; use activity_pub::actor::Actor; +use activity_pub::object::Object; use activity_pub::outbox::Outbox; use db_conn::DbConn; use models::blog_authors::*; use models::blogs::*; use models::instance::Instance; +use models::posts::Post; use models::users::User; use utils; #[get("/~/", rank = 2)] fn details(name: String, conn: DbConn, user: Option) -> Template { - let blog = Blog::find_by_actor_id(&*conn, name).unwrap(); + let blog = Blog::find_by_actor_id(&*conn, name).unwrap(); + let recents = Post::get_recents_for_blog(&*conn, &blog, 5); Template::render("blogs/details", json!({ "blog": blog, - "account": user + "account": user, + "recents": recents.into_iter().map(|p| { + json!({ + "post": p, + "author": p.get_authors(&*conn)[0], + "url": p.compute_id(&*conn), + "date": p.creation_date.timestamp() + }) + }).collect::>() })) } diff --git a/src/routes/posts.rs b/src/routes/posts.rs index ddd8224c..e98d9e39 100644 --- a/src/routes/posts.rs +++ b/src/routes/posts.rs @@ -3,7 +3,6 @@ use rocket::request::Form; use rocket::response::Redirect; use rocket_contrib::Template; use serde_json; -use std::collections::HashMap; use activity_pub::{context, activity_pub, ActivityPub}; use activity_pub::activity::Create; diff --git a/src/routes/session.rs b/src/routes/session.rs index 2adf7336..721d8575 100644 --- a/src/routes/session.rs +++ b/src/routes/session.rs @@ -3,7 +3,6 @@ use rocket::response::Redirect; use rocket::response::status::NotFound; use rocket::request::Form; use rocket_contrib::Template; -use std::collections::HashMap; use db_conn::DbConn; use models::users::{User, AUTH_COOKIE}; diff --git a/src/routes/user.rs b/src/routes/user.rs index 16061dc1..7c15e419 100644 --- a/src/routes/user.rs +++ b/src/routes/user.rs @@ -2,15 +2,16 @@ use rocket::request::Form; use rocket::response::Redirect; use rocket_contrib::Template; use serde_json; -use std::collections::HashMap; use activity_pub::{activity, activity_pub, ActivityPub, context}; use activity_pub::actor::Actor; use activity_pub::inbox::Inbox; +use activity_pub::object::Object; use activity_pub::outbox::Outbox; use db_conn::DbConn; use models::follows::*; use models::instance::Instance; +use models::posts::Post; use models::users::*; #[get("/me")] @@ -21,9 +22,18 @@ fn me(user: User) -> Redirect { #[get("/@/", rank = 2)] fn details(name: String, conn: DbConn, account: Option) -> Template { let user = User::find_by_fqn(&*conn, name).unwrap(); + let recents = Post::get_recents_for_author(&*conn, &user, 5); Template::render("users/details", json!({ "user": serde_json::to_value(user).unwrap(), - "account": account + "account": account, + "recents": recents.into_iter().map(|p| { + json!({ + "post": p, + "author": p.get_authors(&*conn)[0], + "url": p.compute_id(&*conn), + "date": p.creation_date.timestamp() + }) + }).collect::>() })) } diff --git a/templates/blogs/details.tera b/templates/blogs/details.tera index c875a1bb..6274c4f7 100644 --- a/templates/blogs/details.tera +++ b/templates/blogs/details.tera @@ -5,6 +5,15 @@ {% endblock title %} {% block content %} -

{{ blog.title }} (~{{ blog.actor_id }})

-

{{ blog.summary }}

+

{{ blog.title }} (~{{ blog.actor_id }})

+

{{ blog.summary }}

+ +

Latest articles

+ {% for article in recents %} +
+

{{ article.post.title }}

+

{{ article.post.content | escape | truncate(length=200) }}…

+

By {{ article.author.display_name }} ⋅ {{ article.date | date(format="%B %e") }}

+
+ {% endfor %} {% endblock content %} diff --git a/templates/users/details.tera b/templates/users/details.tera index 2cfa16eb..717d41e4 100644 --- a/templates/users/details.tera +++ b/templates/users/details.tera @@ -9,4 +9,13 @@
{{ user.summary | safe }}
+ +

Latest articles

+{% for article in recents %} +
+

{{ article.post.title }}

+

{{ article.post.content | escape | truncate(length=200) }}…

+

By {{ article.author.display_name }} ⋅ {{ article.date | date(format="%B %e") }}

+
+{% endfor %} {% endblock content %}