Initial commit: Kottgard production website code

This commit is contained in:
2026-06-19 15:46:23 +00:00
commit e0273c46d7
196 changed files with 29799 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
import { CartItem, Product, ProductCustomization } from '@/domain/entities';
import { CustomizationDomainService } from './CustomizationDomainService';
/**
* DOMAIN SERVICE — Cart business rules (pure functions, no storage)
*/
export class CartDomainService {
static calculateSubtotal(items: CartItem[]): number {
return items.reduce((sum, item) => sum + item.product.price * item.quantity, 0);
}
static calculateItemCount(items: CartItem[]): number {
return items.reduce((sum, item) => sum + item.quantity, 0);
}
static addItem(
items: CartItem[],
product: Product,
customization: ProductCustomization,
customizationLabel: string,
quantity = 1
): CartItem[] {
const id = CustomizationDomainService.getCartItemKey(product.id, customization);
const existing = items.find((item) => item.id === id);
if (existing) {
return items.map((item) =>
item.id === id ? { ...item, quantity: item.quantity + quantity } : item
);
}
return [
...items,
{ id, product, quantity, customization, customizationLabel },
];
}
static removeItem(items: CartItem[], id: string): CartItem[] {
return items.filter((item) => item.id !== id);
}
static updateQuantity(items: CartItem[], id: string, quantity: number): CartItem[] {
if (quantity <= 0) {
return CartDomainService.removeItem(items, id);
}
return items.map((item) => (item.id === id ? { ...item, quantity } : item));
}
}