@@ -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
107123async 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
144193module . exports = { initDbIfNeeded } ;
0 commit comments