add experimental support for temporary links
This commit is contained in:
23
src/db.rs
23
src/db.rs
@@ -1,3 +1,5 @@
|
||||
use std::time::{Duration, SystemTime};
|
||||
|
||||
use rocket::futures::lock::Mutex;
|
||||
use tokio_postgres::{Client, Error, Statement};
|
||||
|
||||
@@ -5,7 +7,9 @@ use crate::GlobalState;
|
||||
|
||||
pub const STATEMENT_GET_LINK: usize = 0;
|
||||
pub const STATEMENT_ADD_LINK: usize = 1;
|
||||
pub const N_STATEMENTS: usize = 2;
|
||||
pub const STATEMENT_ADD_TEMP_LINK: usize = 2;
|
||||
pub const STATEMENT_DELETE_EXPIRED: usize = 3;
|
||||
pub const N_STATEMENTS: usize = 4;
|
||||
|
||||
pub async fn get_link(state: &Mutex<GlobalState>, link: &str) -> Result<Option<String>, Error> {
|
||||
let lock = state.lock().await;
|
||||
@@ -18,13 +22,28 @@ pub async fn add_link(state: &Mutex<GlobalState>, link: &str, url: &str) -> Resu
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn add_temporary_link(state: &Mutex<GlobalState>, link: &str, url: &str, ttl: u64) -> Result<(), Error> {
|
||||
let time = SystemTime::now() + Duration::from_secs(ttl);
|
||||
let lock = state.lock().await;
|
||||
lock.db_client.execute(&lock.statements[STATEMENT_ADD_TEMP_LINK], &[&link, &url, &time]).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn delete_expired_links(state: &Mutex<GlobalState>) -> Result<(), Error> {
|
||||
let lock = state.lock().await;
|
||||
lock.db_client.execute(&lock.statements[STATEMENT_DELETE_EXPIRED], &[]).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn prepare_statements(db: &Client) -> Result<[Statement; N_STATEMENTS], Error> {
|
||||
Ok([db.prepare("SELECT url FROM links WHERE id = $1").await?,
|
||||
db.prepare("INSERT INTO links (id, url) VALUES ($1, $2)").await?,
|
||||
db.prepare("INSERT INTO links (id, url, valid_until) VALUES ($1, $2, $3)").await?,
|
||||
db.prepare("DELETE FROM links WHERE valid_until < NOW()").await?
|
||||
])
|
||||
}
|
||||
|
||||
pub async fn prepare_tables(db: &Client) -> Result<(), Error> {
|
||||
db.execute("CREATE TABLE IF NOT EXISTS links (id TEXT PRIMARY KEY, url TEXT NOT NULL)", &[]).await?;
|
||||
db.execute("CREATE TABLE IF NOT EXISTS links (id TEXT PRIMARY KEY, url TEXT NOT NULL, valid_until TIMESTAMP NOT NULL)", &[]).await?;
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user