diff --git a/Dockerfile b/Dockerfile index be09a305..c691e80b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ COPY pyproject.toml pyproject.toml RUN pip install poetry RUN poetry config virtualenvs.create false -RUN poetry install --no-dev +RUN poetry install --no-root COPY . /app diff --git a/docker-compose.yml b/docker-compose.yml index 8fcb739c..02477ce7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: web: build: . @@ -9,7 +7,7 @@ services: - "8000:8000" env_file: - ./ops/environment/.default.env - - ./ops/environment/.local.env + - ./ops/environment/.test.env depends_on: - db networks: diff --git a/ops/environment/.test.env b/ops/environment/.test.env index 8b137891..563a7b19 100644 --- a/ops/environment/.test.env +++ b/ops/environment/.test.env @@ -1 +1,5 @@ +POSTGRES_USER=fastshop +POSTGRES_PASSWORD=password +POSTGRES_DB=fastshop_db +DATABASE_URL=postgresql+asyncpg://fastshop:password@db:5432/fastshop_db diff --git a/src/catalogue/models/database.py b/src/catalogue/models/database.py index cc5ba136..e6b9dd6c 100644 --- a/src/catalogue/models/database.py +++ b/src/catalogue/models/database.py @@ -90,3 +90,17 @@ class ProductDiscount(SQLModel, table=True): valid_to: datetime product: Product = Relationship(back_populates="discounts") + +class AdditionalProducts(SQLModel, table=True): + __tablename__ = 'additional_products' + + id: Optional[int] = Field(default=None, primary_key=True) + primary_id: int = Field(foreign_key="products.id") + additional_id: int = Field(foreign_key="products.id") + +class RecommendedProducts(SQLModel, table=True): + __tablename__ = 'recommended_products' + + id: Optional[int] = Field(default=None, primary_key=True) + primary_id: int = Field(foreign_key="products.id") + recommended_id: int = Field(foreign_key="products.id") diff --git a/src/catalogue/repository.py b/src/catalogue/repository.py index fab3dcd5..1908333b 100644 --- a/src/catalogue/repository.py +++ b/src/catalogue/repository.py @@ -1,7 +1,7 @@ from fastapi import Depends from sqlalchemy.ext.asyncio import AsyncSession -from src.catalogue.models.database import Product +from src.catalogue.models.database import Product, AdditionalProducts, RecommendedProducts from src.common.databases.postgres import get_session from src.common.repository.sqlalchemy import BaseSQLAlchemyRepository @@ -13,3 +13,17 @@ def __init__(self, session: AsyncSession): def get_product_repository(session: AsyncSession = Depends(get_session)) -> ProductRepository: return ProductRepository(session=session) + +class AdditionalProductsRepository(BaseSQLAlchemyRepository[AdditionalProducts]): + def __init__(self, session: AsyncSession): + super().__init__(model=AdditionalProducts, session=session) + +def get_additional_product_repository(session: AsyncSession = Depends(get_session)) -> AdditionalProductsRepository: + return AdditionalProductsRepository(session=session) + +class RecommendedProductsRepository(BaseSQLAlchemyRepository[RecommendedProducts]): + def __init__(self, session: AsyncSession): + super().__init__(model=RecommendedProducts, session=session) + +def get_recommended_product_repository(session: AsyncSession = Depends(get_session)) -> RecommendedProductsRepository: + return RecommendedProductsRepository(session=session) \ No newline at end of file diff --git a/src/catalogue/services.py b/src/catalogue/services.py index 53810517..d41b69e1 100644 --- a/src/catalogue/services.py +++ b/src/catalogue/services.py @@ -1,12 +1,12 @@ from fastapi import Depends -from src.catalogue.models.database import Product +from src.catalogue.models.database import Product, AdditionalProducts, RecommendedProducts from src.catalogue.repository import ( - ProductRepository, - get_product_repository, + ProductRepository, AdditionalProductsRepository, RecommendedProductsRepository, + get_product_repository, get_additional_product_repository, get_recommended_product_repository, ) from src.common.service import BaseService - +from sqlalchemy import select class ProductService(BaseService[Product]): def __init__(self, repository: ProductRepository): @@ -15,3 +15,28 @@ def __init__(self, repository: ProductRepository): def get_product_service(repo: ProductRepository = Depends(get_product_repository)) -> ProductService: return ProductService(repository=repo) + +class AdditionalProductsService(BaseService[AdditionalProducts]): + def __init__(self, repository: AdditionalProductsRepository): + super().__init__(repository) + + async def list_for_product(self, primary_id: int): + query = select(AdditionalProducts).where(AdditionalProducts.primary_id == primary_id) + result = await self.repository.session.execute(query) + return result.scalars().all() + + +def get_additional_product_service(repo: AdditionalProductsRepository = Depends(get_additional_product_repository)) -> AdditionalProductsService: + return AdditionalProductsService(repository=repo) + +class RecommendedProductsService(BaseService[RecommendedProducts]): + def __init__(self, repository: RecommendedProductsRepository): + super().__init__(repository) + + async def list_for_product(self, primary_id: int): + query = select(RecommendedProducts).where(RecommendedProducts.primary_id == primary_id) + result = await self.repository.session.execute(query) + return result.scalars().all() + +def get_recommended_product_service(repo: RecommendedProductsRepository = Depends(get_recommended_product_repository)) -> RecommendedProductsService: + return RecommendedProductsService(repository=repo) \ No newline at end of file