Skip to content

Commit ab51203

Browse files
fix db
1 parent 26f7634 commit ab51203

3 files changed

Lines changed: 127 additions & 54 deletions

File tree

backend/database/career_advisor.db

4 KB
Binary file not shown.

backend/scripts/migrateAddUsername.js

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,55 +3,79 @@
33
* Run this script to update existing databases
44
*/
55

6-
const db = require('../database/connection');
6+
const sqlite3 = require('sqlite3').verbose();
7+
const path = require('path');
8+
9+
const DB_PATH = path.join(__dirname, '..', 'database', 'career_advisor.db');
710

811
async function migrate() {
912
console.log('Starting migration: Add username column to users table...');
1013

1114
return new Promise((resolve, reject) => {
12-
// Check if username column exists
13-
db.get("SELECT sql FROM sqlite_master WHERE type='table' AND name='users'", (err, row) => {
15+
const db = new sqlite3.Database(DB_PATH, async (err) => {
1416
if (err) {
15-
console.error('Error checking users table:', err.message);
17+
console.error('DB connect error:', err.message);
1618
return reject(err);
1719
}
1820

19-
console.log('Current users table schema:', row?.sql);
20-
21-
if (row?.sql?.includes('username')) {
22-
console.log('Username column already exists. Skipping migration.');
23-
return resolve(true);
24-
}
21+
console.log('DB connected');
2522

26-
// Add username column
27-
const alterQuery = `ALTER TABLE users ADD COLUMN username VARCHAR(100)`;
28-
db.run(alterQuery, (err) => {
29-
if (err) {
30-
console.error('Error adding username column:', err.message);
31-
return reject(err);
23+
try {
24+
// Check if username column exists
25+
const columnInfo = await new Promise((resolve, reject) => {
26+
db.all("PRAGMA table_info(users)", (err, rows) => {
27+
if (err) return reject(err);
28+
resolve(rows || []);
29+
});
30+
});
31+
32+
const hasUsername = columnInfo.some(col => col.name === 'username');
33+
const hasLastLogin = columnInfo.some(col => col.name === 'last_login');
34+
35+
if (hasUsername) {
36+
console.log('✅ Username column already exists');
37+
} else {
38+
console.log('📝 Adding username column...');
39+
await new Promise((resolve, reject) => {
40+
db.run('ALTER TABLE users ADD COLUMN username VARCHAR(100)', (err) => {
41+
if (err) return reject(err);
42+
43+
db.run('CREATE INDEX IF NOT EXISTS idx_users_username ON users(username)', (err) => {
44+
if (err) console.warn('⚠️ Warning: Failed to create username index:', err.message);
45+
console.log('✅ Username column added successfully');
46+
resolve();
47+
});
48+
});
49+
});
3250
}
3351

34-
console.log('Username column added successfully.');
52+
if (!hasLastLogin) {
53+
console.log('📝 Adding last_login column...');
54+
await new Promise((resolve, reject) => {
55+
db.run('ALTER TABLE users ADD COLUMN last_login DATETIME', (err) => {
56+
if (err) return reject(err);
57+
console.log('✅ last_login column added successfully');
58+
resolve();
59+
});
60+
});
61+
}
3562

36-
// Create index for username
37-
const createIndex = `CREATE INDEX IF NOT EXISTS idx_users_username ON users(username)`;
38-
db.run(createIndex, (err) => {
39-
if (err) {
40-
console.error('Error creating username index:', err.message);
41-
// Continue anyway, the column was added
42-
}
43-
console.log('Username index created.');
44-
resolve(true);
45-
});
46-
});
63+
console.log('✅ Migration completed successfully.');
64+
resolve(true);
65+
} catch (e) {
66+
console.error('Migration error:', e.message);
67+
reject(e);
68+
} finally {
69+
db.close();
70+
}
4771
});
4872
});
4973
}
5074

5175
// Run migration
5276
migrate()
5377
.then(() => {
54-
console.log('Migration completed successfully.');
78+
console.log('Done.');
5579
process.exit(0);
5680
})
5781
.catch((err) => {

backend/services/dbInit.js

Lines changed: 74 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ async function initDbIfNeeded(db) {
3535

3636
await execSql(db, schemaSql);
3737

38-
// Run migrations before seeding
38+
// Run migrations after schema is applied (for existing databases)
3939
await runMigrations(db);
4040

4141
await seedCareerLibrary(db);
@@ -77,19 +77,22 @@ async function runMigrations(db) {
7777
console.log('🔧 Running migrations...');
7878

7979
// Migration: Add username column to users table
80-
await new Promise((resolve, reject) => {
81-
db.get("SELECT sql FROM sqlite_master WHERE type='table' AND name='users'", (err, row) => {
80+
// Check if username column exists using PRAGMA table_info
81+
const columnInfo = await new Promise((resolve, reject) => {
82+
db.all("PRAGMA table_info(users)", (err, rows) => {
8283
if (err) return reject(err);
83-
84-
const hasUsername = row && row.sql && row.sql.includes('username');
85-
86-
if (hasUsername) {
87-
console.log('✅ Username column already exists');
88-
return resolve();
89-
}
90-
91-
console.log('📝 Adding username column to users table...');
92-
db.run('ALTER TABLE users ADD COLUMN username VARCHAR(255)', (err) => {
84+
resolve(rows || []);
85+
});
86+
});
87+
88+
const hasUsername = columnInfo.some(col => col.name === 'username');
89+
90+
if (hasUsername) {
91+
console.log('✅ Username column already exists');
92+
} else {
93+
console.log('📝 Adding username column to users table...');
94+
await new Promise((resolve, reject) => {
95+
db.run('ALTER TABLE users ADD COLUMN username VARCHAR(100)', (err) => {
9396
if (err) return reject(err);
9497

9598
db.run('CREATE INDEX IF NOT EXISTS idx_users_username ON users(username)', (err) => {
@@ -99,20 +102,45 @@ async function runMigrations(db) {
99102
});
100103
});
101104
});
102-
});
105+
}
106+
107+
// Migration: Add last_login column if not exists
108+
const hasLastLogin = columnInfo.some(col => col.name === 'last_login');
109+
if (!hasLastLogin) {
110+
console.log('📝 Adding last_login column to users table...');
111+
await new Promise((resolve, reject) => {
112+
db.run('ALTER TABLE users ADD COLUMN last_login DATETIME', (err) => {
113+
if (err) return reject(err);
114+
console.log('✅ last_login column added successfully');
115+
resolve();
116+
});
117+
});
118+
}
103119

104120
console.log('✅ Migrations complete');
105121
}
106122

107123
async function ensureAdminAccount(db) {
108124
if (!ADMIN_EMAIL || !ADMIN_PASSWORD) return;
125+
126+
// Check if username column exists
127+
const columnInfo = await new Promise((resolve, reject) => {
128+
db.all("PRAGMA table_info(users)", (err, rows) => {
129+
if (err) return reject(err);
130+
resolve(rows || []);
131+
});
132+
});
133+
134+
const hasUsername = columnInfo.some(col => col.name === 'username');
135+
109136
await new Promise((resolve, reject) => {
110137
db.run(
111138
"UPDATE users SET user_type = 'professional' WHERE user_type = 'admin' AND email != ?",
112139
[ADMIN_EMAIL],
113140
(err) => (err ? reject(err) : resolve())
114141
);
115142
});
143+
116144
const admin = await new Promise((resolve) => {
117145
db.get('SELECT id FROM users WHERE email = ?', [ADMIN_EMAIL], (err, row) => {
118146
if (err) return resolve(null);
@@ -121,24 +149,45 @@ async function ensureAdminAccount(db) {
121149
});
122150

123151
const passwordHash = await bcrypt.hash(ADMIN_PASSWORD, 10);
152+
124153
if (!admin) {
154+
if (hasUsername) {
155+
await new Promise((resolve, reject) => {
156+
db.run(
157+
'INSERT INTO users (email, username, password_hash, user_type) VALUES (?, ?, ?, ?)',
158+
[ADMIN_EMAIL, 'admin', passwordHash, 'admin'],
159+
(err) => (err ? reject(err) : resolve())
160+
);
161+
});
162+
} else {
163+
await new Promise((resolve, reject) => {
164+
db.run(
165+
'INSERT INTO users (email, password_hash, user_type) VALUES (?, ?, ?)',
166+
[ADMIN_EMAIL, passwordHash, 'admin'],
167+
(err) => (err ? reject(err) : resolve())
168+
);
169+
});
170+
}
171+
return;
172+
}
173+
174+
if (hasUsername) {
125175
await new Promise((resolve, reject) => {
126176
db.run(
127-
'INSERT INTO users (email, username, password_hash, user_type) VALUES (?, ?, ?, ?)',
128-
[ADMIN_EMAIL, 'admin', passwordHash, 'admin'],
177+
'UPDATE users SET password_hash = ?, user_type = ?, username = ? WHERE email = ?',
178+
[passwordHash, 'admin', 'admin', ADMIN_EMAIL],
179+
(err) => (err ? reject(err) : resolve())
180+
);
181+
});
182+
} else {
183+
await new Promise((resolve, reject) => {
184+
db.run(
185+
'UPDATE users SET password_hash = ?, user_type = ? WHERE email = ?',
186+
[passwordHash, 'admin', ADMIN_EMAIL],
129187
(err) => (err ? reject(err) : resolve())
130188
);
131189
});
132-
return;
133190
}
134-
135-
await new Promise((resolve, reject) => {
136-
db.run(
137-
'UPDATE users SET password_hash = ?, user_type = ?, username = ? WHERE email = ?',
138-
[passwordHash, 'admin', 'admin', ADMIN_EMAIL],
139-
(err) => (err ? reject(err) : resolve())
140-
);
141-
});
142191
}
143192

144193
module.exports = { initDbIfNeeded };

0 commit comments

Comments
 (0)