Добавил типов ответы на сообщения
This commit is contained in:
parent
3f5cebb69f
commit
ce0086540e
7 changed files with 71 additions and 16 deletions
|
@ -0,0 +1,36 @@
|
|||
"""Добавил таблицу ответов
|
||||
|
||||
Revision ID: b516ed56b44b
|
||||
Revises: 6df47399c087
|
||||
Create Date: 2024-03-17 19:40:43.587035
|
||||
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = 'b516ed56b44b'
|
||||
down_revision: Union[str, None] = '6df47399c087'
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.create_table('answers',
|
||||
sa.Column('answer_id', sa.Integer(), nullable=False),
|
||||
sa.Column('message_id', sa.Integer(), nullable=False),
|
||||
sa.ForeignKeyConstraint(['answer_id'], ['messages.id'], ),
|
||||
sa.ForeignKeyConstraint(['message_id'], ['messages.id'], ),
|
||||
sa.PrimaryKeyConstraint('answer_id')
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_table('answers')
|
||||
# ### end Alembic commands ###
|
|
@ -4,7 +4,7 @@ from app.dao.base import BaseDAO
|
|||
from app.database import async_session_maker, engine
|
||||
from app.exceptions import UserAlreadyInChatException, UserAlreadyPinnedChatException
|
||||
from app.users.models import Users
|
||||
from app.users.chat.models import Chats, Messages, UsersXChats, PinnedChats, PinnedMessages
|
||||
from app.users.chat.models import Chats, Messages, UsersXChats, PinnedChats, PinnedMessages, Answers
|
||||
|
||||
|
||||
class ChatDAO(BaseDAO):
|
||||
|
@ -43,9 +43,11 @@ class ChatDAO(BaseDAO):
|
|||
|
||||
@staticmethod
|
||||
async def get_message_by_id(message_id: int):
|
||||
query = (select(Messages.message, Messages.image_url, Messages.chat_id, Messages.user_id,
|
||||
Messages.created_at, Users.avatar_image, Users.username, Users.avatar_hex).select_from(Messages)
|
||||
query = (select(Messages.id, Messages.message, Messages.image_url, Messages.chat_id, Messages.user_id,
|
||||
Messages.created_at, Users.avatar_image, Users.username, Users.avatar_hex,
|
||||
Answers.answer_id, Answers.message_id).select_from(Messages)
|
||||
.join(Users, Users.id == Messages.user_id)
|
||||
.join(Answers, Answers.answer_id == Messages.id, isouter=True)
|
||||
.where(
|
||||
and_(
|
||||
Messages.id == message_id,
|
||||
|
@ -82,14 +84,16 @@ class ChatDAO(BaseDAO):
|
|||
LIMIT 15 OFFSET 0;
|
||||
"""
|
||||
messages_with_users = (
|
||||
select(Messages.__table__.columns, Users.__table__.columns)
|
||||
select(Messages.__table__.columns, Users.__table__.columns, Answers.__table__.columns)
|
||||
.select_from(Messages)
|
||||
.join(Users, Messages.user_id == Users.id)).cte('messages_with_users')
|
||||
.join(Users, Messages.user_id == Users.id)
|
||||
.join(Answers, Answers.answer_id == Messages.id, isouter=True)).cte('messages_with_users')
|
||||
|
||||
messages = (select(messages_with_users.c.message, messages_with_users.c.image_url,
|
||||
messages = (select(messages_with_users.c.id, 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,
|
||||
messages_with_users.c.username, messages_with_users.c.avatar_hex
|
||||
messages_with_users.c.username, messages_with_users.c.avatar_hex,
|
||||
messages_with_users.c.answer_id, messages_with_users.c.message_id,
|
||||
)
|
||||
.where(
|
||||
and_(
|
||||
|
@ -213,7 +217,7 @@ class ChatDAO(BaseDAO):
|
|||
|
||||
@staticmethod
|
||||
async def get_pinned_messages(chat_id: int) -> list[dict]:
|
||||
query = (select(Messages.message, Messages.image_url,
|
||||
query = (select(Messages.id, Messages.message, Messages.image_url,
|
||||
Messages.chat_id, Messages.user_id,
|
||||
Messages.created_at, Users.avatar_image,
|
||||
Users.username).select_from(PinnedMessages)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import func, ForeignKey, DateTime
|
||||
from sqlalchemy.orm import mapped_column, Mapped, relationship
|
||||
from sqlalchemy.ext.associationproxy import association_proxy
|
||||
|
||||
from app.database import Base
|
||||
|
||||
|
@ -33,19 +33,31 @@ class Messages(Base):
|
|||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
chat_id = mapped_column(ForeignKey("chats.id"))
|
||||
user_id = mapped_column(ForeignKey("users.id"))
|
||||
message: Mapped[Optional[str]]
|
||||
image_url: Mapped[Optional[str]]
|
||||
message: Mapped[str | None]
|
||||
image_url: Mapped[str | None]
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
|
||||
visibility: Mapped[bool] = mapped_column(server_default='true')
|
||||
|
||||
chat = relationship("Chats", back_populates="message")
|
||||
user = relationship("Users", back_populates="message")
|
||||
pinned_messages = relationship("PinnedMessages", back_populates="message")
|
||||
answer_id = relationship("Answers", primaryjoin='Messages.id == Answers.answer_id', back_populates="message")
|
||||
message_id = relationship("Answers", primaryjoin='Messages.id == Answers.message_id', back_populates="message")
|
||||
|
||||
def __str__(self):
|
||||
return f"#{self.id} {self.message} от {self.user_id}. Написано {self.created_at}"
|
||||
|
||||
|
||||
class Answers(Base):
|
||||
__tablename__ = "answers"
|
||||
|
||||
answer_id: Mapped[int] = mapped_column(ForeignKey('messages.id'), primary_key=True)
|
||||
message_id: Mapped[int] = mapped_column(ForeignKey('messages.id'))
|
||||
|
||||
answer_message = relationship("Messages", primaryjoin="Answers.answer_id == Messages.id", back_populates="answer_id")
|
||||
message = relationship("Messages", primaryjoin="Answers.message_id == Messages.id", back_populates="message_id")
|
||||
|
||||
|
||||
class UsersXChats(Base):
|
||||
__tablename__ = "usersxchats"
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ from pydantic import BaseModel, ConfigDict
|
|||
class SMessage(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: int
|
||||
message: str | None = None
|
||||
image_url: str | None = None
|
||||
chat_id: int
|
||||
|
@ -12,6 +13,9 @@ class SMessage(BaseModel):
|
|||
created_at: str
|
||||
avatar_image: str
|
||||
avatar_hex: str
|
||||
answer_id: int | None
|
||||
message_id: int | None
|
||||
|
||||
|
||||
|
||||
class SLastMessages:
|
||||
|
|
|
@ -84,6 +84,7 @@ class UserDAO(BaseDAO):
|
|||
chats_with_avatars.c.id == user_id,
|
||||
chats_with_avatars.c.visibility == True
|
||||
)))
|
||||
|
||||
async with async_session_maker() as session:
|
||||
result = await session.execute(query)
|
||||
result = result.mappings().all()
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
from datetime import date, datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import func, ForeignKey, DateTime
|
||||
from sqlalchemy.orm import mapped_column, Mapped, relationship
|
||||
from sqlalchemy.ext.associationproxy import association_proxy
|
||||
|
||||
from app.database import Base
|
||||
|
||||
|
@ -16,9 +16,7 @@ class Users(Base):
|
|||
hashed_password: Mapped[str]
|
||||
role: Mapped[int] = mapped_column(server_default='0')
|
||||
black_phoenix: Mapped[bool] = mapped_column(server_default='false')
|
||||
avatar_image: Mapped[str | None] = mapped_column(
|
||||
server_default='https://images.black-phoenix.ru/static/images/%D1%82%D1%8B%20%D1%83%D0%B6%D0%B5%20%D0%BF%D0%B5%D1%88%D0%BA%D0%B0%20BP.png'
|
||||
)
|
||||
avatar_image: Mapped[str | None] = mapped_column(server_default='https://images.black-phoenix.ru/static/images/%D1%82%D1%8B%20%D1%83%D0%B6%D0%B5%20%D0%BF%D0%B5%D1%88%D0%BA%D0%B0%20BP.png')
|
||||
avatar_hex: Mapped[str | None] = mapped_column(server_default='#30293f')
|
||||
date_of_birth: Mapped[date]
|
||||
date_of_registration: Mapped[date] = mapped_column(server_default=func.now())
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from fastapi import APIRouter, Response, Depends, status
|
||||
from fastapi import APIRouter, Response, Depends, status, Request
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from app.config import settings
|
||||
|
|
Loading…
Add table
Reference in a new issue