feat(docs): add technical features documentation and apply consistent formatting

Added a detailed technical features section to the documentation, covering key functionalities of Memegoat. Improved consistency in formatting across documentation and source files.
This commit is contained in:
Mathis HERRIOT
2026-01-05 16:29:31 +01:00
parent 38e97741e0
commit 86543eeb4f
6 changed files with 84 additions and 21 deletions

View File

@@ -0,0 +1,57 @@
---
title: Fonctionnalités Techniques
description: Détails des fonctionnalités clés du projet Memegoat
---
## 🚀 Fonctionnalités Techniques
Le projet Memegoat intègre un ensemble de fonctionnalités avancées pour garantir une expérience utilisateur fluide, sécurisée et performante.
### 📧 Emailing
Le système intègre un service d'envoi d'emails pour :
- La vérification des comptes lors de l'inscription.
- La récupération de mots de passe.
- Les notifications de sécurité (nouvelles connexions, changements de profil).
- Les alertes de modération.
### 📦 Stockage S3 (MinIO)
Pour la gestion des médias, Memegoat utilise **MinIO**, une solution de stockage d'objets compatible S3, auto-hébergée.
- **Sécurité** : Le serveur MinIO est isolé dans le réseau interne de Docker et n'est pas exposé directement sur internet.
- **Accès** : Le Backend fait office de proxy ou génère des URLs présignées pour l'accès aux fichiers, garantissant un contrôle total sur la diffusion des contenus.
- **Performance** : Optimisé pour le service rapide de fichiers volumineux comme les GIFs.
### 🔍 SEO & Partage
La plateforme est optimisée pour le référencement naturel et le partage social :
- **Metatags dynamiques** : Génération de balises OpenGraph et Twitter Cards pour chaque mème.
- **Indexation** : Structure sémantique HTML5 et Sitemap dynamique.
- **Rendus côté serveur (SSR)** : Utilisation de Next.js pour un affichage instantané et une indexation parfaite par les robots.
### 🔗 URLs de Terminaison
À l'instar de plateformes comme Tenor, Memegoat utilise des structures d'URLs courtes et sémantiques :
- Format : `memegoat.fr/m/[slug-unique]` ou `memegoat.fr/g/[slug-unique]`.
- Les slugs sont générés de manière à être lisibles par l'humain tout en garantissant l'unicité.
### 🕵️ Audit des Actions
Chaque action sensible sur la plateforme est tracée dans la table `audit_logs` :
- Modification de profil, suppression de contenu, changements de permissions.
- Enregistrement de l'auteur, de l'action, de l'horodatage et des détails techniques (IP hachée, User-Agent).
- Outil essentiel pour la sécurité et la conformité RGPD.
### 👤 Gestion du Profil
Un système complet de gestion de profil permet aux utilisateurs de :
- Gérer leurs informations personnelles (nom d'affichage, avatar).
- Configurer la **Double Authentification (2FA)**.
- Consulter leurs sessions actives et révoquer des accès.
- Les données sensibles sont protégées par **chiffrement PGP** au repos.
### 🚩 Gestion des Signalements
Un système de modération intégré permet de maintenir la qualité du contenu :
- Signalement de contenus (mèmes, GIFs) ou de tags inappropriés.
- Workflow de traitement : `pending` -> `reviewed` -> `resolved` / `dismissed`.
- Purge automatique des signalements obsolètes pour respecter la minimisation des données (RGPD).
### 📤 Publication de Contenu
Le coeur de la plateforme permet la publication de mèmes et de GIFs :
- Support des formats images standards et animés.
- Système de **Tags** pour catégoriser et faciliter la recherche.
- Gestion du cycle de vie des contenus (Publication, Edition, Soft Delete).

View File

@@ -9,6 +9,7 @@
"types:check": "fumadocs-mdx && next typegen && tsc --noEmit", "types:check": "fumadocs-mdx && next typegen && tsc --noEmit",
"postinstall": "fumadocs-mdx", "postinstall": "fumadocs-mdx",
"lint": "biome check", "lint": "biome check",
"lint:write": "biome check --write",
"format": "biome format --write" "format": "biome format --write"
}, },
"dependencies": { "dependencies": {

View File

@@ -1,7 +1,7 @@
'use client'; "use client";
import { use, useEffect, useId, useState } from 'react'; import { use, useEffect, useId, useState } from "react";
import { useTheme } from 'next-themes'; import { useTheme } from "next-themes";
export function Mermaid({ chart }: { chart: string }) { export function Mermaid({ chart }: { chart: string }) {
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
@@ -16,7 +16,10 @@ export function Mermaid({ chart }: { chart: string }) {
const cache = new Map<string, Promise<unknown>>(); const cache = new Map<string, Promise<unknown>>();
function cachePromise<T>(key: string, setPromise: () => Promise<T>): Promise<T> { function cachePromise<T>(
key: string,
setPromise: () => Promise<T>,
): Promise<T> {
const cached = cache.get(key); const cached = cache.get(key);
if (cached) return cached as Promise<T>; if (cached) return cached as Promise<T>;
@@ -28,19 +31,21 @@ function cachePromise<T>(key: string, setPromise: () => Promise<T>): Promise<T>
function MermaidContent({ chart }: { chart: string }) { function MermaidContent({ chart }: { chart: string }) {
const id = useId(); const id = useId();
const { resolvedTheme } = useTheme(); const { resolvedTheme } = useTheme();
const { default: mermaid } = use(cachePromise('mermaid', () => import('mermaid'))); const { default: mermaid } = use(
cachePromise("mermaid", () => import("mermaid")),
);
mermaid.initialize({ mermaid.initialize({
startOnLoad: false, startOnLoad: false,
securityLevel: 'loose', securityLevel: "loose",
fontFamily: 'inherit', fontFamily: "inherit",
themeCSS: 'margin: 1.5rem auto 0;', themeCSS: "margin: 1.5rem auto 0;",
theme: resolvedTheme === 'dark' ? 'dark' : 'default', theme: resolvedTheme === "dark" ? "dark" : "default",
}); });
const { svg, bindFunctions } = use( const { svg, bindFunctions } = use(
cachePromise(`${chart}-${resolvedTheme}`, () => { cachePromise(`${chart}-${resolvedTheme}`, () => {
return mermaid.render(id, chart.replaceAll('\\n', '\n')); return mermaid.render(id, chart.replaceAll("\\n", "\n"));
}), }),
); );