Доделанно получение сообщений
This commit is contained in:
parent
b4a624dc6e
commit
e6d6421f01
3 changed files with 54 additions and 36 deletions
|
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue