chat_back/chat_test/app/users/chat/router.py

90 lines
3.2 KiB
Python

from fastapi import APIRouter, Depends, status
from app.exceptions import UserDontHavePermissionException, MessageNotFoundException, UserCanNotReadThisChatException
from app.users.chat.dao import ChatDAO
from app.users.chat.shemas import SMessage, SLastMessages
from app.users.dao import UserDAO
from app.users.dependencies import get_current_user
from app.users.auth import validate_user_access_to_chat, validate_user_admin, get_user_allowed_chats_id, ADMIN_USER_ID
from app.users.models import Users
router = APIRouter(
prefix="/chat",
tags=["Чат"]
)
@router.get('')
async def get_all_chats(user: Users = Depends(get_current_user)):
return await UserDAO.get_user_allowed_chats(user.id)
@router.post("", status_code=status.HTTP_201_CREATED)
async def add_message_to_chat(
chat_id: int,
message: str,
user: Users = Depends(get_current_user)
):
chats = await get_user_allowed_chats_id(user.id)
if chat_id not in chats:
raise UserDontHavePermissionException
send_message_to_chat = await ChatDAO.send_message(
user_id=user.id,
chat_id=chat_id,
message=message,
)
@router.delete("/delete_message", status_code=status.HTTP_204_NO_CONTENT)
async def delete_message_from_chat(
message_id: int,
user: Users = Depends(get_current_user)
):
get_message_sender = await ChatDAO.get_message_by_id(message_id=message_id)
if get_message_sender is None:
raise MessageNotFoundException
if get_message_sender["user_id"] != user.id:
if not await validate_user_admin(user_id=user.id):
raise UserDontHavePermissionException
deleted_message = await ChatDAO.delete_message(message_id=message_id)
return deleted_message
@router.post("/create_chat", status_code=status.HTTP_201_CREATED)
async def create_chat(
user_to_exclude: int,
chat_name: str,
user: Users = Depends(get_current_user)
):
if user.id == user_to_exclude:
raise UserCanNotReadThisChatException
chat_id = await ChatDAO.create(user_id=user_to_exclude, chat_name=chat_name)
user_added_to_chat = await ChatDAO.add_user_to_chat(user.id, chat_id)
await ChatDAO.add_user_to_chat(ADMIN_USER_ID, chat_id)
return user_added_to_chat
@router.get("/get_last_message/{chat_id}", response_model=list[SMessage])
async def get_last_message(chat_id: int, user: Users = Depends(get_current_user)):
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
message = await ChatDAO.get_some_messages(chat_id=chat_id, message_number_from=0, messages_to_get=1)
if message is None:
raise MessageNotFoundException
return message
@router.get("/get_some_messages/{chat_id}", response_model=list[SMessage])
async def get_some_messages(
chat_id: int, last_messages: SLastMessages = Depends(), user: Users = Depends(get_current_user)
):
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
messages = await ChatDAO.get_some_messages(
chat_id=chat_id,
message_number_from=last_messages.messages_count,
messages_to_get=last_messages.messages_to_get
)
if not messages:
raise MessageNotFoundException
return messages