Crafting technique¶
Architecture et données¶
PostgreSQL est autoritaire. La migration 0030_crafting_system ajoute les types, recettes, ingrédients, prérequis de compétence, établis, jobs, opérations idempotentes et compensations. Les jobs gardent un snapshot complet de la recette afin qu'une modification future n'altère pas une commande existante. Les clés de placement, de soumission et d'opération empêchent les doubles effets.
La configuration validée api/app/crafting_config.json centralise distances, limites de recettes/files/lots, cadence du scheduler et backoff. Le routeur api/app/routers/crafting.py expose /internal/v1/crafting/* aux ressources FiveM et /admin/crafting/* au web admin. Les routes web utilisent session, CSRF et permissions; les routes internes recalculent les droits depuis les rôles transmis par le serveur FiveM de confiance.
Transactions et scheduler¶
crafting_inventory.py verrouille les inventaires dans l'ordre de leurs UUID et fournit consommation/crédit sans commit interne. Un lot possède des marqueurs durables consume, deposit et xp. Le scheduler du lifespan FastAPI traite un lot borné de jobs, verrouille les lignes et isole les erreurs par machine avec backoff exponentiel.
Les états principaux sont queued, processing, blocked_input, blocked_output, blocked_link, paused_admin, system_error, cancelled et completed. cancel_requested est conservé séparément pour ne pas être perdu si une sortie devient pleine. Une liaison de stockage supprimée est explicitement mise à NULL et la machine passe à blocked_link.
La suppression d'un item appelle l'orchestrateur Crafting avant le catalogue. Les jobs dépendants sont annulés; les composants consommés encore valides sont recrédités au stockage d'entrée ou enregistrés dans crafting_compensations. La suppression d'un personnage ou groupe bascule ses établis en admin_recovery dans la même transaction.
La suppression d'un nœud de compétence désactive d'abord les recettes qui le référencent et retire leurs liaisons de prérequis, afin de préserver l'intégrité référentielle; les jobs déjà soumis conservent leur snapshot.
Ressource FiveM et interfaces¶
medusa-crafting écoute medusa:inventory:useItem, charge les définitions depuis l'API, utilise medusa-entity-placement, matérialise les props à proximité et enregistre les interactions via medusa-interactions. Le serveur revalide personnage actif et distance. Les changements de version recréent uniquement le binding concerné; la fermeture libère focus NUI et verrou d'interaction.
La NUI dédiée reste transparente hors ouverture. Sa console AR à trois zones montre catalogue, recette et file FIFO. Le web admin possède la construction complète sous World Edit; medusa-admin ne fournit que la supervision F10 et transmet ses actions à medusa-crafting. La ressource démarre après inventaires, stockages, groupes, compétences, interactions et placement, avant medusa-admin.
Le document NUI impose son état initial fermé dans JavaScript et ne dépend pas uniquement du markup
hidden. html, body et la racine inactive restent transparents, [hidden] applique
display:none!important afin de prévaloir sur les panneaux display:grid, et aucun
color-scheme: dark n'est déclaré : dans Chromium NUI, ce dernier peut peindre un canvas sombre
même lorsque les surfaces applicatives sont censées être transparentes. Le message hide du mode
placement masque temporairement la console sans détruire son setup; close efface la session.
Observabilité et reprise¶
Les erreurs scheduler enregistrent type, message, job, tentative et prochaine échéance. Les actions web sont couvertes par l'audit admin global; les mutations F10 écrivent un audit interne avec acteur Discord. Le rollback opérationnel bloque les types et arrête le scheduler/la ressource sans supprimer les tables; un redéploiement reprend les étapes idempotentes.