aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/compat/youtube.rs36
-rw-r--r--server/src/main.rs44
-rw-r--r--server/src/routes.rs5
-rw-r--r--server/src/ui/home.rs21
-rw-r--r--server/src/ui/mod.rs2
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;