feat: Implement enhanced user profiles with social features including direct messaging, post comments, and reposts, and introduce new routing for Docs and Changelog views.
This commit is contained in:
141
server/db.js
141
server/db.js
@@ -7,82 +7,89 @@ const db = new duckdb.Database(dbPath);
|
||||
const con = db.connect();
|
||||
|
||||
// Initialize Schema
|
||||
con.exec(`
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
wallet_address VARCHAR PRIMARY KEY,
|
||||
username VARCHAR UNIQUE,
|
||||
bio VARCHAR DEFAULT '',
|
||||
banner_color VARCHAR DEFAULT '#6366f1',
|
||||
balance INTEGER DEFAULT 100,
|
||||
last_seen TIMESTAMP
|
||||
);
|
||||
function initDb() {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
con.exec(`
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
wallet_address VARCHAR PRIMARY KEY,
|
||||
username VARCHAR UNIQUE,
|
||||
bio VARCHAR DEFAULT '',
|
||||
banner_color VARCHAR DEFAULT '#6366f1',
|
||||
balance INTEGER DEFAULT 100,
|
||||
last_seen TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS messages (
|
||||
id INTEGER PRIMARY KEY,
|
||||
channel_id VARCHAR,
|
||||
wallet_address VARCHAR,
|
||||
content VARCHAR,
|
||||
timestamp TIMESTAMP,
|
||||
tx_id VARCHAR,
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS messages (
|
||||
id INTEGER PRIMARY KEY,
|
||||
channel_id VARCHAR,
|
||||
wallet_address VARCHAR,
|
||||
content VARCHAR,
|
||||
timestamp TIMESTAMP,
|
||||
tx_id VARCHAR,
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS reactions (
|
||||
message_id INTEGER,
|
||||
wallet_address VARCHAR,
|
||||
emoji VARCHAR,
|
||||
PRIMARY KEY (message_id, wallet_address, emoji),
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS reactions (
|
||||
message_id INTEGER,
|
||||
wallet_address VARCHAR,
|
||||
emoji VARCHAR,
|
||||
PRIMARY KEY (message_id, wallet_address, emoji),
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS posts (
|
||||
id INTEGER PRIMARY KEY,
|
||||
wallet_address VARCHAR,
|
||||
content VARCHAR,
|
||||
timestamp TIMESTAMP,
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
|
||||
CREATE SEQUENCE IF NOT EXISTS seq_msg_id START 1;
|
||||
CREATE SEQUENCE IF NOT EXISTS seq_post_id START 1;
|
||||
CREATE TABLE IF NOT EXISTS posts (
|
||||
id INTEGER PRIMARY KEY,
|
||||
wallet_address VARCHAR,
|
||||
content VARCHAR,
|
||||
timestamp TIMESTAMP,
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
|
||||
-- Migration: Add tx_id to messages if it doesn't exist (for existing DBs)
|
||||
PRAGMA table_info('messages');
|
||||
`, (err) => {
|
||||
if (err) return console.error('Schema error:', err);
|
||||
CREATE TABLE IF NOT EXISTS comments (
|
||||
id INTEGER PRIMARY KEY,
|
||||
post_id INTEGER,
|
||||
wallet_address VARCHAR,
|
||||
content VARCHAR,
|
||||
timestamp TIMESTAMP,
|
||||
FOREIGN KEY (post_id) REFERENCES posts(id),
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
|
||||
// Check if tx_id exists, if not add it
|
||||
con.all("PRAGMA table_info('messages')", (err, rows) => {
|
||||
if (err) return;
|
||||
const hasTxId = rows.some(r => r.name === 'tx_id');
|
||||
if (!hasTxId) {
|
||||
con.run("ALTER TABLE messages ADD COLUMN tx_id VARCHAR", (err) => {
|
||||
if (err) console.error("Error adding tx_id column:", err);
|
||||
CREATE TABLE IF NOT EXISTS reposts (
|
||||
id INTEGER PRIMARY KEY,
|
||||
post_id INTEGER,
|
||||
wallet_address VARCHAR,
|
||||
timestamp TIMESTAMP,
|
||||
FOREIGN KEY (post_id) REFERENCES posts(id),
|
||||
FOREIGN KEY (wallet_address) REFERENCES users(wallet_address)
|
||||
);
|
||||
|
||||
CREATE SEQUENCE IF NOT EXISTS seq_msg_id START 1;
|
||||
CREATE SEQUENCE IF NOT EXISTS seq_post_id START 1;
|
||||
CREATE SEQUENCE IF NOT EXISTS seq_comment_id START 1;
|
||||
CREATE SEQUENCE IF NOT EXISTS seq_repost_id START 1;
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_reposts_unique ON reposts(post_id, wallet_address);
|
||||
`, (err) => {
|
||||
if (err) {
|
||||
console.error('Schema initialization error:', err);
|
||||
return resolve(); // Resolve anyway so server starts
|
||||
}
|
||||
console.log('Database schema created/verified');
|
||||
resolve();
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('Fatal database initialization error:', e);
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Migration: Add bio and banner_color to users
|
||||
con.all("PRAGMA table_info('users')", (err, rows) => {
|
||||
if (err) return;
|
||||
const hasBio = rows.some(r => r.name === 'bio');
|
||||
if (!hasBio) {
|
||||
con.run("ALTER TABLE users ADD COLUMN bio VARCHAR DEFAULT ''", (err) => {
|
||||
if (err) console.error("Error adding bio column:", err);
|
||||
});
|
||||
con.run("ALTER TABLE users ADD COLUMN banner_color VARCHAR DEFAULT '#6366f1'", (err) => {
|
||||
if (err) console.error("Error adding banner_color column:", err);
|
||||
});
|
||||
}
|
||||
|
||||
const hasBalance = rows.some(r => r.name === 'balance');
|
||||
if (!hasBalance) {
|
||||
con.run("ALTER TABLE users ADD COLUMN balance INTEGER DEFAULT 100", (err) => {
|
||||
if (err) console.error("Error adding balance column:", err);
|
||||
});
|
||||
}
|
||||
});
|
||||
console.log('Database initialized and cleared');
|
||||
initDb().then(() => {
|
||||
console.log('Database initialized successfully');
|
||||
}).catch(err => {
|
||||
console.error('Failed to initialize database (continuing anyway):', err);
|
||||
});
|
||||
|
||||
module.exports = { db, con };
|
||||
|
||||
Reference in New Issue
Block a user