62 lines
1.7 KiB
Rust
62 lines
1.7 KiB
Rust
use sqlx::{SqlitePool, sqlite::SqliteConnectOptions};
|
|
|
|
pub async fn init_db(database_url: &str) -> Result<SqlitePool, Box<dyn std::error::Error>> {
|
|
let options = SqliteConnectOptions::new()
|
|
.filename(database_url)
|
|
.create_if_missing(true);
|
|
let pool = SqlitePool::connect_with(options).await?;
|
|
|
|
// Create users table
|
|
sqlx::query(
|
|
r#"
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
phone TEXT UNIQUE NOT NULL,
|
|
username TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
avatar_url TEXT,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
"#,
|
|
)
|
|
.execute(&pool)
|
|
.await?;
|
|
|
|
// Create messages table
|
|
sqlx::query(
|
|
r#"
|
|
CREATE TABLE IF NOT EXISTS messages (
|
|
id TEXT PRIMARY KEY,
|
|
from_user TEXT NOT NULL,
|
|
to_user TEXT NOT NULL,
|
|
content TEXT NOT NULL,
|
|
timestamp INTEGER NOT NULL,
|
|
message_type TEXT NOT NULL,
|
|
read BOOLEAN DEFAULT FALSE,
|
|
deleted_for_sender BOOLEAN DEFAULT FALSE,
|
|
deleted_for_receiver BOOLEAN DEFAULT FALSE,
|
|
deleted_for_everyone BOOLEAN DEFAULT FALSE
|
|
)
|
|
"#,
|
|
)
|
|
.execute(&pool)
|
|
.await?;
|
|
|
|
// Create sessions table
|
|
sqlx::query(
|
|
r#"
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
token TEXT PRIMARY KEY,
|
|
username TEXT NOT NULL,
|
|
phone TEXT NOT NULL,
|
|
expires_at DATETIME NOT NULL,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
"#,
|
|
)
|
|
.execute(&pool)
|
|
.await?;
|
|
|
|
Ok(pool)
|
|
}
|