Chapitre 2 · Leçon 2
Abstraire la persistance derrière une interface domaine
Section 1
Step 1
L'interface ITutorialRepository vit dans la couche domain — elle parle le langage du métier. L'implémentation TypeORM vit dans infrastructure et implémente ce contrat.
ITutorialRepository.ts
1// domain/ — aucune dépendance TypeORM
2export interface ITutorialRepository {
3 findAll(filters?: TutorialFilters): Promise<Tutorial[]>;
4 findBySlug(slug: string): Promise<Tutorial | null>;
5 save(tutorial: Tutorial): Promise<Tutorial>;
6 delete(id: string): Promise<void>;
7}Step 2
Pour les requêtes avec joins et filtres dynamiques, le QueryBuilder TypeORM est plus expressif que find(). Il permet de construire la requête conditionnellement sans concatenation de strings SQL.