aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/node.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-29 16:07:58 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-29 16:07:58 +0100
commite7ba3274e27fad755f15465581f5b403c82ab4d2 (patch)
treef2d693c61786ee6ed027636393fd75f086bd77e8 /server/src/routes/ui/node.rs
parent5ac3f397b4a28b7bf8b399e73ad0d29e3da45ab0 (diff)
downloadjellything-e7ba3274e27fad755f15465581f5b403c82ab4d2.tar
jellything-e7ba3274e27fad755f15465581f5b403c82ab4d2.tar.bz2
jellything-e7ba3274e27fad755f15465581f5b403c82ab4d2.tar.zst
prepare database refactor
Diffstat (limited to 'server/src/routes/ui/node.rs')
-rw-r--r--server/src/routes/ui/node.rs112
1 files changed, 50 insertions, 62 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index 40faf5a..88f71b7 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -4,7 +4,10 @@
Copyright (C) 2024 metamuffin <metamuffin.org>
*/
use super::{
- assets::{rocket_uri_macro_r_item_assets, rocket_uri_macro_r_node_thumbnail},
+ assets::{
+ rocket_uri_macro_r_item_backdrop, rocket_uri_macro_r_item_poster,
+ rocket_uri_macro_r_node_thumbnail,
+ },
error::MyResult,
sort::{filter_and_sort_nodes, NodeFilterSort, NodeFilterSortForm, SortOrder, SortProperty},
};
@@ -14,7 +17,7 @@ use crate::{
api::AcceptJson,
ui::{
account::session::Session,
- assets::{rocket_uri_macro_r_person_asset, AssetRole},
+ assets::rocket_uri_macro_r_person_asset,
layout::{DynLayoutPage, LayoutPage},
player::{rocket_uri_macro_r_player, PlayerConfig},
},
@@ -28,12 +31,12 @@ use crate::{
use anyhow::{anyhow, Result};
use chrono::DateTime;
use jellybase::{
- database::{TableExt, T_NODE, T_NODE_EXTENDED, T_USER_NODE},
+ database::{TableExt, T_NODE, T_USER_NODE},
permission::NodePermissionExt,
};
use jellycommon::{
user::{NodeUserData, WatchedState},
- Chapter, ExtendedNode, MediaInfo, NodeKind, NodePublic, PeopleGroup, Rating, SourceTrackKind,
+ Chapter, MediaInfo, Node, NodeKind, PeopleGroup, Rating, SourceTrackKind,
};
use rocket::{get, serde::json::Json, Either, State};
@@ -43,20 +46,6 @@ pub fn r_library_node(id: String) {
drop(id)
}
-#[get("/n/<id>/extended")]
-pub async fn r_library_node_ext<'a>(
- session: Session,
- id: &'a str,
- db: &'a State<DataAcid>,
-) -> MyResult<Json<ExtendedNode>> {
- T_NODE
- .get(db, id)?
- .only_if_permitted(&session.user.permissions)
- .ok_or(anyhow!("node does not exist"))?;
-
- Ok(Json(T_NODE_EXTENDED.get(db, id)?.unwrap_or_default()))
-}
-
#[get("/n/<id>?<filter..>")]
pub async fn r_library_node_filter<'a>(
session: Session,
@@ -64,13 +53,11 @@ pub async fn r_library_node_filter<'a>(
db: &'a State<DataAcid>,
aj: AcceptJson,
filter: NodeFilterSort,
-) -> MyResult<Either<DynLayoutPage<'a>, Json<NodePublic>>> {
+) -> 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"))?
- .public;
- let node_ext = T_NODE_EXTENDED.get(db, id)?.unwrap_or_default();
+ .ok_or(anyhow!("node does not exist"))?;
let udata = T_USER_NODE
.get(db, &(session.user.name.as_str(), id))?
@@ -80,29 +67,29 @@ pub async fn r_library_node_filter<'a>(
return Ok(Either::Right(Json(node)));
}
- let mut children = node
- .children
- .iter()
- .map(|c| db.get_node_with_userdata(c, &session))
- .collect::<anyhow::Result<Vec<_>>>()?
- .into_iter()
- .collect();
+ // let mut children = node
+ // .children
+ // .iter()
+ // .map(|c| db.get_node_with_userdata(c, &session))
+ // .collect::<anyhow::Result<Vec<_>>>()?
+ // .into_iter()
+ // .collect();
- let path = node
- .path
- .iter()
- .map(|c| {
- Ok((
- c.to_owned(),
- T_NODE
- .get(db, c.as_str())?
- .ok_or(anyhow!("parent node missing"))?
- .public,
- ))
- })
- .collect::<anyhow::Result<Vec<_>>>()?
- .into_iter()
- .collect::<Vec<_>>();
+ // let path = node
+ // .path
+ // .iter()
+ // .map(|c| {
+ // Ok((
+ // c.to_owned(),
+ // T_NODE
+ // .get(db, c.as_str())?
+ // .ok_or(anyhow!("parent node missing"))?
+ // .public,
+ // ))
+ // })
+ // .collect::<anyhow::Result<Vec<_>>>()?
+ // .into_iter()
+ // .collect::<Vec<_>>();
filter_and_sort_nodes(
&filter,
@@ -110,25 +97,26 @@ pub async fn r_library_node_filter<'a>(
NodeKind::Channel => (SortProperty::ReleaseDate, SortOrder::Descending),
_ => (SortProperty::Title, SortOrder::Ascending),
},
- &mut children,
+ // TODO
+ &mut Vec::new(),
);
Ok(Either::Left(LayoutPage {
title: node.title.clone().unwrap_or_default(),
content: markup::new! {
- @NodePage { node: &node, id, udata: &udata, children: &children, path: &path, filter: &filter, node_ext: &node_ext }
+ @NodePage { node: &node, id, udata: &udata, children: &[], path: &[], filter: &filter }
},
..Default::default()
}))
}
markup::define! {
- NodeCard<'a>(id: &'a str, node: &'a NodePublic, udata: &'a NodeUserData) {
+ NodeCard<'a>(id: &'a str, 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_assets(id, AssetRole::Poster, Some(1024))), loading="lazy"];
+ img[src=uri!(r_item_poster(id, Some(1024))), loading="lazy"];
}
.cardhover.item {
@if node.media.is_some() {
@@ -149,14 +137,14 @@ markup::define! {
}
}
}
- NodePage<'a>(id: &'a str, node: &'a NodePublic, node_ext: &'a ExtendedNode, udata: &'a NodeUserData, children: &'a [(String, NodePublic, NodeUserData)], path: &'a [(String, NodePublic)], filter: &'a NodeFilterSort) {
+ NodePage<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData, children: &'a [(String, Node, NodeUserData)], path: &'a [(String, Node)], filter: &'a NodeFilterSort) {
@if !matches!(node.kind.unwrap_or_default(), NodeKind::Collection) {
- img.backdrop[src=uri!(r_item_assets(id, AssetRole::Backdrop, Some(2048))), loading="lazy"];
+ img.backdrop[src=uri!(r_item_backdrop(id, Some(2048))), loading="lazy"];
}
.page.node {
@if !matches!(node.kind.unwrap_or_default(), NodeKind::Collection) {
@let cls = format!("bigposter {}", aspect_class(node.kind.unwrap_or_default()));
- div[class=cls] { img[src=uri!(r_item_assets(id, AssetRole::Poster, Some(2048))), loading="lazy"]; }
+ div[class=cls] { img[src=uri!(r_item_poster(id, Some(2048))), loading="lazy"]; }
}
.title {
h1 { @node.title }
@@ -213,16 +201,16 @@ markup::define! {
}}
}}
}
- @if !node_ext.people.is_empty() {
+ @if !node.people.is_empty() {
h2 { "Cast & Crew" }
- @for (group, people) in &node_ext.people {
+ @for (group, people) in &node.people {
details[open=group==&PeopleGroup::Cast] {
summary { h3 { @format!("{}", group) } }
ul.children.hlist { @for (i, pe) in people.iter().enumerate() {
li { .card."aspect-port" {
.poster {
a[href="#"] {
- img[src=&uri!(r_person_asset(id, i, group, Some(1024))), loading="lazy"];
+ img[src=&uri!(r_person_asset(id, i, group.to_string(), Some(1024))), loading="lazy"];
}
}
.title {
@@ -265,7 +253,7 @@ markup::define! {
}
}
- Props<'a>(node: &'a NodePublic, udata: &'a NodeUserData, full: bool) {
+ Props<'a>(node: &'a Node, udata: &'a NodeUserData, full: bool) {
.props {
@if let Some(m) = &node.media {
p { @format_duration(m.duration) }
@@ -278,9 +266,10 @@ markup::define! {
@DateTime::from_timestamp_millis(*d).unwrap().date_naive().to_string()
}}
}
- @if !node.children.is_empty() {
- p { @format!("{} items", node.children.len()) }
- }
+ // TODO
+ // @if !node.children.is_empty() {
+ // p { @format!("{} items", node.children.len()) }
+ // }
@for (kind, value) in &node.ratings {
@match kind {
Rating::YoutubeLikes => {p{ @format_count(*value as usize) " Likes" }}
@@ -337,21 +326,20 @@ pub trait DatabaseNodeUserDataExt {
&self,
id: &str,
session: &Session,
- ) -> Result<(String, NodePublic, NodeUserData)>;
+ ) -> Result<(String, Node, NodeUserData)>;
}
impl DatabaseNodeUserDataExt for DataAcid {
fn get_node_with_userdata(
&self,
id: &str,
session: &Session,
- ) -> Result<(String, NodePublic, NodeUserData)> {
+ ) -> Result<(String, 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}"))?
- .public,
+ .ok_or(anyhow!("node does not exist: {id}"))?,
T_USER_NODE
.get(self, &(session.user.name.as_str(), id))?
.unwrap_or_default(),