change group chat profile v1
parent
4f95b58871
commit
9eed55164a
|
@ -1,6 +1,7 @@
|
||||||
import random
|
import random
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
from sqlalchemy import select, insert, ScalarResult
|
from sqlalchemy import select, insert, ScalarResult, update, delete
|
||||||
from sqlalchemy.orm.attributes import flag_modified
|
from sqlalchemy.orm.attributes import flag_modified
|
||||||
|
|
||||||
from ..database.db import async_session
|
from ..database.db import async_session
|
||||||
|
@ -33,17 +34,44 @@ async def insert_group_chat(supervisor: str, members: list[str]) -> GroupChat:
|
||||||
|
|
||||||
session.add_all(contact_res.all())
|
session.add_all(contact_res.all())
|
||||||
await session.commit()
|
await session.commit()
|
||||||
await session.close()
|
|
||||||
return group_chat_res.one()
|
return group_chat_res.one()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
await session.close()
|
|
||||||
raise e
|
raise e
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
|
|
||||||
async def select_member_name_avatar(member_id: str, is_friend: bool):
|
async def insert_group_chat_members(group_chat_id: str, members: list[str]):
|
||||||
|
session = async_session()
|
||||||
|
try:
|
||||||
|
group_chat: GroupChat = (
|
||||||
|
await session.scalars(
|
||||||
|
select(GroupChat).where(GroupChat.id == group_chat_id)
|
||||||
|
)
|
||||||
|
).one()
|
||||||
|
group_chat.members.extend(members)
|
||||||
|
flag_modified(group_chat, "members")
|
||||||
|
session.add(group_chat)
|
||||||
|
|
||||||
|
for member in members:
|
||||||
|
contact: Contact = (
|
||||||
|
await session.scalars(select(Contact).where(Contact.user_id == member))
|
||||||
|
).one()
|
||||||
|
contact.group_chats[group_chat_id] = {"myRemark": "", "nameRemark": ""}
|
||||||
|
flag_modified(contact, "group_chats")
|
||||||
|
session.add(contact)
|
||||||
|
|
||||||
|
await session.commit()
|
||||||
|
except Exception as e:
|
||||||
|
raise e
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
|
|
||||||
|
async def select_member_name_avatar(member_id: str, is_friend: bool) -> dict | Tuple:
|
||||||
session = async_session()
|
session = async_session()
|
||||||
if is_friend:
|
if is_friend:
|
||||||
res: ScalarResult[Contact] = await session.scalars(
|
res: ScalarResult[dict] = await session.scalars(
|
||||||
select(Contact.group_chats).where(Contact.user_id == member_id)
|
select(Contact.group_chats).where(Contact.user_id == member_id)
|
||||||
)
|
)
|
||||||
await session.close()
|
await session.close()
|
||||||
|
@ -56,5 +84,111 @@ async def select_member_name_avatar(member_id: str, is_friend: bool):
|
||||||
.where(UserProfile.user_id == member_id)
|
.where(UserProfile.user_id == member_id)
|
||||||
)
|
)
|
||||||
await session.close()
|
await session.close()
|
||||||
# ('htylight', 'cznowoyn1692502503.png', {'81906574618': {'myRemark': '', 'nameRemark': ''}})
|
# ('htylight', 'cznowoyn1692502503.png', {'81906574618': {'myRemark': '', 'nameRemark': ''},})
|
||||||
return res.one()
|
return res.one()
|
||||||
|
|
||||||
|
|
||||||
|
async def select_full_profile(group_chat_id: str) -> Tuple[GroupChat, list[Tuple[str]]]:
|
||||||
|
session = async_session()
|
||||||
|
group_chat: GroupChat = (
|
||||||
|
await session.scalars(select(GroupChat).where(GroupChat.id == group_chat_id))
|
||||||
|
).one()
|
||||||
|
members: list[str] = group_chat.members
|
||||||
|
res = await session.execute(
|
||||||
|
select(
|
||||||
|
UserProfile.user_id,
|
||||||
|
UserProfile.nickname,
|
||||||
|
UserProfile.avatar,
|
||||||
|
Contact.group_chats[group_chat_id]["myRemark"],
|
||||||
|
)
|
||||||
|
.join(Contact, UserProfile.user_id == Contact.user_id)
|
||||||
|
.where(UserProfile.user_id.in_(members))
|
||||||
|
)
|
||||||
|
|
||||||
|
# [
|
||||||
|
# ('01H88FWWRFSXMBGM9GYWM060HP', 'test1', None, ''),
|
||||||
|
# ('01H88EVDZY1R0E267XSB7XGXHG', 'htylight', 'cznowoyn1692502503.png', ''),
|
||||||
|
# ]
|
||||||
|
await session.close()
|
||||||
|
return group_chat, res.all()
|
||||||
|
|
||||||
|
|
||||||
|
async def update_group_name(group_chat_id: str, new_name: str):
|
||||||
|
session = async_session()
|
||||||
|
try:
|
||||||
|
await session.execute(
|
||||||
|
update(GroupChat).values(name=new_name).where(GroupChat.id == group_chat_id)
|
||||||
|
)
|
||||||
|
await session.commit()
|
||||||
|
except Exception:
|
||||||
|
raise Exception
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
|
|
||||||
|
async def update_group_intro(group_chat_id: str, new_intro: str):
|
||||||
|
session = async_session()
|
||||||
|
try:
|
||||||
|
await session.execute(
|
||||||
|
update(GroupChat)
|
||||||
|
.values(introduction=new_intro)
|
||||||
|
.where(GroupChat.id == group_chat_id)
|
||||||
|
)
|
||||||
|
await session.commit()
|
||||||
|
except Exception:
|
||||||
|
raise Exception
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
|
|
||||||
|
async def update_group_remark(user_id: str, group_chat_id: str, new_remark: str):
|
||||||
|
session = async_session()
|
||||||
|
try:
|
||||||
|
contact: Contact = (
|
||||||
|
await session.scalars(select(Contact).where(Contact.user_id == user_id))
|
||||||
|
).one()
|
||||||
|
contact.group_chats[group_chat_id]["nameRemark"] = new_remark
|
||||||
|
flag_modified(contact, "group_chats")
|
||||||
|
session.add(contact)
|
||||||
|
await session.commit()
|
||||||
|
except Exception:
|
||||||
|
raise Exception
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
|
|
||||||
|
async def update_my_remark(user_id: str, group_chat_id: str, new_my_remark: str):
|
||||||
|
session = async_session()
|
||||||
|
try:
|
||||||
|
contact: Contact = (
|
||||||
|
await session.scalars(select(Contact).where(Contact.user_id == user_id))
|
||||||
|
).one()
|
||||||
|
contact.group_chats[group_chat_id]["myRemark"] = new_my_remark
|
||||||
|
flag_modified(contact, "group_chats")
|
||||||
|
session.add(contact)
|
||||||
|
await session.commit()
|
||||||
|
except Exception:
|
||||||
|
raise Exception
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
||||||
|
|
||||||
|
async def delete_group_chat(group_chat_id: str, members: list[str]):
|
||||||
|
session = async_session()
|
||||||
|
try:
|
||||||
|
await session.execute(delete(GroupChat).where(GroupChat.id == group_chat_id))
|
||||||
|
|
||||||
|
res: ScalarResult[Contact] = await session.scalars(
|
||||||
|
select(Contact).where(Contact.user_id.in_(members))
|
||||||
|
)
|
||||||
|
|
||||||
|
for contact in res.all():
|
||||||
|
del contact.group_chats[group_chat_id]
|
||||||
|
flag_modified(contact, "group_chats")
|
||||||
|
session.add(contact)
|
||||||
|
|
||||||
|
await session.commit()
|
||||||
|
except Exception:
|
||||||
|
raise Exception
|
||||||
|
finally:
|
||||||
|
await session.close()
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
|
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
|
||||||
|
|
||||||
db_url = "postgresql+asyncpg://together:togetherno.1@localhost/together"
|
db_url = "postgresql+asyncpg://together:togetherno.1@localhost/together"
|
||||||
engine = create_async_engine(db_url)
|
engine = create_async_engine(db_url, echo=True)
|
||||||
async_session = async_sessionmaker(engine, expire_on_commit=False)
|
async_session = async_sessionmaker(engine, expire_on_commit=False)
|
||||||
|
|
|
@ -22,7 +22,7 @@ app.include_router(user_account_router, dependencies=[Depends(verify_token)])
|
||||||
app.include_router(search_router, dependencies=[Depends(verify_token)])
|
app.include_router(search_router, dependencies=[Depends(verify_token)])
|
||||||
app.include_router(apply_router, dependencies=[Depends(verify_token)])
|
app.include_router(apply_router, dependencies=[Depends(verify_token)])
|
||||||
app.include_router(contact_router, dependencies=[Depends(verify_token)])
|
app.include_router(contact_router, dependencies=[Depends(verify_token)])
|
||||||
app.include_router(group_chat_router)
|
app.include_router(group_chat_router, dependencies=[Depends(verify_token)])
|
||||||
|
|
||||||
app.mount("/static", StaticFiles(directory="static"), name="static")
|
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||||
|
|
||||||
|
|
|
@ -27,3 +27,8 @@ class GroupChatProfileResponse(BaseResponseModel):
|
||||||
|
|
||||||
class MemberNameAvatarResponse(BaseResponseModel):
|
class MemberNameAvatarResponse(BaseResponseModel):
|
||||||
data: _MemberNameAvatar
|
data: _MemberNameAvatar
|
||||||
|
|
||||||
|
|
||||||
|
class FullProfileResponse(BaseResponseModel):
|
||||||
|
groupChat: _GroupChatProfile
|
||||||
|
memberNameAvatar: dict[str, _MemberNameAvatar]
|
||||||
|
|
|
@ -3,8 +3,10 @@ from pydantic import BaseModel
|
||||||
|
|
||||||
from ..crud import group_chat_crud
|
from ..crud import group_chat_crud
|
||||||
from ..response_models.group_chat_response import (
|
from ..response_models.group_chat_response import (
|
||||||
|
BaseResponseModel,
|
||||||
GroupChatProfileResponse,
|
GroupChatProfileResponse,
|
||||||
MemberNameAvatarResponse,
|
MemberNameAvatarResponse,
|
||||||
|
FullProfileResponse,
|
||||||
)
|
)
|
||||||
|
|
||||||
router = APIRouter(prefix="/group_chat", tags=["group_chat"])
|
router = APIRouter(prefix="/group_chat", tags=["group_chat"])
|
||||||
|
@ -15,6 +17,11 @@ class GroupChatCreate(BaseModel):
|
||||||
members: list[str]
|
members: list[str]
|
||||||
|
|
||||||
|
|
||||||
|
class GroupChatMembers(BaseModel):
|
||||||
|
group_chat_id: str
|
||||||
|
members: list[str]
|
||||||
|
|
||||||
|
|
||||||
@router.post("/create", response_model=GroupChatProfileResponse)
|
@router.post("/create", response_model=GroupChatProfileResponse)
|
||||||
async def create_group_chat(group_chat_create: GroupChatCreate):
|
async def create_group_chat(group_chat_create: GroupChatCreate):
|
||||||
try:
|
try:
|
||||||
|
@ -28,8 +35,20 @@ async def create_group_chat(group_chat_create: GroupChatCreate):
|
||||||
}
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Creating Group Chat fail with error: {e}")
|
print(f"Creating Group Chat Fail With Error: {e}")
|
||||||
return {"code": 9999, "msg": "Server error"}
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/invite_members", response_model=BaseResponseModel)
|
||||||
|
async def invite_members(member_invitation: GroupChatMembers):
|
||||||
|
try:
|
||||||
|
await group_chat_crud.insert_group_chat_members(
|
||||||
|
**member_invitation.model_dump()
|
||||||
|
)
|
||||||
|
return {"code": 10800, "msg": "Invite Members Successfully"}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Invite members fail with error: {e}")
|
||||||
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
||||||
|
|
||||||
@router.get("/member_name_avatar", response_model=MemberNameAvatarResponse)
|
@router.get("/member_name_avatar", response_model=MemberNameAvatarResponse)
|
||||||
|
@ -37,10 +56,14 @@ async def get_member_name_avatar(group_chat_id: str, member_id: str, is_friend:
|
||||||
res = await group_chat_crud.select_member_name_avatar(member_id, is_friend)
|
res = await group_chat_crud.select_member_name_avatar(member_id, is_friend)
|
||||||
data = {}
|
data = {}
|
||||||
if is_friend:
|
if is_friend:
|
||||||
|
if res.get(group_chat_id):
|
||||||
|
# make sure my friend is still in this group chat
|
||||||
data["remark"] = res[group_chat_id]["myRemark"]
|
data["remark"] = res[group_chat_id]["myRemark"]
|
||||||
data["nickname"] = ""
|
data["nickname"] = ""
|
||||||
data["avatar"] = ""
|
data["avatar"] = ""
|
||||||
else:
|
else:
|
||||||
|
if len(res) == 3:
|
||||||
|
# make sure this user is still in this group chat
|
||||||
data["remark"] = res[2][group_chat_id]["myRemark"]
|
data["remark"] = res[2][group_chat_id]["myRemark"]
|
||||||
data["nickname"] = res[0]
|
data["nickname"] = res[0]
|
||||||
data["avatar"] = res[1]
|
data["avatar"] = res[1]
|
||||||
|
@ -50,3 +73,79 @@ async def get_member_name_avatar(group_chat_id: str, member_id: str, is_friend:
|
||||||
"msg": "Get Group Chat Member Name and Avatar Successfully",
|
"msg": "Get Group Chat Member Name and Avatar Successfully",
|
||||||
"data": data,
|
"data": data,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/full_profile", response_model=FullProfileResponse)
|
||||||
|
async def get_full_profile(group_chat_id: str):
|
||||||
|
# full profile, includes introduction, noticeboard, group avatar,
|
||||||
|
# tags, and all members remark, avatar
|
||||||
|
group_chat, member_name_avatar_list = await group_chat_crud.select_full_profile(
|
||||||
|
group_chat_id
|
||||||
|
)
|
||||||
|
|
||||||
|
member_name_avatar_dict = {}
|
||||||
|
|
||||||
|
for member_name_avatar in member_name_avatar_list:
|
||||||
|
member_name_avatar_dict[member_name_avatar[0]] = {
|
||||||
|
"remark": member_name_avatar[3],
|
||||||
|
"nickname": member_name_avatar[1],
|
||||||
|
"avatar": member_name_avatar[2] or "",
|
||||||
|
}
|
||||||
|
print(group_chat.to_dict())
|
||||||
|
print(member_name_avatar_dict)
|
||||||
|
return {
|
||||||
|
"code": 10800,
|
||||||
|
"msg": "Get Group Chat Full Profile Successfully",
|
||||||
|
"groupChat": group_chat.to_dict(),
|
||||||
|
"memberNameAvatar": member_name_avatar_dict,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/change_name", response_model=BaseResponseModel)
|
||||||
|
async def change_name(group_chat_id: str, new_name: str):
|
||||||
|
try:
|
||||||
|
await group_chat_crud.update_group_name(group_chat_id, new_name)
|
||||||
|
return {"code": 10800, "msg": "Change Group Chat Name Successfully"}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Change Group Chat Name Fail With Error: {e}")
|
||||||
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/change_intro", response_model=BaseResponseModel)
|
||||||
|
async def change_intro(group_chat_id: str, new_intro: str):
|
||||||
|
try:
|
||||||
|
await group_chat_crud.update_group_intro(group_chat_id, new_intro)
|
||||||
|
return {"code": 10800, "msg": "Change Group Chat Intro Successfully"}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Change Group Chat Intro Fail With Error: {e}")
|
||||||
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/change_remark", response_model=BaseResponseModel)
|
||||||
|
async def change_name_remark(user_id: str, group_chat_id: str, new_remark: str):
|
||||||
|
try:
|
||||||
|
await group_chat_crud.update_group_remark(user_id, group_chat_id, new_remark)
|
||||||
|
return {"code": 10800, "msg": "Change Group Chat Remark Successfully"}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Change Group Chat Remark Fail With Error: {e}")
|
||||||
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/change_my_remark", response_model=BaseResponseModel)
|
||||||
|
async def change_my_remark(user_id: str, group_chat_id: str, new_my_remark: str):
|
||||||
|
try:
|
||||||
|
await group_chat_crud.update_my_remark(user_id, group_chat_id, new_my_remark)
|
||||||
|
return {"code": 10800, "msg": "Change My Nickname in Group Chat Successfully"}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Change Group Chat My Nickname in Group Chat Fail With Error: {e}")
|
||||||
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/delete", response_model=BaseResponseModel)
|
||||||
|
async def delete_group_chat(deletion: GroupChatMembers):
|
||||||
|
try:
|
||||||
|
await group_chat_crud.delete_group_chat(**deletion.model_dump())
|
||||||
|
return {"code": 10800, "msg": "Delete Group Chat Successfully"}
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Delete Group Chat Fail With Error: {e}")
|
||||||
|
return {"code": 9999, "msg": "Server Error"}
|
||||||
|
|
Loading…
Reference in New Issue