intermediate

Repository pattern

Открывайте collection-like persistence operations, скрывая query details и сохраняя service code testable.

Repository предоставляет collection-like операции персистентности для агрегата: `findById`, `save`, `listActiveForUser`. Он скрывает детали ORM или SQL от сервисов, если контракты ориентированы на use case.

					interface OrderRepository {
  findOpenForCustomer(customerId: string): Promise<Order[]>;
  save(order: Order): Promise<void>;
}
				

Хорошие repository моделируют бизнес-запросы, а не любой возможный фильтр по столбцу. Это граница — не магический слой, снимающий необходимость думать о SQL.

На интервью: упомяните владение агрегатом, пагинацию, фильтрацию, транзакции и когда query builder яснее, чем раздувание методов repository.

Типовые ошибки: generic `findByAnyField`, протекающий в схему БД; repository как тонкая обёртка ORM без ценности; размытые имена методов, скрывающие нужную семантику запроса.

Компромисс — более чистый сервисный код и тестовые заглушки против лишней абстракции на чистом CRUD.

Чеклист:

  • Моделируйте методы под use case.
  • Не скрывайте нужную семантику запроса.
  • Держите транзакции явными на правильном слое.
  • Используйте query builder для join и блокировок.