diff --git a/docker-compose.yml b/docker-compose.yml index 3a24cef..52567e4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -39,6 +39,9 @@ services: - type: bind source: /DATA/AppData/bzod/www target: /app/www + - type: bind + source: /DATA/AppData/bzod/images + target: /app/images devices: [] cap_add: [] networks: diff --git a/src/web/pages.rs b/src/web/pages.rs index 3ce9872..53805e8 100644 --- a/src/web/pages.rs +++ b/src/web/pages.rs @@ -181,3 +181,51 @@ pub async fn deploy_script() -> Response { Err(_) => (StatusCode::NOT_FOUND, "deploy.sh not found").into_response(), } } + +pub async fn social_preview() -> Response { + let mut target_path = std::path::PathBuf::from("www/images/preview.png"); + + if !target_path.exists() { + if let Ok(exe_path) = std::env::current_exe() { + if let Some(exe_dir) = exe_path.parent() { + let path1 = exe_dir.join("www/images/preview.png"); + if path1.exists() { + target_path = path1; + } else if let Some(parent1) = exe_dir.parent() { + let path2 = parent1.join("www/images/preview.png"); + if path2.exists() { + target_path = path2; + } else if let Some(parent2) = parent1.parent() { + let path3 = parent2.join("www/images/preview.png"); + if path3.exists() { + target_path = path3; + } + } + } + } + } + } + + if !target_path.exists() { + if let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") { + let path = std::path::PathBuf::from(manifest_dir).join("www/images/preview.png"); + if path.exists() { + target_path = path; + } + } + } + + match tokio::fs::read(target_path).await { + Ok(content) => ( + StatusCode::OK, + [ + ("content-type", "image/png"), + ("cache-control", "public, max-age=86400"), + ], + content, + ) + .into_response(), + + Err(_) => (StatusCode::NOT_FOUND, "preview.png not found").into_response(), + } +} diff --git a/src/web/routes.rs b/src/web/routes.rs index d9fec6a..90740f9 100644 --- a/src/web/routes.rs +++ b/src/web/routes.rs @@ -95,6 +95,7 @@ pub fn create_router(state: AppState) -> Router { .route("/admin/pages/delete/:id", post(admin::pages_delete)) .route("/admin/analytics/url/:id", get(admin::url_analytics_get)) .route("/deploy.sh", get(pages::deploy_script)) + .route("/images/preview.png", get(pages::social_preview)) .route( "/admin/analytics/url/:id/export/csv", get(admin::url_analytics_csv_export), diff --git a/www/images/preview.png b/www/images/preview.png new file mode 100644 index 0000000..e7d67c1 Binary files /dev/null and b/www/images/preview.png differ diff --git a/www/index.html b/www/index.html index 63beff1..2365a5c 100644 --- a/www/index.html +++ b/www/index.html @@ -4,6 +4,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BZOD | Self-Hosted URL Management in Rust