From b2ed5260a6a9ebb4f993810d7f199bac4edcc562 Mon Sep 17 00:00:00 2001 From: matv864 Date: Thu, 13 Mar 2025 19:47:21 +1000 Subject: [PATCH] makeup project --- src/adapters/database/repositories.py | 34 ++++++++-------- src/adapters/database/repository_gateway.py | 20 ++++++--- src/api/create_dataset.py | 20 +++++++++ src/schemas/api/dataset_comments.py | 0 src/schemas/api/dataset_general.py | 0 src/service/dataset_comments.py | 10 +++++ src/service/dataset_general.py | 10 +++++ src/unit_of_work.py | 45 +++++++++------------ src/utils/dependencies.py | 20 --------- src/utils/time.py | 5 --- src/utils/validating_base64.py | 13 ------ src/utils/verification.py | 9 ----- 12 files changed, 90 insertions(+), 96 deletions(-) create mode 100644 src/api/create_dataset.py create mode 100644 src/schemas/api/dataset_comments.py create mode 100644 src/schemas/api/dataset_general.py create mode 100644 src/service/dataset_comments.py create mode 100644 src/service/dataset_general.py delete mode 100644 src/utils/dependencies.py delete mode 100644 src/utils/time.py delete mode 100644 src/utils/validating_base64.py delete mode 100644 src/utils/verification.py diff --git a/src/adapters/database/repositories.py b/src/adapters/database/repositories.py index 9718cd4..75cbb59 100644 --- a/src/adapters/database/repositories.py +++ b/src/adapters/database/repositories.py @@ -1,23 +1,21 @@ -from datetime import datetime, timedelta, timezone -from typing import Optional -from uuid import UUID +from src.utils.repository import SQLAlchemyRepository -from sqlalchemy import asc, desc, func, select -from sqlalchemy.sql.expression import nulls_last -from sqlalchemy.sql.selectable import Select - -from src.settings import settings -from src.utils.exceptions import ( - RefreshClientInfoIncorrect, - RefreshException, - RefreshExpired, -) -from src.utils.repository import ( - SQLAlchemyRepository, - _sentinel, +from .models import ( + User, + Blog, + Post, + Log ) -# from .models import ( -# ) +class userRepository(SQLAlchemyRepository): + # here I can write methods only for this repository + model = User +class BlogRepository(SQLAlchemyRepository): + model = Blog +class PostRepository(SQLAlchemyRepository): + model = Post + +class LogRepository(SQLAlchemyRepository): + model = Log diff --git a/src/adapters/database/repository_gateway.py b/src/adapters/database/repository_gateway.py index e8afcb3..2382066 100644 --- a/src/adapters/database/repository_gateway.py +++ b/src/adapters/database/repository_gateway.py @@ -1,10 +1,20 @@ from sqlalchemy.ext.asyncio import AsyncSession -# from src.adapters.database.repositories import ( - -# ) +from src.adapters.database.repositories import ( + userRepository, + BlogRepository, + PostRepository, + LogRepository +) -class RepositoriesGateway: +class RepositoriesGatewayDB1: def __init__(self, session: AsyncSession): - pass + self.user = userRepository(session) + self.blog = BlogRepository(session) + self.post = PostRepository(session) + + +class RepositoriesGatewayDB2: + def __init__(self, session: AsyncSession): + self.log = LogRepository(session) diff --git a/src/api/create_dataset.py b/src/api/create_dataset.py new file mode 100644 index 0000000..82390c8 --- /dev/null +++ b/src/api/create_dataset.py @@ -0,0 +1,20 @@ +from typing import Annotated + +from fastapi import APIRouter, Depends + +from src.unit_of_work import UnitOfWork + +dataset_router = APIRouter() + + +@dataset_router.get("/comments", response_model=None) +async def get_database_comments(uow: Annotated[UnitOfWork, Depends(UnitOfWork)]): + pass + # async with uow: + # return await FavouriteService(uow, jwt_token).get_favourites( + # page=page, limit=limit + # ) + +@dataset_router.get("/general", response_model=None) +async def get_database_general(uow: Annotated[UnitOfWork, Depends(UnitOfWork)]): + pass \ No newline at end of file diff --git a/src/schemas/api/dataset_comments.py b/src/schemas/api/dataset_comments.py new file mode 100644 index 0000000..e69de29 diff --git a/src/schemas/api/dataset_general.py b/src/schemas/api/dataset_general.py new file mode 100644 index 0000000..e69de29 diff --git a/src/service/dataset_comments.py b/src/service/dataset_comments.py new file mode 100644 index 0000000..23109eb --- /dev/null +++ b/src/service/dataset_comments.py @@ -0,0 +1,10 @@ +from src.unit_of_work import UnitOfWork + + +class DatasetCommentsService: + def __init__(self, uow: UnitOfWork): + self.uow = uow + + async def get_dataset(self): + # data = await self.uow.repositories + pass \ No newline at end of file diff --git a/src/service/dataset_general.py b/src/service/dataset_general.py new file mode 100644 index 0000000..b4af07d --- /dev/null +++ b/src/service/dataset_general.py @@ -0,0 +1,10 @@ +from src.unit_of_work import UnitOfWork + + +class DatasetGeneralService: + def __init__(self, uow: UnitOfWork): + self.uow = uow + + async def get_dataset(self): + # data = await self.uow.repositories + pass diff --git a/src/unit_of_work.py b/src/unit_of_work.py index 99f4d4b..1981375 100644 --- a/src/unit_of_work.py +++ b/src/unit_of_work.py @@ -1,44 +1,37 @@ from asyncio import shield -from src.adapters.database.repository_gateway import ( - RepositoriesGateway, - RepositoriesGatewayProtocol, -) -from src.adapters.database.session import async_session_maker -from src.adapters.filestorage.repository import ( - FileStorageProtocol, - FileStorageRepository, -) -from src.adapters.filestorage.session import s3_session_factory -from src.adapters.verification import VerificationGateway, VerificationProtocol -from src.utils.unit_of_work import UnitOfWorkProtocol +from src.adapters.database.repository_gateway import RepositoriesGatewayDB1, RepositoriesGatewayDB2 +from src.adapters.database.session import async_session_maker_db1, async_session_maker_db2 + +from src.utils.repository import _sentinel -class UnitOfWork(UnitOfWorkProtocol): - file_storage: FileStorageProtocol - repositories: RepositoriesGatewayProtocol - verifications: VerificationProtocol +class UnitOfWork: + repositories = _sentinel + def __init__(self): - self.db_session_factory = async_session_maker - self.s3_session_facotry = s3_session_factory + self.db1_session_factory = async_session_maker_db1 + self.db2_session_factory = async_session_maker_db2 async def __aenter__(self): - self.db_session = self.db_session_factory() - self.s3_session = self.s3_session_facotry() + self.db1_session = self.db1_session_factory() + self.db2_session = self.db2_session_factory() - self.file_storage = FileStorageRepository(self.s3_session) - self.repositories = RepositoriesGateway(self.db_session) - self.verifications = VerificationGateway() + self.repositories_db1 = RepositoriesGatewayDB1(self.db1_session) + self.repositories_db2 = RepositoriesGatewayDB2(self.db2_session) return self async def __aexit__(self, *args): await self.rollback() - await shield(self.db_session.close()) + await shield(self.db1_session.close()) + await shield(self.db2_session.close()) async def commit(self): - await self.db_session.commit() + await self.db1_session.commit() + await self.db2_session.commit() async def rollback(self): - await self.db_session.rollback() + await self.db1_session.rollback() + await self.db2_session.rollback() diff --git a/src/utils/dependencies.py b/src/utils/dependencies.py deleted file mode 100644 index 4846f82..0000000 --- a/src/utils/dependencies.py +++ /dev/null @@ -1,20 +0,0 @@ -from datetime import datetime, timezone -from typing import Annotated - -from fastapi import Depends -from fastapi.security import OAuth2PasswordBearer - -from src.adapters.database.models.clients import ClientType -from src.adapters.jwt_token import JwtToken - -oauth2_scheme = OAuth2PasswordBearer(tokenUrl="authenticaition", auto_error=False) - - -async def provide_jwt_token( - encoded_token: Annotated[str | None, Depends(oauth2_scheme)] = None, -) -> JwtToken: - if encoded_token is None: - return JwtToken( - exp=datetime.now(timezone.utc), client_id=0, client_type=ClientType.individ - ) - return JwtToken.decode(encoded_token) diff --git a/src/utils/time.py b/src/utils/time.py deleted file mode 100644 index 1713398..0000000 --- a/src/utils/time.py +++ /dev/null @@ -1,5 +0,0 @@ -from datetime import datetime, timezone - - -def utc_signed_now(): - return datetime.now(timezone.utc) diff --git a/src/utils/validating_base64.py b/src/utils/validating_base64.py deleted file mode 100644 index e1abcc2..0000000 --- a/src/utils/validating_base64.py +++ /dev/null @@ -1,13 +0,0 @@ -import base64 -import binascii - - -def is_valid_base64(value: str) -> bool: - try: - value = value.split(";base64,")[1] - base64.decodebytes(value.encode("ascii")) - return True - except binascii.Error: - return False - except IndexError: - return False diff --git a/src/utils/verification.py b/src/utils/verification.py deleted file mode 100644 index 52d157a..0000000 --- a/src/utils/verification.py +++ /dev/null @@ -1,9 +0,0 @@ -from abc import abstractmethod -from typing import Protocol - - -class VerificationProtocol(Protocol): - @abstractmethod - async def send_verification_code(self, phone_number: str) -> int: - """Sends verification code to user and returns sended code""" - raise NotImplementedError