feat: Refactor user management to replace email with username across the application
This commit is contained in:
@@ -3,22 +3,22 @@ import bcrypt from "bcryptjs"
|
||||
import { randomBytes } from "crypto"
|
||||
|
||||
// Create a new user
|
||||
export async function createUser({ name, email, password, role = 'user', is_active = true }) {
|
||||
const existingUser = db.prepare("SELECT id FROM users WHERE email = ?").get(email)
|
||||
export async function createUser({ name, username, password, role = 'user', is_active = true }) {
|
||||
const existingUser = db.prepare("SELECT id FROM users WHERE username = ?").get(username)
|
||||
if (existingUser) {
|
||||
throw new Error("User with this email already exists")
|
||||
throw new Error("User with this username already exists")
|
||||
}
|
||||
|
||||
const passwordHash = await bcrypt.hash(password, 12)
|
||||
const userId = randomBytes(16).toString('hex')
|
||||
|
||||
const result = db.prepare(`
|
||||
INSERT INTO users (id, name, email, password_hash, role, is_active)
|
||||
INSERT INTO users (id, name, username, password_hash, role, is_active)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
`).run(userId, name, email, passwordHash, role, is_active ? 1 : 0)
|
||||
`).run(userId, name, username, passwordHash, role, is_active ? 1 : 0)
|
||||
|
||||
return db.prepare(`
|
||||
SELECT id, name, email, role, created_at, updated_at, last_login,
|
||||
SELECT id, name, username, role, created_at, updated_at, last_login,
|
||||
is_active, failed_login_attempts, locked_until
|
||||
FROM users WHERE id = ?
|
||||
`).get(userId)
|
||||
@@ -27,24 +27,24 @@ export async function createUser({ name, email, password, role = 'user', is_acti
|
||||
// Get user by ID
|
||||
export function getUserById(id) {
|
||||
return db.prepare(`
|
||||
SELECT id, name, email, password_hash, role, created_at, updated_at, last_login,
|
||||
SELECT id, name, username, password_hash, role, created_at, updated_at, last_login,
|
||||
is_active, failed_login_attempts, locked_until
|
||||
FROM users WHERE id = ?
|
||||
`).get(id)
|
||||
}
|
||||
|
||||
// Get user by email
|
||||
export function getUserByEmail(email) {
|
||||
// Get user by username
|
||||
export function getUserByUsername(username) {
|
||||
return db.prepare(`
|
||||
SELECT id, name, email, role, created_at, last_login, is_active
|
||||
FROM users WHERE email = ?
|
||||
`).get(email)
|
||||
SELECT id, name, username, role, created_at, last_login, is_active
|
||||
FROM users WHERE username = ?
|
||||
`).get(username)
|
||||
}
|
||||
|
||||
// Get all users (for admin)
|
||||
export function getAllUsers() {
|
||||
return db.prepare(`
|
||||
SELECT id, name, email, password_hash, role, created_at, updated_at, last_login, is_active,
|
||||
SELECT id, name, username, password_hash, role, created_at, updated_at, last_login, is_active,
|
||||
failed_login_attempts, locked_until
|
||||
FROM users
|
||||
ORDER BY created_at DESC
|
||||
@@ -136,11 +136,11 @@ export async function updateUser(userId, updates) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check if email is being changed and if it already exists
|
||||
if (updates.email && updates.email !== user.email) {
|
||||
const existingUser = db.prepare("SELECT id FROM users WHERE email = ? AND id != ?").get(updates.email, userId);
|
||||
// Check if username is being changed and if it already exists
|
||||
if (updates.username && updates.username !== user.username) {
|
||||
const existingUser = db.prepare("SELECT id FROM users WHERE username = ? AND id != ?").get(updates.username, userId);
|
||||
if (existingUser) {
|
||||
throw new Error("User with this email already exists");
|
||||
throw new Error("User with this username already exists");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,9 +153,9 @@ export async function updateUser(userId, updates) {
|
||||
updateValues.push(updates.name);
|
||||
}
|
||||
|
||||
if (updates.email !== undefined) {
|
||||
updateFields.push("email = ?");
|
||||
updateValues.push(updates.email);
|
||||
if (updates.username !== undefined) {
|
||||
updateFields.push("username = ?");
|
||||
updateValues.push(updates.username);
|
||||
}
|
||||
|
||||
if (updates.role !== undefined) {
|
||||
@@ -198,7 +198,7 @@ export async function updateUser(userId, updates) {
|
||||
|
||||
if (result.changes > 0) {
|
||||
return db.prepare(`
|
||||
SELECT id, name, email, role, created_at, updated_at, last_login,
|
||||
SELECT id, name, username, role, created_at, updated_at, last_login,
|
||||
is_active, failed_login_attempts, locked_until
|
||||
FROM users WHERE id = ?
|
||||
`).get(userId);
|
||||
|
||||
Reference in New Issue
Block a user