1+ from fastapi import APIRouter , Query , Body , UploadFile , File , Depends , HTTPException
2+ from sqlalchemy .ext .asyncio import AsyncSession
3+ import os
4+
5+ from app .utils .get_db import get_db
6+ from app .utils .auth import get_current_user
7+ from app .curd .group import crud_create , crud_apply_to_enter , crud_get_applications , crud_reply_to_enter
8+ from app .schemas .group import ApplyToEnter
9+
10+ router = APIRouter ()
11+
12+ @router .post ("/create" , response_model = dict )
13+ async def create (group_name : str = Query (...), group_desc : str = Query (...), group_avatar : UploadFile | None = File (None )
14+ , db : AsyncSession = Depends (get_db ), user : dict = Depends (get_current_user )):
15+ if len (group_name ) > 30 :
16+ raise HTTPException (status_code = 405 , detail = "Invalid group name, longer than 30" )
17+ if len (group_desc ) > 200 :
18+ raise HTTPException (status_code = 405 , detail = "Invalid group description, longer than 200" )
19+ group_id = await crud_create (user .get ("id" ), group_name , group_desc , db )
20+ if group_avatar :
21+ os .makedirs ("/lhcos-data/group-avatar" , exist_ok = True )
22+ ext = os .path .splitext (group_avatar .filename )[1 ]
23+ path = os .path .join ("/lhcos-data/group-avatar" , f"{ group_id } { ext } " )
24+ with open (path , "wb" ) as f :
25+ content = await group_avatar .read ()
26+ f .write (content )
27+ return {"msg" : "Group created successfully" }
28+
29+ @router .post ("/applyToEnter" , response_model = dict )
30+ async def apply_to_enter (model : ApplyToEnter , db : AsyncSession = Depends (get_db ), user : dict = Depends (get_current_user )):
31+ group_id = model .group_id
32+ user_id = user .get ("id" )
33+ await crud_apply_to_enter (user_id , group_id , db )
34+ return {"msg" : "Application sent successfully" }
35+
36+ @router .get ("/getApplications" , response_model = dict )
37+ async def get_applications (group_id : int = Query (...), db : AsyncSession = Depends (get_db )):
38+ users = await crud_get_applications (group_id , db )
39+ return {"users" : users }
40+
41+ @router .post ("/replyToEnter" , response_model = dict )
42+ async def reply_to_enter (user_id : int = Body (...), group_id : int = Body (...), reply : int = Body (...), db : AsyncSession = Depends (get_db )):
43+ if reply != 0 and reply != 1 :
44+ raise HTTPException (status_code = 405 , detail = "Wrong parameter, reply should be either 0 or 1" )
45+ msg = await crud_reply_to_enter (user_id , group_id , reply , db )
46+ return {"msg" : msg }
0 commit comments