feat(): yandex sign up route

This commit is contained in:
doas root
2025-11-19 00:16:36 +03:00
parent 0992e6c038
commit 81cf298b5a
3 changed files with 35 additions and 8 deletions
@@ -24,7 +24,7 @@ def upgrade() -> None:
op.create_table('auth_identities', op.create_table('auth_identities',
sa.Column('id', sa.UUID(), nullable=False), sa.Column('id', sa.UUID(), nullable=False),
sa.Column('user_id', sa.UUID(), nullable=False), sa.Column('user_id', sa.UUID(), nullable=False),
sa.Column('method', sa.Enum('EMAIL', name='auth_method'), nullable=False), sa.Column('method', sa.Enum('EMAIL', 'YANDEX', name='auth_method'), nullable=False),
sa.Column('identifier', sa.String(), nullable=False), sa.Column('identifier', sa.String(), nullable=False),
sa.Column('secret_key', sa.String(), nullable=True), sa.Column('secret_key', sa.String(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
@@ -1,5 +1,6 @@
import argparse import argparse
import asyncio import asyncio
import logging
import os import os
import sys import sys
from collections.abc import AsyncIterator from collections.abc import AsyncIterator
@@ -73,6 +74,9 @@ def make_asgi_application(
async def _main( async def _main(
configuration_path: Path, configuration_path: Path,
) -> None: ) -> None:
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("httpcore").setLevel(logging.WARNING)
configuration = load_configuration(configuration_path) configuration = load_configuration(configuration_path)
ioc = make_ioc(configuration) ioc = make_ioc(configuration)
asgi_application = make_asgi_application(ioc) asgi_application = make_asgi_application(ioc)
+30 -7
View File
@@ -1,31 +1,54 @@
from dishka import FromDishka from dishka import FromDishka
from dishka.integrations.fastapi import DishkaRoute from dishka.integrations.fastapi import DishkaRoute
from fastapi import APIRouter from fastapi import APIRouter, HTTPException, status
from pydantic import BaseModel, SecretStr from pydantic import BaseModel, SecretStr
from template_project.application.auth_identity.errors import AuthError, InvalidCodeError
from template_project.application.auth_identity.interactors.sign_up import AuthIdentityInteractor from template_project.application.auth_identity.interactors.sign_up import AuthIdentityInteractor
from template_project.application.common.containers import SecretString from template_project.application.common.containers import SecretString
router = APIRouter(route_class=DishkaRoute) router = APIRouter(route_class=DishkaRoute)
class UserSignUpRequest(BaseModel): class EmailSignUpRequest(BaseModel):
email: str email: str
password: SecretStr password: SecretStr
class UserSignUpResponse(BaseModel): class EmailSignUpResponse(BaseModel):
access_token: str access_token: str
@router.post("/auth/sign_up/email") @router.post("/auth/sign_up/email")
async def sign_up( async def sign_up_email(
request: UserSignUpRequest, request: EmailSignUpRequest,
interactor: FromDishka[AuthIdentityInteractor], interactor: FromDishka[AuthIdentityInteractor],
) -> UserSignUpResponse: ) -> EmailSignUpResponse:
response_interactor = await interactor.sign_up_email( response_interactor = await interactor.sign_up_email(
email=request.email, password=SecretString(request.password.get_secret_value()) email=request.email, password=SecretString(request.password.get_secret_value())
) )
return UserSignUpResponse( return EmailSignUpResponse(
access_token=response_interactor.access_token, access_token=response_interactor.access_token,
) )
class YandexSignUpRequest(BaseModel):
code: str
class YandexSignUpResponse(BaseModel):
access_token: str
@router.post("/auth/sign_up/yandex")
async def sign_up_yandex(
request: YandexSignUpRequest,
interactor: FromDishka[AuthIdentityInteractor],
) -> YandexSignUpResponse:
try:
response_interactor = await interactor.sign_up_yandex(code=request.code)
except (InvalidCodeError, AuthError) as error:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Authentication failed") from error
return YandexSignUpResponse(access_token=response_interactor.access_token)