feat: initialize aivideo project
This commit is contained in:
16
backend/app/modules/users/repository.py
Normal file
16
backend/app/modules/users/repository.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.models.entities import User
|
||||
|
||||
|
||||
class UsersRepository:
|
||||
def __init__(self, db: Session) -> None:
|
||||
self.db = db
|
||||
|
||||
def get_by_id(self, user_id: int) -> User | None:
|
||||
return self.db.scalar(select(User).where(User.id == user_id))
|
||||
|
||||
def get_by_username(self, username: str) -> User | None:
|
||||
return self.db.scalar(select(User).where(User.username == username))
|
||||
|
||||
37
backend/app/modules/users/router.py
Normal file
37
backend/app/modules/users/router.py
Normal file
@@ -0,0 +1,37 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.common.db.session import get_db
|
||||
from app.common.responses.api_response import success_response
|
||||
from app.common.security.deps import get_current_user
|
||||
from app.models.entities import User
|
||||
from app.modules.users.schema import UpdateProfileRequest
|
||||
from app.modules.users.service import UsersService
|
||||
|
||||
|
||||
router = APIRouter(prefix="/api/v1/profile", tags=["profile"])
|
||||
|
||||
|
||||
@router.get("")
|
||||
def get_profile(current_user: User = Depends(get_current_user)):
|
||||
return success_response(
|
||||
{
|
||||
"publicId": current_user.public_id,
|
||||
"username": current_user.username or "",
|
||||
"nickname": current_user.nickname,
|
||||
"avatarUrl": current_user.avatar_url,
|
||||
"email": current_user.email or "",
|
||||
"mobile": current_user.mobile or "",
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@router.put("")
|
||||
def update_profile(
|
||||
payload: UpdateProfileRequest,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
data = UsersService(db).update_profile(current_user, payload)
|
||||
return success_response(data)
|
||||
|
||||
8
backend/app/modules/users/schema.py
Normal file
8
backend/app/modules/users/schema.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class UpdateProfileRequest(BaseModel):
|
||||
username: str | None = Field(default=None, min_length=3, max_length=32)
|
||||
nickname: str | None = Field(default=None, min_length=1, max_length=32)
|
||||
avatar_url: str | None = Field(default=None, max_length=500)
|
||||
|
||||
31
backend/app/modules/users/service.py
Normal file
31
backend/app/modules/users/service.py
Normal file
@@ -0,0 +1,31 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.common.errors.app_error import ConflictAppError
|
||||
from app.models.entities import User
|
||||
from app.modules.users.repository import UsersRepository
|
||||
|
||||
|
||||
class UsersService:
|
||||
def __init__(self, db: Session) -> None:
|
||||
self.db = db
|
||||
self.repository = UsersRepository(db)
|
||||
|
||||
def update_profile(self, user: User, payload) -> dict:
|
||||
if payload.username and payload.username != user.username:
|
||||
existing = self.repository.get_by_username(payload.username)
|
||||
if existing and existing.id != user.id:
|
||||
raise ConflictAppError("username already exists", code=10011)
|
||||
user.username = payload.username
|
||||
if payload.nickname is not None:
|
||||
user.nickname = payload.nickname
|
||||
if payload.avatar_url is not None:
|
||||
user.avatar_url = payload.avatar_url
|
||||
self.db.commit()
|
||||
return {
|
||||
"publicId": user.public_id,
|
||||
"username": user.username or "",
|
||||
"nickname": user.nickname,
|
||||
"avatarUrl": user.avatar_url,
|
||||
"email": user.email or "",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user