diff --git a/app/__init__.py b/app/__init__.py index 1d04831..7c9e811 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -2,6 +2,6 @@ Initial project v16 """ -x = [1,2,3] -a = 1+1 -b = 1 + 1 \ No newline at end of file +x = [1, 2, 3] +a = 1 + 1 +b = 1 + 1 diff --git a/app/api/depends.py b/app/api/depends.py index dcddad8..d22bb2e 100644 --- a/app/api/depends.py +++ b/app/api/depends.py @@ -17,5 +17,7 @@ async def get_db() -> Database: return Database(session) -async def get_current_user(token: str = Depends(oauth2_scheme), db: Database = Depends(get_db)): +async def get_current_user( + token: str = Depends(oauth2_scheme), db: Database = Depends(get_db) +): return await auth.authorization(token, db) diff --git a/app/api/users/endpoints.py b/app/api/users/endpoints.py index 733ac0b..44ed48e 100644 --- a/app/api/users/endpoints.py +++ b/app/api/users/endpoints.py @@ -43,7 +43,10 @@ async def new(user: UserSchemeAdd, db: Database = Depends(depends.get_db)): @router.post("/token", response_model=UserTokenScheme) -async def token(form_data: auth.OAuth2PasswordRequestForm = Depends(), db: Database = Depends(depends.get_db)): +async def token( + form_data: auth.OAuth2PasswordRequestForm = Depends(), + db: Database = Depends(depends.get_db), +): """ Получение токена доступа для пользователя. """ diff --git a/app/core/__init__.py b/app/core/__init__.py index fa22140..5ab0d0b 100644 --- a/app/core/__init__.py +++ b/app/core/__init__.py @@ -2,8 +2,6 @@ Ядро FastAPI приложения. """ -from .settings import settings - -__all__ = ( - "settings", -) \ No newline at end of file +from .settings import settings + +__all__ = ("settings",) diff --git a/app/core/auth/__init__.py b/app/core/auth/__init__.py index 88ec994..46c0760 100644 --- a/app/core/auth/__init__.py +++ b/app/core/auth/__init__.py @@ -6,9 +6,9 @@ from .security import verify_password, get_password_hash, create_access_token __all__ = ( - 'authorization', - 'OAuth2PasswordRequestForm', - 'verify_password', - 'get_password_hash', - 'create_access_token' + "authorization", + "OAuth2PasswordRequestForm", + "verify_password", + "get_password_hash", + "create_access_token", ) diff --git a/app/core/auth/oauth2.py b/app/core/auth/oauth2.py index 05dca89..36b5e47 100644 --- a/app/core/auth/oauth2.py +++ b/app/core/auth/oauth2.py @@ -9,14 +9,14 @@ class OAuth2PasswordRequestForm: def __init__( - self, - *, - grant_type: Annotated[Union[str, None], Form(pattern="password")] = None, - username: Annotated[str, Form()], - password: Annotated[str, Form()], - scope: Annotated[str, Form()] = "", - client_id: Annotated[Union[str, None], Form()] = None, - client_secret: Annotated[Union[str, None], Form()] = None, + self, + *, + grant_type: Annotated[Union[str, None], Form(pattern="password")] = None, + username: Annotated[str, Form()], + password: Annotated[str, Form()], + scope: Annotated[str, Form()] = "", + client_id: Annotated[Union[str, None], Form()] = None, + client_secret: Annotated[Union[str, None], Form()] = None, ): """ Представляет форму запроса пароля OAuth 2.0. diff --git a/app/core/auth/security.py b/app/core/auth/security.py index 54d3649..01d7511 100644 --- a/app/core/auth/security.py +++ b/app/core/auth/security.py @@ -45,9 +45,6 @@ def create_access_token(username: str): Returns: str: Закодированный JWT токен в виде строки. """ - data = dict( - username=username, - exp=datetime.utcnow() + timedelta(minutes=120) - ) + data = dict(username=username, exp=datetime.utcnow() + timedelta(minutes=120)) encoded_jwt = jwt.encode(data, settings.APP_AUTH_SECRET, algorithm="HS256") return encoded_jwt diff --git a/app/core/settings.py b/app/core/settings.py index c987677..12dd342 100644 --- a/app/core/settings.py +++ b/app/core/settings.py @@ -19,8 +19,10 @@ class Settings(BaseSettings): @property def pg_dns(self): - return (f"postgresql+asyncpg://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@", - f"{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DATABASE}") + return ( + f"postgresql+asyncpg://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@", + f"{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DATABASE}", + ) settings = Settings() diff --git a/app/database/__init__.py b/app/database/__init__.py index 7f5cae4..18fe565 100644 --- a/app/database/__init__.py +++ b/app/database/__init__.py @@ -6,7 +6,7 @@ from .models import Base __all__ = ( - 'Database', - 'engine', - 'Base', + "Database", + "engine", + "Base", ) diff --git a/app/database/database.py b/app/database/database.py index 74b28fa..c431e16 100644 --- a/app/database/database.py +++ b/app/database/database.py @@ -1,29 +1,29 @@ from typing import Optional -from sqlalchemy.engine.url import URL -from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession -from sqlalchemy.ext.asyncio import create_async_engine as _create_async_engine - -from app.core import settings -from .repositories import UserRepo - - -def create_async_engine(url: URL | str) -> AsyncEngine: - return _create_async_engine(url=url, echo=False, pool_pre_ping=True) - - -engine = create_async_engine(settings.pg_dns) - - -class Database: - session: AsyncSession - - user: UserRepo - - def __init__( - self, - session: AsyncSession, - user: Optional[UserRepo] = None, - ): - self.session = session - self.user = user or UserRepo(session=session) +from sqlalchemy.engine.url import URL +from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession +from sqlalchemy.ext.asyncio import create_async_engine as _create_async_engine + +from app.core import settings +from .repositories import UserRepo + + +def create_async_engine(url: URL | str) -> AsyncEngine: + return _create_async_engine(url=url, echo=False, pool_pre_ping=True) + + +engine = create_async_engine(settings.pg_dns) + + +class Database: + session: AsyncSession + + user: UserRepo + + def __init__( + self, + session: AsyncSession, + user: Optional[UserRepo] = None, + ): + self.session = session + self.user = user or UserRepo(session=session) diff --git a/app/database/models/__init__.py b/app/database/models/__init__.py index feb6629..ad4a256 100644 --- a/app/database/models/__init__.py +++ b/app/database/models/__init__.py @@ -6,6 +6,6 @@ from .user import User __all__ = ( - 'Base', - 'User', + "Base", + "User", ) diff --git a/app/database/models/base.py b/app/database/models/base.py index ac2f0af..607e5a4 100644 --- a/app/database/models/base.py +++ b/app/database/models/base.py @@ -8,11 +8,11 @@ metadata = MetaData( naming_convention={ - 'ix': 'ix_%(column_0_label)s', - 'uq': 'uq_%(table_name)s_%(column_0_name)s', - 'ck': 'ck_%(table_name)s_%(constraint_name)s', - 'fk': 'fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s', - 'pk': 'pk_%(table_name)s', + "ix": "ix_%(column_0_label)s", + "uq": "uq_%(table_name)s_%(column_0_name)s", + "ck": "ck_%(table_name)s_%(constraint_name)s", + "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", + "pk": "pk_%(table_name)s", } ) @@ -26,6 +26,4 @@ def __tablename__(cls): __allow_unmapped__ = False - id: Mapped[int] = mapped_column( - Integer, autoincrement=True, primary_key=True - ) + id: Mapped[int] = mapped_column(Integer, autoincrement=True, primary_key=True) diff --git a/app/database/repositories/__init__.py b/app/database/repositories/__init__.py index b541f6e..597697d 100644 --- a/app/database/repositories/__init__.py +++ b/app/database/repositories/__init__.py @@ -4,6 +4,4 @@ from .user import UserRepo -__all__ = ( - 'UserRepo', -) +__all__ = ("UserRepo",) diff --git a/app/database/repositories/abstract.py b/app/database/repositories/abstract.py index 58fea5f..2e4d087 100644 --- a/app/database/repositories/abstract.py +++ b/app/database/repositories/abstract.py @@ -10,7 +10,7 @@ from ..models import Base -AbstractModel = TypeVar('AbstractModel') +AbstractModel = TypeVar("AbstractModel") class Repository(Generic[AbstractModel]): @@ -29,7 +29,10 @@ async def get_by_where(self, whereclause) -> AbstractModel | None: return (await self.session.execute(statement)).unique().scalar_one_or_none() async def get_many( - self, whereclause: Optional [List[Any]] = None, limit: Optional[int] = None, order_by=None + self, + whereclause: Optional[List[Any]] = None, + limit: Optional[int] = None, + order_by=None, ): statement = sa.select(self.type_model).limit(limit).order_by(order_by) if whereclause: @@ -41,7 +44,11 @@ async def delete(self, whereclause) -> None: await self.session.execute(statement) async def update(self, ident: int, **values): - statement = sa.update(self.type_model).values(**values).where(self.type_model.id == ident) + statement = ( + sa.update(self.type_model) + .values(**values) + .where(self.type_model.id == ident) + ) await self.session.execute(statement) @abc.abstractmethod diff --git a/app/database/repositories/user.py b/app/database/repositories/user.py index 7b4fd42..0525f9f 100644 --- a/app/database/repositories/user.py +++ b/app/database/repositories/user.py @@ -16,13 +16,13 @@ async def new( self, username: str | None = None, password: str | None = None, - ) -> User: - new_user = User() - new_user.username = username - new_user.password = password - + ) -> User: + new_user = User() + new_user.username = username + new_user.password = password + new_user = await self.session.merge(new_user) - await self.session.flush() + await self.session.flush() return new_user async def get_by_username(self, username: str) -> User | None: diff --git a/app/schemas/users.py b/app/schemas/users.py index c82680f..d7dd072 100644 --- a/app/schemas/users.py +++ b/app/schemas/users.py @@ -9,6 +9,7 @@ class UserScheme(BaseModel): """ Схема, которую возвращает бэк. """ + id: int = 0 username: str = "username" @@ -20,6 +21,7 @@ class UserSchemeAdd(BaseModel): """ Схема создания пользователя. """ + username: str = "username" password: str = "password" @@ -28,6 +30,7 @@ class UserTokenScheme(BaseModel): """ Схема токена пользователя. """ + access_token: str token_type: str = "Bearer" diff --git a/migrations/env.py b/migrations/env.py index efe4287..eb88309 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -24,7 +24,7 @@ # target_metadata = mymodel.Base.metadata target_metadata = Base.metadata -config.set_main_option('sqlalchemy.url', settings.pg_dns) +config.set_main_option("sqlalchemy.url", settings.pg_dns) # other values from the config, defined by the needs of env.py, diff --git a/migrations/versions/9fc63c3797b9_.py b/migrations/versions/9fc63c3797b9_.py index 1afea74..24f2e7d 100644 --- a/migrations/versions/9fc63c3797b9_.py +++ b/migrations/versions/9fc63c3797b9_.py @@ -12,7 +12,7 @@ # revision identifiers, used by Alembic. -revision: str = '9fc63c3797b9' +revision: str = "9fc63c3797b9" down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -20,16 +20,17 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.create_table('user', - sa.Column('username', sa.String(), nullable=False), - sa.Column('password', sa.String(), nullable=False), - sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), - sa.PrimaryKeyConstraint('id', name=op.f('pk_user')) + op.create_table( + "user", + sa.Column("username", sa.String(), nullable=False), + sa.Column("password", sa.String(), nullable=False), + sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), + sa.PrimaryKeyConstraint("id", name=op.f("pk_user")), ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('user') + op.drop_table("user") # ### end Alembic commands ###