Доделанно получение сообщений

This commit is contained in:
urec56 2024-02-09 12:31:01 +03:00
parent b4a624dc6e
commit e6d6421f01
3 changed files with 54 additions and 36 deletions

View file

@ -10,7 +10,7 @@ class ChatDAO(BaseDAO):
model = Chats
@classmethod
async def create(cls, user_id):
async def create(cls, user_id: int):
query = insert(Chats).values(chat_for=user_id)
async with async_session_maker() as session:
await session.execute(query)
@ -18,7 +18,7 @@ class ChatDAO(BaseDAO):
return True
@classmethod
async def send_message(cls, user_id, chat_id, message):
async def send_message(cls, user_id, chat_id: int, message: str):
query = insert(Messages).values(chat_id=chat_id, user_id=user_id, message=message, image_url=None)
async with async_session_maker() as session:
await session.execute(query)
@ -26,7 +26,7 @@ class ChatDAO(BaseDAO):
return True
@classmethod
async def get_message_by_id(cls, message_id):
async def get_message_by_id(cls, message_id: int):
query = select(Messages.__table__.columns).where(
and_(
Messages.id == message_id,
@ -41,7 +41,15 @@ class ChatDAO(BaseDAO):
return result[0]
@classmethod
async def get_last_message(cls, chat_id):
async def delete_message(cls, message_id: int):
query = update(Messages).where(Messages.id == message_id).values(visibility=False)
async with async_session_maker() as session:
await session.execute(query)
await session.commit()
return True
@classmethod
async def get_some_messages(cls, chat_id: int, message_number_from: int, messages_to_get: int):
"""
WITH messages_with_users AS (
SELECT *
@ -53,7 +61,7 @@ class ChatDAO(BaseDAO):
FROM messages_with_users
WHERE visibility = true AND chat_id = 2
ORDER BY created_at DESC
LIMIT 1;
LIMIT 15 OFFSET 0;
"""
messages_with_users = (
select(Messages.__table__.columns, Users.__table__.columns)
@ -68,20 +76,10 @@ class ChatDAO(BaseDAO):
messages_with_users.c.chat_id == chat_id,
messages_with_users.c.visibility == True
)
).order_by(messages_with_users.c.created_at.desc()).limit(1))
).order_by(messages_with_users.c.created_at.desc()).limit(messages_to_get).offset(message_number_from))
async with async_session_maker() as session:
result = await session.execute(messages)
result = result.mappings().all()
print(result)
if result:
return result[0]
@classmethod
async def delete_message(cls, message_id):
query = update(Messages).where(Messages.id == message_id).values(visibility=False)
async with async_session_maker() as session:
await session.execute(query)
await session.commit()
return True
return result

View file

@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, status
from app.exceptions import UserDontHavePermissionException, MessageNotFoundException, UsersIdIsTheSameException
from app.users.chat.dao import ChatDAO
from app.users.chat.shemas import SMessage
from app.users.chat.shemas import SMessage, SLastMessages
from app.users.dao import UserDAO
from app.users.dependencies import get_current_user, validate_user_access_to_chat
@ -50,15 +50,6 @@ async def delete_message_from_chat(
return deleted_message
@router.get("/get_last_message", response_model=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_last_message(chat_id=chat_id)
if message is None:
raise MessageNotFoundException
return message
# Не доделан
@router.post("/create_chat", status_code=status.HTTP_201_CREATED)
async def create_chat(
@ -71,6 +62,25 @@ async def create_chat(
return created_chat
@router.get("/last_messages")
async def get_last_messages():
pass
@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

View file

@ -14,3 +14,13 @@ class SMessage(BaseModel):
class Config:
from_attributes = True
class SLastMessages:
def __init__(
self,
messages_count: int,
messages_to_get: int,
):
self.messages_count = messages_count
self.messages_to_get = messages_to_get