Builders Academy
Clean Architecture avec Node.js
5 of 5

Chapitre 2 · Leçon 2

Repository Pattern

Abstraire la persistance derrière une interface domaine

Section 1

Interface → Implémentation

Step 1

L'interface dans le domaine

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

typescript
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

QueryBuilder pour les requêtes complexes

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.

ITutorialRepository.ts

typescript
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}

Topics and skills covered

  • TypeORM
  • Repository Pattern
  • QueryBuilder