mywalt-myskills applique une architecture en couches avec une règle de dépendance unidirectionnelle stricte : RpcService → use-cases → services/repositories → database. Aucune couche ne peut importer depuis une couche supérieure.
Use-cases
Chaque opération métier est encapsulée dans un use-case. Les use-cases faillibles retournent Result<T, E> via la librairie neverthrow — jamais de throw depuis l'intérieur d'un use-case. Cela rend les erreurs explicites et traçables.
Repositories
Les repositories abstraient l'accès aux données et mappent les entités ORM vers des objets domaine. Ils injectent EntityRepository et EntityManager de MikroORM. La logique de mapping reste localisée dans la couche repository.
Contrat partagé
Les schémas Zod et les procédures oRPC vivent dans packages/api-contract, un package sans dépendance à NestJS ni React. apps/api l'implémente dans RpcService ; app, back-office et mobile l'importent tel quel pour un client typé de bout en bout, sans génération de code.
Invariants
Ces règles sont vérifiées en CI via des checks d'architecture. Une PR qui viole l'une d'elles sera bloquée avant merge.