Yggdrasil/repositories/adminRepository.js
azures04 617e60cf75 Fix admin permissions table name and seed default permissions
Corrects the table name from 'apiAdministrators_permissions' to 'apiAdministratorsPermissions' in adminRepository.js for consistency with the database schema. Also seeds default permissions into 'apiAdministratorsPermissionsList' during database setup.
2026-01-18 18:55:22 +01:00

139 lines
4.3 KiB
JavaScript

const utils = require("../modules/utils")
const database = require("../modules/database")
const { DefaultError } = require("../errors/errors")
async function getAdminById(id) {
try {
const sql = "SELECT id, username, createdAt FROM apiAdministrators WHERE id = ?"
const rows = await database.query(sql, [id])
return rows[0] || null
} catch (error) {
return utils.handleDBError(error)
}
}
async function createAdmin(username, hashedPassword) {
try {
const sql = "INSERT INTO apiAdministrators (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.")
}
return utils.handleDBError(error)
}
}
async function hasPermission(adminId, permissionKey) {
try {
const sql = `
SELECT COUNT(*) as count
FROM apiAdministratorsPermissions
WHERE administrator_id = ? AND permission_key = ?
`
const rows = await database.query(sql, [adminId, permissionKey])
return rows[0].count === 1
} catch (error) {
return utils.handleDBError(error)
}
}
async function assignPermission(adminId, permissionKey) {
try {
const sql = "INSERT INTO apiAdministratorsPermissions (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
return utils.handleDBError(error)
}
}
async function revokePermission(adminId, permissionKey) {
try {
const sql = "DELETE FROM apiAdministratorsPermissions WHERE administrator_id = ? AND permission_key = ?"
const result = await database.query(sql, [adminId, permissionKey])
return result.affectedRows > 0
} catch (error) {
return utils.handleDBError(error)
}
}
async function getAdminPermissions(adminId) {
try {
const sql = `
SELECT permission_key
FROM apiAdministratorsPermissions
WHERE administrator_id = ?
`
const rows = await database.query(sql, [adminId])
return rows.map(r => r.permission_key)
} catch (error) {
return utils.handleDBError(error)
}
}
async function updateAdminPassword(adminId, newHashedPassword) {
try {
const sql = "UPDATE apiAdministrators 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) {
return utils.handleDBError(error)
}
}
async function getAdminByUsername(username) {
try {
const sql = "SELECT id, username, password, createdAt FROM apiAdministrators WHERE username = ?"
const rows = await database.query(sql, [username])
return rows[0] || null
} catch (error) {
return utils.handleDBError(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) {
return utils.handleDBError(error)
}
}
module.exports = {
createAdmin,
getAdminById,
hasPermission,
addPlayerAction,
assignPermission,
revokePermission,
getAdminByUsername,
getAdminPermissions,
updateAdminPassword
}