Auth
GET
/api/auth/me
public
Aktueller Login-Status. Liefert User-Objekt wenn eingeloggt, sonst loggedIn:false. Setzt CSRF-Token im Response.
# Response (loggedIn):
{
"loggedIn": true,
"user": {
"id": 12,
"username": "senpai",
"email": "senpai@onimai.eu",
"role": "user",
"isVerified": true
},
"csrfToken": "…"
}
POST
/api/auth/register
CSRF
Neuen Account anlegen. Username 3–50 Zeichen, Passwort mind. 8.
# Body:
{ "username": "…", "email": "…", "password": "…" }
POST
/api/auth/login
CSRF
Login mit Username oder E-Mail + Passwort.
# Body:
{ "usernameOrEmail": "senpai", "password": "…" }
POST
/api/auth/logout
CSRF
Session beenden. Keine Body-Parameter.
Groups
GET
/api/groups
public
Alle verifizierten Gruppen im Verzeichnis. Sortiert nach created_at DESC.
# Query (optional):
?platform=WhatsApp
?category=Gaming
?search=onimai
POST
/api/groups
Login + CSRF
Neue Gruppe einreichen. Multipart-Form mit optionalem Logo (max 2 MB).
# Felder:
title, platform, category, inviteLink,
description, tags?, logo?, externalImageUrl?
POST
/api/groups/:id/like
Login + CSRF
Like-Counter für eine Gruppe um +1 erhöhen.
Public Stats
GET
/api/public/stats
public
Anonyme Aggregat-Stats (Mitgliederzahl, Verified-Quote, Like-Total).
# Response:
{
"members": 42,
"groups_total": 8,
"groups_verified": 7,
"total_likes": 156,
"platforms": ["WhatsApp", "Telegram", "Discord", "Signal"]
}
Admin ⚡ requires role=admin
GET
/api/admin/stats
Admin
Vollständige Dashboard-Stats: User-Counts nach Rolle/Status, Gruppen-Counts, Plattform-Verteilung, Kategorie-Verteilung.
GET
/api/admin/users
Admin
Die letzten 100 User mit Username, Email, Rolle, Verify-Status.
POST
/api/admin/users/:id/verify
Admin + CSRF
User verifizieren — setzt is_verified=TRUE.
GET
/api/admin/groups
Admin
Alle Gruppen inklusive unverifizierter (Moderations-Queue).
POST
/api/admin/groups/:id/verify
Admin + CSRF
Gruppe freischalten — wird sofort im öffentlichen Feed sichtbar.
DEL
/api/admin/groups/:id
Admin + CSRF
Gruppe permanent entfernen. Nicht rückgängig.
Quick Sample
JS-Beispiel für Login → eigene Gruppen liken:
// 1) CSRF holen
const me = await fetch('/api/auth/me').then(r=>r.json());
const csrf = me.csrfToken;
// 2) Login
await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-csrf-token': csrf },
body: JSON.stringify({ usernameOrEmail: 'senpai', password: '…' })
});
// 3) Liken
await fetch('/api/groups/12/like', {
method: 'POST',
headers: { 'x-csrf-token': csrf }
});