11from fastapi import HTTPException
22from sqlalchemy .ext .asyncio import AsyncSession
3- from sqlalchemy .exc import IntegrityError
4- from sqlalchemy import select , insert , delete
5- from app .models .model import User , Group , Folder , Article , Note , Tag , user_group , enter_application
3+ from sqlalchemy import select , insert , delete , update
4+ from app .models .model import User , Group , Folder , Article , Note , Tag , user_group , self_recycle_bin
65
7- async def crud_create (leader : int , name : str , description : str , db : AsyncSession ):
8- 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 )
98 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 )
1012 await db .commit ()
11- await db .refresh (new_group )
12- return new_group .id
1313
14- async def crud_apply_to_enter (user_id : int , group_id : int , db : AsyncSession ):
15- # 是否已经在组织中
14+ async def crud_gen_invite_code (user_email : str , db : AsyncSession ):
15+ # 检查邮箱存在性
16+ query = select (User .id ).where (User .email == user_email )
17+ result = await db .execute (query )
18+ user_id = result .scalar_one_or_none ()
19+ if not user_id :
20+ raise HTTPException (status_code = 405 , detail = "User not existed" )
21+
22+ async def crud_enter_group (user_id : int , group_id : int , db : AsyncSession ):
23+ # 检查是否已经在组织内
1624 query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
1725 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 )
26+ exist = result .first ()
27+ if exist :
28+ raise HTTPException (status_code = 408 , detail = "You are already in the group" )
29+ new_relation = insert (user_group ).values (user_id = user_id , group_id = group_id )
30+ await db .execute (new_relation )
31+ await db .commit ()
32+
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 )
2235 result = await db .execute (query )
23- group = result .scalar_one_or_none ()
24- if group .leader == user_id :
25- raise HTTPException (status_code = 405 , detail = "Already in the group" )
36+ old_path = result .scalar_one_or_none ()
37+ update_data = {}
38+ if name :
39+ update_data ["name" ] = name
40+ if desc :
41+ update_data ["description" ] = desc
42+ if avatar :
43+ update_data ["avatar" ] = avatar
44+ query = update (Group ).where (Group .id == id ).values (** update_data )
45+ await db .execute (query )
46+ await db .commit ()
47+ return old_path
48+
49+ async def crud_modify_admin_list (group_id : int , user_id : int , add_admin : bool , db : AsyncSession ):
50+ # 检查组织中是否有该成员
51+ query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
52+ result = await db .execute (query )
53+ relation = result .first ()
54+ if not relation :
55+ raise HTTPException (status_code = 405 , detail = "User currently not in the group" )
2656
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" )
57+ # 将该成员设为或取消管理员
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 )
62+ await db .execute (query )
63+ await db .commit ()
64+
65+ return "The user is an admin now" if add_admin else "The user is not an admin now"
66+
67+ async def crud_remove_member (group_id : int , user_id : int , db : AsyncSession ):
68+ # 不必先检查组织中是否有该成员,若没有则再执行一次delete也不会报错
69+ query = delete (user_group ).where (user_group .c .group_id == group_id , user_group .c .user_id == user_id )
70+ await db .execute (query )
71+ await db .commit ()
72+
73+ async def crud_leave_group (group_id : int , user_id : int , db : AsyncSession ):
74+ # 不必先检查组织中是否有该成员,若没有则再执行一次delete也不会报错
75+ query = delete (user_group ).where (user_group .c .group_id == group_id , user_group .c .user_id == user_id )
76+ await db .execute (query )
77+ await db .commit ()
78+
79+ async def crud_get_basic_info (group_id : int , db : AsyncSession ):
80+ query = select (Group .name , Group .description , Group .avatar ).where (Group .id == group_id )
81+ result = await db .execute (query )
82+ group = result .first ()
83+ return group .name , group .description , group .avatar
84+
85+ async def crud_get_people_info (group_id : int , db : AsyncSession ):
86+ # 创建者信息
87+ query = select (Group .leader ).where (Group .id == group_id )
88+ result = await db .execute (query )
89+ leader_id = result .scalar_one_or_none ()
90+ query = select (User ).where (User .id == leader_id )
91+ result = await db .execute (query )
92+ user = result .scalar_one_or_none ()
93+ leader = {"id" : user .id , "name" : user .username , "avatar" : user .avatar }
94+
95+ # 管理者信息
96+ query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .level == 2 )
97+ result = await db .execute (query )
98+ admin_ids = result .scalars ().all ()
99+ query = select (User ).where (User .id .in_ (admin_ids ))
100+ result = await db .execute (query )
101+ users = result .scalars ().all ()
102+ admins = [{"id" : user .id , "name" : user .username , "avatar" : user .avatar } for user in users ]
35103
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- ))
104+ # 普通成员信息
105+ query = select (user_group .c .user_id ).where (user_group .c .group_id == group_id , user_group .c .level == 3 )
106+ result = await db .execute (query )
107+ member_ids = result .scalars ().all ()
108+ query = select (User ).where (User .id .in_ (member_ids ))
40109 result = await db .execute (query )
41- users = result .all ()
42- return [{"user_id" : user .id , "user_name" : user .username } for user in users ]
110+ users = result .scalars ().all ()
111+ members = [{"id" : user .id , "name" : user .username , "avatar" : user .avatar } for user in users ]
112+
113+ return leader , admins , members
43114
44- async def crud_reply_to_enter (user_id : int , group_id : int , reply : int , db : AsyncSession ):
45- # 答复后,需要从待处理申请的表中删除表项
46- query = delete (enter_application ).where (enter_application .c .user_id == user_id , enter_application .c .group_id == group_id )
115+ async def crud_get_my_level (user_id : int , group_id : int , db : AsyncSession ):
116+ query = select (user_group ).where (user_group .c .user_id == user_id , user_group .c .group_id == group_id )
47117 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 ()
118+ relation = result .first ()
119+ # 在组织中
120+ if relation :
121+ return relation [2 ] # relation[0] relation[1] relation[2] 分别为表的第1、2、3列
122+ # 不在组织中
123+ return 4
51124
52- if reply == 1 :
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"
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 ]
57130
58- return "Refuse the application successfully"
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