From 204e66dd3adcfdfdfb73b5bdfe0e7ee14b6b380a Mon Sep 17 00:00:00 2001 From: "[dyad]" Date: Thu, 6 Nov 2025 13:57:32 +0100 Subject: [PATCH] [dyad] wrote 2 file(s) --- config/database.js | 92 +++++++++++++++++++++++++++++++++++++++++----- server.js | 2 +- 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/config/database.js b/config/database.js index ee2382b..ac8a27b 100644 --- a/config/database.js +++ b/config/database.js @@ -10,6 +10,7 @@ if (!fs.existsSync(dataDir)) { fs.mkdirSync(dataDir, { recursive: true }); } +// Configure logger const logger = winston.createLogger({ level: 'info', format: winston.format.combine( @@ -25,14 +26,7 @@ const logger = winston.createLogger({ const dbPath = path.join(dataDir, 'notes.db'); logger.info(`Using database at: ${dbPath}`); -// Ensure database directory has correct permissions -try { - fs.accessSync(dataDir, fs.constants.W_OK); -} catch (err) { - logger.error(`No write access to ${dataDir}`, err); - process.exit(1); -} - +// Create database connection const db = new sqlite3.Database(dbPath, (err) => { if (err) { logger.error('Database connection error:', err); @@ -42,4 +36,84 @@ const db = new sqlite3.Database(dbPath, (err) => { initializeDatabase(); }); -// Rest of the file remains the same... \ No newline at end of file +// Initialize database schema +function initializeDatabase() { + db.serialize(() => { + // Create users table + db.run(` + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE NOT NULL, + password_hash TEXT NOT NULL, + is_admin INTEGER DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + `); + + // Create notes table + db.run(` + CREATE TABLE IF NOT EXISTS notes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + title TEXT NOT NULL, + content TEXT, + archived INTEGER DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE + ) + `); + + // Create todos table + db.run(` + CREATE TABLE IF NOT EXISTS todos ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + note_id INTEGER NOT NULL, + text TEXT NOT NULL, + completed INTEGER DEFAULT 0, + position INTEGER DEFAULT 0, + FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE CASCADE + ) + `); + + // Create images table + db.run(` + CREATE TABLE IF NOT EXISTS images ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + note_id INTEGER NOT NULL, + filename TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (note_id) REFERENCES notes (id) ON DELETE CASCADE + ) + `); + + // Check if admin user exists, create if not + db.get('SELECT * FROM users WHERE username = ?', ['admin'], async (err, user) => { + if (err) { + logger.error('Error checking admin user:', err); + return; + } + + if (!user) { + try { + const hash = await bcrypt.hash('admin', 10); + db.run( + 'INSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, ?)', + ['admin', hash, 1], + (err) => { + if (err) { + logger.error('Error creating admin user:', err); + return; + } + logger.info('Admin user created successfully'); + } + ); + } catch (err) { + logger.error('Error hashing admin password:', err); + } + } + }); + }); +} + +module.exports = { db, logger }; \ No newline at end of file diff --git a/server.js b/server.js index 10334da..172a2f6 100644 --- a/server.js +++ b/server.js @@ -2,7 +2,7 @@ const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const path = require('path'); -const { logger } = require('./config/database'); +const { db, logger } = require('./config/database'); // Create Express app const app = express();