Introduces a new addPlayerAction method in adminRepository and logPlayerAction in adminService to record admin actions on player accounts. Updates relevant admin routes to log actions such as bans, unbans, forced name changes, and skin resets. Also improves error messages in adminService for consistency and clarity.
149 lines
5.5 KiB
JavaScript
149 lines
5.5 KiB
JavaScript
const logger = require("../modules/logger")
|
|
const database = require("../modules/database")
|
|
const { DefaultError } = require("../errors/errors")
|
|
|
|
async function getAdminById(id) {
|
|
try {
|
|
const sql = "SELECT id, username, createdAt FROM api_administrators WHERE id = ?"
|
|
const rows = await database.query(sql, [id])
|
|
return rows[0] || null
|
|
} catch (error) {
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function createAdmin(username, hashedPassword) {
|
|
try {
|
|
const sql = "INSERT INTO api_administrators (username, password) VALUES (?, ?)"
|
|
const result = await database.query(sql, [username, hashedPassword])
|
|
|
|
if (result.affectedRows > 0) {
|
|
return { code: 200, id: result.insertId, username }
|
|
} else {
|
|
throw new DefaultError(500, "Failed to create administrator.")
|
|
}
|
|
} catch (error) {
|
|
if (error.code === "ER_DUP_ENTRY") {
|
|
throw new DefaultError(409, "Administrator username already exists.")
|
|
}
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function hasPermission(adminId, permissionKey) {
|
|
try {
|
|
const sql = `
|
|
SELECT COUNT(*) as count
|
|
FROM api_administrators_permissions
|
|
WHERE administrator_id = ? AND permission_key = ?
|
|
`
|
|
const rows = await database.query(sql, [adminId, permissionKey])
|
|
return rows[0].count === 1
|
|
} catch (error) {
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function assignPermission(adminId, permissionKey) {
|
|
try {
|
|
const sql = "INSERT INTO api_administrators_permissions (administrator_id, permission_key) VALUES (?, ?)"
|
|
const result = await database.query(sql, [adminId, permissionKey])
|
|
|
|
return result.affectedRows > 0
|
|
} catch (error) {
|
|
if (error.code === "ER_DUP_ENTRY") return true
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function revokePermission(adminId, permissionKey) {
|
|
try {
|
|
const sql = "DELETE FROM api_administrators_permissions WHERE administrator_id = ? AND permission_key = ?"
|
|
const result = await database.query(sql, [adminId, permissionKey])
|
|
|
|
return result.affectedRows > 0
|
|
} catch (error) {
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function getAdminPermissions(adminId) {
|
|
try {
|
|
const sql = `
|
|
SELECT permission_key
|
|
FROM api_administrators_permissions
|
|
WHERE administrator_id = ?
|
|
`
|
|
const rows = await database.query(sql, [adminId])
|
|
return rows.map(r => r.permission_key)
|
|
} catch (error) {
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function updateAdminPassword(adminId, newHashedPassword) {
|
|
try {
|
|
const sql = "UPDATE api_administrators SET password = ? WHERE id = ?"
|
|
const result = await database.query(sql, [newHashedPassword, adminId])
|
|
|
|
if (result.affectedRows > 0) {
|
|
return {
|
|
code: 200,
|
|
message: "Password updated successfully."
|
|
}
|
|
} else {
|
|
throw new DefaultError(404, "Administrator not found.")
|
|
}
|
|
} catch (error) {
|
|
if (error instanceof DefaultError) throw error
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function getAdminByUsername(username) {
|
|
try {
|
|
const sql = "SELECT id, username, password, createdAt FROM api_administrators WHERE username = ?"
|
|
const rows = await database.query(sql, [username])
|
|
|
|
return rows[0] || null
|
|
} catch (error) {
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
async function addPlayerAction(playerUuid, actionCode) {
|
|
try {
|
|
const cleanUuid = playerUuid.replace(/-/g, "")
|
|
const sql = "INSERT IGNORE INTO playerProfileActions (uuid, action) VALUES (?, ?)"
|
|
const result = await database.query(sql, [cleanUuid, actionCode])
|
|
|
|
return {
|
|
code: 200,
|
|
success: result.affectedRows > 0,
|
|
message: result.affectedRows > 0 ? "Action taken." : "Action already taken."
|
|
}
|
|
} catch (error) {
|
|
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
|
|
throw new DefaultError(500, "Internal Server Error", "Database Error")
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
createAdmin,
|
|
getAdminById,
|
|
hasPermission,
|
|
addPlayerAction,
|
|
assignPermission,
|
|
revokePermission,
|
|
getAdminByUsername,
|
|
getAdminPermissions,
|
|
updateAdminPassword
|
|
} |