aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-02-19 16:17:13 +0100
committermetamuffin <metamuffin@disroot.org>2023-02-19 16:17:13 +0100
commit3edddb0aea423a6f41da7597aec1836b015bc6bb (patch)
treef1df038aae2a89037f71ae8fc4342b88df3d210d
parent5a1ff49fe38451451a55266e86a9e9aedecfb44d (diff)
downloadjellything-3edddb0aea423a6f41da7597aec1836b015bc6bb.tar
jellything-3edddb0aea423a6f41da7597aec1836b015bc6bb.tar.bz2
jellything-3edddb0aea423a6f41da7597aec1836b015bc6bb.tar.zst
api errors in json
-rw-r--r--common/src/api.rs15
-rw-r--r--common/src/lib.rs1
-rw-r--r--server/src/routes/api/error.rs8
-rw-r--r--server/src/routes/api/mod.rs36
-rw-r--r--server/src/routes/mod.rs4
5 files changed, 48 insertions, 16 deletions
diff --git a/common/src/api.rs b/common/src/api.rs
new file mode 100644
index 0000000..c01053c
--- /dev/null
+++ b/common/src/api.rs
@@ -0,0 +1,15 @@
+use serde::{Deserialize, Serialize};
+use crate::{DirectoryInfo, ItemInfo};
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub enum ApiNode {
+ Directory {
+ identifier: String,
+ info: DirectoryInfo,
+ children: Vec<String>,
+ },
+ Item {
+ identifier: String,
+ info: ItemInfo,
+ },
+}
diff --git a/common/src/lib.rs b/common/src/lib.rs
index 28ce5a8..080e061 100644
--- a/common/src/lib.rs
+++ b/common/src/lib.rs
@@ -1,4 +1,5 @@
pub mod r#impl;
+pub mod api;
use bincode::{Decode, Encode};
use serde::{Deserialize, Serialize};
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,
],
)
}