mirror of
https://github.com/samiyev/puaros.git
synced 2025-12-27 23:06:54 +05:00
Implement DDD aggregate boundary validation to detect and prevent direct entity references across aggregate boundaries. Features: - Detect direct entity imports between aggregates - Allow only ID or Value Object references - Support multiple folder structures (domain/aggregates/*, domain/*, domain/entities/*) - Filter allowed imports (value-objects, events, repositories, services) - Critical severity level for violations - 41 comprehensive tests with 92.55% coverage - CLI output with detailed suggestions - Examples of good and bad patterns Breaking changes: None Backwards compatible: Yes
62 lines
1.5 KiB
TypeScript
62 lines
1.5 KiB
TypeScript
/**
|
|
* ✅ GOOD EXAMPLE: Using Value Objects for Needed Data
|
|
*
|
|
* Best Practice: When Order needs specific data from other aggregates,
|
|
* use Value Objects to store that data (denormalization)
|
|
*
|
|
* Benefits:
|
|
* 1. Order aggregate has all data it needs
|
|
* 2. No runtime dependency on other aggregates
|
|
* 3. Better performance (no joins needed)
|
|
* 4. Clear contract through Value Objects
|
|
*/
|
|
|
|
import { UserId } from "../user/value-objects/UserId"
|
|
import { ProductId } from "../product/value-objects/ProductId"
|
|
|
|
export class CustomerInfo {
|
|
constructor(
|
|
readonly customerId: UserId,
|
|
readonly customerName: string,
|
|
readonly customerEmail: string,
|
|
) {}
|
|
}
|
|
|
|
export class ProductInfo {
|
|
constructor(
|
|
readonly productId: ProductId,
|
|
readonly productName: string,
|
|
readonly productPrice: number,
|
|
) {}
|
|
}
|
|
|
|
export class Order {
|
|
private id: string
|
|
private customer: CustomerInfo
|
|
private product: ProductInfo
|
|
private quantity: number
|
|
|
|
constructor(id: string, customer: CustomerInfo, product: ProductInfo, quantity: number) {
|
|
this.id = id
|
|
this.customer = customer
|
|
this.product = product
|
|
this.quantity = quantity
|
|
}
|
|
|
|
getCustomerEmail(): string {
|
|
return this.customer.customerEmail
|
|
}
|
|
|
|
calculateTotal(): number {
|
|
return this.product.productPrice * this.quantity
|
|
}
|
|
|
|
getCustomerInfo(): CustomerInfo {
|
|
return this.customer
|
|
}
|
|
|
|
getProductInfo(): ProductInfo {
|
|
return this.product
|
|
}
|
|
}
|