Add legacy skin and cape routes, improve error handling

Introduces legacy routes for Minecraft skins and capes to support older endpoints. Enhances error handling in sessionsRepository for missing skins/capes, adds getActiveSkin and getActiveCape to sessionsService, and improves error logging in server.js.
This commit is contained in:
Gilles Lazures 2025-12-29 22:02:52 +01:00
parent 80fb6c6cd4
commit 9b36c85974
8 changed files with 82 additions and 3 deletions

View File

@ -69,9 +69,14 @@ async function getActiveSkin(uuid) {
` `
const rows = await database.query(sql, [uuid]) const rows = await database.query(sql, [uuid])
const skin = rows[0] const skin = rows[0]
if (!skin) {
throw new DefaultError(404, "Not found", "Not found")
}
return { code: 200, data: skin || null } return { code: 200, data: skin || null }
} catch (error) { } catch (error) {
if (error instanceof DefaultError) {
throw error
}
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"]) logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
throw new DefaultError(500, "Internal Server Error", "Please contact an administrator.") throw new DefaultError(500, "Internal Server Error", "Please contact an administrator.")
} }
@ -87,9 +92,14 @@ async function getActiveCape(uuid) {
` `
const rows = await database.query(sql, [uuid]) const rows = await database.query(sql, [uuid])
const cape = rows[0] const cape = rows[0]
if (!cape) {
throw new DefaultError(404, "Not found", "Not found")
}
return { code: 200, data: cape || null } return { code: 200, data: cape || null }
} catch (error) { } catch (error) {
if (error instanceof DefaultError) {
throw error
}
logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"]) logger.log("Internal Server Error".bold + " : " + error.toString(), ["MariaDB", "yellow"])
throw new DefaultError(500, "Internal Server Error", "Please contact an administrator.") throw new DefaultError(500, "Internal Server Error", "Please contact an administrator.")
} }

View File

@ -0,0 +1,10 @@
const express = require("express")
const router = express.Router({ mergeParams: true })
const sessionsService = require("../../../services/sessionsService")
router.get("", async (req, res) => {
const cape = await sessionsService.getActiveCape({ username: req.params.username.replace(".png", "") })
return res.redirect(`/textures${cape.data.url}`)
})
module.exports = router

View File

@ -0,0 +1,10 @@
const express = require("express")
const router = express.Router({ mergeParams: true })
const sessionsService = require("../../../services/sessionsService")
router.get("", async (req, res) => {
const cape = await sessionsService.getActiveSkin({ username: req.params.username.replace(".png", "") })
return res.redirect(`/textures${cape.data.url}`)
})
module.exports = router

View File

@ -0,0 +1,10 @@
const express = require("express")
const router = express.Router({ mergeParams: true })
const sessionsService = require("../../../services/sessionsService")
router.get("", async (req, res) => {
const cape = await sessionsService.getActiveCape({ username: req.params.username.replace(".png", "") })
return res.redirect(`/textures${cape.data.url}`)
})
module.exports = router

View File

@ -0,0 +1,10 @@
const express = require("express")
const router = express.Router({ mergeParams: true })
const sessionsService = require("../../../services/sessionsService")
router.get("", async (req, res) => {
const cape = await sessionsService.getActiveSkin({ username: req.params.username.replace(".png", "") })
return res.redirect(`/textures${cape.data.url}`)
})
module.exports = router

View File

@ -149,7 +149,7 @@ app.all(/.*/, (req, res, next) => {
app.use((err, req, res, next) => { app.use((err, req, res, next) => {
const statusCode = err.statusCode || err.code || 500 const statusCode = err.statusCode || err.code || 500
logger.log(req.originalUrl) logger.error(`Error occured on: ${req.originalUrl.bold}`, ["API", "red"])
logger.error(err.message, ["API", "red"]) logger.error(err.message, ["API", "red"])
if (typeof err.serialize === "function") { if (typeof err.serialize === "function") {

View File

@ -167,9 +167,37 @@ async function joinLegacyServer({ name, sessionId, serverId }) {
return { code: 200, message: "OK" } return { code: 200, message: "OK" }
} }
async function getActiveSkin({ username }) {
try {
const dbUser = await authRepository.getUser(username)
const activeSkin = await sessionRepository.getActiveSkin(dbUser.user.uuid)
return activeSkin
} catch (error) {
if (!(error instanceof DefaultError)) {
throw new DefaultError(400, "Bad Request", error.toString())
}
throw error
}
}
async function getActiveCape({ username }) {
try {
const dbUser = await authRepository.getUser(username)
const activeCape = await sessionRepository.getActiveCape(dbUser.user.uuid)
return activeCape
} catch (error) {
if (!(error instanceof DefaultError)) {
throw new DefaultError(400, "Bad Request", error.toString())
}
throw error
}
}
module.exports = { module.exports = {
getProfile, getProfile,
joinServer, joinServer,
getActiveCape,
getActiveSkin,
hasJoinedServer, hasJoinedServer,
joinLegacyServer, joinLegacyServer,
getBlockedServers, getBlockedServers,

View File

@ -523,6 +523,7 @@ module.exports = {
getPlayerProperty, getPlayerProperty,
addPlayerProperty, addPlayerProperty,
updatePreferences, updatePreferences,
uploadSkinFromUrl,
getSettingsSchema, getSettingsSchema,
getPlayerBanStatus, getPlayerBanStatus,
removeProfileAction, removeProfileAction,