6
6
from fastapi_sqlalchemy import db
7
7
from pydantic import BaseModel
8
8
9
- from social .exceptions import GroupRequestNotFound
9
+ from social .exceptions import GroupNotFound , GroupRequestNotFound
10
10
from social .models .create_group_request import CreateGroupRequest
11
+ from social .models .group import Group
11
12
from social .settings import get_settings
13
+ from social .utils .telegram_groups import update_tg_chat
14
+ from social .utils .vk_groups import update_vk_chat
12
15
13
16
14
17
router = APIRouter (prefix = "/group" , tags = ['User defined groups' ])
@@ -23,6 +26,21 @@ class GroupRequestGet(BaseModel):
23
26
24
27
class GroupGet (BaseModel ):
25
28
id : int
29
+ owner_id : int | None = None
30
+ name : str | None = None
31
+ description : str | None = None
32
+ invite_link : str | None = None
33
+
34
+
35
+ class GroupGetMany (BaseModel ):
36
+ items : list [GroupGet ]
37
+
38
+
39
+ class GroupPatch (BaseModel ):
40
+ update_from_source : bool | None = False
41
+ name : str | None = None
42
+ description : str | None = None
43
+ invite_link : str | None = None
26
44
27
45
28
46
@router .post ('' )
@@ -35,11 +53,15 @@ def create_group_request(
35
53
return obj
36
54
37
55
38
- @router .get ('' )
56
+ @router .get ('/validation ' )
39
57
def validate_group_request (
40
58
secret_key : str ,
41
59
user : dict [str ] = Depends (UnionAuth (["social.group.create" ])),
42
60
) -> GroupGet | GroupRequestGet :
61
+ """Получение состояния валидации группы по коду валидации
62
+
63
+ Трубуются права: `social.group.create`
64
+ """
43
65
obj = (
44
66
db .session .query (CreateGroupRequest )
45
67
.where (CreateGroupRequest .secret_key == secret_key , CreateGroupRequest .owner_id == user .get ("id" ))
@@ -52,3 +74,61 @@ def validate_group_request(
52
74
return GroupGet .model_validate (obj .mapped_group , from_attributes = True )
53
75
54
76
return GroupRequestGet .model_validate (obj , from_attributes = True )
77
+
78
+
79
+ @router .get ('' )
80
+ def get_all_groups (
81
+ my : bool = True ,
82
+ user : dict [str ] = Depends (UnionAuth (allow_none = True , auto_error = False )),
83
+ ) -> GroupGetMany :
84
+ """Получение списка групп
85
+
86
+ Трубуются права:
87
+ - Для получения списка своих групп права не требуются (`my=True`)
88
+ - `social.group.read` для чтения списка всех групп, подключенных к приложению
89
+ """
90
+ if not user :
91
+ # Возвращаем список видимых всем групп
92
+ return {"items" : db .session .query (Group ).where (Group .hidden == False ).all ()}
93
+
94
+ if user and my :
95
+ # Возвращаем только свои группы
96
+ return {"items" : db .session .query (Group ).where (Group .owner_id == user .get ("id" )).all ()}
97
+
98
+ # Если у пользователя есть права на просмотр всех групп – показываем все неудаленные группы
99
+ for scope in user .get ("session_scopes" , []):
100
+ if scope .get ("name" ) == "social.group.read" :
101
+ return {"items" : db .session .query (Group ).where (Group .is_deleted == False ).all ()}
102
+
103
+ # Возвращаем пустный список если не прошли ни по одному условию
104
+ logger .debug ("User %s has no rights to get groups" , user .get ("id" ) if user else None )
105
+ return {"items" : []}
106
+
107
+
108
+ @router .patch ('/{group_id}' )
109
+ def update_group_info (
110
+ group_id : int ,
111
+ patch_info : GroupPatch ,
112
+ user : dict [str ] = Depends (UnionAuth ()),
113
+ ):
114
+ group = db .session .get (Group , group_id )
115
+ if group .owner_id != user .get ("id" ):
116
+ raise GroupNotFound (user_id = user .get ("id" ), group_id = group_id )
117
+
118
+ # Пытаемся получить данные из источника (получение название чата ВК/Telegram)
119
+ if patch_info .update_from_source :
120
+ if group .type == "vk_chat" :
121
+ update_vk_chat (group )
122
+ elif group .type == "tg_chat" or group .type == "tg_channel" :
123
+ update_tg_chat (group )
124
+
125
+ # Ручное обновление данных
126
+ if patch_info .name :
127
+ group .name = patch_info .name
128
+ if patch_info .description :
129
+ group .description = patch_info .description
130
+ if patch_info .invite_link :
131
+ group .invite_link = patch_info .invite_link
132
+
133
+ db .session .commit ()
134
+ return GroupGet .model_validate (group , from_attributes = True )
0 commit comments