[FWA-3] completed update Profile

This commit is contained in:
2024-06-11 12:28:02 +00:00
parent 0ea7ba1a39
commit 3fed0650c9
17 changed files with 246 additions and 105 deletions

View File

@ -1,16 +1,16 @@
from datetime import datetime
from sqlalchemy import DateTime
from sqlalchemy.orm import declarative_base, Mapped, mapped_column
from sqlalchemy.orm import declarative_base, Mapped, mapped_column, QueryPropertyDescriptor
from text_unidecode import unidecode
from backend.db.db_setup import SessionLocal
Model = declarative_base()
Model.query = SessionLocal.query_property()
class SqlAlchemyBase(Model):
__abstract__ = True
query: QueryPropertyDescriptor = SessionLocal.query_property()
created_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), index=True)
updated_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())

View File

@ -1,7 +1,7 @@
from backend.core.config import get_app_settings
from backend.core.security.security import hash_password
from backend.db.models import User
from backend.schemas import UserCreate
from backend.schemas import UserCreate, UserProfile
from sqlalchemy.orm import Session
from uuid import UUID
@ -20,7 +20,7 @@ class RepositoryUsers:
return self.user.query.filter_by(username=username).first()
def get_by_id(self, user_id: str):
return self.user.query.filter_by(id=UUID(user_id)).first()
return self.user.query.filter_by(id=UUID(str(user_id))).one()
def create(self, db: Session, user: UserCreate | UserSeeds):
try:
@ -34,3 +34,17 @@ class RepositoryUsers:
db.refresh(db_user)
return db_user
def update(self, db: Session, user: UserProfile, user_id: str):
db_user = self.get_by_id(user_id)
if not db_user:
return None
try:
self.user.query.where(User.id == user_id).update(user.dict(exclude_unset=True))
db.commit()
except Exception:
db.rollback()
raise
db.refresh(db_user)
return db_user

View File

@ -9,7 +9,7 @@ from backend.core.config import get_app_settings
from backend.core.dependencies.dependencies import get_current_user
from backend.core import MessageCode
from backend.db.db_setup import generate_session
from backend.schemas import ReturnValue, UserRequest, LoginResponse, UserCreate, PrivateUser
from backend.schemas import ReturnValue, UserRequest, LoginResponse, PrivateUser
from backend.services.user import UserService
@ -29,14 +29,6 @@ async def get_token(form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
return {'access_token': token, 'token_type': 'bearer'}
@auth_router.put('/register')
def register_user(user: UserCreate, db: db_dependency) -> ReturnValue[Any]:
db_user = user_service.get_by_username(username=user.username)
if db_user:
raise HTTPException(status_code=400, detail=MessageCode.CREATED_USER)
user_service.create(db=db, user=user)
return ReturnValue(status=200, data="created")
@auth_router.post('/login', response_model=ReturnValue[LoginResponse])
def user_login(user: UserRequest, response: Response) -> ReturnValue[Any]:
db_user = user_service.check_exist(user=user)

View File

@ -1,11 +1,12 @@
from typing import Annotated, Any
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from backend.core.config import get_app_settings
from backend.core.dependencies import is_logged_in
from backend.core.message_code import MessageCode
from backend.db.db_setup import generate_session
from backend.schemas.common import ReturnValue
from backend.schemas.user import ProfileResponse
from backend.schemas.user import ProfileResponse, UserCreate, UserProfile
from backend.services.user import UserService
@ -16,6 +17,19 @@ settings = get_app_settings()
db_dependency = Annotated[Session, Depends(generate_session)]
current_user_token = Annotated[ProfileResponse, Depends(is_logged_in)]
@public_router.put('/register')
def register_user(user: UserCreate, db: db_dependency) -> ReturnValue[Any]:
db_user = user_service.get_by_username(username=user.username)
if db_user:
raise HTTPException(status_code=400, detail=MessageCode.CREATED_USER)
user_service.create(db=db, user=user)
return ReturnValue(status=200, data="created")
@public_router.get("/me", response_model=ReturnValue[ProfileResponse])
def get_user(current_user: current_user_token) -> ReturnValue[Any]:
return ReturnValue(status=200, data=current_user)
@public_router.put("/update-profile", response_model=ReturnValue[ProfileResponse])
def update_user(user: UserProfile, current_user: current_user_token, db: db_dependency) -> ReturnValue[Any]:
db_user = user_service.update(db=db, user=user, user_id=current_user.id)
return ReturnValue(status=200, data=db_user)

View File

@ -14,6 +14,13 @@ class UserRequest(UserBase):
class UserCreate(UserRequest):
name: str
class UserProfile(MainModel):
name: str | None = None
password: str | None = None
is_admin: bool | None = None
is_lock: bool | None = None
model_config = ConfigDict(from_attributes=True)
class UserSeeds(UserCreate):
is_admin: bool
is_lock: bool

View File

@ -10,12 +10,20 @@ class UserService(BaseService):
def __init__(self):
self.repos = RepositoryUsers()
def get_all(self, skip: int = 0, limit: int = 100):
return self.repos.get_all(skip=skip, limit=limit)
def generate_token(self, user_id: str):
access_token = create_access_token(data={"sub": str(user_id)})
refresh_token = create_refresh_token(data={"sub": str(user_id)})
return access_token, refresh_token
def get_by_username(self, username: str):
return self.repos.get_by_username(username)
def get_access_token(self, user_id: str):
return create_access_token(data={"sub": str(user_id)})
def get_all(self, skip: int = 0, limit: int = 100):
return self.repos.get_all(skip=skip, limit=limit)
def get_by_id(self, user_id: str):
return self.repos.get_by_id(user_id)
@ -23,6 +31,7 @@ class UserService(BaseService):
return self.repos.create(db=db, user=user)
def check_exist(self, user: UserRequest):
print(f"user: {user}")
db_user = self.get_by_username(username=user.username)
if not db_user:
return False
@ -30,10 +39,5 @@ class UserService(BaseService):
return False
return db_user
def generate_token(self, user_id: str):
access_token = create_access_token(data={"sub": str(user_id)})
refresh_token = create_refresh_token(data={"sub": str(user_id)})
return access_token, refresh_token
def get_access_token(self, user_id: str):
return create_access_token(data={"sub": str(user_id)})
def update(self, db: Session, user: UserCreate, user_id: str):
return self.repos.update(db=db, user=user, user_id=user_id)