diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/routes/api/error.rs | 8 | ||||
-rw-r--r-- | server/src/routes/api/mod.rs | 36 | ||||
-rw-r--r-- | server/src/routes/mod.rs | 4 |
3 files changed, 32 insertions, 16 deletions
diff --git a/server/src/routes/api/error.rs b/server/src/routes/api/error.rs index ef5374c..9630f94 100644 --- a/server/src/routes/api/error.rs +++ b/server/src/routes/api/error.rs @@ -1,13 +1,17 @@ // TODO: Slightâ„¢ code duplication with `ui/error.rs` +use crate::routes::ui::error::MyError; use rocket::{ response::{self, Responder}, - Request, + Request, http::Status, catch, }; use serde_json::{json, Value}; use std::fmt::Display; -use crate::routes::ui::error::MyError; +#[catch(default)] +pub fn r_api_catch<'a>(status: Status, _request: &Request) -> Value { + json!({ "error": format!("{status}") }) +} pub type ApiResult<T> = Result<T, ApiError>; diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs index 5f48873..06c38cf 100644 --- a/server/src/routes/api/mod.rs +++ b/server/src/routes/api/mod.rs @@ -9,9 +9,15 @@ use crate::{ routes::{api::error::ApiResult, ui::account::session::Session}, }; use anyhow::Context; -use rocket::{get, http::CookieJar, post, serde::json::Json, State}; +use jellycommon::api::ApiNode; +use rocket::{get, http::CookieJar, post, response::Redirect, serde::json::Json, State}; use serde_json::{json, Value}; +#[get("/api")] +pub fn r_api_root() -> Redirect { + Redirect::moved("https://codeberg.org/metamuffin/jellything/src/branch/master/api.md") +} + #[get("/api/version")] pub fn r_api_version() -> &'static str { "1" @@ -32,20 +38,24 @@ pub fn r_api_library_node( _sess: Session, path: PathBuf, library: &State<Library>, -) -> ApiResult<Value> { +) -> ApiResult<Json<ApiNode>> { let node = library .nested_path(&path) .context("retrieving library node")?; - match node.as_ref() { - Node::Directory(d) => Ok(json!({ - "identifier": d.identifier, - "info": d.info, - "children": d.children.iter().map(|c| c.identifier().to_string()).collect::<Vec<_>>() - })), - Node::Item(i) => Ok(json!({ - "identifier": i.identifier, - "info": i.info, - })), - } + Ok(Json(match node.as_ref() { + Node::Directory(d) => ApiNode::Directory { + identifier: d.identifier.clone(), + info: d.info.clone(), + children: d + .children + .iter() + .map(|c| c.identifier().to_string()) + .collect::<Vec<_>>(), + }, + Node::Item(i) => ApiNode::Item { + identifier: i.identifier.clone(), + info: i.info.clone(), + }, + })) } diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs index 421907b..54d4ae0 100644 --- a/server/src/routes/mod.rs +++ b/server/src/routes/mod.rs @@ -4,7 +4,7 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ use crate::{database::Database, library::Library, routes::ui::error::MyResult, CONF}; -use api::{r_api_account_login, r_api_version, r_api_library_node}; +use api::{error::r_api_catch, r_api_account_login, r_api_library_node, r_api_root, r_api_version}; use jellyremuxer::RemuxerContext; use rocket::{ catchers, config::SecretKey, fairing::AdHoc, fs::FileServer, get, http::Header, routes, Build, @@ -55,6 +55,7 @@ pub fn build_rocket( Box::pin(async {}) })) .register("/", catchers![r_catch]) + .register("/api", catchers![r_api_catch]) .mount("/assets", FileServer::from(&CONF.asset_path)) .mount( "/", @@ -83,6 +84,7 @@ pub fn build_rocket( r_api_version, r_api_account_login, r_api_library_node, + r_api_root, ], ) } |