Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Postにメディア情報を紐づける #110

Merged
merged 15 commits into from
Oct 8, 2024
Merged

Conversation

sushichan044
Copy link
Collaborator

@sushichan044 sushichan044 commented Sep 30, 2024

closes #71

やりたいこと

API側の GET /posts において、media クエリを用いて必要なら画像や動画などのメディア情報を取得できるようにする

実装詳細

  • 既に仮置きされていた MediaDetails を変更した
    • list[HttpUrl] | None -> list[XMedia]
    • Noneを除去しないと SQL Alchemy側でリレーションが組めない
  • DB的には Post.idMedia.media_key の N:N relationとして格納している
    • 命名を media に統一するか xmediaに統一するかは意見をいただきたいです

Warning

API側で、 media=false のテストを書いた際に、 pydantic のモデル周りの罠を踏んでおりテストが壊れています
#113 をMergeすると治ります

todo

@sushichan044 sushichan044 self-assigned this Sep 30, 2024
@sushichan044
Copy link
Collaborator Author

sushichan044 commented Sep 30, 2024

9666eb6 時点で手元の tox は通っているが CI が落ちている

@yu23ki14
Copy link
Collaborator

yu23ki14 commented Oct 1, 2024

命名を media に統一するか xmediaに統一するかは意見をいただきたいです

mediaに統一でお願いします!

@sushichan044
Copy link
Collaborator Author

mediaに統一でお願いします!

承知です!ありがとうございます

@sushichan044
Copy link
Collaborator Author

sushichan044 commented Oct 1, 2024

memo Post.media_details にアクセスしたときに PostMedia中間テーブルにどういうSQLが飛んでいるか確認しておく。
理想は関連するMediaRecordまで一気にJOINされている状態だが、N回クエリを飛ばしていそうなら対応する

@sushichan044
Copy link
Collaborator Author

sushichan044 commented Oct 2, 2024

memo
test_posts_get_with_media_false のみテストが落ちる。
pydanticのmodel copyをした際に参照が変わるが、その際にlinkが変わっている?

Full diff:
    {
        'data': [
            {
                'createdAt': 1153921700000,
                'impressionCount': 30,
                'likeCount': 10,
  -             'link': 'http://localhost/',
  +             'link': 'https://x.com/User1/status/2234567890123456791',
                'mediaDetails': [],
                'postId': '2234567890123456791',
                'repostCount': 20,
                'text': 'このブログ記事、めちゃくちゃ参考になった!🔥 チェックしてみて!\n'
                '\n'
                'https://t.co/yyyyyyyyyyy/ #学び #自己啓発',
                'xUser': {
                    'followersCount': 100,
                    'followingCount': 200,
                    'name': 'User1',
                    'profileImage': 'http://localhost/',
                    'userId': '1234567890123456781',
                },
                'xUserId': '1234567890123456781',
            },
        ],
        'meta': {
            'next': None,
            'prev': None,
        },
    }

@sushichan044
Copy link
Collaborator Author

sushichan044 commented Oct 2, 2024

そもそもlinkは XUser.idpost_id から計算できるので、 Computed Fieldにした方が良さそう
ref: https://docs.pydantic.dev/latest/concepts/fields/#the-computed_field-decorator

=> 修正PR作成済み #114

@sushichan044 sushichan044 marked this pull request as ready for review October 2, 2024 06:42
@sushichan044 sushichan044 requested a review from yu23ki14 October 2, 2024 06:42
@sushichan044
Copy link
Collaborator Author

sushichan044 commented Oct 2, 2024

Post.media_details にアクセスした際に発生するクエリは以下のよう。
おそらく意図通りアクセスした時点で関連するメディアを1回のクエリで取得できている。
N+1 にはなっていないとみられる。

INFO:sqlalchemy.engine.Engine:SELECT post_media.post_id AS post_media_post_id, post_media.media_key AS post_media_media_key, media_1.media_key AS media_1_media_key, media_1.type AS media_1_type, media_1.url AS media_1_url, media_1.width AS media_1_width, media_1.height AS media_1_height 
FROM post_media LEFT OUTER JOIN media AS media_1 ON media_1.media_key = post_media.media_key 
WHERE %(param_1)s = post_media.post_id
INFO:sqlalchemy.engine.Engine:[cached since 0.001606s ago] {'param_1': '2234567890123456801'}

@yu23ki14 yu23ki14 merged commit 22da0ca into main Oct 8, 2024
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

/post エンドポイントの返却にMedia(画像や動画)を追加する
2 participants