ARCH-003: Repositories Must Not Depend on Controllers
| Attribute | Value |
|---|---|
| Category | Architecture |
| Default Severity | error (Blocking) |
| Applicable Files | Repository files (*.repository.ts, *.repo.ts) |
Why It Exists (Rationale)
The architectural dependency chain is strictly unidirectional:
Controller → Service → Repository.
When a repository imports from a controller:
- It introduces an inverted circular dependency.
- The data layer cannot be tested or compiled in isolation.
- Transport types (like Express
Requestor NestJSController) leak into the persistence layer.
Bad Example
// src/order/OrderRepository.ts
import { OrderController } from "./OrderController"; // ❌
export class OrderRepository {
async save(data: any, controller: OrderController) {}
}
Good Example
// src/order/OrderRepository.ts
import { OrderEntity } from "./OrderEntity"; // ✅ Clean domain entity
export class OrderRepository {
async save(data: OrderEntity): Promise<OrderEntity> {}
}
How It's Detected
ArchStandards inspects import declarations in all repository files. Imports matching controller files or directory paths (/controllers/, *controller*) trigger this rule.