From 3d0f5c54aff7e00eda5bcdb5cdf07733f938594d Mon Sep 17 00:00:00 2001 From: azures04 Date: Wed, 24 Dec 2025 04:54:53 +0100 Subject: [PATCH] Add session join schema and enhance error serialization Introduces a Zod schema for the Minecraft session join endpoint, validating accessToken, selectedProfile, and serverId. Updates ValidationError to support serialization via YggdrasilError and SessionError for improved error formatting. --- errors/ValidationError.js | 25 ++++++++++++++----- .../sessionsserver/session/minecraft/join.js | 22 ++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 schemas/sessionsserver/session/minecraft/join.js diff --git a/errors/ValidationError.js b/errors/ValidationError.js index 71ca835..ea104e3 100644 --- a/errors/ValidationError.js +++ b/errors/ValidationError.js @@ -1,5 +1,6 @@ -const path = require("node:path") const DefaultError = require("./DefaultError") +const YggdrasilError = require("./YggdrasilError") +const SessionError = require("./SessionError") const logger = require("../modules/logger") class ValidationError extends DefaultError { @@ -34,11 +35,23 @@ class ValidationError extends DefaultError { serialize() { if (this.config.errorFormat === "YggdrasilError") { - return { - error: this.config.errorName || "IllegalArgumentException", - errorMessage: this.message, - cause: JSON.stringify(this.formattedErrors) - } + const err = new YggdrasilError( + this.code, + this.config.errorName || "IllegalArgumentException", + this.message, + JSON.stringify(this.formattedErrors) + ) + return err.serialize() + } + + if (this.config.errorFormat === "SessionError") { + const err = new SessionError( + this.code, + this.config.errorName || "Forbidden", + this.message, + this.context.path || "" + ) + return err.serialize() } return { diff --git a/schemas/sessionsserver/session/minecraft/join.js b/schemas/sessionsserver/session/minecraft/join.js new file mode 100644 index 0000000..311489c --- /dev/null +++ b/schemas/sessionsserver/session/minecraft/join.js @@ -0,0 +1,22 @@ +const z = require("zod") + +module.exports = { + POST: { + body: z.object({ + accessToken: z.string() + .min(1, { message: "Access Token is required." }), + selectedProfile: z.string() + .length(32, { message: "Selected Profile must be a valid UUID without dashes." }) + .regex(/^[0-9a-fA-F]+$/, { message: "Selected Profile must be hexadecimal." }), + serverId: z.string() + .min(1, { message: "Server ID is required." }) + .max(42, { message: "Server ID is too long." }) + }), + error: { + code: 400, + message: "Missing or invalid parameters.", + errorFormat: "SessionError", + errorName: "Forbidden" + } + } +} \ No newline at end of file