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: 1 addition & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
version: '3.8'

services:
web:
build: .
Expand All @@ -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:
Expand Down
4 changes: 4 additions & 0 deletions ops/environment/.test.env
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
POSTGRES_USER=fastshop
POSTGRES_PASSWORD=password
POSTGRES_DB=fastshop_db
DATABASE_URL=postgresql+asyncpg://fastshop:password@db:5432/fastshop_db
Comment on lines +1 to +4
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Це файли не можна пушити


14 changes: 14 additions & 0 deletions src/catalogue/models/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
16 changes: 15 additions & 1 deletion src/catalogue/repository.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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)
33 changes: 29 additions & 4 deletions src/catalogue/services.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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)