Public Access
feat: enhance user registration with email verification configuration and status handling
This commit is contained in:
1 parent
4f33444653
commit
f7b93f8612
3 files changed
+32
-13
No files matched your search
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'url'
|
||||
import { runMigrations } from './migrations.js'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const DB_PATH = path.join(__dirname, '..', '..', 'brainwave.db')
|
||||
const DB_PATH = path.join(__dirname, '..', '..', 'db', 'brainwave.db')
|
||||
|
||||
let db: Database.Database | null = null
|
||||
|
||||
|
||||
+27
-12
@@ -2,7 +2,7 @@ import { Router } from 'express'
|
||||
import bcrypt from 'bcrypt'
|
||||
import { getDb } from '../db/database.js'
|
||||
import { signToken, generateVerificationToken } from '../utils/tokens.js'
|
||||
import { sendVerificationEmail, sendPasswordResetEmail } from '../utils/email.js'
|
||||
import { sendVerificationEmail, sendPasswordResetEmail, isEmailConfigured } from '../utils/email.js'
|
||||
import { requireAuth } from '../middleware/auth.js'
|
||||
|
||||
const router = Router()
|
||||
@@ -40,20 +40,35 @@ router.post('/register', async (req, res) => {
|
||||
}
|
||||
|
||||
const passwordHash = await bcrypt.hash(password, BCRYPT_ROUNDS)
|
||||
const verifyToken = generateVerificationToken()
|
||||
const verifyExpires = Date.now() + VERIFY_EXPIRY_MS
|
||||
const emailConfigured = isEmailConfigured()
|
||||
|
||||
let verifyToken: string | null = null
|
||||
let verifyExpires: number | null = null
|
||||
let emailVerified = 1
|
||||
|
||||
if (emailConfigured) {
|
||||
verifyToken = generateVerificationToken()
|
||||
verifyExpires = Date.now() + VERIFY_EXPIRY_MS
|
||||
emailVerified = 0
|
||||
}
|
||||
|
||||
const result = db.prepare(`
|
||||
INSERT INTO users (email, password_hash, display_name, verify_token, verify_expires)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
`).run(email.toLowerCase().trim(), passwordHash, displayName.trim(), verifyToken, verifyExpires)
|
||||
INSERT INTO users (email, password_hash, display_name, verify_token, verify_expires, email_verified)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
`).run(email.toLowerCase().trim(), passwordHash, displayName.trim(), verifyToken, verifyExpires, emailVerified)
|
||||
|
||||
await sendVerificationEmail(email, verifyToken)
|
||||
|
||||
res.status(201).json({
|
||||
message: 'Account created. Please check your email to verify your account.',
|
||||
userId: result.lastInsertRowid,
|
||||
})
|
||||
if (emailConfigured) {
|
||||
await sendVerificationEmail(email, verifyToken!)
|
||||
res.status(201).json({
|
||||
message: 'Account created. Please check your email to verify your account.',
|
||||
userId: result.lastInsertRowid,
|
||||
})
|
||||
} else {
|
||||
res.status(201).json({
|
||||
message: 'Account created and verified. You can now log in.',
|
||||
userId: result.lastInsertRowid,
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Register error:', err)
|
||||
res.status(500).json({ error: 'Internal server error' })
|
||||
|
||||
@@ -38,6 +38,10 @@ function getSetting(key: string): string {
|
||||
return row?.value ?? "";
|
||||
}
|
||||
|
||||
export function isEmailConfigured(): boolean {
|
||||
return !!getSetting("smtp_host").trim();
|
||||
}
|
||||
|
||||
function getSmtpConfig(): SmtpConfig | null {
|
||||
const host = getSetting("smtp_host").trim();
|
||||
if (!host) return null;
|
||||
|
||||
Reference in new issue
Block a user