Skip to content

Commit ddd15a8

Browse files
committed
Логика не зависит от фреймворка, осталось решить зависимость от exps fastapi
1 parent f247e94 commit ddd15a8

File tree

12 files changed

+93
-105
lines changed

12 files changed

+93
-105
lines changed

app/api/anotations.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

app/api/deps.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""
2+
Dependencies
3+
"""
4+
5+
from typing import Annotated
6+
7+
from fastapi import Depends
8+
from fastapi.security import APIKeyHeader
9+
10+
from app.logic import Logic as _Logic
11+
from app.models.user import User as _User
12+
13+
14+
async def get_logic() -> _Logic:
15+
return await _Logic.create()
16+
17+
18+
Logic = Annotated[_Logic, Depends(get_logic)]
19+
20+
21+
async def get_user(
22+
token: Annotated[str, Depends(APIKeyHeader(name="access-token"))],
23+
logic: Logic,
24+
) -> _User | None:
25+
return await logic.users.retrieve_by_token(token)
26+
27+
28+
User = Annotated[_User, Depends(get_user)]

app/api/v1/users/auth/token.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from fastapi import APIRouter
22

3-
from app.api import anotations
3+
from app.api import deps
44
from app.models.token import AccessToken
55
from app.models.user import UserCreate
66

77
router = APIRouter(prefix="/token")
88

99

1010
@router.post("/", response_model=AccessToken)
11-
async def token(data: UserCreate, logic: anotations.Logic):
11+
async def token(data: UserCreate, logic: deps.Logic):
1212
"""
1313
Retrieve new access token
1414
"""

app/api/v1/users/create.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
from fastapi import APIRouter
22

3-
from app.api import anotations
3+
from app.api import deps
44
from app.models.user import UserCreate, UserRead
55

66
router = APIRouter(prefix="/create")
77

88

99
@router.post("/", response_model=UserRead)
10-
async def create(data: UserCreate, logic: anotations.Logic):
10+
async def create(data: UserCreate, logic: deps.Logic):
1111
"""
1212
Create user
1313
"""

app/api/v1/users/retrieve.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55
from fastapi import APIRouter
66

7-
from app.api import anotations
7+
from app.api import deps
88
from app.models.user import UserRead
99

1010
router = APIRouter()
1111

1212

1313
@router.get("/", response_model=UserRead)
14-
async def retrieve(user: anotations.CurrentUser):
14+
async def retrieve(user: deps.User):
1515
"""
1616
Retrieve user
1717
"""

app/core/db.py

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,38 @@
1010

1111

1212
class Database:
13-
session: AsyncSession
14-
15-
@classmethod
16-
def __get_async_engine(cls) -> AsyncEngine:
17-
return create_async_engine(
18-
settings.pg_dsn.unicode_string(), echo=False, future=True
19-
)
20-
21-
@classmethod
22-
def __get_async_session(cls) -> async_sessionmaker[AsyncSession]:
23-
return async_sessionmaker(
24-
autocommit=False,
25-
autoflush=False,
26-
bind=cls.__get_async_engine(),
27-
class_=AsyncSession,
28-
expire_on_commit=False,
29-
)
30-
31-
def __set_repositories(self):
32-
self.user = repos.UserRepo(session=self.session)
13+
def __init__(
14+
self, engine: AsyncEngine | None = None, session: AsyncSession | None = None
15+
) -> None:
16+
self.engine = engine
17+
self.session = session
18+
19+
async def __set_async_engine(self) -> None:
20+
if self.engine is None:
21+
self.engine = create_async_engine(
22+
settings.pg_dsn.unicode_string(), echo=False, future=True
23+
)
24+
25+
async def __set_async_session(self) -> None:
26+
if self.session is None:
27+
self.session = async_sessionmaker(
28+
autocommit=False,
29+
autoflush=False,
30+
bind=self.engine,
31+
class_=AsyncSession,
32+
expire_on_commit=False,
33+
)()
34+
35+
async def __set_repositories(self) -> None:
36+
if self.session is not None:
37+
self.user = repos.UserRepo(session=self.session)
3338

3439
async def __aenter__(self):
35-
async with self.__get_async_session()() as session:
36-
self.session = session
37-
self.__set_repositories()
40+
await self.__set_async_engine()
41+
await self.__set_async_session()
42+
await self.__set_repositories()
3843
return self
3944

4045
async def __aexit__(self, exc_type, exc_value, traceback):
41-
await self.session.close()
46+
if self.session is not None:
47+
await self.session.close()

app/core/deps.py

Lines changed: 0 additions & 36 deletions
This file was deleted.

app/logic/__init__.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
from app.core.db import Database
2-
from app.core.security import Security
32

43
from .users import Users
4+
from .security import Security
55

66

77
class Logic:
8-
def __init__(self, db: Database, security: Security):
9-
self.users = Users(db, security)
8+
def __init__(self, db: Database):
9+
self.db = db
10+
self.security = Security()
11+
self.users = Users(self)
1012

13+
@classmethod
14+
async def create(cls):
15+
async with Database() as db:
16+
return cls(db)
1117

12-
__all__ = ['Logic']
18+
19+
__all__ = ["Logic"]
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)