diff --git a/src/lib.rs b/src/lib.rs index c234658..0763c96 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,7 @@ pub mod config_parser; pub mod engines; pub mod search_results_handler; pub mod server; +pub mod theme_handler; use std::net::TcpListener; @@ -15,6 +16,7 @@ use actix_files as fs; use actix_web::{dev::Server, middleware::Logger, web, App, HttpServer}; use config_parser::parser::Config; use handlebars::Handlebars; +use theme_handler::theme_path_handler::handle_different_theme_path; /// Runs the web server on the provided TCP listener and returns a `Server` instance. /// @@ -39,8 +41,10 @@ use handlebars::Handlebars; pub fn run(listener: TcpListener, config: Config) -> std::io::Result { let mut handlebars: Handlebars = Handlebars::new(); + let theme_folder_path: String = handle_different_theme_path()?; + handlebars - .register_templates_directory(".html", "./public/templates") + .register_templates_directory(".html", format!("{}/templates", theme_folder_path)) .unwrap(); let handlebars_ref: web::Data = web::Data::new(handlebars); @@ -51,8 +55,14 @@ pub fn run(listener: TcpListener, config: Config) -> std::io::Result { .app_data(web::Data::new(config.clone())) .wrap(Logger::default()) // added logging middleware for logging. // Serve images and static files (css and js files). - .service(fs::Files::new("/static", "./public/static").show_files_listing()) - .service(fs::Files::new("/images", "./public/images").show_files_listing()) + .service( + fs::Files::new("/static", format!("{}/static", theme_folder_path)) + .show_files_listing(), + ) + .service( + fs::Files::new("/images", format!("{}/images", theme_folder_path)) + .show_files_listing(), + ) .service(routes::robots_data) // robots.txt .service(routes::index) // index page .service(routes::search) // search page diff --git a/src/server/routes.rs b/src/server/routes.rs index 0f84cc9..bb6be27 100644 --- a/src/server/routes.rs +++ b/src/server/routes.rs @@ -8,6 +8,7 @@ use crate::{ cache::cacher::RedisCache, config_parser::parser::Config, search_results_handler::{aggregation_models::SearchResults, aggregator::aggregate}, + theme_handler::theme_path_handler::handle_different_theme_path, }; use actix_web::{get, web, HttpRequest, HttpResponse}; use handlebars::Handlebars; @@ -146,7 +147,8 @@ pub async fn search( /// Handles the route of robots.txt page of the `websurfx` meta search engine website. #[get("/robots.txt")] pub async fn robots_data(_req: HttpRequest) -> Result> { - let page_content: String = read_to_string("./public/robots.txt")?; + let page_content: String = + read_to_string(format!("{}/robots.txt", handle_different_theme_path()?))?; Ok(HttpResponse::Ok() .content_type("text/plain; charset=ascii") .body(page_content)) diff --git a/src/theme_handler/mod.rs b/src/theme_handler/mod.rs new file mode 100644 index 0000000..3bbca9d --- /dev/null +++ b/src/theme_handler/mod.rs @@ -0,0 +1 @@ +pub mod theme_path_handler; diff --git a/src/theme_handler/theme_path_handler.rs b/src/theme_handler/theme_path_handler.rs new file mode 100644 index 0000000..df3e5cc --- /dev/null +++ b/src/theme_handler/theme_path_handler.rs @@ -0,0 +1,31 @@ +//! This module provides the functionality to handle theme folder present on different paths and +//! provide one appropriate path on which it is present and can be used. + +use std::io::Error; +use std::path::Path; + +// ------- Constants -------- +static THEME_DIRECTORY_NAME: &str = "public"; + +/// A function which returns an appropriate theme directory path checking if the theme +/// directory exists on that path. +/// +/// # Error +/// +/// Returns a `Theme (public) folder not found!!` error if the theme folder is not present under following +/// paths which are: +/// 1. `/opt/websurfx` if it not present here then it fallbacks to the next one (2) +/// 2. Under project folder ( or codebase in other words) if it is not present +/// here then it returns an error as mentioned above. +pub fn handle_different_theme_path() -> Result { + if Path::new(format!("/opt/websurfx/{}/", THEME_DIRECTORY_NAME).as_str()).exists() { + Ok(format!("/opt/websurfx/{}", THEME_DIRECTORY_NAME)) + } else if Path::new(format!("./{}/", THEME_DIRECTORY_NAME).as_str()).exists() { + Ok(format!("./{}", THEME_DIRECTORY_NAME)) + } else { + Err(Error::new( + std::io::ErrorKind::NotFound, + "Themes (public) folder not found!!", + )) + } +}