diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-29 16:07:58 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-29 16:07:58 +0100 |
commit | e7ba3274e27fad755f15465581f5b403c82ab4d2 (patch) | |
tree | f2d693c61786ee6ed027636393fd75f086bd77e8 /server/src/routes/ui/node.rs | |
parent | 5ac3f397b4a28b7bf8b399e73ad0d29e3da45ab0 (diff) | |
download | jellything-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.rs | 112 |
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(), |