From 69e67d049411ceb5c839386b020ce2c77ffc2847 Mon Sep 17 00:00:00 2001 From: l3wdfut4pwr Date: Thu, 2 Apr 2026 08:39:42 +0300 Subject: minor improvements --- app/routes/register.py | 93 +++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 51 deletions(-) (limited to 'app/routes/register.py') diff --git a/app/routes/register.py b/app/routes/register.py index fb8ec3d..ffcd336 100644 --- a/app/routes/register.py +++ b/app/routes/register.py @@ -1,10 +1,11 @@ import re from typing import Optional -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Response from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select +from app.auth.jwt import create_access_token, create_refresh_token from app.models.user import User from app.schemas.user import UserCreate, UserRead from app.utils.db import get_async_session @@ -16,21 +17,15 @@ router = APIRouter(tags=["auth"]) @router.post("/register", response_model=UserRead) async def register_user( - user: UserCreate, session: AsyncSession = Depends(get_async_session) + user: UserCreate, + response: Response, + session: AsyncSession = Depends(get_async_session), ): logger.debug("Register request received") email: Optional[str] = user.email.strip() if user.email else None - logger.debug("Normalized email value: {}", email) - - logger.info( - "Registration attempt | username={} email={}", - user.username, - email, - ) - - logger.debug("Validating password complexity") + logger.info("Registration attempt | username={} email={}", user.username, email) if not ( re.search(r"[A-Za-z]", user.password) @@ -41,14 +36,18 @@ async def register_user( "Registration failed | password complexity requirement not met | username={}", user.username, ) + raise HTTPException( + status_code=400, + detail={ + "field": "password", + "message": "Попробуйте сочетание букв, цифр и символов.", + }, + ) - logger.debug("Checking if username already exists") result = await session.execute(select(User).where(User.username == user.username)) - existing_username = result.scalars().first() - if existing_username: + if result.scalars().first(): logger.warning( - "Registration failed | username already exists | username={}", - user.username, + "Registration failed | username already exists | username={}", user.username ) raise HTTPException( status_code=400, @@ -56,55 +55,23 @@ async def register_user( ) if email: - logger.debug("Checking if email already exists") result = await session.execute(select(User).where(User.email == email)) - existing_email = result.scalars().first() - if existing_email: + if result.scalars().first(): logger.warning( - "Registration failed | email already exists | email={}", - email, + "Registration failed | email already exists | email={}", email ) raise HTTPException( status_code=400, detail={"field": "email", "message": "Адрес уже занят."}, ) - logger.debug("Starting password hashing") - hashed_password = hash_password(user.password) - logger.debug("Password hashing completed") - - logger.debug("Creating new user") - - new_user = User( - username=user.username, - email=email, - password=hashed_password, - ) - - logger.debug("User model created | username={}", user.username) - - logger.debug("Adding user to session") - + new_user = User(username=user.username, email=email, password=hashed_password) session.add(new_user) - - logger.debug("Preparing to commit database transaction") - await session.commit() - - logger.debug("Transaction committed successfully") - - logger.debug("Refreshing user instance from database") - await session.refresh(new_user) - logger.debug( - "User instance refreshed | id={} username={}", - new_user.id, - new_user.username, - ) - logger.success( "User successfully registered | id={} username={} email={}", new_user.id, @@ -112,4 +79,28 @@ async def register_user( new_user.email, ) + access_token = create_access_token( + {"sub": str(new_user.id), "token_version": new_user.token_version} + ) + refresh_token = create_refresh_token( + {"sub": str(new_user.id), "token_version": new_user.token_version} + ) + + response.set_cookie( + key="access_token", + value=access_token, + httponly=True, + secure=False, + samesite="lax", + max_age=60 * 60, + ) + response.set_cookie( + key="refresh_token", + value=refresh_token, + httponly=True, + secure=False, + samesite="lax", + max_age=30 * 24 * 60 * 60, + ) + return new_user -- cgit v1.3-3-g829e