Aller au contenu
keforo-app

Étude de cas

Keforo App

Le bureau des commandes des équipes e-commerce au MENA : commandes, stock, clients et une Google Sheet qui reste synchronisée.

Rôle
Fondateur, ingénieur full-stack
Année
2024
Stack
Next.js · Hono · Bun · MongoDB · Redis

Le défi

Ici, les boutiques tournent sur une Google Sheet avant tout le reste. Le bureau des commandes devait lire cette feuille, faire bouger le stock et le statut ensemble, et ne laisser personne faire plus que ce qu’il a le droit de faire.

En chiffres

  1. 386Routes, chacune déclarée comme une donnée : méthode, chemin, scopes et schéma.
  2. 68Scopes répartis dans 18 modules, réglés par personne.
  3. 585Tests backend, contre MongoDB et Redis.
  4. 7Transitions de commande, un endpoint chacune.

Ce qu’il fait tourner

Un seul tableau pour toutes les commandes.

Un seul tableau pour toutes les commandes, avec un cycle de vie strict, des lignes qu’on peut annuler ou marquer en rupture une par une, des retours partiels qui remettent en stock, et un journal d’activité de 18 types d’entrée.

Le stock vit dans deux compartiments, disponible et engagé. Chaque changement écrit un mouvement de stock qui renvoie à la commande, à l’import ou au retour qui l’a causé.

En arabe, en français et en anglais, avec une vraie mise en page de droite à gauche.

Le cycle de vie

Une commande est une machine à états

Chaque changement de statut passe par un seul service. Il vérifie le mouvement dans une table, applique son effet sur le stock, écrit le nouveau statut et ajoute une ligne au journal, le tout dans une seule transaction MongoDB. Si une partie échoue, rien n’a eu lieu.

draftbeing built, no stock heldpendingplaced · units committedconfirmedstatus onlypackedstatus onlyshippedheld until delivereddeliveredsold · on hand −refundedon hand +cancelledcommitted releasedPOST /placePOST /confirmPOST /packPOST /shipPOST /deliverPOST /refundPOST /cancel

En direct

Essayez les transitions

Choisissez un jeton, puis appuyez sur un endpoint. La route refuse un scope manquant avant que le handler ne tourne, le service refuse un mouvement absent de la table, et un mouvement légal change le statut, déplace le stock et écrit le journal.

En direct

Google Sheets

Une feuille, une exécution

  1. Étape 1 sur 6

    File

    Un job par feuille, lancé par le cron ou par le bouton Synchroniser. Le worker traite un job à la fois, volontairement.

  2. Étape 2 sur 6

    Version

    Un appel Drive compare la version de la feuille à celle de la dernière exécution. Une feuille inchangée est sautée à cet instant.

  3. Étape 3 sur 6

    Mapping

    Chaque en-tête mappé doit être encore là. Si l’un a disparu, la feuille est mise en pause et son propriétaire reçoit un e-mail ; rien n’est deviné à l’exécution.

  4. Étape 4 sur 6

    Lecture

    Les lignes sont lues par pages de 5 000, sous une limite de soixante appels par minute et par organisation.

  5. Étape 5 sur 6

    Import

    Chaque ligne passe par le même processeur qu’un envoi CSV. Une commande emballée ou plus avancée n’est jamais touchée par une feuille.

  6. Étape 6 sur 6

    Compte rendu

    L’exécution écrit ses compteurs et un échantillon d’erreurs, et la salle de l’organisation l’apprend en WebSocket. Une exécution se termine toujours ; aucune ne reste « en cours ».

Rejeu

Une synchronisation, rejouée

Le connecteur traite la feuille comme la source et l’application comme le miroir : chaque exécution lit la feuille, et rien n’y est réécrit.

Replay

Connexion

Trois façons de se connecter

Google examine toute application qui demande l’accès à Drive, et l’examen prend du temps. Le connecteur a donc trois portes, et deux d’entre elles n’ont besoin d’aucun examen.

Your sheetGoogle SheetsGoogle sign-infile picker · drive.file scopePublic CSV linkno Google API at allService accountshare the sheet with an emailLinked sheetmapping · conflict policy · cadenceSync runone job, one worker at a timetoken, encryptedcontent hashkey, encryptedcron · Sync now

L’assistant

L’assistant ne fait que ce que vous avez le droit de faire

Le chat de la barre latérale est un orchestrateur qui ne possède aucune connaissance métier et un seul outil : delegate. Il confie une sous-tâche à l’un de cinq spécialistes, en parallèle quand une question couvre plusieurs domaines.

La première ligne de chaque outil est une vérification de scope. Les scopes viennent du jeton de l’appelant ; un modèle qui affirme « l’utilisateur est administrateur » ne change rien.

Les écritures attendent une personne. Annuler une commande ou changer un prix crée une action en attente que la personne confirme dans le chat, et le scope est vérifié de nouveau à la confirmation.

Permissions

Chaque outil vérifie l’appelant

Onze outils, chacun déclarant le scope dont il a besoin. Un spécialiste dont les outils exigent des scopes que l’appelant n’a pas est retiré du prompt de l’orchestrateur : le modèle ne peut même pas essayer.

Youchat in the sidebarPOST /ai/chatSSE streamOrchestratorsees one tooldelegateone specialist per domainSpecialistorder · product · customer · analytics · helperTool11, each declares a scoperequireScopeyour JWT, never the model’s wordMongoDBscoped to your organisationmessageturnsub-taskin parallelcallfirst linethen the servicetokens

Construit avec

  • Bun
  • Hono
  • MongoDB
  • Redis
  • BullMQ
  • WebSocket
  • Next.js
  • TanStack
  • OpenRouter
  • Google Sheets
  • Google Drive

Où il en est

En ligne sur app.keforo.com

Commandes, stock, scopes d’équipe, assistant et facturation par virement tournent aujourd’hui, avec Google Sheets comme premier connecteur. À venir : les connecteurs de boutiques, l’écriture vers la feuille, la détection de changement par ligne et le paiement par carte.

Lire comment ça marche
Modèles, chacun portant son organisation.
50
Workers en arrière-plan : synchronisation des feuilles, cron des feuilles, imports et facturation.
4
Étude suivanteJad Elevateur