Projets

Little World Nepal France

Plateforme bilingue pour une association franco-népalaise d’éducation

Année
2026
Type
Projet client
Rôle
Ingénierie full-stack
Statut
En développement

Un site en français et en anglais pour LWNF, association qui soutient l’éducation, la formation et les étudiants au Népal : projets, blog, informations de parrainage, galerie et boîte de réception des demandes, avec une administration pour l’équipe.

Contexte

Les soutiens de LWNF, francophones et anglophones, suivent des projets dans des écoles et des villages népalais. Le site remplace un ancien blog par une plateforme structurée : projets et actualités, informations de parrainage, et demandes qui arrivent dans une boîte de l’équipe plutôt que dans une messagerie personnelle.

Les dons sont présentés à titre d’information et renvoient vers l’extérieur : le site ne traite aucun paiement.

Approche

Les pages publiques vivent sous /fr et /en, rendues statiquement et revalidées par étiquette à chaque publication. Les contenus traduisibles sont stockés en paires de champs français/anglais avec un repli défini : un article à moitié traduit n’affiche jamais de titre vide à un lecteur anglophone.

Architecture du système

Client

  • Visiteurs et équipe · FR · EN

    Les soutiens lisent les projets, le blog et les informations de parrainage en français ou en anglais ; l’équipe gère contenus et demandes.

    Appelle Next.js

Application

  • Next.js · /fr · /en · ISR

    Pages publiques préfixées par la langue, rendues statiquement et revalidées par étiquette à chaque publication.

    Appelle Django · DRF · Appelé par Visiteurs et équipe

  • Django · DRF · Contenu · demandes

    Projets, blog, profils de parrainage, galerie et boîte de réception des demandes, avec le système d’identité et une API de contenu réservée à l’équipe.

    Appelle PostgreSQL, Redis · Appelé par Next.js

  • Celery · E-mails · nettoyage

    Worker et Beat : e-mails sortants, revalidation du frontend et nettoyage planifié.

    Appelé par Redis

Données

  • PostgreSQL · Contenu · identité

    Identité, jetons, contenus et demandes.

    Appelé par Django · DRF

  • Redis · Cache · verrouillage · broker

    Cache, compteurs de verrouillage de connexion et broker Celery.

    Appelle Celery (asynchrone) · Appelé par Django · DRF

Difficultés d’ingénierie

  1. Un compte d’équipe pouvait prendre le contrôle d’un superutilisateur

    1. Problème

      L’équipe pouvait modifier l’e-mail d’un autre compte, y compris celui d’un superutilisateur, puis mener à bien la récupération du mot de passe. La suite de tests d’API d’origine, pourtant au vert, ne l’avait pas révélé.

    2. Analyse

      Un test de recette a reproduit tout le chemin sur la vraie API et PostgreSQL : modifier l’e-mail de récupération, demander une réinitialisation, se connecter en tant que superutilisateur.

    3. Solution

      Les modifications d’identité exigent désormais un superutilisateur actif ; l’équipe éditoriale garde un accès en lecture. L’admin Django applique la même frontière, qu’une permission de modification explicite ne peut contourner. L’équipe ne peut plus désactiver de comptes.

    4. Résultat

      La prise de contrôle initiale reçoit maintenant un 403 et l’e-mail enregistré reste inchangé ; six autres cas couvrent les modifications d’identité sur des membres, de l’équipe et des superutilisateurs.

Performance, sécurité et accessibilité

Avant la mise en ligne, j’ai mené une recette fondée sur les risques, sur les images de production, PostgreSQL et Redis. Elle a conclu que la version n’était pas prête. Onze défauts ont été confirmés et corrigés, chacun avec un test de régression qui échoue sans le correctif.

Technologies

  • TypeScript
  • Next.js
  • Django
  • Django REST Framework
  • Celery
  • PostgreSQL
  • Redis
  • Docker
  • Nginx
  • Playwright
esc