diff --git a/README.md b/README.md index fdf61d3..64ac244 100644 --- a/README.md +++ b/README.md @@ -48,4 +48,7 @@ - датасет comments - так как информации о связи постов комментариев не было - я создал таблицу Comment - - было упоминание "написать комментарий" в таблице логов, которую можно было дополнить столбцом, ведущим к постту, но мне кажется это не очень хорошим решением - сначала разделять на 2 БД, а потом пытаться связать данные внутри них \ No newline at end of file + - было упоминание "написать комментарий" в таблице логов, которую можно было дополнить столбцом, ведущим к постту, но мне кажется это не очень хорошим решением - сначала разделять на 2 БД, а потом пытаться связать данные внутри них + +## мои сомнения +я недопонял смыслого посыла датасета comments, поэтому тот датасет - это количество комментариев одного пользователя под пост другого с деталями \ No newline at end of file diff --git a/src/adapters/database/models/db1/comment.py b/src/adapters/database/models/db1/comment.py index 21af1df..a84270e 100644 --- a/src/adapters/database/models/db1/comment.py +++ b/src/adapters/database/models/db1/comment.py @@ -1,5 +1,5 @@ from sqlalchemy import INTEGER, ForeignKey -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped, mapped_column, relationship from .base import Base from .user import User @@ -11,6 +11,6 @@ class Comment(Base): id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True) text: Mapped[str] author_id: Mapped[int] = mapped_column(ForeignKey(User.id)) - # author: Mapped[User] = relationship(lazy="selectin") + author: Mapped[User] = relationship(lazy="selectin") post_id: Mapped[int] = mapped_column(ForeignKey(Post.id)) - # post: Mapped[Post] = relationship(lazy="selectin") \ No newline at end of file + post: Mapped[Post] = relationship(lazy="selectin") \ No newline at end of file diff --git a/src/adapters/database/models/db1/post.py b/src/adapters/database/models/db1/post.py index e333459..7e13394 100644 --- a/src/adapters/database/models/db1/post.py +++ b/src/adapters/database/models/db1/post.py @@ -1,5 +1,5 @@ from sqlalchemy import INTEGER, ForeignKey -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import Mapped, mapped_column, relationship from .base import Base from .user import User @@ -12,6 +12,9 @@ class Post(Base): header: Mapped[str] text: Mapped[str] = mapped_column(default="") author_id: Mapped[int] = mapped_column(ForeignKey(User.id)) - # author: Mapped[User] = relationship(lazy="selectin") + author: Mapped[User] = relationship(lazy="selectin") blog_id: Mapped[int] = mapped_column(ForeignKey(Blog.id)) - # blog: Mapped[Blog] = relationship(lazy="selectin") \ No newline at end of file + # blog: Mapped[Blog] = relationship(lazy="selectin") + + def __str__(self): + return self.header diff --git a/src/adapters/database/models/db1/user.py b/src/adapters/database/models/db1/user.py index 0511d92..c5fa191 100644 --- a/src/adapters/database/models/db1/user.py +++ b/src/adapters/database/models/db1/user.py @@ -9,3 +9,6 @@ class User(Base): id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True) email: Mapped[str] login: Mapped[str] + + def __str__(self): + return self.login diff --git a/src/api/create_dataset.py b/src/api/create_dataset.py index c5a39c9..63db2d6 100644 --- a/src/api/create_dataset.py +++ b/src/api/create_dataset.py @@ -3,17 +3,46 @@ from fastapi import APIRouter from sqlalchemy import text, func, Date, case, select from src.adapters.database.session import async_session_maker_db1, async_session_maker_db2 -from src.adapters.database.models import User, Blog, Post, Log +from src.adapters.database.models import Log +from src.schemas.dataset_comments import DatasetCommentsItem, DatasetCommentsOutput from src.schemas.dataset_general import DatasetGeneralItem, DatasetGeneralOutput + dataset_router = APIRouter() +RAW_SQL_FOR_COMMENTS = """ +SELECT + u_comment.login as commentator, + p."header" as post_header, + min(u_author.login) as post_owner, + (select COUNT(*) from comment co where co.post_id = p.id and co.author_id = u_comment.id) as comments_count +FROM + post p +inner JOIN "user" u_author + on (u_author.id = p.author_id) +left JOIN comment c + ON (c.post_id = p.id) +inner JOIN "user" u_comment + on (u_comment.id = c.author_id) +group by p.id, u_comment.id + ; +""" -@dataset_router.get("/comments", response_model=None) + +@dataset_router.get("/comments", response_model=DatasetCommentsOutput) async def get_database_comments(): async with async_session_maker_db1() as session: - pass + orm_result = (await session.execute(text(RAW_SQL_FOR_COMMENTS))).all() + items = [] + for record in orm_result: + items.append(DatasetCommentsItem( + commentator_login=record[0], + post_header=record[1], + post_owner=record[2], + comments_count=record[3] + )) + return DatasetCommentsOutput(items=items) diff --git a/src/schemas/dataset_comments.py b/src/schemas/dataset_comments.py index e69de29..ef75738 100644 --- a/src/schemas/dataset_comments.py +++ b/src/schemas/dataset_comments.py @@ -0,0 +1,16 @@ +from pydantic import BaseModel, ConfigDict + + +class DatasetCommentsOutput(BaseModel): + model_config = ConfigDict(from_attributes=True) + + items: list["DatasetCommentsItem"] + + +class DatasetCommentsItem(BaseModel): + model_config = ConfigDict(from_attributes=True) + + commentator_login: str + post_header: str + post_owner: str + comments_count: int