aboutsummaryrefslogtreecommitdiff
path: root/logic/src/items.rs
diff options
context:
space:
mode:
Diffstat (limited to 'logic/src/items.rs')
-rw-r--r--logic/src/items.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/logic/src/items.rs b/logic/src/items.rs
new file mode 100644
index 0000000..67c45cb
--- /dev/null
+++ b/logic/src/items.rs
@@ -0,0 +1,42 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2025 metamuffin <metamuffin.org>
+*/
+
+use crate::{filter_sort::filter_and_sort_nodes, session::Session};
+use anyhow::Result;
+use jellybase::database::Database;
+use jellycommon::{
+ Visibility,
+ api::{ApiItemsResponse, NodeFilterSort, SortOrder, SortProperty},
+};
+
+pub fn all_items(
+ db: &Database,
+ session: &Session,
+ page: Option<usize>,
+ filter: NodeFilterSort,
+) -> Result<ApiItemsResponse> {
+ let mut items = db.list_nodes_with_udata(session.user.name.as_str())?;
+
+ items.retain(|(n, _)| matches!(n.visibility, Visibility::Visible));
+
+ filter_and_sort_nodes(
+ &filter,
+ (SortProperty::Title, SortOrder::Ascending),
+ &mut items,
+ );
+
+ let page_size = 100;
+ let page = page.unwrap_or(0);
+ let offset = page * page_size;
+ let from = offset.min(items.len());
+ let to = (offset + page_size).min(items.len());
+ let max_page = items.len().div_ceil(page_size);
+ Ok(ApiItemsResponse {
+ count: items.len(),
+ pages: max_page,
+ items: items[from..to].to_vec(),
+ })
+}