from typing import Literal from pydantic import BaseModel class Image(BaseModel): """画像情報を格納するデータクラス - `filename`: 画像ファイル名 - `extension`: 画像拡張子 - `order`: 画像の表示順 - 0: primary - 1 > 2 > ... : optional """ filename: str extension: str order: int class Sns(BaseModel): """SNS情報を格納するデータクラス - `service`: サービス名 (例: "X", "Instagram", "Youtube", etc.) - `url`: URL """ service: str url: str class Project(BaseModel): """団体から提供された企画情報を格納するデータクラス。DBから取得したデータをこれに当てはめる。 - `projectId`: 企画ID (unique) - `circleName`: 団体名 - `circleNameKana`: 団体名読み仮名 - `name`: 企画名 - `category`: 企画ジャンル - `location`: 実施場所 - `areaCode`: エリアコード (T:工北, R:工南, S:理学, L:文法, D:人社・院棟, K:語らいの森, H:本部, E:教育, G:総合校舎) - `description`: 企画内容 - `prSummary`: PRコメント - `prDetail`: PRコメント(詳細ページ用) - `remark`: 注意事項 - `images`: 画像情報 - `socialMedia`: 各種URL情報 """ projectId: str circleName: str circleNameKana: str name: str category: Literal[ "パフォーマンス", "飲食", "物販", "展示", "参加型", "音楽", "その他" ] location: str | None areaCode: str | None description: str | None prSummary: str | None prDetail: str | None remark: str | None images: list[Image] socialMedia: list[Sns] tags: list[str] | None isArchived: bool class ProjectSummary(BaseModel): """/api/projectsのレスポンス用データクラス。企画一覧に表示されるデータ。 - `projectId`: 企画ID (unique) - `circleName`: 団体名 - `name`: 企画名 - `category`: 企画ジャンル - `place`: 実施場所 - `areaCode`: エリアコード (T:工北, R:工南, S:理学, L:文法, D:人社・院棟, K:語らいの森, H:本部, E:教育, G:総合校舎) - `description`: 企画内容 - `prSummary`: PRコメント - `remark`: 注意事項 - `image`: 画像情報 """ projectId: str circleName: str name: str category: Literal[ "パフォーマンス", "飲食", "物販", "展示", "参加型", "音楽", "その他" ] location: str | None areaCode: str | None description: str | None prSummary: str | None remark: str | None image: Image | None tags: list[str] | None isArchived: bool class ProjectDetail(BaseModel): """/api/details?projectId=xxxのレスポンス用データクラス。企画詳細ページに表示されるデータ。 - `projectId`: 企画ID (unique) - `circleName`: 団体名 - `name`: 企画名 - `category`: 企画ジャンル - `location`: 実施場所 - `areaCode`: エリアコード (T:工北, R:工南, S:理学, L:文法, D:人社・院棟, K:語らいの森, H:本部, E:教育, G:総合校舎) - `description`: 企画内容 - `prSummary`: PRコメント - `prDetail`: PRコメント(詳細ページ用) - `remark`: 注意事項 - `images`: 画像情報 - `socialMedia`: 各種URL情報 """ projectId: str circleName: str name: str category: Literal[ "パフォーマンス", "飲食", "物販", "展示", "参加型", "音楽", "その他" ] location: str | None areaCode: str | None description: str | None prSummary: str | None prDetail: str | None remark: str | None images: list[Image] socialMedia: list[Sns] tags: list[str] | None isArchived: bool class ProjectIds(BaseModel): """/api/searchのレスポンス用データクラス。 ## example: ``` { "projectIds": ["62000A", "62000B", "62000C"] } ``` """ projectIds: list[str]