From 9b36c859746f583661b88f31d80153e650f5efa7 Mon Sep 17 00:00:00 2001 From: azures04 Date: Mon, 29 Dec 2025 22:02:52 +0100 Subject: [PATCH] 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. --- repositories/sessionsRepository.js | 14 +++++++++-- routes/legacy/MinecraftCloaks/[username].js | 10 ++++++++ routes/legacy/MinecraftSkins/[username].js | 10 ++++++++ routes/legacy/cloaks/[username].js | 10 ++++++++ routes/legacy/skins/[username].js | 10 ++++++++ server.js | 2 +- services/sessionsService.js | 28 +++++++++++++++++++++ services/userService.js | 1 + 8 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 routes/legacy/MinecraftCloaks/[username].js create mode 100644 routes/legacy/MinecraftSkins/[username].js create mode 100644 routes/legacy/cloaks/[username].js create mode 100644 routes/legacy/skins/[username].js diff --git a/repositories/sessionsRepository.js b/repositories/sessionsRepository.js index 1e32e21..a8104e7 100644 --- a/repositories/sessionsRepository.js +++ b/repositories/sessionsRepository.js @@ -69,9 +69,14 @@ async function getActiveSkin(uuid) { ` const rows = await database.query(sql, [uuid]) const skin = rows[0] - + if (!skin) { + throw new DefaultError(404, "Not found", "Not found") + } return { code: 200, data: skin || null } } 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", "Please contact an administrator.") } @@ -87,9 +92,14 @@ async function getActiveCape(uuid) { ` const rows = await database.query(sql, [uuid]) const cape = rows[0] - + if (!cape) { + throw new DefaultError(404, "Not found", "Not found") + } return { code: 200, data: cape || null } } 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", "Please contact an administrator.") } diff --git a/routes/legacy/MinecraftCloaks/[username].js b/routes/legacy/MinecraftCloaks/[username].js new file mode 100644 index 0000000..6f426a9 --- /dev/null +++ b/routes/legacy/MinecraftCloaks/[username].js @@ -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 \ No newline at end of file diff --git a/routes/legacy/MinecraftSkins/[username].js b/routes/legacy/MinecraftSkins/[username].js new file mode 100644 index 0000000..b2aa20b --- /dev/null +++ b/routes/legacy/MinecraftSkins/[username].js @@ -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 \ No newline at end of file diff --git a/routes/legacy/cloaks/[username].js b/routes/legacy/cloaks/[username].js new file mode 100644 index 0000000..6f426a9 --- /dev/null +++ b/routes/legacy/cloaks/[username].js @@ -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 \ No newline at end of file diff --git a/routes/legacy/skins/[username].js b/routes/legacy/skins/[username].js new file mode 100644 index 0000000..b2aa20b --- /dev/null +++ b/routes/legacy/skins/[username].js @@ -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 \ No newline at end of file diff --git a/server.js b/server.js index 16424e9..537713b 100644 --- a/server.js +++ b/server.js @@ -149,7 +149,7 @@ app.all(/.*/, (req, res, next) => { app.use((err, req, res, next) => { 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"]) if (typeof err.serialize === "function") { diff --git a/services/sessionsService.js b/services/sessionsService.js index 0dcdfc1..0db7194 100644 --- a/services/sessionsService.js +++ b/services/sessionsService.js @@ -167,9 +167,37 @@ async function joinLegacyServer({ name, sessionId, serverId }) { 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 = { getProfile, joinServer, + getActiveCape, + getActiveSkin, hasJoinedServer, joinLegacyServer, getBlockedServers, diff --git a/services/userService.js b/services/userService.js index 3943ead..91dce07 100644 --- a/services/userService.js +++ b/services/userService.js @@ -523,6 +523,7 @@ module.exports = { getPlayerProperty, addPlayerProperty, updatePreferences, + uploadSkinFromUrl, getSettingsSchema, getPlayerBanStatus, removeProfileAction,