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

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 model = Chats
@classmethod @classmethod
async def create(cls, user_id): async def create(cls, user_id: int):
query = insert(Chats).values(chat_for=user_id) query = insert(Chats).values(chat_for=user_id)
async with async_session_maker() as session: async with async_session_maker() as session:
await session.execute(query) await session.execute(query)
@ -18,7 +18,7 @@ class ChatDAO(BaseDAO):
return True return True
@classmethod @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) query = insert(Messages).values(chat_id=chat_id, user_id=user_id, message=message, image_url=None)
async with async_session_maker() as session: async with async_session_maker() as session:
await session.execute(query) await session.execute(query)
@ -26,7 +26,7 @@ class ChatDAO(BaseDAO):
return True return True
@classmethod @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( query = select(Messages.__table__.columns).where(
and_( and_(
Messages.id == message_id, Messages.id == message_id,
@ -41,7 +41,15 @@ class ChatDAO(BaseDAO):
return result[0] return result[0]
@classmethod @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 ( WITH messages_with_users AS (
SELECT * SELECT *
@ -53,7 +61,7 @@ class ChatDAO(BaseDAO):
FROM messages_with_users FROM messages_with_users
WHERE visibility = true AND chat_id = 2 WHERE visibility = true AND chat_id = 2
ORDER BY created_at DESC ORDER BY created_at DESC
LIMIT 1; LIMIT 15 OFFSET 0;
""" """
messages_with_users = ( messages_with_users = (
select(Messages.__table__.columns, Users.__table__.columns) select(Messages.__table__.columns, Users.__table__.columns)
@ -61,27 +69,17 @@ class ChatDAO(BaseDAO):
.join(Users, Messages.user_id == Users.id)).cte('messages_with_users') .join(Users, Messages.user_id == Users.id)).cte('messages_with_users')
messages = (select(messages_with_users.c.message, messages_with_users.c.image_url, messages = (select(messages_with_users.c.message, messages_with_users.c.image_url,
messages_with_users.c.chat_id, messages_with_users.c.user_id, messages_with_users.c.chat_id, messages_with_users.c.user_id,
messages_with_users.c.created_at, messages_with_users.c.avatar_image) messages_with_users.c.created_at, messages_with_users.c.avatar_image)
.where( .where(
and_( and_(
messages_with_users.c.chat_id == chat_id, messages_with_users.c.chat_id == chat_id,
messages_with_users.c.visibility == True 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: async with async_session_maker() as session:
result = await session.execute(messages) result = await session.execute(messages)
result = result.mappings().all() result = result.mappings().all()
print(result)
if result: if result:
return result[0] return result
@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

View file

@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, status
from app.exceptions import UserDontHavePermissionException, MessageNotFoundException, UsersIdIsTheSameException from app.exceptions import UserDontHavePermissionException, MessageNotFoundException, UsersIdIsTheSameException
from app.users.chat.dao import ChatDAO 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.dao import UserDAO
from app.users.dependencies import get_current_user, validate_user_access_to_chat 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 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) @router.post("/create_chat", status_code=status.HTTP_201_CREATED)
async def create_chat( async def create_chat(
@ -71,6 +62,25 @@ async def create_chat(
return created_chat return created_chat
@router.get("/last_messages") @router.get("/get_last_message/{chat_id}", response_model=list[SMessage])
async def get_last_messages(): async def get_last_message(chat_id: int, user: Users = Depends(get_current_user)):
pass 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: class Config:
from_attributes = True 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