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
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ FROM python:3.11

WORKDIR /app

COPY pyproject.toml pyproject.toml
COPY pyproject.toml pyproject.toml poetry.lock ./

RUN pip install poetry
RUN poetry config virtualenvs.create false
RUN poetry install --no-dev
RUN poetry install --no-root

COPY . /app

Expand Down
1 change: 1 addition & 0 deletions ops/scripts/mongo/init-mongodb.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
db = db.getSiblingDB('fastshop');
db.createCollection('productReviews');
db.createCollection('analytics');
228 changes: 218 additions & 10 deletions poetry.lock

Large diffs are not rendered by default.

Empty file added src/analytics/__init__.py
Empty file.
Empty file.
16 changes: 16 additions & 0 deletions src/analytics/models/mongo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from datetime import datetime
from typing import List

from beanie import Document
from pydantic import (
BaseModel,
Field
)


class ProductAnalytics(Document):
product_id: int
timestamp: datetime

class Settings:
name = 'analytics'
6 changes: 6 additions & 0 deletions src/analytics/repositories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from src.common.repository.beanie import BaseMongoRepository
from src.analytics.models.mongo import ProductAnalytics


class ProductAnalyticsRepository(BaseMongoRepository[ProductAnalytics]):
__model__ = ProductAnalytics
25 changes: 25 additions & 0 deletions src/analytics/services.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from datetime import datetime
from typing import Annotated

from fastapi import Depends

from src import analytics
from src.common.exceptions.base import ObjectDoesNotExistException
from src.common.service import BaseService
from src.analytics.models.mongo import (
ProductAnalytics,
)
from src.analytics.repositories import ProductAnalyticsRepository


class ProductAnalyticsService(BaseService):
def __init__(
self,
repository: Annotated[ProductAnalyticsRepository, Depends()],
):
super().__init__(repository=repository)

async def visit_record(self, product_id: int):
analytics = ProductAnalytics(product_id = product_id, timestamp = datetime.now())

await analytics.save()
3 changes: 3 additions & 0 deletions src/catalogue/views/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from src.common.exceptions.base import ObjectDoesNotExistException
from src.common.schemas.common import ErrorResponse

from src.analytics.services import ProductAnalyticsService

router = APIRouter(prefix=CatalogueRoutesPrefixes.product)

Expand Down Expand Up @@ -51,6 +52,7 @@ async def product_detail(
response: Response,
pk: int,
service: Annotated[get_product_service, Depends()],
analytics_service: Annotated[ProductAnalyticsService, Depends()],
) -> Union[Response, ErrorResponse]:
"""
Retrieve product.
Expand All @@ -59,6 +61,7 @@ async def product_detail(
Response with product details.
"""
try:
await analytics_service.visit_record(product_id=pk)
response = await service.detail(pk=pk)
except ObjectDoesNotExistException as exc:
response.status_code = status.HTTP_404_NOT_FOUND
Expand Down
2 changes: 2 additions & 0 deletions src/common/databases/mongo_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from beanie import init_beanie
from motor.motor_asyncio import AsyncIOMotorClient

from src.analytics.models.mongo import ProductAnalytics
from src.base_settings import base_settings
from src.common.singleton import SingletonMeta
from src.reviews.models.mongo import ProductReview
Expand All @@ -21,5 +22,6 @@ async def init_mongo_db():
database=client.get_database(),
document_models=[
ProductReview,
ProductAnalytics
],
)