Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: '3.8'
#version: '3.8'

services:
web:
Expand All @@ -9,7 +9,7 @@ services:
- "8000:8000"
env_file:
- ./ops/environment/.default.env
- ./ops/environment/.local.env
- ./ops/environment/.env
depends_on:
- db
networks:
Expand Down
12 changes: 12 additions & 0 deletions src/catalogue/models/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
57 changes: 56 additions & 1 deletion src/catalogue/repository.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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
48 changes: 47 additions & 1 deletion src/catalogue/services.py
Original file line number Diff line number Diff line change
@@ -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]):
Expand All @@ -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_)