Refactor code structure for improved readability and maintainability
This commit is contained in:
@@ -7,10 +7,16 @@ async function createUsersTable() {
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
name VARCHAR(120) NOT NULL,
|
||||
email VARCHAR(120) NOT NULL UNIQUE,
|
||||
is_admin TINYINT(1) NOT NULL DEFAULT 0,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
`);
|
||||
|
||||
const [columns] = await db.query(`SHOW COLUMNS FROM users LIKE 'is_admin'`);
|
||||
if (columns.length === 0) {
|
||||
await db.query(`ALTER TABLE users ADD COLUMN is_admin TINYINT(1) NOT NULL DEFAULT 0 AFTER email`);
|
||||
}
|
||||
}
|
||||
|
||||
async function createLicensesTable() {
|
||||
|
||||
@@ -10,6 +10,7 @@ function serializeUser(row) {
|
||||
username: row.username,
|
||||
name: row.name,
|
||||
email: row.email,
|
||||
isAdmin: Boolean(row.is_admin),
|
||||
createdAt: row.created_at ? new Date(row.created_at).toISOString() : null
|
||||
};
|
||||
}
|
||||
@@ -20,10 +21,12 @@ function signToken(userId) {
|
||||
|
||||
export async function registerUser({ username, name, email, password }) {
|
||||
const passwordHash = await bcrypt.hash(password, 10);
|
||||
const [[{ count }]] = await db.query("SELECT COUNT(*) AS count FROM users");
|
||||
const isAdmin = count === 0 ? 1 : 0;
|
||||
try {
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO users (username, name, email, password_hash) VALUES (?, ?, ?, ?)`,
|
||||
[username, name, email, passwordHash]
|
||||
`INSERT INTO users (username, name, email, password_hash, is_admin) VALUES (?, ?, ?, ?, ?)`,
|
||||
[username, name, email, passwordHash, isAdmin]
|
||||
);
|
||||
const user = await getUserById(result.insertId);
|
||||
const token = signToken(user.id);
|
||||
@@ -64,6 +67,37 @@ export async function authenticateUser(identifier, password) {
|
||||
}
|
||||
|
||||
export async function getUserById(id) {
|
||||
const [rows] = await db.query(`SELECT id, username, name, email, created_at FROM users WHERE id = ? LIMIT 1`, [id]);
|
||||
const [rows] = await db.query(
|
||||
`SELECT id, username, name, email, is_admin, created_at FROM users WHERE id = ? LIMIT 1`,
|
||||
[id]
|
||||
);
|
||||
return serializeUser(rows[0]);
|
||||
}
|
||||
|
||||
export async function listUsers() {
|
||||
const [rows] = await db.query(
|
||||
`SELECT id, username, name, email, is_admin, created_at FROM users ORDER BY created_at ASC`
|
||||
);
|
||||
return rows.map(serializeUser);
|
||||
}
|
||||
|
||||
export async function adminCreateUser({ username, name, email, password, isAdmin = false }) {
|
||||
const passwordHash = await bcrypt.hash(password, 10);
|
||||
try {
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO users (username, name, email, password_hash, is_admin) VALUES (?, ?, ?, ?, ?)`,
|
||||
[username, name, email, passwordHash, isAdmin ? 1 : 0]
|
||||
);
|
||||
return await getUserById(result.insertId);
|
||||
} catch (error) {
|
||||
if (error?.code === "ER_DUP_ENTRY") {
|
||||
const message = error.sqlMessage || "Duplicate";
|
||||
if (message.includes("username")) {
|
||||
error.meta = "USERNAME";
|
||||
} else if (message.includes("email")) {
|
||||
error.meta = "EMAIL";
|
||||
}
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user