小程序后端接入微信登录与家长头像能力
This commit is contained in:
@@ -1,14 +1,18 @@
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
||||
from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile, status
|
||||
from pydantic import BaseModel
|
||||
|
||||
try:
|
||||
from app.service.parent import ParentService
|
||||
from app.service import get_db_session
|
||||
from app.service.avatar_storage import AvatarStorageError
|
||||
from app.security import get_current_user_id
|
||||
except ModuleNotFoundError:
|
||||
from service.parent import ParentService
|
||||
from service import get_db_session
|
||||
from service.avatar_storage import AvatarStorageError
|
||||
from security import get_current_user_id
|
||||
|
||||
|
||||
router = APIRouter(prefix="/parents", tags=["parents"])
|
||||
@@ -38,6 +42,11 @@ class ParentUpdateRequest(BaseModel):
|
||||
phone: str | None = None
|
||||
|
||||
|
||||
class AvatarDownloadResponse(BaseModel):
|
||||
avatar_url: str
|
||||
expires_in: int | None = None
|
||||
|
||||
|
||||
@router.post("", response_model=ParentResponse, status_code=status.HTTP_201_CREATED)
|
||||
def create_parent(payload: ParentCreateRequest, request: Request, db=Depends(get_db_session)) -> ParentResponse:
|
||||
service = ParentService(db)
|
||||
@@ -45,6 +54,43 @@ def create_parent(payload: ParentCreateRequest, request: Request, db=Depends(get
|
||||
return ParentResponse(**parent)
|
||||
|
||||
|
||||
@router.post("/me/avatar", response_model=ParentResponse)
|
||||
def upload_my_avatar(
|
||||
request: Request,
|
||||
file: UploadFile = File(...),
|
||||
current_user_id: int = Depends(get_current_user_id),
|
||||
db=Depends(get_db_session),
|
||||
) -> ParentResponse:
|
||||
del request
|
||||
service = ParentService(db)
|
||||
try:
|
||||
content = file.file.read()
|
||||
parent = service.upload_avatar(
|
||||
user_id=current_user_id,
|
||||
filename=file.filename,
|
||||
content_type=file.content_type,
|
||||
content=content,
|
||||
)
|
||||
except AvatarStorageError as exc:
|
||||
raise HTTPException(status_code=exc.status_code, detail=str(exc)) from exc
|
||||
finally:
|
||||
file.file.close()
|
||||
|
||||
if not parent:
|
||||
raise HTTPException(status_code=404, detail="parent not found")
|
||||
return ParentResponse(**parent)
|
||||
|
||||
|
||||
@router.get("/{user_id}/avatar", response_model=AvatarDownloadResponse)
|
||||
def get_parent_avatar(user_id: int, request: Request, db=Depends(get_db_session)) -> AvatarDownloadResponse:
|
||||
del request
|
||||
service = ParentService(db)
|
||||
avatar = service.get_avatar_download(user_id)
|
||||
if not avatar:
|
||||
raise HTTPException(status_code=404, detail="avatar not found")
|
||||
return AvatarDownloadResponse(**avatar)
|
||||
|
||||
|
||||
@router.get("/{user_id}", response_model=ParentResponse)
|
||||
def get_parent(user_id: int, request: Request, db=Depends(get_db_session)) -> ParentResponse:
|
||||
service = ParentService(db)
|
||||
@@ -60,4 +106,4 @@ def update_parent(user_id: int, payload: ParentUpdateRequest, request: Request,
|
||||
parent = service.update(user_id, payload.nickname, payload.avatar_url, payload.phone)
|
||||
if not parent:
|
||||
raise HTTPException(status_code=404, detail="parent not found")
|
||||
return ParentResponse(**parent)
|
||||
return ParentResponse(**parent)
|
||||
|
||||
Reference in New Issue
Block a user