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..55b90c37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3.8' +#version: '3.8' services: web: @@ -9,7 +9,7 @@ services: - "8000:8000" env_file: - ./ops/environment/.default.env - - ./ops/environment/.local.env + - ./ops/environment/.env depends_on: - db networks: diff --git a/src/catalogue/models/database.py b/src/catalogue/models/database.py index cc5ba136..30ac2127 100644 --- a/src/catalogue/models/database.py +++ b/src/catalogue/models/database.py @@ -90,3 +90,15 @@ 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") \ No newline at end of file diff --git a/src/catalogue/repository.py b/src/catalogue/repository.py index fab3dcd5..92c60922 100644 --- a/src/catalogue/repository.py +++ b/src/catalogue/repository.py @@ -1,7 +1,8 @@ from fastapi import Depends from sqlalchemy.ext.asyncio import AsyncSession +from sqlmodel import Session, select -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 +14,57 @@ def __init__(self, session: AsyncSession): def get_product_repository(session: AsyncSession = Depends(get_session)) -> ProductRepository: return ProductRepository(session=session) + +class AdditionalProductsRepository: + def __init__(self, session: Session): + self.session = session + + def get_all_by_primary(self, primary_id: int): + return self.session.exec( + select(AdditionalProducts).where(AdditionalProducts.primary_id == primary_id) + ).all() + + def get_by_id(self, id_: int): + return self.session.get(AdditionalProducts, id_) + + def create(self, obj: AdditionalProducts): + self.session.add(obj) + self.session.commit() + self.session.refresh(obj) + return obj + + def update(self, db_obj: AdditionalProducts, **kwargs): + for k, v in kwargs.items(): + setattr(db_obj, k, v) + self.session.add(db_obj) + self.session.commit() + self.session.refresh(db_obj) + return db_obj + + def delete(self, db_obj: AdditionalProducts): + self.session.delete(db_obj) + self.session.commit() + +class RecommendedProductsRepository: + def __init__(self, session: Session): + self.session = session + + def get_all(self): + return self.session.exec(select(RecommendedProducts)).all() + + def get_by_id(self, id_: int): + return self.session.get(RecommendedProducts, id_) + + def create(self, obj_in: RecommendedProducts) -> RecommendedProducts: + self.session.add(obj_in) + self.session.commit() + self.session.refresh(obj_in) + return obj_in + + def delete(self, id_: int): + db_obj = self.get_by_id(id_) + if db_obj: + self.session.delete(db_obj) + self.session.commit() + return True + return False \ No newline at end of file diff --git a/src/catalogue/services.py b/src/catalogue/services.py index 53810517..642f0123 100644 --- a/src/catalogue/services.py +++ b/src/catalogue/services.py @@ -1,11 +1,14 @@ 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, + AdditionalProductsRepository, + RecommendedProductsRepository, ) from src.common.service import BaseService +from sqlmodel import Session class ProductService(BaseService[Product]): @@ -15,3 +18,46 @@ def __init__(self, repository: ProductRepository): def get_product_service(repo: ProductRepository = Depends(get_product_repository)) -> ProductService: return ProductService(repository=repo) + +class AdditionalProductsService: + def __init__(self, session: Session): + self.repo = AdditionalProductsRepository(session) + + def list_for_product(self, primary_id: int): + """Список додаткових товарів для конкретного продукту""" + return self.repo.get_all_by_primary(primary_id) + + def add_relation(self, primary_id: int, additional_id: int): + obj = AdditionalProducts(primary_id=primary_id, additional_id=additional_id) + return self.repo.create(obj) + + def update_relation(self, id_: int, **kwargs): + """Оновлення зв’язку (наприклад, змінити additional_id)""" + db_obj = self.repo.get_by_id(id_) + if not db_obj: + return None + return self.repo.update(db_obj, **kwargs) + + def remove_relation(self, id_: int): + db_obj = self.repo.get_by_id(id_) + if db_obj: + self.repo.delete(db_obj) + return True + return False + +class RecommendedProductsService: + def __init__(self, session: Session): + self.repo = RecommendedProductsRepository(session) + + def list_all(self): + return self.repo.get_all() + + def get(self, id_: int): + return self.repo.get_by_id(id_) + + def add_relation(self, primary_id: int, recommended_id: int): + obj = RecommendedProducts(primary_id=primary_id, recommended_id=recommended_id) + return self.repo.create(obj) + + def remove_relation(self, id_: int): + return self.repo.delete(id_) \ No newline at end of file