From 6c2ea68bbef0e1fc0b50b80f113b0ebcdf745a40 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 12 May 2021 23:48:04 -0700 Subject: feat: :star: --- src/db/mod.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/db/models.rs | 18 ++++++++++++++++++ src/db/schema.rs | 9 +++++++++ 3 files changed, 83 insertions(+) create mode 100644 src/db/mod.rs create mode 100644 src/db/models.rs create mode 100644 src/db/schema.rs (limited to 'src/db') diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..a607593 --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,56 @@ +// Copyleft (ɔ) 2021-2021 Fuwn +// SPDX-License-Identifier: GPL-3.0-only + +pub mod models; +mod schema; + +use diesel::{insert_into, prelude::*, update}; + +use crate::db::models::{Link, LinkForm}; + +fn establish_connection() -> SqliteConnection { + let database_url = std::env::var("DATABASE_URL").unwrap_or_else(|_| "lime.sqlite3".to_string()); + SqliteConnection::establish(&database_url) + .unwrap_or_else(|_| panic!("error connecting to {}", database_url)) +} + +pub fn insert_link(form: LinkForm) -> Result<(), Box> { + use schema::links::dsl::*; + + if find_link(form.short, false).is_err() { + insert_into(links) + .values((long.eq(form.long), short.eq(form.short), ip.eq(form.ip))) + .execute(&establish_connection())?; + } else { + bail!("short url already exists"); + } + + Ok(()) +} + +pub fn find_link(short_c: &str, tick: bool) -> Result> { + use schema::links::dsl::*; + + let results = links + .filter(short.eq(short_c)) + .load::(&establish_connection()) + .unwrap(); + + if results.is_empty() { + bail!("no entry found with the short url: /{}", short_c) + } else { + let long_c = results[0].clone(); + + if tick { + update(links.find(&long_c.short)) + .set(uses.eq(long_c.uses + 1)) + .execute(&establish_connection())?; + } + + if long_c.disabled { + bail!("short url disabled") + } + + Ok(long_c) + } +} diff --git a/src/db/models.rs b/src/db/models.rs new file mode 100644 index 0000000..1b465b6 --- /dev/null +++ b/src/db/models.rs @@ -0,0 +1,18 @@ +// Copyleft (ɔ) 2021-2021 Fuwn +// SPDX-License-Identifier: GPL-3.0-only + +#[derive(Queryable, Debug, Clone)] +pub struct Link { + pub long: String, + pub short: String, + pub disabled: bool, + pub ip: String, + pub uses: i32, +} + +#[derive(Deserialize, Debug)] +pub struct LinkForm<'a> { + pub long: &'a str, + pub short: &'a str, + pub ip: &'a str, +} diff --git a/src/db/schema.rs b/src/db/schema.rs new file mode 100644 index 0000000..8d4006b --- /dev/null +++ b/src/db/schema.rs @@ -0,0 +1,9 @@ +table! { + links (short) { + long -> Text, + short -> Text, + disabled -> Bool, + ip -> Text, + uses -> Int4, + } +} -- cgit v1.2.3