Skip to content

Commit

Permalink
example に実データを使う
Browse files Browse the repository at this point in the history
  • Loading branch information
sushichan044 committed Nov 1, 2024
1 parent d049750 commit 0001665
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 33 deletions.
6 changes: 3 additions & 3 deletions api/birdxplorer_api/openapi_doc.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class FastAPIEndpointDocs(Generic[_KEY]):


SAMPLE_POST_IDS = [PostId("1828261879854309500"), PostId("1828261879854309501")]
SAMPLE_NOTE_IDS = [NoteId("1726874378217161050"), NoteId("1726922868037198220")]
SAMPLE_NOTE_IDS = [NoteId("1845672983001710655"), NoteId("1845776988935770187")]

v1_data_posts_post_id: FastAPIEndpointParamDocs = {
"description": """
Expand Down Expand Up @@ -170,7 +170,7 @@ class FastAPIEndpointDocs(Generic[_KEY]):

v1_data_posts_search_text: FastAPIEndpointParamDocs = {
"description": """
指定した文字列を含む Post を検索して取得する。検索は Post の本文に対して**完全一致**で行われる
指定した文字列を含む Post を検索して取得する。検索は Post の**本文に対して**行われる
""",
"openapi_examples": {
"default": {
Expand Down Expand Up @@ -458,7 +458,7 @@ class FastAPIEndpointDocs(Generic[_KEY]):
# 第2引数を空の辞書にすると mypy に怒られる
# が、第2引数が空の辞書でも怒られない実装にすると param 辞書の補完が効かなくなるので、エラーを無視する
V1DataTopicsDocs = FastAPIEndpointDocs(
"自動分類されたコミュニティノートのトピックを取得するエンドポイント",
"自動分類されたコミュニティノートのトピック一覧を取得するエンドポイント",
{}, # type: ignore[var-annotated]
)

Expand Down
112 changes: 82 additions & 30 deletions api/birdxplorer_api/routers/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from fastapi import APIRouter, HTTPException, Path, Query, Request
from pydantic import Field as PydanticField
from pydantic import HttpUrl
from pydantic_core import Url
from typing_extensions import Annotated

from birdxplorer_api.openapi_doc import (
Expand All @@ -17,7 +16,6 @@
from birdxplorer_common.models import (
BaseModel,
LanguageIdentifier,
NonNegativeInt,
Note,
NoteId,
PaginationMeta,
Expand All @@ -26,64 +24,118 @@
PostId,
Topic,
TopicId,
TopicLabelString,
TwitterTimestamp,
UserEnrollment,
)
from birdxplorer_common.storage import Storage

PaginationMetaWithExamples: TypeAlias = Annotated[
PostsPaginationMetaWithExamples: TypeAlias = Annotated[
PaginationMeta,
PydanticField(
description="ページネーション用情報。 リクエスト時に指定した offset / limit の値に応じて、次のページや前のページのリクエスト用 URL が設定される。",
examples=[
# TODO: 公開エンドポイントの URL に差し替える
PaginationMeta(next=Url("http://127.0.0.1:8000/api/v1/data/posts?offset=100&limit=100"), prev=None)
],
json_schema_extra={
"examples": [
{"next": "http://birdxplorer.onrender.com/api/v1/data/posts?offset=100&limit=100", "prev": "null"}
]
},
),
]

NotesPaginationMetaWithExamples: TypeAlias = Annotated[
PaginationMeta,
PydanticField(
description="ページネーション用情報。 リクエスト時に指定した offset / limit の値に応じて、次のページや前のページのリクエスト用 URL が設定される。",
json_schema_extra={
"examples": [
{"next": "http://birdxplorer.onrender.com/api/v1/data/notes?offset=100&limit=100", "prev": "null"}
]
},
),
]

TopicListWithExamples: TypeAlias = Annotated[
List[Topic],
PydanticField(
description="推定されたトピックのリスト",
examples=[
[
# TODO: 実データの例に差し替える
Topic(
topic_id=TopicId(1),
label={
LanguageIdentifier.EN: TopicLabelString("Technology"),
LanguageIdentifier.JA: TopicLabelString("テクノロジー"),
},
reference_count=NonNegativeInt(123),
)
json_schema_extra={
"examples": [
[
{"label": {"en": "Human rights", "ja": "人権"}, "referenceCount": 5566, "topicId": 28},
{"label": {"en": "Media", "ja": "メディア"}, "referenceCount": 3474, "topicId": 25},
]
]
],
},
),
]

NoteListWithExamples: TypeAlias = Annotated[
List[Note],
PydanticField(
description="コミュニティノートのリスト",
examples=[
[
# TODO: 実データの例に差し替える
json_schema_extra={
"examples": [
{
"noteId": "1845672983001710655",
"postId": "1842116937066955027",
"language": "ja",
"topics": [
{
"topicId": 26,
"label": {"ja": "セキュリティ上の脅威", "en": "security threat"},
"referenceCount": 0,
},
{"topicId": 47, "label": {"ja": "検閲", "en": "Censorship"}, "referenceCount": 0},
{"topicId": 51, "label": {"ja": "テクノロジー", "en": "technology"}, "referenceCount": 0},
],
"summary": "Content Security Policyは情報の持ち出しを防止する仕組みではありません。コンテンツインジェクションの脆弱性のリスクを軽減する仕組みです。適切なContent Security Policyがレスポンスヘッダーに設定されている場合でも、外部への通信をブロックできない点に注意が必要です。 Content Security Policy Level 3 https://w3c.github.io/webappsec-csp/",
"currentStatus": "NEEDS_MORE_RATINGS",
"createdAt": 1728877704750,
},
]
],
},
),
]

PostListWithExamples: TypeAlias = Annotated[
List[Post],
PydanticField(
description="X の Post のリスト",
examples=[
[
# TODO: 実データの例に差し替える
json_schema_extra={
"examples": [
{
"postId": "1846718284369912064",
"xUserId": "90954365",
"xUser": {
"userId": "90954365",
"name": "earthquakejapan",
"profileImage": "https://pbs.twimg.com/profile_images/1638600342/japan_rel96_normal.jpg",
"followersCount": 162934,
"followingCount": 6,
},
"text": "今後48時間以内に日本ではマグニチュード6.0の地震が発生する可能性があります。地図をご覧ください。(10月17日~10月18日) - https://t.co/nuyiVdM4FW https://t.co/Xd6U9XkpbL",
"mediaDetails": [
{
"mediaKey": "3_1846718279236177920-1846718284369912064",
"type": "photo",
"url": "https://pbs.twimg.com/media/GaDcfZoX0AAko2-.jpg",
"width": 900,
"height": 738,
}
],
"createdAt": 1729094524000,
"likeCount": 451,
"repostCount": 104,
"impressionCount": 82378,
"links": [
{
"linkId": "9c139b99-8111-e4f0-ad41-fc9e40d08722",
"url": "https://www.quakeprediction.com/Earthquake%20Forecast%20Japan.html",
}
],
"link": "https://x.com/earthquakejapan/status/1846718284369912064",
},
]
],
},
),
]

Expand All @@ -94,12 +146,12 @@ class TopicListResponse(BaseModel):

class NoteListResponse(BaseModel):
data: NoteListWithExamples
meta: PaginationMeta
meta: NotesPaginationMetaWithExamples


class PostListResponse(BaseModel):
data: PostListWithExamples
meta: PaginationMetaWithExamples
meta: PostsPaginationMetaWithExamples


def str_to_twitter_timestamp(s: str) -> TwitterTimestamp:
Expand Down

0 comments on commit 0001665

Please sign in to comment.