Initial project structure and core files
Add base project files including environment example, license, README, .gitignore, error classes, ESLint config, database modules, texture assets, repositories, routes, schemas, services, and server entry point. This establishes the foundational structure for a Yggdrasil-compatible REST API with modular error handling, database setup, and route organization.
This commit is contained in:
28
schemas/minecraftservices/minecraft/profile/capes/active.js
Normal file
28
schemas/minecraftservices/minecraft/profile/capes/active.js
Normal file
@@ -0,0 +1,28 @@
|
||||
const z = require("zod")
|
||||
|
||||
module.exports = {
|
||||
DELETE: {
|
||||
headers: z.object({
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
error: {
|
||||
code: 401,
|
||||
message: "Unauthorized"
|
||||
}
|
||||
},
|
||||
PUT: {
|
||||
headers: z.object({
|
||||
"content-type": z.string()
|
||||
.regex(/application\/json/i, { message: "Content-Type must be application/json" }),
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
body: z.object({
|
||||
capeId: z.string().uuid({ message: "Invalid Cape UUID." })
|
||||
}),
|
||||
error: {
|
||||
code: 400,
|
||||
message: "profile does not own cape",
|
||||
error: "IllegalArgumentException"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
const z = require("zod")
|
||||
|
||||
module.exports = {
|
||||
POST: {
|
||||
headers: z.object({
|
||||
"content-type": z.string()
|
||||
.regex(/application\/json/i, { message: "Content-Type must be application/json" })
|
||||
}),
|
||||
body: z.array(z.string().trim().min(1))
|
||||
.min(1, { message: "RequestPayload is an empty array." })
|
||||
.max(10, { message: "RequestPayload has more than 10 elements." }),
|
||||
error: {
|
||||
code: 400,
|
||||
error: "CONSTRAINT_VIOLATION",
|
||||
errorMessage: "size must be between 1 and 10"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
const z = require("zod")
|
||||
|
||||
module.exports = {
|
||||
GET: {
|
||||
params: z.object({
|
||||
username: z.string().min(1)
|
||||
}),
|
||||
error: {
|
||||
code: 404,
|
||||
message: "Not Found"
|
||||
}
|
||||
}
|
||||
}
|
||||
22
schemas/minecraftservices/minecraft/profile/name/[name].js
Normal file
22
schemas/minecraftservices/minecraft/profile/name/[name].js
Normal file
@@ -0,0 +1,22 @@
|
||||
const z = require("zod")
|
||||
|
||||
const nameSchema = z.string()
|
||||
.min(1)
|
||||
.max(16)
|
||||
.regex(/^[a-zA-Z0-9_]+$/, { message: "Name can only contain alphanumeric characters and underscores." });
|
||||
|
||||
module.exports = {
|
||||
PUT: {
|
||||
headers: z.object({
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
params: z.object({
|
||||
name: nameSchema
|
||||
}),
|
||||
error: {
|
||||
code: 400,
|
||||
error: "CONSTRAINT_VIOLATION",
|
||||
errorMessage: "Invalid profile name"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
const z = require("zod")
|
||||
|
||||
const nameSchema = z.string()
|
||||
.min(1)
|
||||
.max(16)
|
||||
.regex(/^[a-zA-Z0-9_]+$/, { message: "Name can only contain alphanumeric characters and underscores." });
|
||||
|
||||
module.exports = {
|
||||
GET: {
|
||||
headers: z.object({
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
params: z.object({
|
||||
name: nameSchema
|
||||
}),
|
||||
error: {
|
||||
code: 401,
|
||||
message: "Unauthorized"
|
||||
}
|
||||
}
|
||||
}
|
||||
13
schemas/minecraftservices/minecraft/profile/namechange.js
Normal file
13
schemas/minecraftservices/minecraft/profile/namechange.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const z = require("zod")
|
||||
|
||||
module.exports = {
|
||||
GET: {
|
||||
headers: z.object({
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
error: {
|
||||
code: 401,
|
||||
message: "Unauthorized"
|
||||
}
|
||||
}
|
||||
}
|
||||
24
schemas/minecraftservices/minecraft/profile/skins.js
Normal file
24
schemas/minecraftservices/minecraft/profile/skins.js
Normal file
@@ -0,0 +1,24 @@
|
||||
const z = require("zod")
|
||||
|
||||
module.exports = {
|
||||
POST: {
|
||||
headers: z.object({
|
||||
"content-type": z.string()
|
||||
.regex(/application\/json/i, { message: "Content-Type must be application/json" }),
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
body: z.object({
|
||||
variant: z.enum(["classic", "slim"], {
|
||||
errorMap: () => ({ message: "Variant must be 'classic' or 'slim'." })
|
||||
}),
|
||||
url: z.string()
|
||||
.url({ message: "Invalid URL format." })
|
||||
.max(2048, { message: "URL is too long." })
|
||||
}),
|
||||
error: {
|
||||
code: 400,
|
||||
message: "Invalid skin URL or variant.",
|
||||
error: "IllegalArgumentException"
|
||||
}
|
||||
}
|
||||
}
|
||||
13
schemas/minecraftservices/minecraft/profile/skins/active.js
Normal file
13
schemas/minecraftservices/minecraft/profile/skins/active.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const z = require("zod")
|
||||
|
||||
module.exports = {
|
||||
DELETE: {
|
||||
headers: z.object({
|
||||
"authorization": z.string().min(1, { message: "Authorization header is required." })
|
||||
}),
|
||||
error: {
|
||||
code: 401,
|
||||
message: "Unauthorized"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user