66from fastapi_sqlalchemy import db
77from pydantic import BaseModel
88
9- from social .exceptions import GroupRequestNotFound
9+ from social .exceptions import GroupNotFound , GroupRequestNotFound
1010from social .models .create_group_request import CreateGroupRequest
11+ from social .models .group import Group
1112from 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
1215
1316
1417router = APIRouter (prefix = "/group" , tags = ['User defined groups' ])
@@ -23,6 +26,21 @@ class GroupRequestGet(BaseModel):
2326
2427class GroupGet (BaseModel ):
2528 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
2644
2745
2846@router .post ('' )
@@ -35,11 +53,15 @@ def create_group_request(
3553 return obj
3654
3755
38- @router .get ('' )
56+ @router .get ('/validation ' )
3957def validate_group_request (
4058 secret_key : str ,
4159 user : dict [str ] = Depends (UnionAuth (["social.group.create" ])),
4260) -> GroupGet | GroupRequestGet :
61+ """Получение состояния валидации группы по коду валидации
62+
63+ Трубуются права: `social.group.create`
64+ """
4365 obj = (
4466 db .session .query (CreateGroupRequest )
4567 .where (CreateGroupRequest .secret_key == secret_key , CreateGroupRequest .owner_id == user .get ("id" ))
@@ -52,3 +74,61 @@ def validate_group_request(
5274 return GroupGet .model_validate (obj .mapped_group , from_attributes = True )
5375
5476 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