11from fastapi import HTTPException
22from sqlalchemy .ext .asyncio import AsyncSession
3- from sqlalchemy .exc import IntegrityError
43from sqlalchemy import select , insert , delete , update
5- from app .models .model import User , Group , Folder , Article , Note , Tag , user_group , enter_application
4+ from app .models .model import User , Group , Folder , Article , Note , Tag , user_group
65
76async def crud_create (leader : int , name : str , description : str , db : AsyncSession ):
87 new_group = Group (leader = leader , name = name , description = description )
@@ -11,51 +10,30 @@ async def crud_create(leader: int, name: str, description: str, db: AsyncSession
1110 await db .refresh (new_group )
1211 return new_group .id
1312
14- async def crud_apply_to_enter ( user_id : int , group_id : int , db : AsyncSession ):
15- # 是否已经在组织中
16- query = select (user_group ).where (user_group . c . user_id == user_id , user_group . c . group_id == group_id )
13+ async def crud_gen_invite_code ( user_email : str , db : AsyncSession ):
14+ # 检查邮箱存在性
15+ query = select (User . id ).where (User . email == user_email )
1716 result = await db .execute (query )
18- existing = result .first ()
19- if existing :
20- raise HTTPException (status_code = 405 , detail = "Already in the group" )
21- query = select (Group ).where (Group .id == group_id )
17+ user_id = result .scalar_one_or_none ()
18+ if not user_id :
19+ raise HTTPException (status_code = 405 , detail = "User not existed" )
20+
21+ async def crud_enter_group (user_id : int , group_id : int , db : AsyncSession ):
22+ # 检查是否已经在组织内
23+ # 已经是组织leader
24+ query = select (Group ).where (Group .id == group_id , Group .leader == user_id )
2225 result = await db .execute (query )
2326 group = result .scalar_one_or_none ()
24- if group .leader == user_id :
25- raise HTTPException (status_code = 405 , detail = "Already in the group" )
26-
27- # 插入申请表,若已存在申请则抛出异常
28- query = insert (enter_application ).values (user_id = user_id , group_id = group_id )
29- try :
30- await db .execute (query )
31- await db .commit ()
32- except IntegrityError :
33- await db .rollback ()
34- raise HTTPException (status_code = 405 , detail = "Don't apply repeatedly" )
35-
36- async def crud_get_applications (group_id : int , db : AsyncSession ):
37- query = select (User .id , User .username ).where (User .id .in_ (
38- select (enter_application .c .user_id ).where (enter_application .c .group_id == group_id )
39- ))
40- result = await db .execute (query )
41- users = result .all ()
42- return [{"user_id" : user .id , "user_name" : user .username } for user in users ]
43-
44- async def crud_reply_to_enter (user_id : int , group_id : int , reply : bool , db : AsyncSession ):
45- # 答复后,需要从待处理申请的表中删除表项
46- query = delete (enter_application ).where (enter_application .c .user_id == user_id , enter_application .c .group_id == group_id )
27+ # 已经是组织admin或member
28+ query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
4729 result = await db .execute (query )
48- if result .rowcount == 0 : # 如果没有删除任何行,说明不存在该项
49- raise HTTPException (status_code = 405 , detail = "Application is not existed or already handled" )
50- await db .commit ()
51-
52- if reply :
53- new_relation = insert (user_group ).values (user_id = user_id , group_id = group_id )
54- await db .execute (new_relation )
55- await db .commit ()
56- return "Add new member successfully"
30+ row = result .first ()
31+ if group or row :
32+ raise HTTPException (status_code = 408 , detail = "You are already in the group" )
5733
58- return "Refuse the application successfully"
34+ new_relation = insert (user_group ).values (user_id = user_id , group_id = group_id )
35+ await db .execute (new_relation )
36+ await db .commit ()
5937
6038async def crud_modify_basic_info (db : AsyncSession , id : int , name : str | None = None , desc : str | None = None ):
6139 update_data = {}
@@ -116,16 +94,16 @@ async def crud_get_people_info(group_id: int, db: AsyncSession):
11694 admin_ids = result .scalars ().all ()
11795 query = select (User ).where (User .id .in_ (admin_ids ))
11896 result = await db .execute (query )
119- users = result .all ()
97+ users = result .scalars (). all ()
12098 admins = [{"id" : user .id , "name" : user .username , "avatar" : user .avatar } for user in users ]
12199
122100 # 普通成员信息
123101 query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .is_admin == False )
124102 result = await db .execute (query )
125- member_ids = result .scalars .all ()
103+ member_ids = result .scalars () .all ()
126104 query = select (User ).where (User .id .in_ (member_ids ))
127105 result = await db .execute (query )
128- users = result .all ()
106+ users = result .scalars (). all ()
129107 members = [{"id" : user .id , "name" : user .username , "avatar" : user .avatar } for user in users ]
130108
131109 return leader , admins , members
@@ -139,12 +117,12 @@ async def crud_get_my_level(user_id: int, group_id: int, db: AsyncSession):
139117 return 1
140118 query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
141119 result = await db .execute (query )
142- relation = result .first ()
120+ relation = result .first () # relation[0] relation[1] relation[2] 分别为表的第1、2、3列
143121 # 是否是管理员
144- if relation and relation ["is_admin" ]:
122+ if relation and relation [2 ]:
145123 return 2
146124 # 是否是普通成员
147- if relation : # and not relation["is_admin"]:
125+ if relation :
148126 return 3
149127 # 未加入组织
150128 return 4
0 commit comments