Menu
Public repository / 2d36cd6c72fc6a63a7edb87bb54a4020e50f2f8a
AkurAI-Drive / backend/src/db/mod.rs
Latest change feb03c4c2e9a6b0e869a63e52329c938e68dc8e8 - backend: device-token auth, SigV4 presigning, and file API for the sync client by olibuijr
use crate::config;
use rusqlite::Connection;
use std::sync::LazyLock;
use std::sync::Mutex;
static DB: LazyLock<Mutex<Connection>> = LazyLock::new(|| {
let cfg = config::get();
if let Some(parent) = std::path::Path::new(&cfg.db_path).parent() {
std::fs::create_dir_all(parent).ok();
}
let conn = Connection::open(&cfg.db_path).expect("failed to open SQLite database");
conn.execute_batch("PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON;")
.expect("failed to set pragmas");
create_tables(&conn);
Mutex::new(conn)
});
/// Run a closure with exclusive access to the single shared connection.
pub fn with_db<F, R>(f: F) -> R
where
F: FnOnce(&Connection) -> R,
{
let conn = DB.lock().unwrap();
f(&conn)
}
fn create_tables(conn: &Connection) {
conn.execute_batch(
"
CREATE TABLE IF NOT EXISTS sessions (
id TEXT PRIMARY KEY,
sub TEXT NOT NULL,
email TEXT NOT NULL,
groups TEXT NOT NULL, -- JSON array of group names
tenant_id TEXT,
created INTEGER NOT NULL,
expires INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS sessions_expires_idx ON sessions(expires);
CREATE TABLE IF NOT EXISTS storage (
id TEXT PRIMARY KEY,
owner_sub TEXT NOT NULL,
org TEXT NOT NULL,
email TEXT NOT NULL,
plan TEXT NOT NULL,
bucket TEXT NOT NULL,
region TEXT NOT NULL,
created INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS storage_owner_idx ON storage(owner_sub);
CREATE TABLE IF NOT EXISTS device_tokens (
id TEXT PRIMARY KEY,
token TEXT NOT NULL UNIQUE,
sub TEXT NOT NULL,
email TEXT NOT NULL,
created INTEGER NOT NULL,
expires INTEGER NOT NULL,
last_used INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS device_tokens_expires_idx ON device_tokens(expires);
-- Carries the post-login `return_to` URL across the OAuth round-trip, keyed
-- on the OAuth `state` (so /auth/device can resume after a fresh login).
CREATE TABLE IF NOT EXISTS oauth_states (
state TEXT PRIMARY KEY,
return_to TEXT NOT NULL,
created INTEGER NOT NULL
);
",
)
.expect("failed to create tables");
}