Utoipa hello world wip

This commit is contained in:
Antoine Gersant 2025-01-13 20:05:32 -08:00
parent d47fffae4f
commit 1b142b1855
7 changed files with 243 additions and 32 deletions

241
Cargo.lock generated
View file

@ -59,6 +59,15 @@ dependencies = [
"byteorder",
]
[[package]]
name = "arbitrary"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
dependencies = [
"derive_arbitrary",
]
[[package]]
name = "arrayvec"
version = "0.7.4"
@ -290,7 +299,7 @@ checksum = "a539389a13af092cd345a2b47ae7dec12deb306d660b2223d25cd3419b253ebe"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -325,6 +334,12 @@ dependencies = [
"orion",
]
[[package]]
name = "bumpalo"
version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "bytecount"
version = "0.6.8"
@ -516,6 +531,17 @@ dependencies = [
"powerfmt",
]
[[package]]
name = "derive_arbitrary"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
]
[[package]]
name = "diff"
version = "0.1.13"
@ -541,7 +567,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -591,7 +617,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -1154,7 +1180,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -1202,6 +1228,7 @@ checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
dependencies = [
"equivalent",
"hashbrown",
"serde",
]
[[package]]
@ -1327,6 +1354,12 @@ dependencies = [
"scopeguard",
]
[[package]]
name = "lockfree-object-pool"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e"
[[package]]
name = "log"
version = "0.4.22"
@ -1421,7 +1454,7 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "348bdc7300502f0801e5b57c448815713cd843b744ef9bda252a2698fdf90a0f"
dependencies = [
"thiserror",
"thiserror 1.0.63",
]
[[package]]
@ -1476,7 +1509,7 @@ dependencies = [
"semver",
"serde",
"skeptic",
"thiserror",
"thiserror 1.0.63",
]
[[package]]
@ -1486,7 +1519,7 @@ source = "git+https://github.com/vincent-herlemont/native_db#6daae43c5461e5944f0
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -1500,7 +1533,7 @@ dependencies = [
"native_model_macro",
"serde",
"skeptic",
"thiserror",
"thiserror 1.0.63",
"zerocopy",
]
@ -1512,7 +1545,7 @@ checksum = "35ade955118c8776435064b3c0e95b75e89867ed19eaaf6709a2f3eea9c46420"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -1682,6 +1715,12 @@ dependencies = [
"subtle",
]
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pbkdf2"
version = "0.11.0"
@ -1717,7 +1756,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -1800,7 +1839,7 @@ dependencies = [
"serde_json",
"simplelog",
"symphonia",
"thiserror",
"thiserror 1.0.63",
"tinyvec",
"tokio",
"tokio-util",
@ -1810,6 +1849,9 @@ dependencies = [
"trie-rs",
"unicase",
"ureq",
"utoipa",
"utoipa-axum",
"utoipa-swagger-ui",
"winres",
]
@ -1858,9 +1900,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.86"
version = "1.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
dependencies = [
"unicode-ident",
]
@ -2007,7 +2049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9838134a2bfaa8e1f40738fcc972ac799de6e0e06b5157acb95fc2b05a0ea283"
dependencies = [
"lazy_static",
"thiserror",
"thiserror 1.0.63",
]
[[package]]
@ -2039,6 +2081,40 @@ dependencies = [
"smallvec",
]
[[package]]
name = "rust-embed"
version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0"
dependencies = [
"rust-embed-impl",
"rust-embed-utils",
"walkdir",
]
[[package]]
name = "rust-embed-impl"
version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478"
dependencies = [
"proc-macro2",
"quote",
"rust-embed-utils",
"syn 2.0.96",
"walkdir",
]
[[package]]
name = "rust-embed-utils"
version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d"
dependencies = [
"sha2",
"walkdir",
]
[[package]]
name = "rust-multipart-rfc7578_2"
version = "0.6.1"
@ -2052,7 +2128,7 @@ dependencies = [
"mime",
"mime_guess",
"rand",
"thiserror",
"thiserror 1.0.63",
]
[[package]]
@ -2189,7 +2265,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -2560,9 +2636,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.72"
version = "2.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
dependencies = [
"proc-macro2",
"quote",
@ -2583,7 +2659,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -2614,7 +2690,16 @@ version = "1.0.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724"
dependencies = [
"thiserror-impl",
"thiserror-impl 1.0.63",
]
[[package]]
name = "thiserror"
version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
dependencies = [
"thiserror-impl 2.0.11",
]
[[package]]
@ -2625,7 +2710,18 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
name = "thiserror-impl"
version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
]
[[package]]
@ -2711,7 +2807,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -2972,6 +3068,68 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "utoipa"
version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0"
dependencies = [
"indexmap",
"serde",
"serde_json",
"utoipa-gen",
]
[[package]]
name = "utoipa-axum"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff0d605008ed085986e1803fd5c81d18c0f8503b1e4bbb21ea75b3fc20dd1efb"
dependencies = [
"axum",
"paste",
"tower-layer",
"tower-service",
"utoipa",
]
[[package]]
name = "utoipa-gen"
version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a77d306bc75294fd52f3e99b13ece67c02c1a2789190a6f31d32f736624326f7"
dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.96",
]
[[package]]
name = "utoipa-swagger-ui"
version = "8.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "040cad8bd8de63f3d028e08e5b39be49d68f8a646e99f4aea2e2d4d82c34b21f"
dependencies = [
"axum",
"base64 0.22.1",
"mime_guess",
"regex",
"rust-embed",
"serde",
"serde_json",
"url",
"utoipa",
"utoipa-swagger-ui-vendored",
"zip",
]
[[package]]
name = "utoipa-swagger-ui-vendored"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2eebbbfe4093922c2b6734d7c679ebfebd704a0d7e56dfcb0d05818ce28977d"
[[package]]
name = "vcpkg"
version = "0.2.15"
@ -3295,7 +3453,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
"synstructure",
]
@ -3317,7 +3475,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
@ -3337,7 +3495,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
"synstructure",
]
@ -3366,7 +3524,38 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.72",
"syn 2.0.96",
]
[[package]]
name = "zip"
version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45"
dependencies = [
"arbitrary",
"crc32fast",
"crossbeam-utils",
"displaydoc",
"flate2",
"indexmap",
"memchr",
"thiserror 2.0.11",
"zopfli",
]
[[package]]
name = "zopfli"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946"
dependencies = [
"bumpalo",
"crc32fast",
"lockfree-object-pool",
"log",
"once_cell",
"simd-adler32",
]
[[package]]

