diff --git a/Cargo.lock b/Cargo.lock index 1beafb7..0a4af45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,7 +194,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chela" -version = "0.1.0" +version = "0.2.0" dependencies = [ "axum", "color-eyre", diff --git a/Cargo.toml b/Cargo.toml index 3358738..7853f0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chela" -version = "0.1.0" +version = "0.2.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/README.md b/README.md index acaf051..ca96920 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ You can create a redirect by navigating to the `/create` page and filling out th docker run -d \ -p 3000:3000 \ -e DATABASE_URL=postgres://chela:password@dbhost/postgres?sslmode=disable \ - -e CHELA_HOST=example.com \ + -e CHELA_HOST=a.com \ secondsmiles/chela ``` @@ -32,7 +32,8 @@ services: - 3000:3000 environment: - DATABASE_URL=postgres://chela:password@chela-postgres/postgres?sslmode=disable - - CHELA_HOST=example.com + - CHELA_HOST=a.com + - CHELA_MAIN_PAGE_REDIRECT='https://example.com' depends_on: - chela-postgres restart: unless-stopped @@ -52,6 +53,9 @@ The hostname that Chela should refer to itself as. Defaults to `localhost`. ##### `CHELA_LISTEN_ADDRESS` The address that Chela should listen on. Defaults to `0.0.0.0`. +##### `CHELA_MAIN_PAGE_REDIRECT` +A page that Chela will redirect to when `/` is requested instead of replying with the default homepage. + ### Manually #### Build ```bash @@ -63,7 +67,7 @@ $ cargo build -r #### Run ```bash $ export DATABASE_URL=postgres://chela:password@dbhost/postgres?sslmode=disable -$ export CHELA_HOST=example.com +$ export CHELA_HOST=a.com $ export CHELA_LISTEN_ADDRESS=127.0.0.1 $ ./target/release/chela ``` diff --git a/src/get.rs b/src/get.rs index e5268ff..d96e05f 100644 --- a/src/get.rs +++ b/src/get.rs @@ -3,7 +3,7 @@ use std::net::SocketAddr; use axum::extract::{ConnectInfo, Path}; use axum::http::HeaderMap; use axum::http::StatusCode; -use axum::response::{Html, IntoResponse}; +use axum::response::{Html, IntoResponse, Redirect}; use axum::Extension; use info_utils::prelude::*; @@ -11,7 +11,11 @@ use info_utils::prelude::*; use crate::ServerState; use crate::UrlRow; -pub async fn index(Extension(state): Extension) -> Html { +pub async fn index(Extension(state): Extension) -> impl IntoResponse { + if let Some(redirect) = state.main_page_redirect { + return Redirect::temporary(redirect.as_str()).into_response(); + } + Html(format!( r#" @@ -27,6 +31,7 @@ pub async fn index(Extension(state): Extension) -> Html { "#, state.host, state.host )) + .into_response() } /// # Panics @@ -47,7 +52,7 @@ pub async fn id( let item: Result = sqlx::query_as("SELECT * FROM chela.urls WHERE id = $1") - .bind(use_id) + .bind(use_id.clone()) .fetch_one(&state.db_pool) .await; if let Ok(it) = item { @@ -74,11 +79,11 @@ pub async fn id( ) .into_response(); } - } else if let Err(err) = item { - warn!("{}", err); + } else { + warn!("'{}' not found.", use_id); return ( - StatusCode::INTERNAL_SERVER_ERROR, - Html(format!("
Internal error: {err}.
")), + StatusCode::NOT_FOUND, + Html("
Not found.
".to_string()), ) .into_response(); } diff --git a/src/main.rs b/src/main.rs index 22750a6..ac16eb4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,7 @@ use std::net::SocketAddr; +use url::Url; + use axum::routing::{get, post}; use axum::Router; @@ -20,6 +22,7 @@ pub struct ServerState { pub db_pool: Pool, pub host: String, pub sqids: Sqids, + pub main_page_redirect: Option, } #[derive(Debug, Clone, sqlx::FromRow, PartialEq, Eq)] @@ -40,9 +43,7 @@ async fn main() -> eyre::Result<()> { color_eyre::install()?; let db_pool = init_db().await?; - let host = std::env::var("CHELA_HOST").unwrap_or("localhost".to_string()); - let sqids = Sqids::builder() .alphabet( "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -51,10 +52,12 @@ async fn main() -> eyre::Result<()> { ) .blocklist(["create".to_string()].into()) .build()?; + let main_page_redirect = std::env::var("CHELA_MAIN_PAGE_REDIRECT").unwrap_or_default(); let server_state = ServerState { db_pool, host, sqids, + main_page_redirect: Url::parse(&main_page_redirect).ok(), }; let address = std::env::var("CHELA_LISTEN_ADDRESS").unwrap_or("0.0.0.0".to_string()); @@ -74,7 +77,11 @@ async fn main() -> eyre::Result<()> { async fn init_db() -> eyre::Result> { let db_pool = PgPoolOptions::new() .max_connections(15) - .connect(std::env::var("DATABASE_URL")?.as_str()) + .connect( + std::env::var("DATABASE_URL") + .expect("DATABASE_URL must be set") + .as_str(), + ) .await?; log!("Successfully connected to database");