Introduces Discord OAuth2 integration for account association and login, including new routes for linking, unlinking, and authenticating via Discord. Adds supporting services, repositories, and schema validation for the OAuth2 flow. Refactors database schema and queries for consistency, and updates dependencies to include required OAuth2 libraries.
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 apiAdministrators 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 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.")
|
|
}
|
|
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 apiAdministrators_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 apiAdministrators_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 apiAdministrators_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 apiAdministrators_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 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) {
|
|
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 apiAdministrators 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
|
|
} |