Работа с бд, чатом
This commit is contained in:
parent
c0f808c20b
commit
b4a624dc6e
4 changed files with 47 additions and 22 deletions
|
@ -62,3 +62,8 @@ class IncorrectPasswordException(BlackPhoenixException):
|
||||||
class PasswordsМismatchException(BlackPhoenixException):
|
class PasswordsМismatchException(BlackPhoenixException):
|
||||||
status_code = status.HTTP_409_CONFLICT
|
status_code = status.HTTP_409_CONFLICT
|
||||||
detail = "Пароли не совпадают"
|
detail = "Пароли не совпадают"
|
||||||
|
|
||||||
|
|
||||||
|
class UsersIdIsTheSameException(BlackPhoenixException):
|
||||||
|
status_code = status.HTTP_409_CONFLICT
|
||||||
|
detail = "Айди юзеров совпадают"
|
||||||
|
|
|
@ -42,15 +42,37 @@ class ChatDAO(BaseDAO):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_last_message(cls, chat_id):
|
async def get_last_message(cls, chat_id):
|
||||||
query = select(Messages.__table__.columns).where(
|
"""
|
||||||
and_(
|
WITH messages_with_users AS (
|
||||||
Messages.chat_id == chat_id,
|
SELECT *
|
||||||
Messages.visibility == True
|
FROM messages
|
||||||
)
|
LEFT JOIN users ON messages.user_id = users.id
|
||||||
).order_by(Messages.created_at.desc()).limit(1)
|
)
|
||||||
|
|
||||||
|
SELECT message, image_url, chat_id, user_id, created_at, avatar_image
|
||||||
|
FROM messages_with_users
|
||||||
|
WHERE visibility = true AND chat_id = 2
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1;
|
||||||
|
"""
|
||||||
|
messages_with_users = (
|
||||||
|
select(Messages.__table__.columns, Users.__table__.columns)
|
||||||
|
.select_from(Messages)
|
||||||
|
.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_with_users.c.chat_id, messages_with_users.c.user_id,
|
||||||
|
messages_with_users.c.created_at, messages_with_users.c.avatar_image)
|
||||||
|
.where(
|
||||||
|
and_(
|
||||||
|
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))
|
||||||
async with async_session_maker() as session:
|
async with async_session_maker() as session:
|
||||||
result = await session.execute(query)
|
result = await session.execute(messages)
|
||||||
result = result.mappings().all()
|
result = result.mappings().all()
|
||||||
|
print(result)
|
||||||
if result:
|
if result:
|
||||||
return result[0]
|
return result[0]
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
from fastapi import APIRouter, Depends, status
|
from fastapi import APIRouter, Depends, status
|
||||||
|
|
||||||
|
from app.exceptions import UserDontHavePermissionException, MessageNotFoundException, UsersIdIsTheSameException
|
||||||
from app.exceptions import UserDontHavePermissionException, MessageNotFoundException
|
|
||||||
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
|
||||||
|
|
||||||
|
@ -15,6 +14,7 @@ router = APIRouter(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Мусор
|
||||||
@router.get("")
|
@router.get("")
|
||||||
async def root(user: Users = Depends(get_current_user)):
|
async def root(user: Users = Depends(get_current_user)):
|
||||||
print(user)
|
print(user)
|
||||||
|
@ -25,14 +25,12 @@ async def root(user: Users = Depends(get_current_user)):
|
||||||
async def add_message_to_chat(
|
async def add_message_to_chat(
|
||||||
chat_id: int,
|
chat_id: int,
|
||||||
message: str,
|
message: str,
|
||||||
image_url: str = None,
|
|
||||||
user: Users = Depends(get_current_user)
|
user: Users = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
send_message_to_chat = await ChatDAO.send_message(
|
send_message_to_chat = await ChatDAO.send_message(
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
chat_id=chat_id,
|
chat_id=chat_id,
|
||||||
message=message,
|
message=message,
|
||||||
image_url=image_url
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,25 +52,25 @@ async def delete_message_from_chat(
|
||||||
|
|
||||||
@router.get("/get_last_message", response_model=SMessage)
|
@router.get("/get_last_message", response_model=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)):
|
||||||
message = dict(await ChatDAO.get_last_message(chat_id=chat_id))
|
await validate_user_access_to_chat(chat_id=chat_id, user_id=user.id)
|
||||||
user_avatar = await UserDAO.get_user_avatar(user_id=user.id)
|
message = await ChatDAO.get_last_message(chat_id=chat_id)
|
||||||
message["user_avatar"] = user_avatar
|
if message is None:
|
||||||
print(message)
|
raise MessageNotFoundException
|
||||||
if message is not None:
|
return message
|
||||||
return message
|
|
||||||
raise MessageNotFoundException
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/create_chat")
|
# Не доделан
|
||||||
|
@router.post("/create_chat", status_code=status.HTTP_201_CREATED)
|
||||||
async def create_chat(
|
async def create_chat(
|
||||||
user_to_exclude: int,
|
user_to_exclude: int,
|
||||||
user: Users = Depends(get_current_user)
|
user: Users = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
|
if user.id == user_to_exclude:
|
||||||
|
raise UsersIdIsTheSameException
|
||||||
created_chat = await ChatDAO.create(user_id=user_to_exclude)
|
created_chat = await ChatDAO.create(user_id=user_to_exclude)
|
||||||
return created_chat
|
return created_chat
|
||||||
|
|
||||||
|
|
||||||
@router.get("/last_messages")
|
@router.get("/last_messages")
|
||||||
async def get_last_messages():
|
async def get_last_messages():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ class SMessage(BaseModel):
|
||||||
chat_id: int
|
chat_id: int
|
||||||
user_id: int
|
user_id: int
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
user_avatar: str
|
avatar_image: str
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
from_attributes = True
|
from_attributes = True
|
||||||
|
|
Loading…
Add table
Reference in a new issue