ダッシュボードのTask Schedulerバッジが更新されない問題を調査中、GitHub APIの重要な特性を発見した。
問題は、CSVファイルを更新した後、ダッシュボードのバッジ表示(「Today」「Yesterday」など)が即座に更新されないことだった。Mongolian Headwordsのバッジは1-3秒で更新されるのに、Task Schedulerは数分かかる。
原因は、使用していたAPIエンドポイントの違いだった。当初、commitsリストAPIを使用していた:
// 遅いアプローチ
const commitsUrl = `https://api.github.com/repos/${owner}/${repo}/commits?path=${filePath}`;
const commits = fetch(commitsUrl).getContentText();
const latestCommit = JSON.parse(commits)[0];
このエンドポイントには15-60秒の伝播遅延がある。GitHubが内部的にコミットリストをキャッシュし、定期的にしか更新しないためだ。
解決策は、2段階のアプローチだった:
ステップ1:Content APIで最新のSHAを取得
const contentUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${filePath}`;
const content = fetch(contentUrl).getContentText();
const sha = JSON.parse(content).sha;
Content APIは1-3秒で更新され、常に最新のSHA値を返す。
ステップ2:SHA値で直接コミット情報を取得
const commitUrl = `https://api.github.com/repos/${owner}/${repo}/commits/${sha}`;
const commit = fetch(commitUrl).getContentText();
const commitData = JSON.parse(commit);
この方法により、コミットリストAPIの遅延を回避しつつ、完全なコミットメタデータ(日時、著者、メッセージ)を取得できる。
ダッシュボードのアーキテクチャは、デュアルAPI戦略を使用するようになった:
- 高速データ取得:Content APIで最新の状態を確認
- 詳細メタデータ:commit-by-SHA APIで履歴情報を取得
キャッシュメカニズム(5分TTL)も正しく機能していることを確認した。問題はキャッシュではなく、APIエンドポイントの選択だった。
現在、Task Schedulerバッジは、Mongolian Headwordsと同じ速度(1-3秒)で更新される。この経験から、APIの各エンドポイントの特性を理解することの重要性を学んだ。