Add session server routes and SessionError class
Introduces new session server endpoints for hasJoined and profile lookup, adds a SessionError class for improved error handling, and updates error exports. Also renames sessionRepository and sessionService files to sessionsRepository and sessionsService for consistency, and sets max listeners in logger.
This commit is contained in:
parent
64d632eac9
commit
80bca31d9a
20
errors/SessionError.js
Normal file
20
errors/SessionError.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
class SessionError extends Error {
|
||||||
|
constructor(statusCode, errorMessage, path) {
|
||||||
|
super(errorMessage)
|
||||||
|
this.path = path
|
||||||
|
this.statusCode = statusCode
|
||||||
|
this.errorMessage = errorMessage
|
||||||
|
this.isOperational = true
|
||||||
|
Error.captureStackTrace(this, this.constructor)
|
||||||
|
}
|
||||||
|
|
||||||
|
serialize() {
|
||||||
|
const response = {
|
||||||
|
path: this.path,
|
||||||
|
errorMessage: this.errorMessage
|
||||||
|
}
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SessionError
|
||||||
@ -1,10 +1,4 @@
|
|||||||
class YggdrasilError extends Error {
|
class YggdrasilError extends Error {
|
||||||
/**
|
|
||||||
* @param {number} statusCode - Le code HTTP (ex: 403, 415)
|
|
||||||
* @param {string} error - Description courte (ex: "ForbiddenOperationException" ou "Unsupported Media Type")
|
|
||||||
* @param {string} errorMessage - Description longue pour l'utilisateur
|
|
||||||
* @param {string} [cause] - Cause optionnelle de l'erreur
|
|
||||||
*/
|
|
||||||
constructor(statusCode, error, errorMessage, cause) {
|
constructor(statusCode, error, errorMessage, cause) {
|
||||||
super(errorMessage)
|
super(errorMessage)
|
||||||
this.statusCode = statusCode
|
this.statusCode = statusCode
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
const DefaultError = require("./DefaultError")
|
const DefaultError = require("./DefaultError")
|
||||||
|
const SessionError = require("./SessionError")
|
||||||
const YggdrasilError = require("./YggdrasilError")
|
const YggdrasilError = require("./YggdrasilError")
|
||||||
const ValidationError = require("./ValidationError")
|
const ValidationError = require("./ValidationError")
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
DefaultError,
|
DefaultError,
|
||||||
|
SessionError,
|
||||||
YggdrasilError,
|
YggdrasilError,
|
||||||
ValidationError
|
ValidationError
|
||||||
}
|
}
|
||||||
@ -5,6 +5,8 @@ require("dotenv").config({
|
|||||||
quiet: true
|
quiet: true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
process.setMaxListeners(15)
|
||||||
|
|
||||||
function cleanup($stream) {
|
function cleanup($stream) {
|
||||||
if (!$stream.destroyed) {
|
if (!$stream.destroyed) {
|
||||||
$stream.end()
|
$stream.end()
|
||||||
@ -49,7 +51,7 @@ function createLogger(root) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const stream = fs.createWriteStream(path.join(logsDir, `${fileName}.log`), { flags: "a" })
|
const stream = fs.createWriteStream(path.join(logsDir, `${fileName}.log`), { flags: "a" })
|
||||||
|
|
||||||
process.on("exit", () => {
|
process.on("exit", () => {
|
||||||
cleanup(stream)
|
cleanup(stream)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
const path = require("node:path")
|
const path = require("node:path")
|
||||||
const Logger = require("./logger")
|
const Logger = require("./logger")
|
||||||
|
const crypto = require("node:crypto")
|
||||||
const logger = Logger.createLogger(path.join(__dirname, ".."))
|
const logger = Logger.createLogger(path.join(__dirname, ".."))
|
||||||
const certificatesManager = require("./certificatesManager")
|
const certificatesManager = require("./certificatesManager")
|
||||||
const serverKeys = certificatesManager.getKeys()
|
const serverKeys = certificatesManager.getKeys()
|
||||||
|
|||||||
26
routes/sessionsserver/session/minecraft/hasJoined.js
Normal file
26
routes/sessionsserver/session/minecraft/hasJoined.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const path = require("path")
|
||||||
|
const express = require("express")
|
||||||
|
const router = express.Router()
|
||||||
|
const sessionsService = require("../../../../services/sessionsService")
|
||||||
|
const Logger = require("../../../../modules/logger")
|
||||||
|
const { YggdrasilError, DefaultError } = require("../../../../errors/errors")
|
||||||
|
const logger = Logger.createLogger(path.join(__dirname, "..", "..", "..", ".."))
|
||||||
|
|
||||||
|
router.get("/", async (req, res) => {
|
||||||
|
const { username, serverId, ip } = req.query
|
||||||
|
try {
|
||||||
|
const result = await sessionsService.hasJoinedServer({ username, serverId, ip })
|
||||||
|
if (result.code === 200) {
|
||||||
|
logger.log(`Server join verified for: ${username}`, ["SESSION", "green"])
|
||||||
|
return res.status(200).json(result.data)
|
||||||
|
}
|
||||||
|
return res.status(204).end()
|
||||||
|
} catch (err) {
|
||||||
|
if (err instanceof DefaultError) {
|
||||||
|
throw new YggdrasilError(err.code, err.error || "InternalServerError", err.message, err.cause)
|
||||||
|
}
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = router
|
||||||
29
routes/sessionsserver/session/minecraft/profile/[uuid].js
Normal file
29
routes/sessionsserver/session/minecraft/profile/[uuid].js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
const express = require("express")
|
||||||
|
const router = express.Router({ mergeParams: true })
|
||||||
|
const sessionsService = require("../../../../../services/sessionsService")
|
||||||
|
const { SessionError, DefaultError } = require("../../../../../errors/errors")
|
||||||
|
|
||||||
|
router.get("", async (req, res) => {
|
||||||
|
const { uuid } = req.params
|
||||||
|
const { unsigned } = req.query
|
||||||
|
const isUnsigned = (unsigned == undefined || unsigned == "true") ? true : false
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await sessionsService.getProfile({
|
||||||
|
uuid: uuid,
|
||||||
|
unsigned: isUnsigned
|
||||||
|
})
|
||||||
|
if (result.code === 200) {
|
||||||
|
return res.status(200).json(result.data)
|
||||||
|
}
|
||||||
|
if (result.code === 204) {
|
||||||
|
throw new SessionError(404, "Not a valid UUID", req.originalUrl)
|
||||||
|
}
|
||||||
|
throw new DefaultError(500, "Unknown error")
|
||||||
|
} catch (err) {
|
||||||
|
const errorMessage = err.message || "Not a valid UUID"
|
||||||
|
throw new SessionError(400, errorMessage, req.originalUrl)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = router
|
||||||
@ -1,6 +1,6 @@
|
|||||||
const utils = require("../modules/utils")
|
const utils = require("../modules/utils")
|
||||||
const authRepository = require("../repositories/authRepository")
|
const authRepository = require("../repositories/authRepository")
|
||||||
const sessionRepository = require("../repositories/sessionRepository")
|
const sessionRepository = require("../repositories/sessionsRepository")
|
||||||
const { DefaultError } = require("../errors/errors")
|
const { DefaultError } = require("../errors/errors")
|
||||||
|
|
||||||
async function registerLegacySession({ uuid, sessionId }) {
|
async function registerLegacySession({ uuid, sessionId }) {
|
||||||
Loading…
x
Reference in New Issue
Block a user