From c1c02260c94716f3cf4bcdf4057f013bf4a710af Mon Sep 17 00:00:00 2001 From: Christopher Angelo Date: Wed, 7 Aug 2024 22:59:48 +0700 Subject: [PATCH] feat: redirection count --- src/db.rs | 13 ++++++++++++- src/routes/mod.rs | 11 ++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/db.rs b/src/db.rs index 3847366..f5c5deb 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,7 +1,7 @@ use std::fs; use libsql::Builder; -use tracing::{debug, info, instrument}; +use tracing::{debug, instrument}; const DB_PATH: &str = "data/links.db"; @@ -50,6 +50,17 @@ async fn migrate(conn: libsql::Connection) { version = 1; } + if version == 1 { + debug!("Migrating from version 1 -> 2"); + conn.execute( + "ALTER TABLE links ADD COLUMN visitor_count INTEGER DEFAULT 0", + (), + ) + .await + .expect("Unable to add visitor_count column"); + version = 2; + } + conn.execute(&format!("PRAGMA user_version = {version}"), ()) .await .expect("Unable to set user_version"); diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 0e2123c..92a631a 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -74,10 +74,11 @@ pub async fn handle_short_url( } let conn = state.db.clone(); + let short_url = uri.to_lowercase(); let mut target_url_query_rows = conn .query( "SELECT target_url FROM links WHERE short_url = ?", - [uri.to_lowercase().as_str()], + [short_url.clone()], ) .await .expect("Unable to execute query"); @@ -86,6 +87,14 @@ pub async fn handle_short_url( if let Some(row) = target_url_query_rows.next().await.unwrap() { let target_url = row.get::(0).expect("Unable to get target_url"); info!("[{ip:?}] Redirecting {uri} to {target_url}"); + + conn.execute( + "UPDATE OR IGNORE links SET visitor_count = visitor_count + 1 WHERE short_url = ?;", + [short_url.clone()], + ) + .await + .ok(); + axum::response::Redirect::to(&target_url).into_response() } else { info!("[{ip:?}] Visited {uri}");