View file

@ -65,6 +65,9 @@ tower-http = { version = "0.6.2", features = [
trie-rs = { version = "0.4.2", features = ["serde"] }
unicase = "2.7.0"
ureq = { version = "2.10.0", default-features = false, features = ["tls"] }
utoipa = { version = "5.3", features = ["axum_extras"] }
utoipa-swagger-ui = { version = "8.1", features = ["axum", "vendored"] }
utoipa-axum = { version = "0.1" }
[dependencies.axum]
version = "0.8.1"

View file

@ -1,5 +1,6 @@
use error::APIError;
mod doc;
mod dto;
mod error;

View file

@ -1,3 +1,5 @@
use crate::app::{self, App};
use crate::server::doc;
use axum::{extract::FromRef, Router, ServiceExt};
use tower::Layer;
use tower_http::{
@ -5,8 +7,9 @@ use tower_http::{
normalize_path::{NormalizePath, NormalizePathLayer},
services::ServeDir,
};
use crate::app::{self, App};
use utoipa::OpenApi;
use utoipa_axum::router::OpenApiRouter;
use utoipa_swagger_ui::SwaggerUi;
mod api;
mod auth;
@ -24,11 +27,14 @@ pub fn make_router(app: App) -> NormalizePath<Router> {
.fallback_service(ServeDir::new(&app.web_dir_path))
.layer(CompressionLayer::new());
let router = Router::new()
let (open_api_router, open_api) =
OpenApiRouter::with_openapi(doc::ApiDoc::openapi()).split_for_parts();
let router = open_api_router
.merge(SwaggerUi::new("/swagger-ui"))
.nest("/api", api::router())
.with_state(app.clone())
.nest_service("/swagger", swagger)
.fallback_service(static_files)
.nest("/", static_files)
.layer(logger::LogLayer::new());
NormalizePathLayer::trim_trailing_slash().layer(router)

View file

@ -85,6 +85,13 @@ async fn get_version() -> Json<dto::Version> {
Json(current_version)
}
#[utoipa::path(
get,
path = "/initial_setup",
responses(
(status = 200, body = dto::InitialSetup),
),
)]
async fn get_initial_setup(
State(config_manager): State<config::Manager>,
) -> Result<Json<dto::InitialSetup>, APIError> {

4
src/server/doc.rs Normal file
View file

@ -0,0 +1,4 @@
use utoipa::OpenApi;
#[derive(OpenApi)]
pub struct ApiDoc;

View file

@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use crate::app::{config, index, peaks, playlist, scanner, thumbnail};
use std::{collections::HashMap, convert::From, path::PathBuf, time::UNIX_EPOCH};
@ -9,7 +10,7 @@ pub struct Version {
pub minor: i32,
}
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
#[derive(PartialEq, Eq, Debug, Serialize, Deserialize, ToSchema)]
pub struct InitialSetup {
pub has_any_users: bool,
}