11from fastapi import HTTPException
22from sqlalchemy .ext .asyncio import AsyncSession
33from sqlalchemy import select , insert , delete , update
4- from app .models .model import User , Group , Folder , Article , Note , Tag , user_group
4+ from app .models .model import User , Group , Folder , Article , Note , Tag , user_group , self_recycle_bin
55
6- async def crud_create (leader : int , name : str , description : str , db : AsyncSession ):
7- new_group = Group (leader = leader , name = name , description = description )
6+ async def crud_create (leader : int , name : str , description : str , path : str , db : AsyncSession ):
7+ new_group = Group (leader = leader , name = name , description = description , avatar = path )
88 db .add (new_group )
9+ await db .flush () # 仅将数据同步到数据库,事务尚未提交,此时 new_group.id 已可用
10+ new_relation = insert (user_group ).values (user_id = leader , group_id = new_group .id , level = 1 )
11+ await db .execute (new_relation )
912 await db .commit ()
10- await db .refresh (new_group )
11- return new_group .id
1213
1314async def crud_gen_invite_code (user_email : str , db : AsyncSession ):
1415 # 检查邮箱存在性
@@ -20,30 +21,30 @@ async def crud_gen_invite_code(user_email: str, db: AsyncSession):
2021
2122async def crud_enter_group (user_id : int , group_id : int , db : AsyncSession ):
2223 # 检查是否已经在组织内
23- # 已经是组织leader
24- query = select (Group ).where (Group .id == group_id , Group .leader == user_id )
25- result = await db .execute (query )
26- group = result .scalar_one_or_none ()
27- # 已经是组织admin或member
2824 query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
2925 result = await db .execute (query )
30- row = result .first ()
31- if group or row :
32- raise HTTPException (status_code = 408 , detail = "You are already in the group" )
33-
26+ exist = result .first ()
27+ if exist :
28+ raise HTTPException (status_code = 408 , detail = "You are already in the group" )
3429 new_relation = insert (user_group ).values (user_id = user_id , group_id = group_id )
3530 await db .execute (new_relation )
3631 await db .commit ()
3732
38- async def crud_modify_basic_info (db : AsyncSession , id : int , name : str | None = None , desc : str | None = None ):
33+ async def crud_modify_basic_info (db : AsyncSession , id : int , name : str | None = None , desc : str | None = None , avatar : str | None = None ):
34+ query = select (Group .avatar ).where (Group .id == id )
35+ result = await db .execute (query )
36+ old_path = result .scalar_one_or_none ()
3937 update_data = {}
4038 if name :
4139 update_data ["name" ] = name
4240 if desc :
4341 update_data ["description" ] = desc
42+ if avatar :
43+ update_data ["avatar" ] = avatar
4444 query = update (Group ).where (Group .id == id ).values (** update_data )
4545 await db .execute (query )
4646 await db .commit ()
47+ return old_path
4748
4849async def crud_modify_admin_list (group_id : int , user_id : int , add_admin : bool , db : AsyncSession ):
4950 # 检查组织中是否有该成员
@@ -54,7 +55,10 @@ async def crud_modify_admin_list(group_id: int, user_id: int, add_admin: bool, d
5455 raise HTTPException (status_code = 405 , detail = "User currently not in the group" )
5556
5657 # 将该成员设为或取消管理员
57- query = update (user_group ).where (user_group .c .group_id == group_id , user_group .c .user_id == user_id ).values (is_admin = add_admin )
58+ if add_admin :
59+ query = update (user_group ).where (user_group .c .group_id == group_id , user_group .c .user_id == user_id ).values (level = 2 )
60+ else :
61+ query = update (user_group ).where (user_group .c .group_id == group_id , user_group .c .user_id == user_id ).values (level = 3 )
5862 await db .execute (query )
5963 await db .commit ()
6064
@@ -73,10 +77,10 @@ async def crud_leave_group(group_id: int, user_id: int, db: AsyncSession):
7377 await db .commit ()
7478
7579async def crud_get_basic_info (group_id : int , db : AsyncSession ):
76- query = select (Group .name , Group .description ).where (Group .id == group_id )
80+ query = select (Group .name , Group .description , Group . avatar ).where (Group .id == group_id )
7781 result = await db .execute (query )
7882 group = result .first ()
79- return group .name , group .description
83+ return group .name , group .description , group . avatar
8084
8185async def crud_get_people_info (group_id : int , db : AsyncSession ):
8286 # 创建者信息
@@ -89,7 +93,7 @@ async def crud_get_people_info(group_id: int, db: AsyncSession):
8993 leader = {"id" : user .id , "name" : user .username , "avatar" : user .avatar }
9094
9195 # 管理者信息
92- query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .is_admin == True )
96+ query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .level == 2 )
9397 result = await db .execute (query )
9498 admin_ids = result .scalars ().all ()
9599 query = select (User ).where (User .id .in_ (admin_ids ))
@@ -98,7 +102,7 @@ async def crud_get_people_info(group_id: int, db: AsyncSession):
98102 admins = [{"id" : user .id , "name" : user .username , "avatar" : user .avatar } for user in users ]
99103
100104 # 普通成员信息
101- query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .is_admin == False )
105+ query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .level == 3 )
102106 result = await db .execute (query )
103107 member_ids = result .scalars ().all ()
104108 query = select (User ).where (User .id .in_ (member_ids ))
@@ -109,20 +113,35 @@ async def crud_get_people_info(group_id: int, db: AsyncSession):
109113 return leader , admins , members
110114
111115async def crud_get_my_level (user_id : int , group_id : int , db : AsyncSession ):
112- # 是否是创建者
113- query = select (Group .leader ).where (Group .id == group_id )
114- result = await db .execute (query )
115- leader_id = result .scalar_one_or_none ()
116- if user_id == leader_id :
117- return 1
118116 query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
119117 result = await db .execute (query )
120- relation = result .first () # relation[0] relation[1] relation[2] 分别为表的第1、2、3列
121- # 是否是管理员
122- if relation and relation [2 ]:
123- return 2
124- # 是否是普通成员
118+ relation = result .first ()
119+ # 在组织中
125120 if relation :
126- return 3
127- # 未加入组织
128- return 4
121+ return relation [2 ] # relation[0] relation[1] relation[2] 分别为表的第1、2、3列
122+ # 不在组织中
123+ return 4
124+
125+ async def crud_all_groups (user_id : int , db : AsyncSession ):
126+ query = select (Group ).where (Group .leader == user_id ).order_by (Group .id .desc ())
127+ result = await db .execute (query )
128+ groups = result .scalars ().all ()
129+ leader = [{"group_id" : group .id , "group_name" : group .name , "group_avatar" : group .avatar , "group_desc" : group .description } for group in groups ]
130+
131+ query = select (user_group .c .group_id ).where (user_group .c .user_id == user_id , user_group .c .level == 2 )
132+ result = await db .execute (query )
133+ group_ids = result .scalars ().all ()
134+ query = select (Group ).where (Group .id .in_ (group_ids )).order_by (Group .id .desc ())
135+ result = await db .execute (query )
136+ groups = result .scalars ().all ()
137+ admin = [{"group_id" : group .id , "group_name" : group .name , "group_avatar" : group .avatar , "group_desc" : group .description } for group in groups ]
138+
139+ query = select (user_group .c .group_id ).where (user_group .c .user_id == user_id , user_group .c .level == 3 )
140+ result = await db .execute (query )
141+ group_ids = result .scalars ().all ()
142+ query = select (Group ).where (Group .id .in_ (group_ids )).order_by (Group .id .desc ())
143+ result = await db .execute (query )
144+ groups = result .scalars ().all ()
145+ member = [{"group_id" : group .id , "group_name" : group .name , "group_avatar" : group .avatar , "group_desc" : group .description } for group in groups ]
146+
147+ return leader , admin , member
0 commit comments