Skip to content

fix(kusa): contribution APIを新Deno Deployへ移行し、Search API失敗時の全体エラーを修正 - #1375

Merged
swfz merged 2 commits into
mainfrom
fix/kusa-contribution-api-migration
Jul 30, 2026
Merged

fix(kusa): contribution APIを新Deno Deployへ移行し、Search API失敗時の全体エラーを修正#1375
swfz merged 2 commits into
mainfrom
fix/kusa-contribution-api-migration

Conversation

@swfz

@swfz swfz commented Jul 30, 2026

Copy link
Copy Markdown
Owner

概要

Deno Deploy Classic の停止で参照できなくなっていた kusa の contribution API を、新 Deno Deploy へ移したデプロイ先に差し替える。あわせて、その検証中に見つかった Search API 失敗時に Detail 全体が壊れる問題を修正する。

why

contribution API の移行漏れ

Deno Deploy Classic が 2026-07-20 に停止し、参照していた2つのエンドポイントが両方とも死んでいた。

https://github-contributions-api.deno.dev/swfz.json          → 404 DEPLOYMENT_NOT_FOUND
https://forked-gh-contributions-wt0jrc54gcqt.deno.dev/swfz   → 404 DEPLOYMENT_NOT_FOUND
  "Deno Deploy Classic was sunset on July 20, 2026 and no longer serves deployments."

primary(upstream のデプロイ)が落ちたときのフォールバック先も同じ Classic 上にあったため、/kusa/[username] の SSR は常に [null, null] を返し、Today / Yesterday / Streak / Coverage と OG の description がすべて - になっていた。

Search API 失敗で Detail 全体がエラーになる

未認証の GitHub Search API は 10req/min で枯れる。その 403 応答は Access-Control-Allow-Origin: *; という不正な値を返すため、ブラウザは CORS 違反として fetch 自体を reject する。search-api.tsif (!res.ok) return [] で握る作りだったが、reject ではその分岐に到達せず例外が伝播し、React Query が error 状態になって Detail 全体が "Error" 表示になっていた(curl では正常な * が返るためブラウザからしか再現しない)。

how

  • pages/kusa/[username].tsx の参照先を、fork を新 Deno Deploy へデプロイした https://forked-contributions-api.swfz.deno.net に変更
    • 生きている代替が存在しなくなったため、フォールバックへの retry 分岐は削除
    • レスポンス形式は旧 API と同一(週ごとのネスト配列 / to パラメータ / CORS・cache ヘッダ)なので他の変更は不要
  • search-api.ts の3関数を共通ヘルパ fetchSearchItems に集約し、fetch が reject しても空配列に倒す
  • e2e に「contribution API が落ちていてもページは表示され統計は - になる」ケースを追加(モックサーバーが deadapi に 503 を返す)
  • e2e の Search API 呼び出しをモックし、レート制限に依存しないようにした

確認観点

  • 移行先 API が旧 API と互換の応答を返すこと(週ごとのネスト配列 / to パラメータ / 最終要素が当日)
  • 実 API に対する SSR 疎通(og:description に実データが入ること)
    og:description" content="Today: 9, Yesterday: 7, Streak: 5, Coverage: 70%"
    
  • API 停止時にページが落ちず統計が - になること(e2e で固定)
  • Search API が例外を投げても空配列を返すこと(unit test 3件追加)
  • jest: 83 passed / 8 suites
  • playwright: kusa 9 passed(新規1件含む) / navigation・timer 8 passed
  • eslint: 0 errors(warning 28件はすべて既存)
  • prettier / tsc --noEmit ともにエラーなし

🤖 Generated with Claude Code

swfz added 2 commits July 31, 2026 03:09
未認証のSearch APIはレート制限に達すると403を返すが、その応答の
Access-Control-Allow-Originが不正な値(`*;`)のためブラウザがCORS違反として
fetch自体をrejectする。`!res.ok`の分岐に到達せず例外が伝播していたため、
1リクエストの失敗でReact Queryがerror状態になりDetail全体が"Error"表示に
なっていた。取得結果が空でもページは成立するので、失敗時は空配列に倒す。

e2e側もSearch APIのレート制限に依存して不安定だったためモックする。
Deno Deploy Classicが2026-07-20に停止し、参照していたupstreamの
github-contributions-api.deno.devもフォールバック先のforked-gh-contributions-*.deno.devも
DEPLOYMENT_NOT_FOUNDになっていた。結果としてToday/Yesterday/Streak/Coverageと
OGのdescriptionがすべて`-`になっていたため、新Deno Deployへ移したデプロイ先を参照する。

生きている代替が存在しなくなったのでフォールバックのretry分岐は削除する。
同じ事故を検知できるよう、APIが落ちていてもページが表示され統計が`-`になることを
e2eで固定する。
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tools-oswo Ready Ready Preview Jul 30, 2026 6:10pm

@swfz
swfz merged commit c525115 into main Jul 30, 2026
8 checks passed
@swfz
swfz deleted the fix/kusa-contribution-api-migration branch July 30, 2026 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant