Взаимодействия с чатом доступны только после подтверждения почты

This commit is contained in:
urec56 2024-03-06 14:37:50 +03:00
parent 9198c14359
commit 488df408ca
4 changed files with 26 additions and 7 deletions

View file

@ -1,4 +1,3 @@
import asyncio
import json import json
from datetime import datetime from datetime import datetime

View file

@ -79,6 +79,11 @@ async def check_verificated_user(user_id: int) -> bool:
return user.role >= VERIFICATED_USER return user.role >= VERIFICATED_USER
async def check_verificated_user_with_exc(user_id: int) -> bool:
if not await check_verificated_user(user_id=user_id):
raise UserDontHavePermissionException
async def get_user_allowed_chats_id(user_id: int): async def get_user_allowed_chats_id(user_id: int):
user_allowed_chats = await UserDAO.get_user_allowed_chats(user_id) user_allowed_chats = await UserDAO.get_user_allowed_chats(user_id)
user_allowed_chats_id = (chat['chat_id'] for chat in user_allowed_chats) user_allowed_chats_id = (chat['chat_id'] for chat in user_allowed_chats)
@ -97,6 +102,3 @@ async def validate_user_admin(user_id: int):
if user_role == ADMIN_USER: if user_role == ADMIN_USER:
return True return True
return False return False

View file

@ -10,7 +10,8 @@ from app.users.chat.shemas import SMessage, SLastMessages, SPinnedMessage, SPinn
from app.users.dao import UserDAO from app.users.dao import UserDAO
from app.users.dependencies import get_current_user 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.auth import validate_user_access_to_chat, validate_user_admin, get_user_allowed_chats_id, ADMIN_USER_ID, \
check_verificated_user_with_exc
from app.users.models import Users from app.users.models import Users
router = APIRouter( router = APIRouter(
@ -21,6 +22,7 @@ router = APIRouter(
@router.get("", response_model=list[SChat]) @router.get("", response_model=list[SChat])
async def get_all_chats(user: Users = Depends(get_current_user)): async def get_all_chats(user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
result = await UserDAO.get_user_allowed_chats(user.id) result = await UserDAO.get_user_allowed_chats(user.id)
return result return result
@ -31,6 +33,7 @@ async def add_message_to_chat(
message: str, message: str,
user: Users = Depends(get_current_user) user: Users = Depends(get_current_user)
): ):
await check_verificated_user_with_exc(user_id=user.id)
chats = await get_user_allowed_chats_id(user.id) chats = await get_user_allowed_chats_id(user.id)
if chat_id not in chats: if chat_id not in chats:
raise UserDontHavePermissionException raise UserDontHavePermissionException
@ -46,6 +49,7 @@ async def delete_message_from_chat(
message_id: int, message_id: int,
user: Users = Depends(get_current_user) user: Users = Depends(get_current_user)
): ):
await check_verificated_user_with_exc(user_id=user.id)
get_message_sender = await ChatDAO.get_message_by_id(message_id=message_id) get_message_sender = await ChatDAO.get_message_by_id(message_id=message_id)
if get_message_sender is None: if get_message_sender is None:
raise MessageNotFoundException raise MessageNotFoundException
@ -62,6 +66,7 @@ async def create_chat(
chat_name: str, chat_name: str,
user: Users = Depends(get_current_user) user: Users = Depends(get_current_user)
): ):
await check_verificated_user_with_exc(user_id=user.id)
if user.id == user_to_exclude: if user.id == user_to_exclude:
raise UserCanNotReadThisChatException raise UserCanNotReadThisChatException
chat_id = await ChatDAO.create(user_id=user_to_exclude, chat_name=chat_name, created_by=user.id) chat_id = await ChatDAO.create(user_id=user_to_exclude, chat_name=chat_name, created_by=user.id)
@ -72,6 +77,7 @@ async def create_chat(
@router.get("/get_last_message/{chat_id}", response_model=list[SMessage]) @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)): async def get_last_message(chat_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) 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) message = await ChatDAO.get_some_messages(chat_id=chat_id, message_number_from=0, messages_to_get=1)
if message is None: if message is None:
@ -85,6 +91,7 @@ async def get_last_message(chat_id: int, user: Users = Depends(get_current_user)
async def get_some_messages( async def get_some_messages(
chat_id: int, last_messages: SLastMessages = Depends(), user: Users = Depends(get_current_user) chat_id: int, last_messages: SLastMessages = Depends(), user: Users = Depends(get_current_user)
): ):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
messages = await ChatDAO.get_some_messages( messages = await ChatDAO.get_some_messages(
chat_id=chat_id, chat_id=chat_id,
@ -100,6 +107,7 @@ async def get_some_messages(
@router.get("/create_invitation_link", response_model=dict[str, str], status_code=status.HTTP_201_CREATED) @router.get("/create_invitation_link", response_model=dict[str, str], status_code=status.HTTP_201_CREATED)
async def create_invitation_link(chat_id: int, user: Users = Depends(get_current_user)): async def create_invitation_link(chat_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
cipher_suite = Fernet(settings.INVITATION_LINK_TOKEN_KEY) cipher_suite = Fernet(settings.INVITATION_LINK_TOKEN_KEY)
invitation_token = cipher_suite.encrypt(str(chat_id).encode()) invitation_token = cipher_suite.encrypt(str(chat_id).encode())
@ -109,6 +117,7 @@ async def create_invitation_link(chat_id: int, user: Users = Depends(get_current
@router.get("/invite_to_chat/{invitation_token}", response_model=bool, status_code=status.HTTP_200_OK) @router.get("/invite_to_chat/{invitation_token}", response_model=bool, status_code=status.HTTP_200_OK)
async def invite_to_chat(invitation_token: str, user: Users = Depends(get_current_user)): async def invite_to_chat(invitation_token: str, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
invitation_token = invitation_token.encode() invitation_token = invitation_token.encode()
cipher_suite = Fernet(settings.INVITATION_LINK_TOKEN_KEY) cipher_suite = Fernet(settings.INVITATION_LINK_TOKEN_KEY)
chat_id = int(cipher_suite.decrypt(invitation_token)) chat_id = int(cipher_suite.decrypt(invitation_token))
@ -120,6 +129,7 @@ async def invite_to_chat(invitation_token: str, user: Users = Depends(get_curren
@router.delete("/delete_chat/{chat_id}", response_model=SDeletedChat, status_code=status.HTTP_200_OK) @router.delete("/delete_chat/{chat_id}", response_model=SDeletedChat, status_code=status.HTTP_200_OK)
async def delete_chat(chat_id: int, user: Users = Depends(get_current_user)): async def delete_chat(chat_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
chat = await ChatDAO.find_one_or_none(id=chat_id) chat = await ChatDAO.find_one_or_none(id=chat_id)
if user.id == chat.created_by: if user.id == chat.created_by:
return {'deleted_chat': await ChatDAO.delete_chat(chat_id)} return {'deleted_chat': await ChatDAO.delete_chat(chat_id)}
@ -127,7 +137,8 @@ async def delete_chat(chat_id: int, user: Users = Depends(get_current_user)):
@router.delete("/delete_user_from_chat/{chat_id}", response_model=SDeletedUser) @router.delete("/delete_user_from_chat/{chat_id}", response_model=SDeletedUser)
async def delete_user(chat_id: int, user_id: int, user: Users = Depends(get_current_user)): async def delete_user_from_chat(chat_id: int, user_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
chat = await ChatDAO.find_one_or_none(id=chat_id) chat = await ChatDAO.find_one_or_none(id=chat_id)
if user.id == chat.created_by: if user.id == chat.created_by:
return {'deleted_user': await ChatDAO.delete_user(chat_id=chat_id, user_id=user_id)} return {'deleted_user': await ChatDAO.delete_user(chat_id=chat_id, user_id=user_id)}
@ -136,6 +147,7 @@ async def delete_user(chat_id: int, user_id: int, user: Users = Depends(get_curr
@router.post("/pinn_chat", response_model=SPinnedChat) @router.post("/pinn_chat", response_model=SPinnedChat)
async def pinn_chat(chat_id: int, user: Users = Depends(get_current_user)): async def pinn_chat(chat_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
await ChatDAO.pinn_chat(chat_id=chat_id, user_id=user.id) await ChatDAO.pinn_chat(chat_id=chat_id, user_id=user.id)
return {'chat_id': chat_id, 'user_id': user.id} return {'chat_id': chat_id, 'user_id': user.id}
@ -143,6 +155,7 @@ async def pinn_chat(chat_id: int, user: Users = Depends(get_current_user)):
@router.delete("/unpinn_chat", response_model=SPinnedChat) @router.delete("/unpinn_chat", response_model=SPinnedChat)
async def unpinn_chat(chat_id: int, user: Users = Depends(get_current_user)): async def unpinn_chat(chat_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
await ChatDAO.unpinn_chat(chat_id=chat_id, user_id=user.id) await ChatDAO.unpinn_chat(chat_id=chat_id, user_id=user.id)
return {'chat_id': chat_id, 'user_id': user.id} return {'chat_id': chat_id, 'user_id': user.id}
@ -150,11 +163,13 @@ async def unpinn_chat(chat_id: int, user: Users = Depends(get_current_user)):
@router.get("/get_pinned_chats", response_model=list[SChat]) @router.get("/get_pinned_chats", response_model=list[SChat])
async def get_pinned_chats(user: Users = Depends(get_current_user)): async def get_pinned_chats(user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
return await ChatDAO.get_pinned_chats(user_id=user.id) return await ChatDAO.get_pinned_chats(user_id=user.id)
@router.post("/pinn_message", response_model=SPinnedMessage) @router.post("/pinn_message", response_model=SPinnedMessage)
async def pinn_message(chat_id: int, message_id: int, user: Users = Depends(get_current_user)): async def pinn_message(chat_id: int, message_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
await ChatDAO.pinn_message(chat_id=chat_id, message_id=message_id, user_id=user.id) await ChatDAO.pinn_message(chat_id=chat_id, message_id=message_id, user_id=user.id)
return {'message_id': message_id, 'user_id': user.id, 'chat_id': chat_id} return {'message_id': message_id, 'user_id': user.id, 'chat_id': chat_id}
@ -162,6 +177,7 @@ async def pinn_message(chat_id: int, message_id: int, user: Users = Depends(get_
@router.delete("/unpinn_message", response_model=SPinnedMessage) @router.delete("/unpinn_message", response_model=SPinnedMessage)
async def unpinn_message(chat_id: int, message_id: int, user: Users = Depends(get_current_user)): async def unpinn_message(chat_id: int, message_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
message_pinner = await ChatDAO.get_message_pinner(chat_id=chat_id, message_id=message_id) message_pinner = await ChatDAO.get_message_pinner(chat_id=chat_id, message_id=message_id)
if message_pinner == user.id: if message_pinner == user.id:
@ -172,6 +188,7 @@ async def unpinn_message(chat_id: int, message_id: int, user: Users = Depends(ge
@router.get("/pinned_messages/{chat_id}", response_model=list[SMessage] | None) @router.get("/pinned_messages/{chat_id}", response_model=list[SMessage] | None)
async def pinned_messages(chat_id: int, user: Users = Depends(get_current_user)): async def pinned_messages(chat_id: int, user: Users = Depends(get_current_user)):
await check_verificated_user_with_exc(user_id=user.id)
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id) await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
messages = await ChatDAO.get_pinned_messages(chat_id=chat_id) messages = await ChatDAO.get_pinned_messages(chat_id=chat_id)
if messages: if messages:

View file

@ -1,7 +1,7 @@
from fastapi import WebSocket, WebSocketDisconnect from fastapi import WebSocket, WebSocketDisconnect
from app.users.chat.dao import ChatDAO from app.users.chat.dao import ChatDAO
from app.users.auth import validate_user_access_to_chat from app.users.auth import validate_user_access_to_chat, check_verificated_user_with_exc
from app.users.chat.router import router from app.users.chat.router import router
@ -39,6 +39,7 @@ manager = ConnectionManager()
@router.websocket("/ws/{chat_id}") @router.websocket("/ws/{chat_id}")
async def websocket_endpoint(chat_id: int, user_id: int, websocket: WebSocket): async def websocket_endpoint(chat_id: int, user_id: int, websocket: WebSocket):
await check_verificated_user_with_exc(user_id=user_id)
await validate_user_access_to_chat(user_id=user_id, chat_id=chat_id) await validate_user_access_to_chat(user_id=user_id, chat_id=chat_id)
await manager.connect(chat_id, websocket) await manager.connect(chat_id, websocket)
try: try: