aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/node.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-29 18:03:06 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-29 18:03:06 +0100
commitdb511d3fe50f05329615f718515fab1b80d9e06a (patch)
tree7969fea01be100cbe4385ad13a14940a987ac513 /server/src/routes/ui/node.rs
parent82e8a55a1496ae9132e13e7286fe1c0d57d586d3 (diff)
downloadjellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar
jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar.bz2
jellything-db511d3fe50f05329615f718515fab1b80d9e06a.tar.zst
no direct redb access
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r--server/src/routes/ui/node.rs62
1 files changed, 24 insertions, 38 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index 3307d50..5cc8a2f 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -1,3 +1,5 @@
+use std::sync::Arc;
+
/*
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.
@@ -12,7 +14,7 @@ use super::{
sort::{filter_and_sort_nodes, NodeFilterSort, NodeFilterSortForm, SortOrder, SortProperty},
};
use crate::{
- database::DataAcid,
+ database::Database,
routes::{
api::AcceptJson,
ui::{
@@ -30,13 +32,9 @@ use crate::{
};
use anyhow::{anyhow, Result};
use chrono::DateTime;
-use jellybase::{
- database::{TableExt, T_NODE, T_USER_NODE},
- permission::NodePermissionExt,
-};
use jellycommon::{
user::{NodeUserData, WatchedState},
- Chapter, MediaInfo, Node, NodeKind, PeopleGroup, Rating, SourceTrackKind,
+ Chapter, MediaInfo, Node, NodeID, NodeKind, PeopleGroup, Rating, SourceTrackKind,
};
use rocket::{get, serde::json::Json, Either, State};
@@ -50,21 +48,14 @@ pub fn r_library_node(id: String) {
pub async fn r_library_node_filter<'a>(
session: Session,
id: &'a str,
- db: &'a State<DataAcid>,
+ db: &'a State<Database>,
aj: AcceptJson,
filter: NodeFilterSort,
) -> MyResult<Either<DynLayoutPage<'a>, Json<Node>>> {
- let node = T_NODE
- .get(db, id)?
- .only_if_permitted(&session.user.permissions)
- .ok_or(anyhow!("node does not exist"))?;
-
- let udata = T_USER_NODE
- .get(db, &(session.user.name.as_str(), id))?
- .unwrap_or_default();
+ let (node, udata) = db.get_node_with_userdata(NodeID::from_slug(id), &session)?;
if *aj {
- return Ok(Either::Right(Json(node)));
+ return Ok(Either::Right(Json((*node).clone())));
}
// let mut children = node
@@ -111,22 +102,22 @@ pub async fn r_library_node_filter<'a>(
}
markup::define! {
- NodeCard<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData) {
+ NodeCard<'a>(node: &'a Node, udata: &'a NodeUserData) {
@let cls = format!("node card poster {}", aspect_class(node.kind.unwrap_or_default()));
div[class=cls] {
.poster {
- a[href=uri!(r_library_node(id))] {
- img[src=uri!(r_item_poster(id, Some(1024))), loading="lazy"];
+ a[href=uri!(r_library_node(&node.slug))] {
+ img[src=uri!(r_item_poster(&node.slug, Some(1024))), loading="lazy"];
}
.cardhover.item {
@if node.media.is_some() {
- a.play.icon[href=&uri!(r_player(id, PlayerConfig::default()))] { "play_arrow" }
+ a.play.icon[href=&uri!(r_player(&node.slug, PlayerConfig::default()))] { "play_arrow" }
}
@Props { node, udata, full: false }
}
}
div.title {
- a[href=uri!(r_library_node(id))] {
+ a[href=uri!(r_library_node(&node.slug))] {
@node.title
}
}
@@ -137,7 +128,7 @@ markup::define! {
}
}
}
- NodePage<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData, children: &'a [(String, Node, NodeUserData)], path: &'a [(String, Node)], filter: &'a NodeFilterSort) {
+ NodePage<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData, children: &'a [(Arc<Node>, NodeUserData)], path: &'a [(String, Node)], filter: &'a NodeFilterSort) {
@if !matches!(node.kind.unwrap_or_default(), NodeKind::Collection) {
img.backdrop[src=uri!(r_item_backdrop(id, Some(2048))), loading="lazy"];
}
@@ -240,13 +231,13 @@ markup::define! {
}
@match node.kind.unwrap_or_default() {
NodeKind::Show | NodeKind::Series | NodeKind::Season => {
- ol { @for (id, c, _) in children.iter() {
- li { a[href=uri!(r_library_node(id))] { @c.title } }
+ ol { @for (c, _) in children.iter() {
+ li { a[href=uri!(r_library_node(&c.slug))] { @c.title } }
}}
}
NodeKind::Collection | NodeKind::Channel | _ => {
- ul.children {@for (id, node, udata) in children.iter() {
- li { @NodeCard { id, node, udata } }
+ ul.children {@for (node, udata) in children.iter() {
+ li { @NodeCard { node, udata } }
}}
}
}
@@ -324,24 +315,19 @@ pub fn format_duration(mut d: f64) -> String {
pub trait DatabaseNodeUserDataExt {
fn get_node_with_userdata(
&self,
- id: &str,
+ id: NodeID,
session: &Session,
- ) -> Result<(String, Node, NodeUserData)>;
+ ) -> Result<(Arc<Node>, NodeUserData)>;
}
-impl DatabaseNodeUserDataExt for DataAcid {
+impl DatabaseNodeUserDataExt for Database {
fn get_node_with_userdata(
&self,
- id: &str,
+ id: NodeID,
session: &Session,
- ) -> Result<(String, Node, NodeUserData)> {
+ ) -> Result<(Arc<Node>, NodeUserData)> {
Ok((
- id.to_owned(),
- T_NODE
- .get(self, id)?
- .only_if_permitted(&session.user.permissions)
- .ok_or(anyhow!("node does not exist: {id}"))?,
- T_USER_NODE
- .get(self, &(session.user.name.as_str(), id))?
+ self.get_node(id)?.ok_or(anyhow!("node does not exist"))?,
+ self.get_node_udata(id, &session.user.name)?
.unwrap_or_default(),
))
}