diff options
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/compat/youtube.rs | 36 | ||||
| -rw-r--r-- | server/src/main.rs | 44 | ||||
| -rw-r--r-- | server/src/routes.rs | 5 | ||||
| -rw-r--r-- | server/src/ui/home.rs | 21 | ||||
| -rw-r--r-- | server/src/ui/mod.rs | 2 |
5 files changed, 79 insertions, 29 deletions
diff --git a/server/src/compat/youtube.rs b/server/src/compat/youtube.rs index e511d9b..2ed0406 100644 --- a/server/src/compat/youtube.rs +++ b/server/src/compat/youtube.rs @@ -4,19 +4,37 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ use crate::{request_info::RequestInfo, ui::error::MyResult}; +use anyhow::anyhow; +use jellycommon::{ + IDENT_YOUTUBE_VIDEO, NO_IDENTIFIERS, NO_SLUG, jellyobject::Path, routes::u_node_id, +}; +use jellydb::{Filter, Query, Sort}; use rocket::{get, response::Redirect}; #[get("/watch?<v>")] pub fn r_youtube_watch(ri: RequestInfo<'_>, v: &str) -> MyResult<Redirect> { - // if v.len() != 11 { - // Err(anyhow!("video id length incorrect"))? - // } - // let Some(id) = get_node_by_eid(&session.0, IdentifierType::YoutubeVideo, v)? else { - // Err(anyhow!("element not found"))? - // }; - // let slug = node_id_to_slug(&session.0, id)?; - // Ok(Redirect::to(u_node_slug_player(&slug))) - todo!() + if v.len() != 11 { + Err(anyhow!("video id length incorrect"))? + } + let mut res = None; + ri.state.database.transaction(&mut |txn| { + if let Some(row) = txn.query_single(Query { + filter: Filter::Match( + Path(vec![NO_IDENTIFIERS.0, IDENT_YOUTUBE_VIDEO.0]), + v.as_bytes().to_vec(), + ), + sort: Sort::None, + })? { + res = txn.get(row)?; + } + Ok(()) + })?; + let node = res.ok_or(anyhow!("video not found"))?; + let slug = node + .as_object() + .get(NO_SLUG) + .ok_or(anyhow!("node has no slug"))?; + Ok(Redirect::found(u_node_id(slug))) } #[get("/channel/<id>")] diff --git a/server/src/main.rs b/server/src/main.rs index db02c29..c481eec 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -7,10 +7,17 @@ #![allow(clippy::needless_borrows_for_generic_args)] #![recursion_limit = "4096"] -use crate::{auth::token::SessionKey, logger::setup_logger}; +use crate::{ + auth::{hash_password, token::SessionKey}, + logger::setup_logger, +}; use anyhow::{Result, anyhow}; use jellycache::Cache; -use jellydb::Database; +use jellycommon::{ + TAGREG, USER_LOGIN, USER_PASSWORD, + jellyobject::{ObjectBuffer, Path}, +}; +use jellydb::{Database, Filter, Query, Sort}; use log::{error, info}; use routes::build_rocket; use serde::Deserialize; @@ -29,6 +36,7 @@ pub mod ui; #[rocket::main] async fn main() { setup_logger(); + jellydb::DEBUG_TAGREG.set(TAGREG.clone()).ok().unwrap(); let state = match create_state() { Ok(s) => s, @@ -58,6 +66,7 @@ pub struct State { pub struct Config { pub ui: jellyui::Config, pub session_key: String, + pub admin_password: String, pub asset_path: PathBuf, pub database_path: PathBuf, pub cache_path: PathBuf, @@ -73,12 +82,37 @@ pub fn create_state() -> Result<Arc<State>> { let config: Config = serde_yaml_ng::from_str(&read_to_string(config_path)?)?; let cache_storage = jellykv::rocksdb::new(&config.cache_path)?; - let db_storage = jellykv::rocksdb::new(&config.database_path)?; + // let db_storage = jellykv::rocksdb::new(&config.database_path)?; + let db_storage = jellykv::memory::new(); - Ok(Arc::new(State { + let state = Arc::new(State { cache: Cache::new(Box::new(cache_storage), config.max_memory_cache_size), database: Arc::new(db_storage), session_key: SessionKey::parse(&config.session_key)?, config, - })) + }); + + create_admin_user(&state)?; + + Ok(state) +} + +fn create_admin_user(state: &State) -> Result<()> { + state.database.transaction(&mut |txn| { + let admin_row = txn.query_single(Query { + filter: Filter::Match(Path(vec![USER_LOGIN.0]), "admin".as_bytes().to_vec()), + sort: Sort::None, + })?; + if admin_row.is_none() { + info!("Creating new admin user"); + let pwhash = hash_password("admin", &state.config.admin_password); + txn.insert(ObjectBuffer::new(&mut [ + (USER_LOGIN.0, &"admin"), + (USER_PASSWORD.0, &pwhash.as_slice()), + ]))?; + } + + Ok(()) + })?; + Ok(()) } diff --git a/server/src/routes.rs b/server/src/routes.rs index 4744561..adbf6e0 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -15,9 +15,10 @@ use crate::{ account::{r_account_login, r_account_login_post, r_account_logout, r_account_logout_post}, assets::r_image, error::{r_api_catch, r_catch}, + home::r_home, node::r_node, r_favicon, - style::{r_assets_font, r_assets_js, r_assets_js_map, r_assets_css}, + style::{r_assets_css, r_assets_font, r_assets_js, r_assets_js_map}, }, }; use rocket::{ @@ -93,7 +94,7 @@ pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> { r_assets_js, r_assets_css, r_favicon, - // r_home, + r_home, // r_index, // r_item_poster, r_node, diff --git a/server/src/ui/home.rs b/server/src/ui/home.rs index 4e9fd28..e9136ec 100644 --- a/server/src/ui/home.rs +++ b/server/src/ui/home.rs @@ -5,18 +5,15 @@ */ use super::error::MyResult; -use rocket::{get, response::content::RawHtml, serde::json::Json, Either}; +use crate::request_info::RequestInfo; +use jellycommon::jellyobject::ObjectBuffer; +use jellyui::render_view; +use rocket::{Either, get, response::content::RawHtml, serde::json::Json}; #[get("/home")] -pub fn r_home(ri: RequestInfo) -> MyResult<Either<RawHtml<String>, Json<ApiHomeResponse>>> { - let r = jellylogic::home::home(&ri.session)?; - - Ok(if matches!(ri.accept, Accept::Json) { - Either::Right(Json(r)) - } else { - Either::Left(RawHtml(render_page( - &HomePage { lang: &ri.lang, r }, - ri.render_info(), - ))) - }) +pub fn r_home(ri: RequestInfo<'_>) -> MyResult<RawHtml<String>> { + Ok(RawHtml(render_view( + ri.render_info(), + ObjectBuffer::new(&mut []).as_object(), + ))) } diff --git a/server/src/ui/mod.rs b/server/src/ui/mod.rs index 55fad6a..112bb6b 100644 --- a/server/src/ui/mod.rs +++ b/server/src/ui/mod.rs @@ -14,7 +14,7 @@ pub mod account; // pub mod admin; pub mod assets; pub mod error; -// pub mod home; +pub mod home; // pub mod items; pub mod node; // pub mod player; |