perf(slug): point-lookup instead of full discovery #28
Loading…
Reference in a new issue
No description provided.
Delete branch "perf/slug/point-lookup-single-repo"
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?
Что сделано
src/lib/readme-discovery.ts: вынесена общая per-repo логика (detail→readme→cover→parse) вbuildDiscoveredRepo(); добавленаdiscoverSingleRepo(owner, repoName, token, fetchOptions)— точечный поиск одного репо черезGET /repos/{owner}/{repoName}(1 запрос), 404/fork/private/slaid098-dev→null. Цикл вdiscoverShowcaseReposрефакторён вызыватьbuildDiscoveredRepo(без дублирования per-repo логики).src/lib/showcase.ts: добавленаgetShowcaseRepo(slug)— обёрнута в Reactcache()(дедуп per-request), вызываетdiscoverSingleRepoс теми же опциями кеширования (cache: "force-cache",revalidate: 3600, tags:["showcase"]).src/app/[locale]/[slug]/page.tsx:PageиgenerateMetadataпереключены сgetShowcaseRepos()+findRepo()наgetShowcaseRepo(slug)(null →notFound()/return {}).generateStaticParamsбез изменений (используетgetShowcaseRepos()).src/app/[locale]/apps/page.tsx,middleware.ts,__404__/page.tsx— без изменений.getShowcaseRepos+findRepoдля Page (app-detail-features,slug-back-link,generate-metadata), наgetShowcaseRepo.showcase-single-repo.test.ts(11 — nonexistent→null, fork/private/slaid098-dev→null, network error→null, valid→DiscoveredRepo, счётчик fetchей: 1 для 404, 3 для valid, NO list-вызова),slug-point-lookup.test.tsx(4 — Page для unknown slug вызываетnotFound()БЕЗgetShowcaseRepos(), valid slug рендерится БЕЗgetShowcaseRepos(),generateStaticParamsвсё ещё используетgetShowcaseRepos()).Почему
Страницы одиночного репо (
/[locale]/[slug]) и 404 на неизвестном slug делали 7 последовательных запросов к Forgejo API (1 list + 2×3 detail/readme/cover для всех кандидатов) на cold cache, ~1.5–2с. Для 404 страница сначала выполняла все 7 запросов, и только потом вызывалаnotFound(). Точечный поиск черезGET /repos/{owner}/{slug}сокращает: 404 → 1 запрос, валидный slug → 3–4 запроса (detail+readme+cover для одного репо). Warm cache: 0 запросов (тот же tagshowcase, инвалидируется webhook/cron)./appsсписок — без изменений (7 запросов, нужен полный список).Watch out
findRepoоставлен вshowcase.ts(тестыslug-static-params,app-detail-features,slug-back-linkмокают его — совместимость). Спека: опциональное удаление, оставлен.discoverSingleRepoвозвращаетnull(не бросает) на network error — не отличим от 404 без проверки статуса;nullвыбран как более простая 404-логика.generate-metadata.test.ts: mock для/repos/slaid098/opencode-configрасширен полным объектом detail (раньше только{ default_branch }) —discoverSingleRepoиспользует поляname/created_at/description/html_urlиз detail напрямую.getShowcaseRepos—revalidateTag("showcase")(webhook/cron) инвалидирует и list, и single.Pending
—
Closes #27
Code Review Summary
PR реализует точечный lookup одного репо через
GET /repos/{owner}/{slug}вместо full discovery (7 запросов → 1 для 404, 3 для валидного slug). Качество высокое: спецификация issue #27 выполнена полностью, per-repo логика вынесена в общийbuildDiscoveredRepo(без дублирования), тесты покрывают все критерии приемки, backward-compat сохранён.Positives
discoverSingleRepo(404/fork/private/slaid098-dev→ null, те же cache options),getShowcaseRepoобёрнут в Reactcache(),Page/generateMetadataпереключены,generateStaticParamsиapps/page.tsxбез изменений (подтверждено пустым diff).buildDiscoveredRepo(owner, repo, headers, opts)— общий helper, вызывается из обоих путей (discoverSingleRepoи цикл вdiscoverShowcaseRepos). Раньше тело цикла (detail→readme→cover→parse, ~40 строк) дублировалось бы — теперь нет.showcase-single-repo.test.ts(11 тестов: nonexistent→null, fork/private/slaid098-dev→null, network error→null, valid→DiscoveredRepo, счётчик fetchей 1/3, NO list-вызова),slug-point-lookup.test.tsx(4 теста: Page unknown slug → notFound() БЕЗgetShowcaseRepos(), valid slug рендерится БЕЗ list,generateStaticParamsregression — всё ещё list).findRepoполностью удалён из кодовой базы (grep поsrc/— 0 matches), все readers обновлены в этом PR.getShowcaseReposreaders (sitemap.ts,cron-refresh/route.ts,apps/page.tsx,generateStaticParams) не тронуты и остаются валидными.discoverSingleRepo— try/catch на fetch (network error → null), try/catch на json parse (→ null),!detailRes.ok→ null. Документированное решение в PR body и issue spec: network error неотличим от 404 без проверки статуса,nullвыбран для простой 404-логики.perf(slug): point-lookup instead of full discoveryследует convention, body имеет все 4 заголовка осмысленно,## Pending: —допустим, branch name descriptive, нет debug-кода/секретов.Suggestions (info, not blocking)
buildDiscoveredRepo~47 строк — превышает guideline 30 строк для TS из code-standards skill. Однако функция состоит из двух object-literal return'ов (одинаковая форма для readme-missing и parsed case), разбить без искусственной фрагментации сложно. Функция делает одну вещь (build DiscoveredRepo from RepoMeta) — оставлено как есть, приемлемо.discoverShowcaseReposцикл делает свой detail fetch (строки 293-298) вместо вызоваdiscoverSingleRepo. Это намерерно и корректно: list-путь имеет другую error-обработку (makeErrorRepo+ continue vsnull), а общая логика — per-repo build (buildDiscoveredRepo), не detail fetch. Spec issue #27 явно допускал "или общую логику" — автор выбрал shared helper, что валидно.findRepoоставлен вshowcase.ts", но фактическиfindRepoудалён. Удаление — лучший выбор (нет dead code), расхождение косметическое./repos/slaid098/opencode-configрасширен полным detail-объектом (раньше только{ default_branch }). Необходимо:discoverSingleRepoчитаетname/created_at/description/html_urlиз detail напрямую (vs старый list-путь брал их из list item). Корректное обновление.Verdict: APPROVE