0xAcademy Docs
Aperçu

Documentation officielle de 0xAcademy : structure, endpoints, sécurité et exemples d’intégration.

Aperçu

Cette page regroupe toute la documentation de la plateforme 0xAcademy. Vous y trouverez un guide rapide, les endpoints REST disponibles, le modèle d’authentification, ainsi que des exemples concrets en fetch et cURL.

App Router • Next.js
SQLite
Shadcn UI
Guide rapide

Créer un profil, le lire et le mettre à jour en moins de 2 minutes.

Guide rapide

Les profils utilisent le champ pseudo comme nom d’affichage et url comme slug public. Les champs email et website sont facultatifs.

Lire un profil public
GET
GET /api/user/profile?url=monprofil

Réponse (200):
{
  "id": 1,
  "displayName": "MonPseudo",
  "avatar": null,
  "email": null,
  "website": null,
  "url": "monprofil"
}
cURL
curl "http://0xacademy.dev/api/user/profile?url=monprofil"
Mettre à jour (nom, avatar, email, site)
PUT
PUT /api/user/profile
Content-Type: application/json

{
  "url": "monprofil",
  "displayName": "Nouveau Nom",
  "email": "me@example.com",
  "website": "https://mon-site.com",
  "avatar": "data:image/png;base64,...." // ou URL
}

Réponse (200):
{
  "success": true,
  "profile": {
    "id": 1,
    "displayName": "Nouveau Nom",
    "avatar": "...",
    "email": "me@example.com",
    "website": "https://mon-site.com",
    "url": "monprofil"
  }
}
fetch
await fetch("/api/user/profile", {
  method: "PUT",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    url: "monprofil",
    displayName: "Nouveau Nom",
    email: "me@example.com",
    website: "https://mon-site.com"
  })
});
Authentification & Sécurité

Cookies de session et bonnes pratiques.

Authentification & Sécurité

Le back-end vérifie la session via les cookies auth_token et session_active. Certaines routes publiques (profil) ne nécessitent pas d’être connecté, tandis que les opérations d’écriture exigent une session valide.

  • Utiliser credentials: "include" côté client si requis.
  • Valider et normaliser les entrées (e-mail, URL, tailles d’images).
  • Limiter la taille de payload (ex : avatars en base64).
Exemple de vérification côté client
const res = await fetch("/api/auth/session", { cache: "no-store" });
if (res.ok) {
  const s = await res.json();
  // s: { hasAuthToken: boolean, hasSessionActive: boolean, ... }
}
Endpoints API

Catalogue des routes HTTP disponibles dans l’application.

Endpoints API

Profils
GET
/api/user/profile?url=<slug> | ?id=<id>— lire un profil minimal
PUT
/api/user/profile— mettre à jour displayName, avatar, email, website
GET
/api/profile/[username]— profil complet + analytics (+1 vue)
PUT
/api/profile/[username]— mise à jour profil + customisation + liens
Discord
GET
/api/user/discord?username=<name>— status, badges, activités
GET
/api/user/role— rôle principal (admin/plus/pro/member/none)
Liens & Analytics
POST
/api/links/[id]/click— incrémente les clics d’un lien (+ analytics)
Assurez-vous que votre handler utilise bien params.id (et non params.username) si le segment de route est [id].
Composants front utiles

Hooks et composants exportés par l’app.

Composants front utiles

  • useDiscordRole() retourne { roleData, loading, error, refreshRole }
  • <RoleBadge /> → badge avec dégradé selon le rôle.
Exemple — RoleBadge
import { RoleBadge } from "@/components/role-badge";

export default function Header() {
  return (
    <div className="flex items-center gap-2">
      <span className="text-sm text-gray-400">Status:</span>
      <RoleBadge />
    </div>
  );
}
Exemple — fetch profil
const res = await fetch("/api/user/profile?url=monprofil", { cache: "no-store" });
const data = await res.json();
// data: { id, displayName, avatar, email, website, url }
Modèle de données

Colonnes importantes de la table users (SQLite).

Modèle de données

La table users contient notamment :

  • pseudo — nom d’affichage (displayName)
  • url — slug public (profil public)
  • avatar — URL ou data:URL (base64)
  • email — e-mail (optionnel)
  • website — site web (optionnel)
Mapping principal
DB → API
pseudo → displayName
url → url (slug)
avatar → avatar
email → email
website → website
Validation
email: simple regex
website: doit commencer par http(s)://
Dépannage

Erreurs fréquentes et correctifs rapides.

Dépannage

Problèmes connus
Dynamic API params (Next.js 15)

Si votre route est /api/users/[username], utilisez params asynchrone :

export async function GET(
  req: Request,
  { params }: { params: Promise<{ username: string }> }
) {
  const { username } = await params;
  // ...
}
Incohérence paramètre de route

Si le fichier est app/api/links/[id]/click/route.ts, le handler doit utiliser params.id (et non params.username).