From 32a808b9624caf027c0ab5074bb746c9d2bb1e92 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Sun, 7 Apr 2019 18:54:53 -0700 Subject: [PATCH 1/5] Ship swagger files and mount them on /swagger --- build_release_unix.sh | 2 +- build_release_windows.ps1 | 1 + src/main.rs | 22 ++++++++++++++++++---- src/server.rs | 7 +++++-- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/build_release_unix.sh b/build_release_unix.sh index 3b657f1..283acdf 100644 --- a/build_release_unix.sh +++ b/build_release_unix.sh @@ -3,7 +3,7 @@ echo "Creating output directory" mkdir -p release/tmp echo "Copying package files" -cp -r web src migrations Cargo.toml Cargo.lock res/unix/Makefile release/tmp +cp -r web docs/swagger src migrations Cargo.toml Cargo.lock res/unix/Makefile release/tmp echo "Creating tarball" POLARIS_VERSION=$(grep -m 1 ^version Cargo.toml | awk '{print $3}' | tr -d '"\r\n') diff --git a/build_release_windows.ps1 b/build_release_windows.ps1 index 6fcaf82..f098b40 100644 --- a/build_release_windows.ps1 +++ b/build_release_windows.ps1 @@ -29,6 +29,7 @@ Copy-Item .\web\style .\release\tmp\web\style -recurse Copy-Item .\web\tags .\release\tmp\web\tags -recurse Copy-Item .\web\favicon.png .\release\tmp\web\ Copy-Item .\web\index.html .\release\tmp\web\ +Copy-Item .\docs\swagger .\release\tmp\swagger -recurse "" "Creating installer" diff --git a/src/main.rs b/src/main.rs index c9a8cb2..f54c46f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -149,6 +149,7 @@ fn run() -> Result<()> { options.optopt("p", "port", "set polaris to run on a custom port", "PORT"); options.optopt("d", "database", "set the path to index database", "FILE"); options.optopt("w", "web", "set the path to web client files", "DIRECTORY"); + options.optopt("s", "swagger", "set the path to swagger files", "DIRECTORY"); options.optopt( "l", "log", @@ -223,7 +224,7 @@ fn run() -> Result<()> { let api_url = format!("{}/api", &prefix_url); info!("Mounting API on {}", api_url); - // Static files mount target + // Web client mount target let web_dir_name = matches.opt_str("w"); let mut default_web_dir = utils::get_data_root()?; default_web_dir.push("web"); @@ -231,8 +232,19 @@ fn run() -> Result<()> { .map(|n| Path::new(n.as_str()).to_path_buf()) .unwrap_or(default_web_dir); info!("Static files location is {}", web_dir_path.display()); - let static_url = format!("/{}", &prefix_url); - info!("Mounting static files on {}", static_url); + let web_url = format!("/{}", &prefix_url); + info!("Mounting web client files on {}", web_url); + + // Swagger files mount target + let swagger_dir_name = matches.opt_str("s"); + let mut default_swagger_dir = utils::get_data_root()?; + default_swagger_dir.push("swagger"); + let swagger_dir_path = swagger_dir_name + .map(|n| Path::new(n.as_str()).to_path_buf()) + .unwrap_or(default_swagger_dir); + info!("Swagger files location is {}", swagger_dir_path.display()); + let swagger_url = format!("/{}swagger", &prefix_url); + info!("Mounting swagger files on {}", swagger_url); // Start server info!("Starting up server"); @@ -244,9 +256,11 @@ fn run() -> Result<()> { let server = server::get_server( port, - &static_url, &api_url, + &web_url, &web_dir_path, + &swagger_url, + &swagger_dir_path, db.clone(), command_sender, )?; diff --git a/src/server.rs b/src/server.rs index f0ccd3a..a9812b8 100644 --- a/src/server.rs +++ b/src/server.rs @@ -10,9 +10,11 @@ use crate::index::CommandSender; pub fn get_server( port: u16, - static_url: &str, api_url: &str, + web_url: &str, web_dir_path: &PathBuf, + swagger_url: &str, + swagger_dir_path: &PathBuf, db: Arc, command_sender: Arc, ) -> Result { @@ -23,6 +25,7 @@ pub fn get_server( Ok(rocket::custom(config) .manage(db) .manage(command_sender) - .mount(&static_url, StaticFiles::from(web_dir_path)) + .mount(&swagger_url, StaticFiles::from(swagger_dir_path)) + .mount(&web_url, StaticFiles::from(web_dir_path)) .mount(&api_url, api::get_routes())) } From b190385dbd12bda6577c90dde1dd91433a4f5766 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Sun, 7 Apr 2019 19:31:36 -0700 Subject: [PATCH 2/5] Allow tests to compile --- src/api_tests.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/api_tests.rs b/src/api_tests.rs index a83ee4c..0a59487 100644 --- a/src/api_tests.rs +++ b/src/api_tests.rs @@ -50,13 +50,17 @@ fn get_test_environment(db_name: &str) -> TestEnvironment { let db = Arc::new(db::DB::new(&db_path).unwrap()); let web_dir_path = PathBuf::from("web"); + let mut swagger_dir_path = PathBuf::from("docs"); + swagger_dir_path.push("swagger"); let command_sender = index::init(db.clone()); let server = server::get_server( 5050, - "/", "/api", + "/", &web_dir_path, + "/swagger", + &swagger_dir_path, db.clone(), command_sender.clone(), ) From c8655a2447ddedcdcfa2d0ca6d18f1348ef2f0f2 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Sun, 7 Apr 2019 23:24:15 -0700 Subject: [PATCH 3/5] Serve swagger files under /swagger --- src/api_tests.rs | 60 ++-------------------------------------------- src/main.rs | 5 +++- src/server.rs | 20 ++++++++++++---- src/swagger.rs | 37 +++++++++++++++++++++++++++++ src/test.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ src/web.rs | 37 +++++++++++++++++++++++++++++ 6 files changed, 157 insertions(+), 64 deletions(-) create mode 100644 src/swagger.rs create mode 100644 src/test.rs create mode 100644 src/web.rs diff --git a/src/api_tests.rs b/src/api_tests.rs index 0a59487..5f3077c 100644 --- a/src/api_tests.rs +++ b/src/api_tests.rs @@ -2,77 +2,21 @@ use rocket::http::hyper::header::*; use rocket::http::uri::Uri; use rocket::http::Status; use rocket::local::Client; -use std::fs; -use std::ops::Deref; -use std::path::PathBuf; -use std::sync::Arc; use std::{thread, time}; use crate::api; use crate::config; -use crate::db; use crate::ddns; use crate::index; -use crate::server; use crate::vfs; +use crate::test::get_test_environment; + const TEST_USERNAME: &str = "test_user"; const TEST_PASSWORD: &str = "test_password"; const TEST_MOUNT_NAME: &str = "collection"; const TEST_MOUNT_SOURCE: &str = "test/collection"; -struct TestEnvironment { - pub client: Client, - command_sender: Arc, - db: Arc, -} - -impl TestEnvironment { - pub fn update_index(&self) { - index::update(self.db.deref()).unwrap(); - } -} - -impl Drop for TestEnvironment { - fn drop(&mut self) { - self.command_sender.deref().exit().unwrap(); - } -} - -fn get_test_environment(db_name: &str) -> TestEnvironment { - let mut db_path = PathBuf::new(); - db_path.push("test"); - db_path.push(db_name); - if db_path.exists() { - fs::remove_file(&db_path).unwrap(); - } - - let db = Arc::new(db::DB::new(&db_path).unwrap()); - - let web_dir_path = PathBuf::from("web"); - let mut swagger_dir_path = PathBuf::from("docs"); - swagger_dir_path.push("swagger"); - let command_sender = index::init(db.clone()); - - let server = server::get_server( - 5050, - "/api", - "/", - &web_dir_path, - "/swagger", - &swagger_dir_path, - db.clone(), - command_sender.clone(), - ) - .unwrap(); - let client = Client::new(server).unwrap(); - TestEnvironment { - client, - command_sender, - db, - } -} - fn complete_initial_setup(client: &Client) { let configuration = config::Config { album_art_pattern: None, diff --git a/src/main.rs b/src/main.rs index f54c46f..098772f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,11 +71,14 @@ mod metadata; mod playlist; mod serve; mod server; +mod swagger; +mod test; mod thumbnails; mod ui; mod user; mod utils; mod vfs; +mod web; static LOG_CONFIG: simplelog::Config = simplelog::Config { time: Some(Level::Error), @@ -221,7 +224,7 @@ fn run() -> Result<()> { // API mount target let prefix_url = config.prefix_url.unwrap_or_else(|| "".to_string()); - let api_url = format!("{}/api", &prefix_url); + let api_url = format!("/{}api", &prefix_url); info!("Mounting API on {}", api_url); // Web client mount target diff --git a/src/server.rs b/src/server.rs index a9812b8..cdaf255 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,13 +1,16 @@ use rocket; -use rocket_contrib::serve::StaticFiles; use std::path::PathBuf; use std::sync::Arc; -use crate::api; use crate::db::DB; use crate::errors; use crate::index::CommandSender; +pub struct StaticDirs { + pub web_dir_path: PathBuf, + pub swagger_dir_path: PathBuf, +} + pub fn get_server( port: u16, api_url: &str, @@ -18,14 +21,21 @@ pub fn get_server( db: Arc, command_sender: Arc, ) -> Result { + let config = rocket::Config::build(rocket::config::Environment::Production) .port(port) .finalize()?; + let static_dirs = Arc::new(StaticDirs { + web_dir_path: web_dir_path.to_path_buf(), + swagger_dir_path: swagger_dir_path.to_path_buf(), + }); + Ok(rocket::custom(config) .manage(db) .manage(command_sender) - .mount(&swagger_url, StaticFiles::from(swagger_dir_path)) - .mount(&web_url, StaticFiles::from(web_dir_path)) - .mount(&api_url, api::get_routes())) + .manage(static_dirs) + .mount(&swagger_url, crate::swagger::get_routes()) + .mount(&web_url, crate::web::get_routes()) + .mount(&api_url, crate::api::get_routes())) } diff --git a/src/swagger.rs b/src/swagger.rs new file mode 100644 index 0000000..1d959c1 --- /dev/null +++ b/src/swagger.rs @@ -0,0 +1,37 @@ +use rocket::http::Status; +use rocket::response::NamedFile; +use rocket::State; +use std::io; +use std::path::PathBuf; +use std::sync::Arc; + +use crate::server::StaticDirs; +use crate::test::get_test_environment; + +pub fn get_routes() -> Vec { + routes![ + index, + files, + ] +} + +#[get("/", rank = 9)] +fn index(static_dirs: State>) -> io::Result { + let mut path = static_dirs.swagger_dir_path.clone(); + path.push("index.html"); + NamedFile::open(path) +} + +#[get("/", rank = 9)] +fn files(static_dirs: State>, file: PathBuf) -> Option { + let path = static_dirs.swagger_dir_path.clone().join(file.clone()); + NamedFile::open(path).ok() +} + +#[test] +fn test_index() { + let env = get_test_environment("swagger_index.sqlite"); + let client = &env.client; + let response = client.get("/swagger").dispatch(); + assert_eq!(response.status(), Status::Ok); +} diff --git a/src/test.rs b/src/test.rs new file mode 100644 index 0000000..668de13 --- /dev/null +++ b/src/test.rs @@ -0,0 +1,62 @@ +use rocket; +use rocket::local::Client; +use std::fs; +use std::ops::Deref; +use std::path::PathBuf; +use std::sync::Arc; + +use crate::db::DB; +use crate::index; +use crate::server; + +pub struct TestEnvironment { + pub client: Client, + command_sender: Arc, + db: Arc, +} + +impl TestEnvironment { + pub fn update_index(&self) { + index::update(self.db.deref()).unwrap(); + } +} + +impl Drop for TestEnvironment { + fn drop(&mut self) { + self.command_sender.deref().exit().unwrap(); + } +} + +pub fn get_test_environment(db_name: &str) -> TestEnvironment { + let mut db_path = PathBuf::new(); + db_path.push("test"); + db_path.push(db_name); + if db_path.exists() { + fs::remove_file(&db_path).unwrap(); + } + + let db = Arc::new(DB::new(&db_path).unwrap()); + + let web_dir_path = PathBuf::from("web"); + let mut swagger_dir_path = PathBuf::from("docs"); + swagger_dir_path.push("swagger"); + let command_sender = index::init(db.clone()); + + let server = server::get_server( + 5050, + "/api", + "/", + &web_dir_path, + "/swagger", + &swagger_dir_path, + db.clone(), + command_sender.clone(), + ) + .unwrap(); + let client = Client::new(server).unwrap(); + TestEnvironment { + client, + command_sender, + db, + } +} diff --git a/src/web.rs b/src/web.rs new file mode 100644 index 0000000..695b616 --- /dev/null +++ b/src/web.rs @@ -0,0 +1,37 @@ +use rocket::http::Status; +use rocket::response::NamedFile; +use rocket::State; +use std::io; +use std::path::PathBuf; +use std::sync::Arc; + +use crate::server::StaticDirs; +use crate::test::get_test_environment; + +pub fn get_routes() -> Vec { + routes![ + index, + files, + ] +} + +#[get("/", rank = 10)] +fn index(static_dirs: State>) -> io::Result { + let mut path = static_dirs.web_dir_path.clone(); + path.push("index.html"); + NamedFile::open(path) +} + +#[get("/", rank = 10)] +fn files(static_dirs: State>, file: PathBuf) -> Option { + let path = static_dirs.web_dir_path.clone().join(file.clone()); + NamedFile::open(path).ok() +} + +#[test] +fn test_index() { + let env = get_test_environment("web_index.sqlite"); + let client = &env.client; + let response = client.get("/").dispatch(); + assert_eq!(response.status(), Status::Ok); +} From 69c8c93277689580578196eebeaa5726208fcb67 Mon Sep 17 00:00:00 2001 From: Antoine Gersant Date: Sun, 7 Apr 2019 23:28:31 -0700 Subject: [PATCH 4/5] Fixed warnings --- src/main.rs | 1 + src/swagger.rs | 5 +++-- src/web.rs | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 098772f..df77e89 100644 --- a/src/main.rs +++ b/src/main.rs @@ -72,6 +72,7 @@ mod playlist; mod serve; mod server; mod swagger; +#[cfg(test)] mod test; mod thumbnails; mod ui; diff --git a/src/swagger.rs b/src/swagger.rs index 1d959c1..6a47a45 100644 --- a/src/swagger.rs +++ b/src/swagger.rs @@ -1,4 +1,3 @@ -use rocket::http::Status; use rocket::response::NamedFile; use rocket::State; use std::io; @@ -6,7 +5,6 @@ use std::path::PathBuf; use std::sync::Arc; use crate::server::StaticDirs; -use crate::test::get_test_environment; pub fn get_routes() -> Vec { routes![ @@ -30,6 +28,9 @@ fn files(static_dirs: State>, file: PathBuf) -> Option Vec { routes![ @@ -30,6 +28,9 @@ fn files(static_dirs: State>, file: PathBuf) -> Option Date: Sun, 7 Apr 2019 23:41:24 -0700 Subject: [PATCH 5/5] Ship swagger files with installers --- build_release_windows.ps1 | 6 +++++- res/unix/Makefile | 1 + res/windows/installer/installer.wxs | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build_release_windows.ps1 b/build_release_windows.ps1 index f098b40..7e55363 100644 --- a/build_release_windows.ps1 +++ b/build_release_windows.ps1 @@ -34,9 +34,13 @@ Copy-Item .\docs\swagger .\release\tmp\swagger -recurse "" "Creating installer" heat dir .\release\tmp\web\ -ag -g1 -dr AppDataPolaris -cg WebUI -sfrag -var wix.WebUIDir -out .\release\tmp\web_ui_fragment.wxs +heat dir .\release\tmp\swagger\ -ag -g1 -dr AppDataPolaris -cg SwaggerUI -sfrag -var wix.SwaggerUIDir -out .\release\tmp\swagger_ui_fragment.wxs + candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\web_ui_fragment.wixobj .\release\tmp\web_ui_fragment.wxs +candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\swagger_ui_fragment.wixobj .\release\tmp\swagger_ui_fragment.wxs candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\installer.wixobj .\res\windows\installer\installer.wxs -light -dWebUIDir=".\release\tmp\web" -wx -ext WixUtilExtension -ext WixUIExtension -spdb -sw1076 -sice:ICE38 -sice:ICE64 -out .\release\Polaris_$POLARIS_VERSION.msi .\release\tmp\installer.wixobj .\release\tmp\web_ui_fragment.wixobj + +light -dWebUIDir=".\release\tmp\web" -dSwaggerUIDir=".\release\tmp\swagger" -wx -ext WixUtilExtension -ext WixUIExtension -spdb -sw1076 -sice:ICE38 -sice:ICE64 -out .\release\Polaris_$POLARIS_VERSION.msi .\release\tmp\installer.wixobj .\release\tmp\web_ui_fragment.wixobj .\release\tmp\swagger_ui_fragment.wixobj "Cleaning up" Remove-Item -Recurse .\release\tmp diff --git a/res/unix/Makefile b/res/unix/Makefile index 893c28e..06f1d2b 100644 --- a/res/unix/Makefile +++ b/res/unix/Makefile @@ -11,6 +11,7 @@ install: build install -d $(POLARIS_DATA_DIR) install ./target/release/polaris $(POLARIS_BIN_DIR) cp -r ./web $(POLARIS_DATA_DIR) + cp -r ./swagger $(POLARIS_DATA_DIR) @echo "Polaris installation complete!" clean: diff --git a/res/windows/installer/installer.wxs b/res/windows/installer/installer.wxs index 71f10c5..f6b6a63 100644 --- a/res/windows/installer/installer.wxs +++ b/res/windows/installer/installer.wxs @@ -52,6 +52,7 @@ +