<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>API on 設計書</title><link>https://Hitamuki.github.io/image-upload/design/api/</link><description>Recent content in API on 設計書</description><generator>Hugo</generator><language>ja</language><atom:link href="https://Hitamuki.github.io/image-upload/design/api/index.xml" rel="self" type="application/rss+xml"/><item><title>API一覧</title><link>https://Hitamuki.github.io/image-upload/design/api/0_api%E4%B8%80%E8%A6%A7/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/api/0_api%E4%B8%80%E8%A6%A7/</guid><description>&lt;h1 id="api一覧"&gt;API一覧&lt;a class="anchor" href="#api%e4%b8%80%e8%a6%a7"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;ID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;メソッド&lt;/th&gt;
 &lt;th style="text-align: left"&gt;パス&lt;/th&gt;
 &lt;th style="text-align: left"&gt;概要&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api001-upload/"&gt;api001&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;POST&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/images/presigned-url&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;S3アップロード用の署名付きURLを発行する&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api002-upload/"&gt;api002&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;POST&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/images&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像メタデータを登録する&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api003-upload/"&gt;api003&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;GET&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/images&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード済み画像の名前リスト取得&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;a href="https://Hitamuki.github.io/image-upload/design/api/images/api004-upload/"&gt;api004&lt;/a&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;GET&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;/images/:id&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;画像の閲覧用URL（Presigned）取得&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>API共通仕様</title><link>https://Hitamuki.github.io/image-upload/design/api/1_api%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/api/1_api%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98/</guid><description>&lt;h1 id="api共通仕様"&gt;API共通仕様&lt;a class="anchor" href="#api%e5%85%b1%e9%80%9a%e4%bb%95%e6%a7%98"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;全APIエンドポイントに共通して適用される仕様を定義する。&lt;/p&gt;
&lt;h2 id="ベースurl"&gt;ベースURL&lt;a class="anchor" href="#%e3%83%99%e3%83%bc%e3%82%b9url"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/api/v1&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="共通ヘッダー"&gt;共通ヘッダー&lt;a class="anchor" href="#%e5%85%b1%e9%80%9a%e3%83%98%e3%83%83%e3%83%80%e3%83%bc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="リクエスト"&gt;リクエスト&lt;a class="anchor" href="#%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;ヘッダー名&lt;/th&gt;
 &lt;th style="text-align: center"&gt;必須&lt;/th&gt;
 &lt;th style="text-align: left"&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;X-Trace-ID&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✓&lt;/td&gt;
 &lt;td style="text-align: left"&gt;トレーサビリティID（UUID v4）。フロントエンドで生成し全リクエストに付与する&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;X-Request-ID&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✓&lt;/td&gt;
 &lt;td style="text-align: left"&gt;リクエスト識別ID（UUID v4）。フロントエンドで生成し、冪等性制御とキャンセルに使用する&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Content-Type&lt;/td&gt;
 &lt;td style="text-align: center"&gt;△&lt;/td&gt;
 &lt;td style="text-align: left"&gt;リクエストボディがある場合は &lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="レスポンス"&gt;レスポンス&lt;a class="anchor" href="#%e3%83%ac%e3%82%b9%e3%83%9d%e3%83%b3%e3%82%b9"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;ヘッダー名&lt;/th&gt;
 &lt;th style="text-align: left"&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Content-Type&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="共通エラーレスポンス形式"&gt;共通エラーレスポンス形式&lt;a class="anchor" href="#%e5%85%b1%e9%80%9a%e3%82%a8%e3%83%a9%e3%83%bc%e3%83%ac%e3%82%b9%e3%83%9d%e3%83%b3%e3%82%b9%e5%bd%a2%e5%bc%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;code&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;フィールド名&lt;/th&gt;
 &lt;th style="text-align: left"&gt;説明&lt;/th&gt;
 &lt;th style="text-align: left"&gt;例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;code&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラーコード&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;INVALID_FILE_SIZE&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;message&lt;/td&gt;
 &lt;td style="text-align: left"&gt;エラーメッセージ&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;ファイルサイズが上限（5MB）を超えています&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="共通ステータスコード"&gt;共通ステータスコード&lt;a class="anchor" href="#%e5%85%b1%e9%80%9a%e3%82%b9%e3%83%86%e3%83%bc%e3%82%bf%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%89"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;コード&lt;/th&gt;
 &lt;th style="text-align: left"&gt;メッセージID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;説明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;429&lt;/td&gt;
 &lt;td style="text-align: left"&gt;MSG-API-C001&lt;/td&gt;
 &lt;td style="text-align: left"&gt;レート制限超過&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;500&lt;/td&gt;
 &lt;td style="text-align: left"&gt;MSG-API-C002&lt;/td&gt;
 &lt;td style="text-align: left"&gt;サーバー内部エラー&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="レート制限"&gt;レート制限&lt;a class="anchor" href="#%e3%83%ac%e3%83%bc%e3%83%88%e5%88%b6%e9%99%90"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;同一IPアドレスから1分間に10リクエストを超えた場合、&lt;code&gt;429 Too Many Requests&lt;/code&gt; を返す。&lt;/p&gt;
