clouddisk-project/backend/src/db.js

87 lines
2.3 KiB
JavaScript

// Simple SQLite database wrapper using sqlite3
const sqlite3 = require('sqlite3').verbose();
const dbPath = process.env.DB_PATH || './clouddisk.db';
const db = new sqlite3.Database(dbPath);
// Initialize tables
db.serialize(() => {
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
email TEXT,
storage_used INTEGER DEFAULT 0,
storage_limit INTEGER DEFAULT 10737418240,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
db.run(`
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
parent_id INTEGER,
name TEXT NOT NULL,
type TEXT,
size INTEGER DEFAULT 0,
path TEXT,
hash TEXT,
is_folder INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (parent_id) REFERENCES files(id)
)
`);
db.run(`
CREATE TABLE IF NOT EXISTS shares (
id INTEGER PRIMARY KEY AUTOINCREMENT,
file_id INTEGER NOT NULL,
share_token TEXT UNIQUE NOT NULL,
password TEXT,
expires_at DATETIME,
view_count INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (file_id) REFERENCES files(id)
)
`);
db.run(`
CREATE TABLE IF NOT EXISTS sync_status (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
last_sync_time DATETIME,
status TEXT DEFAULT 'idle',
total_files INTEGER DEFAULT 0,
synced_files INTEGER DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id)
)
`);
});
// Wrapper functions to match the old API
const query = (sql, params = []) => {
return new Promise((resolve, reject) => {
db.all(sql, params, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
};
const run = (sql, params = []) => {
return new Promise((resolve, reject) => {
db.run(sql, params, function(err) {
if (err) reject(err);
else resolve({ lastInsertRowid: this.lastID, changes: this.changes });
});
});
};
module.exports = { query, run, db };