From 0259aad7fdf68c1f2b2d69b9cdd789cb39a9c140 Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 29 Oct 2026 20:31:10 +0100 Subject: [PATCH] add external users add api --- README.md | 52 +++++++++++++++++++++++++++++++++--- src/pages/api/users/index.ts | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/pages/api/users/index.ts diff --git a/README.md b/README.md index de75c65..92fe89d 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,50 @@ +
+PUT /api/users (Erstellt einen neuen Spieler) + +##### Request Body + +``` +{ + // Vorname des Spielers + "firstname": string, + // Nachname des Spielers + "lastname": string, + // Geburtstag im YYYY-MM-DD Format + "birthday": string, + // Telefonnummer des Spielers + "phone": string, + // Minecraft-Username + "username": string, + // Minecraft-UUID mit Bindestrichen + "uuid": string, + // Minecraft-Edition + "edition": "java" | "bedrock" +} +``` + +##### Response Codes + +| http code | beschreibung | +| --------- | ------------------------------------------ | +| 201 | Der User wurde erstellt | +| 400 | Der Request Body ist falsch | +| 401 | Es wurde ein falsches API Secret angegeben | +| 409 | Username oder UUID existiert bereits | + +##### Response Body + +``` +{ + // ID des neuen Users + "id": number +} +``` + +
+
GET /api/users/{uuid} (Status eines Spielers) @@ -260,8 +304,8 @@ Das Webhook wir so oft gesendet, bis der angegebene Webhook Endpoint eine Respon Alle Webhooks: -| Beschreibung | HTTP Header | Body | -| ------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Beschreibung | HTTP Header | Body | +| ------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Ein neuer Nutzer hat sich registriert |
x-webhook-action: signup
|
{
  // Vorname des Nutzers
  firstname: string,
  // Nachname des Nutzers
  lastname: string,
  // Geburtstag des Nutzers im YYYY-MM-DD format
  birthday: string,
  // Telefonnummer des Nutzers. `null` wenn keine angegeben wurde
  telephone: string \| null,
  // Spielername des Nutzers
  username: string,
  // Minecraft-Edition des Nutzers
  edition: 'java' \| 'bedrock'
  // UUID des Nutzers. null wenn keine UUID ermittelt werden konnte
  uuid: string \| null,
  // IP-Adresse des Users
  ip: string
}
| -| Ein neuer Report wurde erstellt |
x-webhook-action: report
|
{
  // Username des Reporters. `null` wenn der Report vom System gemacht wurde
  reporter: string \| null,
  // Username des reporteten Spielers. `null` wenn Spieler unbekannt ist
  reported: string \| null,
  // Grund des Reports
  reason: string
}
| -| Ein neuer Strike wurde erstellt |
x-webhook-action: strike
|
{
  // UUID des Spielers, der gestriked wurde
  uuid: string
}
| +| Ein neuer Report wurde erstellt |
x-webhook-action: report
|
{
  // Username des Reporters. `null` wenn der Report vom System gemacht wurde
  reporter: string \| null,
  // Username des reporteten Spielers. `null` wenn Spieler unbekannt ist
  reported: string \| null,
  // Grund des Reports
  reason: string
}
| +| Ein neuer Strike wurde erstellt |
x-webhook-action: strike
|
{
  // UUID des Spielers, der gestriked wurde
  uuid: string
}
| diff --git a/src/pages/api/users/index.ts b/src/pages/api/users/index.ts new file mode 100644 index 0000000..0c44a6c --- /dev/null +++ b/src/pages/api/users/index.ts @@ -0,0 +1,48 @@ +import { z } from 'astro:schema'; +import { db } from '@db/database.ts'; +import { externalApi } from '../_api.ts'; + +export const PUT = externalApi({ + auth: true, + input: z.object({ + firstname: z.string().trim().min(1), + lastname: z.string().trim().min(1), + birthday: z.string().date(), + phone: z.string().trim(), + username: z.string().trim().min(1), + uuid: z.string().uuid(), + edition: z.enum(['java', 'bedrock']) + }), + handler: async ({ input }) => { + const existing = await db.existsUser({ + username: input.username, + uuid: input.uuid + }); + + if (existing) { + return new Response(JSON.stringify({ error: 'User with this username or uuid already exists' }), { + status: 409, + headers: { + 'Content-Type': 'application/json' + } + }); + } + + const user = await db.addUser({ + firstname: input.firstname, + lastname: input.lastname, + birthday: input.birthday, + telephone: input.phone || null, + username: input.username, + edition: input.edition, + uuid: input.uuid + }); + + return new Response(JSON.stringify({ id: user.id }), { + status: 201, + headers: { + 'Content-Type': 'application/json' + } + }); + } +});