diff --git a/src/api/v1/users.py b/src/api/v1/users.py index eeb09fe..e39e715 100644 --- a/src/api/v1/users.py +++ b/src/api/v1/users.py @@ -31,16 +31,11 @@ async def get_user_by_id(db: sessionDep, id: int, _: CurrentOrAdmin): async def patch_user( db: sessionDep, id: int, - user_update: UserUpdate = Body(), - _: CurrentOrAdmin = None, -): - user = await UserService(db).get_user_by_filter_or_raise(id=id) - update_data = user_update.model_dump(exclude_unset=True) - if not update_data: - raise HTTPException(status_code=400, detail="No fields provided for update") - updated_user = await db.user.update_one(id=id, data=update_data) - await db.commit() - return User.model_validate(updated_user) + _: CurrentOrAdmin, + user_update: UserUpdate = Body() + ): + updated_user = await UserService(db).update_user(id=id, update_data=user_update) + return updated_user @router.delete("/{id}") diff --git a/src/repository/users.py b/src/repository/users.py index f26c695..3ada358 100644 --- a/src/repository/users.py +++ b/src/repository/users.py @@ -1,4 +1,4 @@ -from sqlalchemy import delete, select +from sqlalchemy import delete, select, update from src.models import UsersORM from src.repository.base import BaseRepo @@ -14,4 +14,10 @@ class UsersRepo(BaseRepo): return models async def delete_one(self, id: int) -> None: - await self.session.execute(delete(self.model).where(self.model.id == id)) \ No newline at end of file + await self.session.execute(delete(self.model).where(self.model.id == id)) + + async def update_one(self, id: int, data: dict) -> None: + stmt = update(self.model).where(self.model.id == id).values(data.model_dump(exclude_unset=True)).returning(self.model) + result = await self.session.execute(stmt) + model = result.scalar_one() + return model diff --git a/src/schemas/users.py b/src/schemas/users.py index 29ffb23..454592b 100644 --- a/src/schemas/users.py +++ b/src/schemas/users.py @@ -5,6 +5,13 @@ from pydantic import BaseModel, EmailStr, ConfigDict, BeforeValidator from src.schemas.validators import ensure_password +class UserUpdate(BaseModel): + email: EmailStr | None = None + username: str | None = None + is_active: bool | None = None + model_config = ConfigDict(from_attributes=True, extra="ignore") + + class User(BaseModel): id: int email: EmailStr | None diff --git a/src/services/users.py b/src/services/users.py index 770c697..3bb5983 100644 --- a/src/services/users.py +++ b/src/services/users.py @@ -1,6 +1,6 @@ from fastapi import HTTPException -from src.schemas.users import User +from src.schemas.users import User, UserUpdate from src.services.base import BaseService @@ -29,4 +29,11 @@ class UserService(BaseService): async def delete_user(self, id: int) -> None: await self.session.user.delete_one(id=id) - await self.session.commit() \ No newline at end of file + await self.session.commit() + + async def update_user(self, id: int, update_data: UserUpdate) -> User: + await self.get_user_by_filter_or_raise(id=id) + user = await self.session.user.update_one(id=id, data=update_data) + await self.session.commit() + return User.model_validate(user) +