コンテンツにスキップ

過去ブログ 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

POST /v1/old_blogs

リクエストボディ

{
  "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

GET /v1/old_blogs

クエリパラメータ

パラメータ データ型 必須 備考
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

GET /v1/old_blogs/{old_blog_id}

レスポンス

200 OK

過去ブログスキーマを返します。

例外処理

説明 ステータスコード ステータス名
過去ブログが存在しない 404 Not Found
内部サーバーエラー 500 Internal Server Error

PUT /v1/old_blogs/{old_blog_id}

概要

過去ブログ記事のカテゴリのみを更新します。

埋め込みベクトルはカテゴリを含めて生成しているため、カテゴリ変更時はベクトルも作り直します。 ベクトル再生成に失敗した場合は既存のベクトルを維持したまま更新を続行します。

カテゴリが変わらない場合は何も更新せず、現在の値を返します。

URI

PUT /v1/old_blogs/{old_blog_id}

リクエストボディ

{
  "category": "string"
}
フィールド データ型 必須 備考
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

POST /v1/old_blogs/{old_blog_id}/rewrite
パスパラメータ データ型 備考
old_blog_id string old_blog._id

リクエストボディ

{
  "race_id": "string"
}
フィールド データ型 必須 備考
race_id string old_blog.race_id が未設定のときに使うレースの _id。ボディ自体を省略してもよい

レスポンス

202 Accepted

{
  "id": "string"
}
フィールド データ型 備考
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 に遷移]