64 lines
3.0 KiB
TypeScript
64 lines
3.0 KiB
TypeScript
/**
|
|
* COMPOSITION ROOT — Wires ports to infrastructure and exposes use cases.
|
|
* This is the only place that should know concrete implementations.
|
|
*/
|
|
import { InMemoryProductRepository } from '@/infrastructure/repositories/InMemoryProductRepository';
|
|
import {
|
|
ZustandCartRepository,
|
|
} from '@/infrastructure/persistence/zustand/cartStore';
|
|
import {
|
|
ZustandAuthRepository,
|
|
} from '@/infrastructure/persistence/zustand/authStore';
|
|
import {
|
|
ZustandWishlistRepository,
|
|
} from '@/infrastructure/persistence/zustand/wishlistStore';
|
|
import { I18nTranslationService } from '@/infrastructure/i18n/I18nTranslationService';
|
|
import { LocalizeProductUseCase } from '@/application/use-cases/catalog/LocalizeProduct';
|
|
import { FilterProductsUseCase } from '@/application/use-cases/catalog/FilterProducts';
|
|
import { GetProductBySlugUseCase } from '@/application/use-cases/catalog/GetProductBySlug';
|
|
import { AddToCartUseCase } from '@/application/use-cases/cart/AddToCart';
|
|
import { GetCartSummaryUseCase } from '@/application/use-cases/cart/GetCartSummary';
|
|
import { UpdateCartQuantityUseCase } from '@/application/use-cases/cart/UpdateCartQuantity';
|
|
import { RemoveFromCartUseCase } from '@/application/use-cases/cart/RemoveFromCart';
|
|
import { PlaceOrderUseCase } from '@/application/use-cases/checkout/PlaceOrder';
|
|
import { LoginUseCase } from '@/application/use-cases/auth/Login';
|
|
import { RegisterUseCase } from '@/application/use-cases/auth/Register';
|
|
import { ToggleWishlistUseCase } from '@/application/use-cases/wishlist/ToggleWishlist';
|
|
import { Locale } from '@/i18n/types';
|
|
|
|
class ApplicationContainer {
|
|
readonly productRepository = new InMemoryProductRepository();
|
|
readonly cartRepository = new ZustandCartRepository();
|
|
readonly authRepository = new ZustandAuthRepository();
|
|
readonly wishlistRepository = new ZustandWishlistRepository();
|
|
|
|
createTranslationService(locale: Locale): I18nTranslationService {
|
|
return new I18nTranslationService(locale);
|
|
}
|
|
|
|
createLocalizeProduct(locale: Locale): LocalizeProductUseCase {
|
|
return new LocalizeProductUseCase(this.createTranslationService(locale));
|
|
}
|
|
|
|
readonly getProductBySlug = new GetProductBySlugUseCase(this.productRepository);
|
|
readonly addToCart = new AddToCartUseCase(this.cartRepository);
|
|
readonly getCartSummary = new GetCartSummaryUseCase(this.cartRepository);
|
|
readonly updateCartQuantity = new UpdateCartQuantityUseCase(this.cartRepository);
|
|
readonly removeFromCart = new RemoveFromCartUseCase(this.cartRepository);
|
|
readonly placeOrder = new PlaceOrderUseCase(
|
|
this.cartRepository,
|
|
this.authRepository
|
|
);
|
|
readonly login = new LoginUseCase(this.authRepository);
|
|
readonly register = new RegisterUseCase(this.authRepository);
|
|
readonly toggleWishlist = new ToggleWishlistUseCase(this.wishlistRepository);
|
|
|
|
createFilterProducts(locale: Locale): FilterProductsUseCase {
|
|
return new FilterProductsUseCase(
|
|
this.productRepository,
|
|
this.createLocalizeProduct(locale)
|
|
);
|
|
}
|
|
}
|
|
|
|
export const container = new ApplicationContainer(); |