&lt;h2 id="トレーサビリティ"&gt;トレーサビリティ&lt;a class="anchor" href="#%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b5%e3%83%93%e3%83%aa%e3%83%86%e3%82%a3"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="id-の役割"&gt;ID の役割&lt;a class="anchor" href="#id-%e3%81%ae%e5%bd%b9%e5%89%b2"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;X-Trace-ID&lt;/strong&gt;: セッション全体の横断的トレーサビリティを確保するためのID&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;X-Request-ID&lt;/strong&gt;: 単一操作の冪等性制御とキャンセルに使用するID&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="実装方針"&gt;実装方針&lt;a class="anchor" href="#%e5%ae%9f%e8%a3%85%e6%96%b9%e9%87%9d"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;フロントエンドは UUID v4 の &lt;code&gt;X-Trace-ID&lt;/code&gt; を生成し、全リクエストヘッダーに付与する。&lt;/li&gt;
&lt;li&gt;フロントエンドは UUID v4 の &lt;code&gt;X-Request-ID&lt;/code&gt; を生成し、各操作のリクエストヘッダーに付与する。&lt;/li&gt;
&lt;li&gt;バックエンドは両方のIDをリクエストヘッダーから受け取り、全レイヤのログに引き継ぐ。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Request-ID&lt;/code&gt; は冪等性チェックに使用し、DBには保存しない（メモリ内で管理）。&lt;/li&gt;
&lt;li&gt;ログは Pino で構造化（JSON）出力し、CloudWatch Logs に集約する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="懸案事項"&gt;懸案事項&lt;a class="anchor" href="#%e6%87%b8%e6%a1%88%e4%ba%8b%e9%a0%85"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="認証認可方式の未確定"&gt;認証・認可方式の未確定&lt;a class="anchor" href="#%e8%aa%8d%e8%a8%bc%e8%aa%8d%e5%8f%af%e6%96%b9%e5%bc%8f%e3%81%ae%e6%9c%aa%e7%a2%ba%e5%ae%9a"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;現状&lt;/strong&gt;: API共通仕様に認証機構が定義されていない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影響&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;ユーザー識別が不可能で、アップロード枚数上限がグローバル制約となる&lt;/li&gt;
&lt;li&gt;アクセス制御ができず、全ユーザーが全画像にアクセス可能&lt;/li&gt;
&lt;li&gt;監査証跡が不完全で、誰がどの操作を行ったか追跡不可&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対応方針&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;JWTトークンまたはセッションベース認証の選定&lt;/li&gt;
&lt;li&gt;Authorizationヘッダーの必須化&lt;/li&gt;
&lt;li&gt;ユーザーIDの全リクエストへの引き継ぎ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hono-middlewareへの影響"&gt;Hono Middlewareへの影響&lt;a class="anchor" href="#hono-middleware%e3%81%b8%e3%81%ae%e5%bd%b1%e9%9f%bf"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;現状&lt;/strong&gt;: 認証ミドルウェアが未実装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影響&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;各APIエンドポイントで個別に認証チェックが必要&lt;/li&gt;
&lt;li&gt;コード重複とメンテナンス性の低下&lt;/li&gt;
&lt;li&gt;セキュリティポリシーの統一が困難&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対応方針&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;認証ミドルウェアの共通化&lt;/li&gt;
&lt;li&gt;ユーザー情報のContextへの格納&lt;/li&gt;
&lt;li&gt;認可エラーハンドリングの統一&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="トレーサビリティと認証の連携"&gt;トレーサビリティと認証の連携&lt;a class="anchor" href="#%e3%83%88%e3%83%ac%e3%83%bc%e3%82%b5%e3%83%93%e3%83%aa%e3%83%86%e3%82%a3%e3%81%a8%e8%aa%8d%e8%a8%bc%e3%81%ae%e9%80%a3%e6%90%ba"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;現状&lt;/strong&gt;: trace_idのみでユーザー情報が紐づかない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影響&lt;/strong&gt;: ユーザー単位の障害調査や監査が困難&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対応方針&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;trace_idとuser_idの両方をログに記録&lt;/li&gt;
&lt;li&gt;ユーザー操作のエンドツーエンド追跡を可能にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tbd"&gt;TBD&lt;a class="anchor" href="#tbd"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="認証方式の技術選定"&gt;認証方式の技術選定&lt;a class="anchor" href="#%e8%aa%8d%e8%a8%bc%e6%96%b9%e5%bc%8f%e3%81%ae%e6%8a%80%e8%a1%93%e9%81%b8%e5%ae%9a"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JWTトークン方式&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;メリット: ステートレス、スケーラビリティ高、SPA親和性&lt;/li&gt;
&lt;li&gt;デメリット: トークン失効・リフレッシュ処理の複雑化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セッション方式&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;メリット: 実装シンプル、サーバー側制御容易&lt;/li&gt;
&lt;li&gt;デメリット: ステートフル、スケーラビリティ制約&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;選定基準&lt;/strong&gt;: セキュリティ要件、運用要件、パフォーマンス要件を考慮&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ミドルウェアアーキテクチャ設計"&gt;ミドルウェアアーキテクチャ設計&lt;a class="anchor" href="#%e3%83%9f%e3%83%89%e3%83%ab%e3%82%a6%e3%82%a7%e3%82%a2%e3%82%a2%e3%83%bc%e3%82%ad%e3%83%86%e3%82%af%e3%83%81%e3%83%a3%e8%a8%ad%e8%a8%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;認証ミドルウェアの実装順序（レート制限→認証→認可）&lt;/li&gt;
&lt;li&gt;エラーハンドリングの共通化&lt;/li&gt;
&lt;li&gt;Context情報の型定義と引き継ぎ仕様&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="認可モデルの設計"&gt;認可モデルの設計&lt;a class="anchor" href="#%e8%aa%8d%e5%8f%af%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e8%a8%ad%e8%a8%88"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;リソースベース認可&lt;/strong&gt;: 画像所有者のみアクセス許可&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ロールベース認可&lt;/strong&gt;: 管理者権限の定義（将来拡張）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スコープ制御&lt;/strong&gt;: 読み取り専用・書き込み専用アクセスの制御&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="セキュリティ強化項目"&gt;セキュリティ強化項目&lt;a class="anchor" href="#%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3%e5%bc%b7%e5%8c%96%e9%a0%85%e7%9b%ae"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;トークン有効期限の最適設定&lt;/li&gt;
&lt;li&gt;リフレッシュトークンの導入検討&lt;/li&gt;
&lt;li&gt;CSRF対策の実装方針&lt;/li&gt;
&lt;li&gt;APIキー管理（将来的な外部連携向け）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="パフォーマンスへの影響評価"&gt;パフォーマンスへの影響評価&lt;a class="anchor" href="#%e3%83%91%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%b3%e3%82%b9%e3%81%b8%e3%81%ae%e5%bd%b1%e9%9f%bf%e8%a9%95%e4%be%a1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;認証チェックのオーバーヘッド測定&lt;/li&gt;
&lt;li&gt;キャッシュ戦略との整合性&lt;/li&gt;
&lt;li&gt;負荷テストでの性能検証&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>APIメッセージ一覧表</title><link>https://Hitamuki.github.io/image-upload/design/api/2_api%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E4%B8%80%E8%A6%A7%E8%A1%A8/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://Hitamuki.github.io/image-upload/design/api/2_api%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E4%B8%80%E8%A6%A7%E8%A1%A8/</guid><description>&lt;h1 id="apiメッセージ一覧表"&gt;APIメッセージ一覧表&lt;a class="anchor" href="#api%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e4%b8%80%e8%a6%a7%e8%a1%a8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;APIレスポンスに含まれるエラーメッセージを管理する。&lt;code&gt;{変数名}&lt;/code&gt; は動的に置換される。&lt;/p&gt;
&lt;h2 id="共通メッセージ"&gt;共通メッセージ&lt;a class="anchor" href="#%e5%85%b1%e9%80%9a%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;全APIで共通して使用するメッセージ。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;メッセージID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;ステータスコード&lt;/th&gt;
 &lt;th style="text-align: left"&gt;code&lt;/th&gt;
 &lt;th style="text-align: left"&gt;メッセージテンプレート&lt;/th&gt;
 &lt;th style="text-align: left"&gt;変数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-C001&lt;/td&gt;
 &lt;td style="text-align: left"&gt;429&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;RATE_LIMIT_EXCEEDED&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;リクエスト数が上限（{limit}回/{window}）を超えました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;limit&lt;/code&gt;: 上限回数（例: 10）、&lt;code&gt;window&lt;/code&gt;: 時間窓（例: 1分）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-C002&lt;/td&gt;
 &lt;td style="text-align: left"&gt;500&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;INTERNAL_SERVER_ERROR&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;サーバーエラーが発生しました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="個別メッセージ"&gt;個別メッセージ&lt;a class="anchor" href="#%e5%80%8b%e5%88%a5%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;メッセージID&lt;/th&gt;
 &lt;th style="text-align: left"&gt;ステータスコード&lt;/th&gt;
 &lt;th style="text-align: left"&gt;code&lt;/th&gt;
 &lt;th style="text-align: left"&gt;メッセージテンプレート&lt;/th&gt;
 &lt;th style="text-align: left"&gt;変数&lt;/th&gt;
 &lt;th style="text-align: left"&gt;発生条件&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-001&lt;/td&gt;
 &lt;td style="text-align: left"&gt;400&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;INVALID_FILE_SIZE&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイルサイズが上限（{maxSize}）を超えています&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;maxSize&lt;/code&gt;: 上限サイズ（例: 5MB）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;fileSize &amp;gt; 5,242,880 bytes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-002&lt;/td&gt;
 &lt;td style="text-align: left"&gt;400&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;INVALID_CONTENT_TYPE&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;対応していないファイル形式です（許可形式: {allowedTypes}）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;allowedTypes&lt;/code&gt;: 許可MIMEタイプ一覧（例: jpeg, png, gif, webp）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;contentType が許可リスト外&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-003&lt;/td&gt;
 &lt;td style="text-align: left"&gt;409&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;UPLOAD_LIMIT_EXCEEDED&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード可能な枚数の上限（{maxCount}枚）に達しています&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;maxCount&lt;/code&gt;: 上限枚数（例: 5）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;アップロード済み枚数 &amp;gt;= 上限&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-004&lt;/td&gt;
 &lt;td style="text-align: left"&gt;422&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;INVALID_FILE_BINARY&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;ファイルのバイナリ検証に失敗しました&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;マジックナンバー不一致&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-005&lt;/td&gt;
 &lt;td style="text-align: left"&gt;404&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;FILE_NOT_FOUND_ON_S3&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;S3上にファイルが存在しません&lt;/td&gt;
 &lt;td style="text-align: left"&gt;—&lt;/td&gt;
 &lt;td style="text-align: left"&gt;HeadObject で対象キーが見つからない&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;MSG-API-006&lt;/td&gt;
 &lt;td style="text-align: left"&gt;404&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;IMAGE_NOT_FOUND&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;指定された画像が存在しません（id: {id}）&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;id&lt;/code&gt;: リクエストされた画像ID&lt;/td&gt;
 &lt;td style="text-align: left"&gt;DBに対象IDが存在しない&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>