fix(discovery): switch runtime from GitHub API to Forgejo API #5
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/discovery/forgejo-api-migration"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Перевёл рантайм discovery с GitHub API на Forgejo API (
git.slaid098.dev). Логика (fetch list → detail → raw README + cover-meta → parse → render) не изменилась — только URL-шаблоны, заголовки и webhook.src/lib/git-host.ts(новый) — единый конфиг хоста:FORGEJO_URL,FORGEJO_API,SHOWCASE_OWNER,FORGEJO_TOKEN+ хелперforgejoHeaders()(Authorization: token {token},Accept: application/json).src/lib/readme-discovery.ts— эндпоинты Forgejo API v1: списокGET /api/v1/users/{owner}/repos?limit=50(клиентский фильтр!r.private), detailGET /api/v1/repos/{owner}/{repo}, raw READMEGET /api/v1/repos/{owner}/{repo}/raw/README.md?ref={branch}, cover SHAGET /api/v1/repos/{owner}/{repo}/contents/assets/cover.png?ref={branch}. Заголовки черезforgejoHeaders().src/app/apps/[slug]/cover/route.ts— raw coverGET /api/v1/repos/{owner}/{repo}/raw/assets/cover.png?ref={branch}.src/lib/showcase.ts—SHOWCASE_OWNERимпортируется изgit-host.ts,FORGEJO_TOKENвместоGITHUB_TOKEN.src/app/api/webhook/route.ts—x-github-event→x-gitea-event,x-hub-signature-256(hex с префиксомsha256=) →x-gitea-signature(hex без префикса), envGITHUB_WEBHOOK_SECRET→WEBHOOK_SECRET. HMAC +timingSafeEqualс guard равных длин сохранён. Event filter:push(default branch + README.md/cover.png в commits) /repository/public(showcase) / other skip.src/components/site-footer.tsx— ссылка наhttps://git.slaid098.dev/slaid098.src/components/qa-chat.tsx—PROJECT_LINKS→ Forgejo URL.src/lib/support.ts—GITHUB_URL→FORGEJO_PROFILE_URL(Forgejo URL,@publicсохранён).src/lib/i18n.ts—footer.github→footer.repo(«Forgejo»),appDetail.github→appDetail.repo(«Репозиторий →»/«Repository →»).src/app/[locale]/[slug]/page.tsx— хардкод «GitHub →» заменён наd.appDetail.repo..env.example—GITHUB_TOKEN→FORGEJO_TOKEN,GITHUB_WEBHOOK_SECRET→WEBHOOK_SECRET, добавленFORGEJO_URL=https://git.slaid098.dev.scripts/spike-discovery.ts—GITHUB_TOKEN→FORGEJO_TOKEN.src/__tests__/) — hostname-матчеры (api.github.com/raw.githubusercontent.com→git.slaid098.dev//api/v1), URL-паттерны (raw/raw/...?ref=, contents/contents/...?ref=), имена webhook-заголовков (x-gitea-event/x-gitea-signature), env-имена (WEBHOOK_SECRET),htmlUrlнаgit.slaid098.dev/slaid098/.... Добавлен тест на фильтр приватных репо.Почему
GitHub-аккаунт
slaid098забанен,api.github.com/raw.githubusercontent.comмертвы. Git remote уже на Forgejo (git.slaid098.dev). Discovery нейтрален к хосту — достаточно было сменить URL-шаблоны и заголовки, не трогая парсинг/рендер.Watch out
/api/webhookи убедиться, что secret в Forgejo =WEBHOOK_SECRETenv. Forgejo шлётX-Gitea-Event/X-Gitea-Signature(hex без префикса) — код уже обновлён.FORGEJO_TOKEN: должен иметь read-доступ к публичным репоslaid098/*. Для публичных репо токен опционален, но без него Forgejo может rate-limit'ить.visibilityparam: у Forgejo параметрvisibilityв/users/{owner}/reposможет не работать — фильтр публичности (!r.private) сделан на стороне клиента.footer.github→footer.repo,appDetail.github→appDetail.repo— если есть внешние потребители i18n-словаря, нужно обновить.Pending
WEBHOOK_SECRET).FORGEJO_URL,FORGEJO_TOKEN,WEBHOOK_SECRETв Vercel env (убрать старыеGITHUB_TOKEN,GITHUB_WEBHOOK_SECRET).Closes #2
Code Review Summary
Чистая миграция discovery с GitHub API на Forgejo API: URL-шаблоны, заголовки и webhook обновлены, парсинг/рендер не тронут. Все cross-file связи (git-host.ts→cover/discovery/showcase, i18n.ts→footer/page, .env.example→consumers) обновлены в одном PR — missing paired updates нет. Тесты полностью переведены на Forgejo-матчеры + добавлен тест на фильтр приватных репо.
Positives
src/lib/git-host.ts— отличная дедупликация:makeGithubHeaders(был в 2 файлах) → единыйforgejoHeaders()с optional token. Конфиг хоста в одном месте (FORGEJO_URL/FORGEJO_API/SHOWCASE_OWNER/FORGEJO_TOKEN).src/app/api/webhook/route.ts:13-20—verifySignatureкорректен: guard равных длин (a.length !== b.length) ПЕРЕДtimingSafeEqual(предотвращает throw), hex без префиксаsha256=.revalidateTagв try/catch → 200 всегда (не ломает webhook при cache backend down).src/lib/readme-discovery.ts:202— self-exclusionr.name !== "slaid098-dev"сохранён, добавлен клиентский фильтр!r.private(Forgejovisibilityparam ненадёжен).fetchCoverMeta/fetchReadme/discoverShowcaseReposсохранилиcache: "force-cache"+next:{revalidate:3600, tags:["showcase"]}.fetchCoverMetaвозвращает{ exists, sha }(blob SHA для cache-busting, ADR-022) — контракт сохранён.src/lib/support.ts:25-28—@publicJSDoc перенесён сGITHUB_URLнаFORGEJO_PROFILE_URL(Knip не ругается).noUncheckedIndexedAccess+exactOptionalPropertyTypes— guards соблюдены:?? "",?? null,default_branch?: stringв cover route,data.shaпроверяетсяtypeof === "string".api.github.com/raw.githubusercontent.com→git.slaid098.dev//api/v1), webhook-заголовки (x-gitea-event/x-gitea-signatureбез префикса), env (WEBHOOK_SECRET). Добавлен тестfilters out private repos.Suggestions (info, not blocking)
FORGEJO_PROFILE_URLэкспортируется, но footer (site-footer.tsx:22) хардкодит тот же URLhttps://git.slaid098.dev/slaid098. Это существующее дублирование (было сGITHUB_URL) — можно подключить footer к константе в отдельном PR.discoverShowcaseRepos~80 строк (TS standard — <30). Существующая функция, структурно не изменена — не регрессия. Можно разбить наfetchRepoDetail+buildDiscoveredRepoв будущем.Verdict: APPROVE