From cf6d551f7837878a198d1a988a9ba32f90473e3a Mon Sep 17 00:00:00 2001 From: l3wdfut4pwr Date: Mon, 27 Apr 2026 14:17:51 +0300 Subject: add description change --- app/models/user.py | 21 +++++++++++++++------ app/routes/users/user.py | 22 ++++++++++++++++++++++ app/schemas/profile.py | 6 +++++- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/app/models/user.py b/app/models/user.py index 11f5107..76ccc84 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -19,17 +19,26 @@ class User(Base): __tablename__ = "users" id: Mapped[int] = mapped_column(Integer, primary_key=True) - username: Mapped[str] = mapped_column(String(20), unique=True, nullable=False) + username: Mapped[str] = mapped_column( + String(20), unique=True, nullable=False + ) password: Mapped[str | None] = mapped_column(String(255), nullable=True) email: Mapped[str] = mapped_column(String(120), unique=True, nullable=False) google_id: Mapped[str | None] = mapped_column( String(255), unique=True, nullable=True ) - description: Mapped[str | None] = mapped_column(String(250), nullable=True) - premium: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) - is_banned: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) - is_moderator: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) - token_version: Mapped[int] = mapped_column(Integer, default=0, nullable=False) + premium: Mapped[bool] = mapped_column( + Boolean, default=False, nullable=False + ) + is_banned: Mapped[bool] = mapped_column( + Boolean, default=False, nullable=False + ) + is_moderator: Mapped[bool] = mapped_column( + Boolean, default=False, nullable=False + ) + token_version: Mapped[int] = mapped_column( + Integer, default=0, nullable=False + ) profile: Mapped["Profile"] = relationship( "Profile", back_populates="user", uselist=False, lazy="selectin" diff --git a/app/routes/users/user.py b/app/routes/users/user.py index 1eb096d..8b0b4f5 100644 --- a/app/routes/users/user.py +++ b/app/routes/users/user.py @@ -1,7 +1,9 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession +from app.auth.dependencies import get_current_user from app.models.user import User +from app.schemas.profile import DescriptionUpdate from app.schemas.user import UserRead from app.utils.db import get_async_session @@ -19,3 +21,23 @@ async def get_user( raise HTTPException(status_code=404, detail="User not found") return UserRead.model_validate(user) + + +@router.patch("/description") +async def update_description( + payload: DescriptionUpdate, + user: User = Depends(get_current_user), + session: AsyncSession = Depends(get_async_session), +): + profile = user.profile + + if not profile: + raise HTTPException(status_code=404, detail="Profile not found") + + profile.description = payload.description + + session.add(profile) + await session.commit() + await session.refresh(profile) + + return {"description": profile.description} diff --git a/app/schemas/profile.py b/app/schemas/profile.py index ab54425..1c62a97 100644 --- a/app/schemas/profile.py +++ b/app/schemas/profile.py @@ -1,6 +1,6 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field class ProfileRead(BaseModel): @@ -19,3 +19,7 @@ class ProfileRead(BaseModel): model_config = { "from_attributes": True, } + + +class DescriptionUpdate(BaseModel): + description: str = Field(max_length=250) -- cgit v1.3-3-g829e