Documentation officielle de 0xAcademy : structure, endpoints, sécurité et exemples d’intégration.
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.
GET /api/user/profile?url=monprofil
Réponse (200):
{
"id": 1,
"displayName": "MonPseudo",
"avatar": null,
"email": null,
"website": null,
"url": "monprofil"
}
curl "http://0xacademy.dev/api/user/profile?url=monprofil"
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"
}
}
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"
})
});
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).
const res = await fetch("/api/auth/session", { cache: "no-store" });
if (res.ok) {
const s = await res.json();
// s: { hasAuthToken: boolean, hasSessionActive: boolean, ... }
}
Catalogue des routes HTTP disponibles dans l’application.
Endpoints API
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.
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>
);
}
const res = await fetch("/api/user/profile?url=monprofil", { cache: "no-store" });
const data = await res.json();
// data: { id, displayName, avatar, email, website, url }
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)
url → url (slug)
avatar → avatar
email → email
website → website
website: doit commencer par http(s)://
Erreurs fréquentes et correctifs rapides.
Dépannage
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;
// ...
}
Si le fichier est app/api/links/[id]/click/route.ts, le handler doit utiliser params.id (et non params.username).