[FWA-3] completed update Profile
This commit is contained in:
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user