chat_back/app/services/chat_service.py
2024-07-12 16:29:31 +04:00

90 lines
3.5 KiB
Python

from app.chat.exceptions import UserDontHavePermissionException, UserCanNotReadThisChatException
from app.chat.shemas import SAllowedChats, SChangeData, SPinnedChats
from app.config import settings
from app.unit_of_work import UnitOfWork
from app.users.schemas import SInvitationData
from app.utils.auth import encode_invitation_token, decode_invitation_token
class ChatService:
@staticmethod
async def get_all_chats(uow: UnitOfWork, user_id: int) -> SAllowedChats:
async with uow:
allowed_chats = await uow.user.get_user_allowed_chats(user_id=user_id)
return allowed_chats
@staticmethod
async def create_chat(uow: UnitOfWork, user_id: int, user_to_exclude_id: int, chat_name: str) -> int:
async with uow:
user_chat_for = await uow.user.find_one(id=user_to_exclude_id)
chat_id = await uow.chat.create_chat(
user_id=user_to_exclude_id, chat_name=chat_name, created_by=user_id,
avatar_image=user_chat_for.avatar_image
)
await uow.chat.add_user_to_chat(user_id, chat_id)
await uow.chat.add_user_to_chat(settings.ADMIN_USER_ID, chat_id)
await uow.commit()
return chat_id
@staticmethod
async def change_chat_data(uow: UnitOfWork, user_id: int, user_data: SChangeData) -> None:
async with uow:
chat = await uow.chat.find_one(chat_id=user_data.chat_id, user_id=user_id)
if chat.created_by != user_id:
raise UserDontHavePermissionException
await uow.chat.change_data(
chat_id=user_data.chat_id, chat_name=user_data.chat_name, avatar_image=user_data.avatar_image
)
@staticmethod
def create_invitation_link(chat_id: int) -> str:
invitation_data = SInvitationData.model_validate({"chat_id": chat_id})
invitation_token = encode_invitation_token(invitation_data)
invitation_link = settings.INVITATION_LINK_HOST + "/api/chat/invite_to_chat/" + invitation_token
return invitation_link
@staticmethod
async def invite_to_chat(uow: UnitOfWork, user_id: int, invitation_token: str) -> None:
invitation_data = decode_invitation_token(invitation_token)
async with uow:
chat = await uow.chat.find_one(chat_id=invitation_data.chat_id, user_id=user_id)
if user_id == chat.chat_for:
raise UserCanNotReadThisChatException
await uow.chat.add_user_to_chat(chat_id=invitation_data.chat_id, user_id=user_id)
await uow.commit()
@staticmethod
async def delete_chat(uow: UnitOfWork, user_id: int, chat_id: int) -> None:
async with uow:
chat = await uow.chat.find_one(chat_id=chat_id, user_id=user_id)
if not user_id == chat.created_by:
raise UserDontHavePermissionException
await uow.chat.delete_chat(chat_id)
await uow.commit()
@staticmethod
async def delete_user_from_chat(uow: UnitOfWork, user_id: int, chat_id: int, user_id_for_delete: int) -> None:
async with uow:
chat = await uow.chat.find_one(chat_id=chat_id, user_id=user_id)
if not user_id == chat.created_by:
raise UserDontHavePermissionException
await uow.chat.delete_user_from_chat(chat_id=chat_id, user_id=user_id_for_delete)
await uow.commit()
@staticmethod
async def pin_chat(uow: UnitOfWork, user_id: int, chat_id: int) -> None:
async with uow:
await uow.chat.pin_chat(chat_id=chat_id, user_id=user_id)
await uow.commit()
@staticmethod
async def unpin_chat(uow: UnitOfWork, user_id: int, chat_id: int) -> None:
async with uow:
await uow.chat.unpin_chat(chat_id=chat_id, user_id=user_id)
await uow.commit()
@staticmethod
async def get_pinned_chats(uow: UnitOfWork, user_id: int) -> SPinnedChats:
async with uow:
pinned_chats = await uow.chat.get_pinned_chats(user_id=user_id)
return pinned_chats