1
1
import json
2
+ import os
2
3
3
- from fastapi import APIRouter , Depends , status
4
+ from fastapi import APIRouter , Depends , Request , status
4
5
from fastapi .responses import JSONResponse
5
6
from sqlmodel .ext .asyncio .session import AsyncSession
6
7
8
+ from pkg .config import Config
7
9
from pkg .db import get_session
8
10
from pkg .utils import get_current_user_uid
9
11
from src .auth .service import UserService
10
12
11
13
from .schemas import UserProfileResponseSchema , UserProfileUpdateSchema
12
14
from .service import UserProfileService
15
+ from .tasks import upload_user_avatar_image_task
13
16
14
17
profile_router = APIRouter ()
15
18
16
19
user_service = UserService ()
17
20
user_profile_service = UserProfileService ()
18
21
19
22
20
- @profile_router .put ("/" , status_code = status .HTTP_200_OK )
23
+ @profile_router .patch ("/update-profile " , status_code = status .HTTP_200_OK )
21
24
async def update_user_profile (
22
25
profile_data : UserProfileUpdateSchema ,
23
26
session : AsyncSession = Depends (get_session ),
@@ -39,3 +42,48 @@ async def update_user_profile(
39
42
).model_dump (),
40
43
},
41
44
)
45
+
46
+
47
+ @profile_router .patch ("/update-avatar" , status_code = status .HTTP_200_OK )
48
+ async def update_user_avatar (
49
+ request : Request ,
50
+ session : AsyncSession = Depends (get_session ),
51
+ user_uid : str = Depends (get_current_user_uid ),
52
+ ):
53
+ user_profile = await user_profile_service .get_user_profile_by_user_uid (
54
+ user_uid , session
55
+ )
56
+
57
+ form = await request .form ()
58
+ avatar_image = form .get ("avatar_image" )
59
+
60
+ if not avatar_image :
61
+ return JSONResponse (
62
+ status_code = status .HTTP_400_BAD_REQUEST ,
63
+ content = {"message" : "Avatar image is required" },
64
+ )
65
+
66
+ avatar_image_content = await avatar_image .read ()
67
+ avatar_image_file_extension = os .path .splitext (avatar_image .filename )[1 ]
68
+ avatar_image_file_name = f"avatars/{ user_uid } { avatar_image_file_extension } "
69
+
70
+ upload_user_avatar_image_task .delay (
71
+ avatar_image_content ,
72
+ avatar_image_file_name ,
73
+ avatar_image .content_type ,
74
+ )
75
+
76
+ file_url = f"http://{ Config .MINIO_STORAGE_ENDPOINT } /{ Config .MINIO_STORAGE_BUCKET } /{ avatar_image_file_name } "
77
+ await user_profile_service .update_user_profile_avatar (
78
+ user_profile , file_url , session
79
+ )
80
+
81
+ return JSONResponse (
82
+ status_code = status .HTTP_200_OK ,
83
+ content = {
84
+ "message" : "User avatar updated successfully" ,
85
+ "user_profile" : UserProfileResponseSchema (
86
+ ** json .loads (user_profile .model_dump_json ())
87
+ ).model_dump (),
88
+ },
89
+ )
0 commit comments