From 90f174bf5360ede53e4279364ac84bc48b1ffaef Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Thu, 1 Feb 2024 12:10:55 +0100 Subject: [PATCH] sort article list by recently edited first --- src/backend/api/article.rs | 2 +- src/backend/database/article.rs | 8 +++++++- tests/test.rs | 12 ++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/backend/api/article.rs b/src/backend/api/article.rs index 124069d..bcac3c5 100644 --- a/src/backend/api/article.rs +++ b/src/backend/api/article.rs @@ -20,7 +20,7 @@ use axum::Extension; use axum::Form; use axum::Json; use axum_macros::debug_handler; -use chrono::Utc; +use chrono::{Utc}; use diffy::create_patch; /// Create a new article with empty text, and federate it to followers. diff --git a/src/backend/database/article.rs b/src/backend/database/article.rs index d31baeb..d3aa27d 100644 --- a/src/backend/database/article.rs +++ b/src/backend/database/article.rs @@ -6,6 +6,7 @@ use crate::common::EditVersion; use crate::common::{ArticleView, DbArticle}; use activitypub_federation::fetch::collection_id::CollectionId; use activitypub_federation::fetch::object_id::ObjectId; +use diesel::dsl::max; use diesel::pg::PgConnection; use diesel::ExpressionMethods; use diesel::{ @@ -118,9 +119,14 @@ impl DbArticle { .get_result(conn.deref_mut())?) } + /// Read all articles, ordered by most recently edited first. pub fn read_all(only_local: bool, conn: &Mutex) -> MyResult> { let mut conn = conn.lock().unwrap(); - let query = article::table.into_boxed(); + let query = article::table + .inner_join(edit::table) + .group_by(article::dsl::id) + .order_by(max(edit::dsl::created).desc()) + .select(article::all_columns); Ok(if only_local { query .filter(article::dsl::local.eq(true)) diff --git a/tests/test.rs b/tests/test.rs index 956fa3e..b3acf59 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -3,7 +3,7 @@ extern crate ibis_lib; mod common; use crate::common::{TestData, TEST_ARTICLE_DEFAULT_TEXT}; -use ibis_lib::common::{ArticleView, EditArticleData, ForkArticleData, GetArticleData}; +use ibis_lib::common::{ArticleView, EditArticleData, ForkArticleData, GetArticleData, ListArticlesData}; use ibis_lib::common::{CreateArticleData, SearchArticleData}; use ibis_lib::common::{LoginUserData, RegisterUserData}; use ibis_lib::frontend::error::MyResult; @@ -59,11 +59,11 @@ async fn test_create_read_and_edit_local_article() -> MyResult<()> { assert_eq!(1, search_res.len()); assert_eq!(edit_res.article, search_res[0]); - let list_articles = data.alpha.list_articles().await?; - dbg!(&list_articles); - // default main page and article created by this test - assert_eq!(2, list_articles.len()); - assert_eq!(edit_res.article, list_articles[1]); + let list_articles = data.alpha.list_articles(ListArticlesData { + only_local: Some(false), + }).await?; + assert_eq!(1, list_articles.len()); + assert_eq!(edit_res.article, list_articles[0]); data.stop() }