過去ブログ API
移行対象の過去ブログ記事(old_blog)を管理するエンドポイントです。
登録した過去ブログは AI によるリライト(blog_rewriter)の入力となり、生成結果は blog に保存されます。
過去ブログスキーマ
| フィールド | データ型 | 備考 |
|---|---|---|
| id | string | _id |
| race_id | string | null | 紐づくレースの _id。必ずしもレースに紐づくとは限らない |
| race_type | enum | null | auto_racing / bicycle_racing / horse_racing |
| blog_type | string | null | シリーズ種別(例: ジョッキーインタビュー、斎藤コラム) |
| category | string | null | 大分類(例: インタビュー、レース回顧、予想)。文字列で保持する |
| source_url | string | null | 移行元ブログ記事の URL |
| published_at | number | null | 移行元ブログ記事の公開日時。UNIXタイムスタンプ(ミリ秒) |
| name | string | タイトル |
| body_html | string | HTML形式。移行元の本文 |
| created_at | number | UNIXタイムスタンプ(ミリ秒) |
| updated_at | number | UNIXタイムスタンプ(ミリ秒) |
embedding はレスポンスに含まれない
埋め込みベクトルは内部的に保持し、API レスポンスには含めません。
POST /v1/old_blogs
概要
過去ブログ記事を登録します。
登録時に「カテゴリ + タイトル + 本文(タグ除去)」をテキスト化し、Amazon Bedrock の
Titan Text Embeddings v2 でベクトル化して保存します。このベクトルはリライト時に blog へ
引き継がれ、関連情報(類似ブログ)の検索に使われます。
ベクトル化は付加要素のため、失敗しても登録自体は成功します(embedding は未設定のまま)。
リクエストとレスポンス
ヘッダー
リクエストヘッダー
Content-Type: application/json
レスポンスヘッダー
Content-Type: application/json
URI
リクエストボディ
{
"name": "string",
"body_html": "string",
"race_id": "string",
"race_type": "horse_racing",
"blog_type": "string",
"category": "string",
"source_url": "string",
"published_at": 1234567890000
}
| フィールド | データ型 | 必須 | 備考 |
|---|---|---|---|
| name | string | ◯ | タイトル |
| body_html | string | ◯ | HTML形式の本文 |
| race_id | string | 紐づくレースの _id |
|
| race_type | enum | auto_racing / bicycle_racing / horse_racing |
|
| blog_type | string | シリーズ種別 | |
| category | string | 大分類。blog_builder の記事テンプレート選択に使われる | |
| source_url | string | 移行元 URL。本文内の相対画像 src を絶対化する基準にも使う | |
| published_at | number | 移行元の公開日時。UNIXタイムスタンプ(ミリ秒) |
レスポンス
201 Created
過去ブログスキーマを返します。
例外処理
| 説明 | ステータスコード | ステータス名 |
|---|---|---|
| リクエストボディが不正 | 422 | Unprocessable Entity |
| 内部サーバーエラー | 500 | Internal Server Error |
処理フロー
flowchart TD
Start([POST /v1/old_blogs]) --> Embed[カテゴリ + タイトル + 本文をベクトル化]
Embed -->|失敗| Save[ベクトルなしで保存]
Embed -->|成功| Save2[ベクトル付きで保存]
Save --> Success[201 Created]
Save2 --> Success
GET /v1/old_blogs
概要
過去ブログ記事の一覧を取得します。
URI
クエリパラメータ
| パラメータ | データ型 | 必須 | 備考 |
|---|---|---|---|
| race_id | string | レースでフィルタ | |
| page | number | 取得するページ番号。デフォルト: 1 |
|
| size | number | 1ページあたりの件数。デフォルト: 10 |
|
| order | enum | asc / desc(updated_at 基準)。デフォルト: desc |
レスポンス
200 OK
{
"list": [
{
"id": "string",
"race_id": "string",
"race_type": "horse_racing",
"blog_type": null,
"category": "レース回顧",
"source_url": "string",
"published_at": 1234567890000,
"name": "string",
"body_html": "string",
"created_at": 1234567890000,
"updated_at": 1234567890000
}
],
"current_page": 1,
"total_count": 10
}
GET /v1/old_blogs/{old_blog_id}
概要
指定した過去ブログ記事を取得します。
URI
レスポンス
200 OK
過去ブログスキーマを返します。
例外処理
| 説明 | ステータスコード | ステータス名 |
|---|---|---|
| 過去ブログが存在しない | 404 | Not Found |
| 内部サーバーエラー | 500 | Internal Server Error |
PUT /v1/old_blogs/{old_blog_id}
概要
過去ブログ記事のカテゴリのみを更新します。
埋め込みベクトルはカテゴリを含めて生成しているため、カテゴリ変更時はベクトルも作り直します。 ベクトル再生成に失敗した場合は既存のベクトルを維持したまま更新を続行します。
カテゴリが変わらない場合は何も更新せず、現在の値を返します。
URI
リクエストボディ
| フィールド | データ型 | 必須 | 備考 |
|---|---|---|---|
| category | string | 大分類 |
レスポンス
200 OK
更新後の過去ブログスキーマを返します。
例外処理
| 説明 | ステータスコード | ステータス名 |
|---|---|---|
| 過去ブログが存在しない | 404 | Not Found |
| 内部サーバーエラー | 500 | Internal Server Error |
DELETE はない
過去ブログの削除エンドポイントは提供していません。
POST /v1/old_blogs/{old_blog_id}/rewrite
概要
指定した過去ブログのリライトを開始します。
blog を generating 状態で作成し、SQS(blog-rewriter キュー)経由で blog_rewriter Lambda へ
ジョブを依頼します。作成される blog には次の情報が引き継がれます。
| 項目 | 引き継ぎ元 |
|---|---|
name |
old_blog.name |
race_id |
old_blog.race_id。無ければリクエストの race_id |
race_type |
old_blog.race_type。無ければレースを引いて解決する |
blog_type |
old_blog.blog_type |
source_url |
old_blog.source_url |
category_id |
old_blog.category と同名の category を検索して解決。見つからなければカテゴリなし |
embedding |
old_blog.embedding |
レースに紐づかない場合は、レース動画・レース結果の分析をスキップして 原文の内容を保ったリライトのみを行います。
URI
| パスパラメータ | データ型 | 備考 |
|---|---|---|
| old_blog_id | string | old_blog._id |
リクエストボディ
| フィールド | データ型 | 必須 | 備考 |
|---|---|---|---|
| race_id | string | old_blog.race_id が未設定のときに使うレースの _id。ボディ自体を省略してもよい |
レスポンス
202 Accepted
| フィールド | データ型 | 備考 |
|---|---|---|
| id | string | 作成された blog の _id |
例外処理
| 説明 | ステータスコード | ステータス名 |
|---|---|---|
| 過去ブログが存在しない | 404 | Not Found |
race_id 指定時、レースが存在しない |
404 | Not Found |
| 内部サーバーエラー | 500 | Internal Server Error |
処理フロー
flowchart TD
Start([POST /v1/old_blogs/old_blog_id/rewrite]) --> Fetch[過去ブログを取得]
Fetch -->|存在しない| E404[404 Not Found]
Fetch -->|存在する| Race[レース紐づきを解決]
Race --> Category[カテゴリ名から category_id を解決]
Category --> Save[blog を generating で保存]
Save --> SendSQS[SQS blog-rewriter キューへ送信]
SendSQS --> Success[202 Accepted]
SendSQS -.->|非同期| Rewrite[blog_rewriter がリライト]
Rewrite -.-> Build[blog_builder が HTML を構築して保存]
Build -.-> Draft[status を draft に遷移]