Audyt podstron, endpointów i testów¶
Nieaktualne od 2026-08-21. Bieżący stan aplikacji opisuje
APP_STATUS_2026-08-21.md. Największe usterki z tego audytu zostały naprawione: proxy dla/judge-fingerprinti/reasoning-linesistnieją,/blogpobiera prawdziwe dane,npm run typecheckprzechodzi, a testy jednostkowe backendu i frontendu są zielone./accessibilityjest już publiczna (frontend/lib/supabase/public-route-policy.ts:22), wbrew wierszowi w tabeli. Tabela poniżej pozostaje przydatna jako szczegółowy spis per-trasa — traktuj jej werdykty jako historyczne.
Stan repozytorium: 2026-08-05. Audyt obejmuje wszystkie 63 pliki frontend/app/**/page.tsx, ich zależności od 99 handlerów tras Next.js (96 pod /api i 3 poza nim), 38 routerów oraz 3 grupy LangServe rejestrowane w backend/app/server.py (290 unikalnych endpointów FastAPI w introspekcji runtime), a także testy Jest, Playwright i pytest.
Wniosek: nie wszystkie podstrony są gotowe produkcyjnie. Najpoważniejsze problemy to niedziałające wywołania chronionego backendu z /judge-fingerprint i /reasoning-lines*, makiety zamiast integracji na /blog* oraz /use-cases/uk-judgments, pięć endpointów FastAPI zasłoniętych przez wcześniej zarejestrowane trasy dynamiczne, co najmniej pięć proxy kierujących do nieistniejącego upstreamu, brak publicznego dostępu do wielu stron informacyjnych i prawnych oraz nierówne pokrycie testami. next typegen poprawnie wygenerował typy routingu, ale pełny npm run typecheck nie przechodzi z powodu błędu TypeScript w components/blog/admin/tiptap-editor.tsx:518. Wszystkie 117 zestawów Jest (1629 testów) zaliczyły asercje, lecz proces nie zakończył się sam z powodu otwartych uchwytów. poetry run pytest -q -m unit zakończył się wynikiem 2621 zaliczonych, 24 pominiętych i 27 niezaliczonych testów; awarie obejmują kontrakty auth 401/403, tworzenie ekstrakcji zwracające 422, autocomplete/topic-click zwracające 422 i jeden test zgodności schematu. Testy Playwright nie zostały uruchomione, ponieważ wymagają działających usług i poświadczeń; pełny zestaw E2E jest w CI uruchamiany ręcznie.
Legenda stanu: ✅ gotowe lub adekwatne; ⚠️ działa częściowo albo ma istotne ryzyko; ❌ niedziałające lub makieta; ➖ endpoint nie jest potrzebny dla strony statycznej.
Snapshot z konkretnej daty. Tabela opisuje stan z 2026-08-05 i nie jest aktualizowana automatycznie. Część pozycji została już naprawiona:
/schemas/[id]zwraca prawdziwe statusy HTTP (#428, doprecyzowane w #433),/documents/[id]również (#423), a kontrakty odpowiedzi i własności publikacji poprawiono w #413 i #424. Pozostałych wpisów nie weryfikowano ponownie przy dodawaniu tej notki — przed działaniem na pojedynczym wierszu sprawdź bieżący kod.
| Podstrona | Plik i dostęp | Dane / endpointy | Stan routingu i endpointów | Testy |
|---|---|---|---|---|
/ |
frontend/app/page.tsx:193; publiczna |
/api/dashboard/stats, /api/dashboard/trending-topics, /api/collections |
⚠️ Statystyki są publiczne, ale anonimowy render uruchamia też dwa hooki blokowane przez middleware; proxy statystyk maskuje awarię backendu odpowiedzią 200 z zerami. | ⚠️ LandingPage unit, smoke /, dashboard E2E i backend dashboard; brak direct testów proxy dashboard. |
/about |
frontend/app/about/page.tsx:21; publiczna |
Brak, strona statyczna | ✅ Endpoint niepotrzebny. | ⚠️ Tylko smoke i matrix middleware. |
/accessibility |
frontend/app/accessibility/page.tsx:6; wymaga sesji |
Brak, strona statyczna | ⚠️ Technicznie poprawna, ale strona informacyjna jest nieoczekiwanie za logowaniem. | ❌ Brak testu strony. |
/admin |
frontend/app/admin/page.tsx:49; AdminGuard |
Bezpośrednio /api/admin/stats, /api/admin/activity, /api/admin/system/health; dodatkowo /api/dashboard/stats |
⚠️ Backend i JWT są spięte, ale klient używa NEXT_PUBLIC_BACKEND_URL, którego nie przekazują pliki Compose/Docker (przekazują NEXT_PUBLIC_API_BASE_URL); domyślny URL działa lokalnie, jest ryzykowny w produkcji. |
⚠️ Backend admin ma unit/integration; brak testu strony i ścieżki produkcyjnej klienta. |
/admin/content |
frontend/app/admin/content/page.tsx:16; AdminGuard |
Backend /api/admin/content/stats |
⚠️ Ten sam problem konfiguracji URL co /admin. |
⚠️ Backend testowany; UI nie. |
/admin/documents |
frontend/app/admin/documents/page.tsx:88; AdminGuard |
Backend /api/admin/documents/stats |
⚠️ Ten sam problem konfiguracji URL co /admin. |
⚠️ Backend testowany; UI nie. |
/admin/system |
frontend/app/admin/system/page.tsx:83; AdminGuard |
Backend /api/admin/system/health |
⚠️ Ten sam problem konfiguracji URL co /admin. |
⚠️ Backend testowany; UI nie. |
/admin/users |
frontend/app/admin/users/page.tsx:18; AdminGuard |
Backend /api/admin/users |
⚠️ Ten sam problem konfiguracji URL co /admin. |
⚠️ Backend testowany; UI nie. |
/argumentation-analysis |
frontend/app/argumentation-analysis/page.tsx:285; wymaga sesji |
/api/argumentation → /argumentation/analyze |
✅ Proxy dodaje klucz API i pasuje metodą oraz ścieżką do FastAPI. | ⚠️ Klient API oraz backend unit/integration; brak testu strony i proxy. |
/auth/error |
frontend/app/auth/error/page.tsx:8; publiczna |
Brak, prezentacja błędu | ✅ Endpoint niepotrzebny. | ⚠️ Pokryta tylko rodziną auth E2E/middleware. |
/auth/forgot-password |
frontend/app/auth/forgot-password/page.tsx:3; publiczna |
Supabase Auth reset password | ✅ Integracja adekwatna, powrót do /auth/update-password. |
⚠️ Auth E2E, brak direct unit strony. |
/auth/login |
frontend/app/auth/login/page.tsx:16; publiczna |
Supabase Auth | ✅ Sanitizuje next i przekierowuje zalogowanego użytkownika. |
✅ Smoke oraz rozbudowane auth E2E, choć część starszych scenariuszy używa nieistniejących nazw tras. |
/auth/sign-up-success |
frontend/app/auth/sign-up-success/page.tsx:9; publiczna |
Brak, strona statyczna | ✅ Endpoint niepotrzebny. | ⚠️ Tylko pokrycie rodziny auth. |
/auth/sign-up |
frontend/app/auth/sign-up/page.tsx:4; publiczna |
Supabase Auth + /auth/confirm |
✅ Routing jest przygotowany. | ⚠️ Auth E2E; brak direct testu strony i handlera confirm. |
/auth/update-password |
frontend/app/auth/update-password/page.tsx:3; publiczna |
Supabase Auth update user | ✅ Routing jest przygotowany. | ⚠️ Auth E2E; brak direct unit strony. |
/blog |
frontend/app/blog/page.tsx:147; wymaga sesji |
Lokalny mockPosts; backend /blog/posts nie jest używany |
❌ Makieta: brak realnego pobierania danych i publicznego proxy; dodatkowo „publiczny” blog wymaga logowania. | ❌ Brak testu strony/publicznego API. |
/blog/[slug] |
frontend/app/blog/[slug]/page.tsx:307; wymaga sesji |
Jeden lokalny mockPost |
❌ Slug jest ignorowany, każdy URL pokazuje ten sam wpis, brak notFound(). |
❌ Brak testu strony. |
/blog/admin |
frontend/app/blog/admin/page.tsx:48; wymaga tylko sesji |
/api/blog/admin/posts, /api/blog/admin/stats → backend admin |
⚠️ Endpointy i backend wymagają admina, ale UI nie ma AdminGuard; zwykły użytkownik dochodzi do ekranu i dostaje 403. |
⚠️ Next admin routes i backend CRUD testowane; strona/guard nie. |
/blog/admin/new |
frontend/app/blog/admin/new/page.tsx:17; wymaga tylko sesji |
POST /api/blog/admin/posts |
⚠️ Endpoint poprawny, brak guardu admina w UI. | ⚠️ Handler/backend testowane; strona nie. |
/blog/admin/[id] |
frontend/app/blog/admin/[id]/page.tsx:13; wymaga tylko sesji |
GET/PUT /api/blog/admin/posts/[id] |
⚠️ Endpoint poprawny, brak guardu admina w UI. | ⚠️ Handler/backend testowane; strona nie. |
/changelog |
frontend/app/changelog/page.tsx:13; wymaga sesji |
Lokalne release-notes/*.md |
✅ Bez API; pliki są uwzględnione w standalone build. | ⚠️ Parser changelogu ma unit test; brak testu strony. |
/changelog/[version] |
frontend/app/changelog/[version]/page.tsx:27; wymaga sesji |
Lokalny plik wersji | ✅ Jedyna dynamiczna strona jawnie używająca notFound() dla braku rekordu. |
⚠️ Parser unit; brak testu routingu strony. |
/chat |
frontend/app/chat/page.tsx:78; wymaga sesji |
/api/chat, /api/chats, /api/example_questions, Supabase messages |
✅ BFF i backend są spięte; chat stream/historia mają właściwe trasy. | ✅ Liczne component/unit i E2E; direct handler test ma tylko root /api/chats, nie cała rodzina. |
/chat/[id] |
frontend/app/chat/[id]/page.tsx:11; wymaga sesji |
/api/chats/[id]/messages, /fork, /export, /api/chats |
⚠️ Funkcjonalnie spięte; brak chatu daje client-side empty state z HTTP 200 zamiast 404. | ✅ Liczne E2E chat; proxy potomne bez pełnego direct coverage. |
/collections |
frontend/app/collections/page.tsx:105; wymaga sesji |
CRUD /api/collections → /collections |
✅ Metody i ścieżki odpowiadają backendowi. | ⚠️ Pełny flow E2E i direct test root; bieżący backend test auth nie przechodzi, bo oczekuje 401, a endpoint zwraca 403. |
/collections/[id] |
frontend/app/collections/[id]/page.tsx:6; wymaga sesji |
/api/collections/[id], /documents, /api/documents/[id] |
⚠️ CRUD działa; brak kolekcji jest komunikatem z HTTP 200, nie 404. | ✅ E2E oraz direct testy większości proxy; brak direct testu documents/[documentId]. |
/contact |
frontend/app/contact/page.tsx:36; wymaga sesji |
/api/contact → Supabase + Resend |
⚠️ Handler jest przygotowany, lecz kontakt nie jest dostępny anonimowo. | ⚠️ Direct unit handlera; brak testu strony. |
/cookies |
frontend/app/cookies/page.tsx:8; wymaga sesji |
Brak, strona statyczna | ⚠️ Polityka cookies jest nieoczekiwanie niepubliczna. | ❌ Brak testu strony. |
/dataset-comparison |
frontend/app/dataset-comparison/page.tsx:80; wymaga sesji |
Lokalny JSON i wykresy | ✅ Endpoint niepotrzebny dla statycznego zestawu danych. | ❌ Brak testu tej strony. |
/documents/[id] |
frontend/app/documents/[id]/page.tsx:19; wymaga sesji |
/api/documents/[id]/{metadata,html,similar}, /api/documents/{summarize,key-points}, versions |
⚠️ Główne endpointy są poprawnie spięte; brak dokumentu daje ErrorCard z HTTP 200. | ✅/⚠️ Najlepsze pokrycie: direct page unit, liczne E2E i 6 handlerów; bieżący backend test auth nie przechodzi przez różnicę 401/403. |
/ecosystem |
frontend/app/ecosystem/page.tsx:143; publiczna |
Brak, strona statyczna | ✅ Endpoint niepotrzebny. | ⚠️ Tylko matrix middleware. |
/extract |
frontend/app/extract/page.tsx:161; wymaga sesji |
/api/collections, /api/schemas, /api/jobs, /api/extractions*, schema generator |
⚠️ Główny przepływ ma proxy, ale statyczne /extractions/prompts i /extractions/schemas są zasłonięte przez wcześniej zarejestrowane /{job_id}; część API jest nieosiągalna. |
⚠️ E2E extraction/schema istnieją, lecz bieżące unit testy tworzenia ekstrakcji dostają 422 zamiast oczekiwanych 202/400; brak direct unit strony i wielu proxy. |
/extractions |
frontend/app/extractions/page.tsx:810; wymaga sesji |
/api/jobs, /api/extractions, /api/extractions/delete |
✅ Routing jest zgodny z backendem. | ✅/⚠️ E2E i backend router tests; direct testy tylko części handlerów. |
/extractions/[id] |
frontend/app/extractions/[id]/page.tsx:686; wymaga sesji |
/api/extractions?job_id=..., export |
⚠️ Dane są spięte; brak wyniku jest stanem klienta z HTTP 200. | ✅/⚠️ E2E list/detail i backend tests; bez direct testu strony. |
/help |
frontend/app/help/page.tsx:28; wymaga sesji |
Lokalny tour store | ✅ Endpoint niepotrzebny. | ❌ Brak testu strony. |
/judge-fingerprint |
frontend/app/judge-fingerprint/page.tsx:22; wymaga sesji |
Bezpośrednio ${NEXT_PUBLIC_API_BASE_URL}/judge-fingerprint/* |
❌ Backend istnieje, ale jest globalnie chroniony X-API-Key; przeglądarka nie wysyła klucza, a proxy Next nie istnieje. |
❌ Tylko test i18n komponentów; brak testu HTTP backendu/proxy/E2E. |
/legal/disclaimer |
frontend/app/legal/disclaimer/page.tsx:14; wymaga sesji |
Brak, strona statyczna | ⚠️ Dokument prawny jest nieoczekiwanie niepubliczny. | ❌ Brak testu strony. |
/legal/terms |
frontend/app/legal/terms/page.tsx:13; wymaga sesji |
Brak, strona statyczna | ⚠️ Dokument prawny jest nieoczekiwanie niepubliczny. | ❌ Brak testu strony. |
/onboarding |
frontend/app/onboarding/page.tsx:81; publiczna |
Brak, strona statyczna | ✅ Endpoint niepotrzebny. | ⚠️ Testowany modal welcome, nie sama strona. |
/precedents |
frontend/app/precedents/page.tsx:160; wymaga sesji |
/api/precedents/find → /precedents/find |
✅ Proxy sprawdza użytkownika i dodaje klucz API. | ⚠️ Klient API i backend unit/integration; brak testu strony i proxy. |
/privacy |
frontend/app/privacy/page.tsx:11; wymaga sesji |
Brak, strona statyczna | ⚠️ Polityka prywatności jest nieoczekiwanie niepubliczna. | ❌ Brak testu strony. |
/publications |
frontend/app/publications/page.tsx:18; wymaga sesji |
/api/publications → /publications |
⚠️ Endpoint działa, ale błąd lub pusta baza są maskowane statycznym fallbackiem; strona opisana jako publiczna jest za auth middleware. | ⚠️ Backend integration; brak testu strony i wszystkich proxy publikacji. |
/publications/admin |
frontend/app/publications/admin/page.tsx:33; AdminGuard |
CRUD /api/publications* |
✅ Auth, BFF i backend są logicznie spięte. | ⚠️ Backend integration; brak direct testów proxy i UI. |
/publications/admin/new |
frontend/app/publications/admin/new/page.tsx:11; AdminGuard |
POST /api/publications + schemas/collections/jobs |
✅ Główna ścieżka jest przygotowana. | ⚠️ Backend integration; brak direct testów proxy i strony. |
/publications/admin/[id] |
frontend/app/publications/admin/[id]/page.tsx:17; AdminGuard |
/api/publications/[id]/{schemas,collections,extraction-jobs} |
⚠️ Endpointy istnieją; lokalny redirect używa redirect=, podczas gdy login czyta next=. |
⚠️ Backend integration; brak direct testów proxy/UI. |
/reasoning-lines |
frontend/app/reasoning-lines/page.tsx:106; wymaga sesji |
Bezpośrednio ${NEXT_PUBLIC_API_BASE_URL}/reasoning-lines/* |
❌ Backend wymaga X-API-Key, klient go nie wysyła, brak proxy Next; dodatkowo /reasoning-lines/dag jest zasłonięte przez wcześniejsze /{line_id}. |
❌ Tylko testy helperów backendu; komentarz testu wskazuje brak integration tests tras. |
/reasoning-lines/[id] |
frontend/app/reasoning-lines/[id]/page.tsx:55; wymaga sesji |
Bezpośrednio /reasoning-lines/* |
❌ Ten sam brak klucza/proxy; brak rekordu dodatkowo daje HTTP 200 z EmptyState. | ❌ Brak testu strony, proxy i endpointów HTTP. |
/saved-searches |
frontend/app/saved-searches/page.tsx:187; wymaga sesji |
CRUD /api/saved-searches → Supabase |
✅ Handler i store są zgodne. | ✅/⚠️ Direct route i store unit; brak direct testu strony, przepływy E2E używają mocków. |
/schema-chat |
frontend/app/schema-chat/page.tsx:47; wymaga sesji |
/api/schemas*, /api/schema-generator/{chat,simple}, /api/collections, versions |
⚠️ Routing jest szeroki, ale /schemas/db/{id}/versions/compare jest zasłonięte przez wcześniejsze /{version_number}; aktualny backend schemas integration suite jest wyłączony z powodu nieaktualnych mocków. |
⚠️ Dużo unitów edytora i E2E, ale tylko root /api/schemas ma direct test; backend integration nie daje obecnie pełnej gwarancji. |
/schemas |
frontend/app/schemas/page.tsx:59; wymaga sesji |
/api/schemas, /api/schemas/stats |
⚠️ Endpointy istnieją; ograniczona gwarancja integracyjna jak wyżej. | ⚠️ Root handler i edytor testowane; stats/proxy i aktywna integracja backendu niepełne. |
/schemas/base |
frontend/app/schemas/base/page.tsx:31; wymaga sesji |
/api/extractions/base-schema/definition |
✅ Endpoint istnieje i jest spięty. | ✅/⚠️ Direct route i backend regression tests; brak testu strony. |
/schemas/[id] |
frontend/app/schemas/[id]/page.tsx:31; wymaga sesji |
/api/schemas/[id], DELETE /api/schemas?id=... |
⚠️ Endpointy istnieją; brak schematu jest stanem klienta, nie 404 strony. | ⚠️ Root schemas handler i unit edytora; brak direct testu [id] oraz aktywnej pełnej integracji. |
/search |
frontend/app/search/page.tsx:682; wymaga sesji |
/api/search/{documents,autocomplete,suggest,topic-click} + document/chunk fallbacki |
⚠️ Główna ścieżka /api/search/documents działa, ale /documents/facets jest zasłonięte przez /{document_id}; proxy enhance_query, documents/search/direct, dwa proxy chunks i similarity-graph celują w upstreamy nieobecne w runtime FastAPI. |
⚠️ Direct page integration, hook/component unit i liczne E2E istnieją, lecz bieżące backend testy autocomplete/topic-click zwracają 422, a mockowane proxy nie wykrywają brakujących upstreamów. |
/search/extractions |
frontend/app/search/extractions/page.tsx:416; wymaga sesji |
/api/extractions/base-schema/{filter,facets,histogram,nl-filter} |
✅ Endpointy odpowiadają backendowi. | ✅ E2E strony, hook unit oraz backend tests; część proxy bez direct testu. |
/settings |
frontend/app/settings/page.tsx:623; wymaga sesji |
/api/embeddings, /api/email-alerts |
⚠️ Używane ścieżki istnieją; store zawiera martwe wywołanie nieistniejącego /api/email-alerts/log, którego strona obecnie nie uruchamia. |
❌ Brak testu strony i handlerów settings; backend embeddings ma testy. |
/statistics |
frontend/app/statistics/page.tsx:165; wymaga sesji |
/api/dashboard/stats → /dashboard/stats |
⚠️ Proxy zwraca HTTP 200 z zerami przy awarii, więc UI nie odróżnia błędu od pustych danych. | ⚠️ Helpery i backend dashboard testowane; brak testu strony/proxy. |
/status |
frontend/app/status/page.tsx:13; publiczna |
Polling /api/health/status → /health/status |
✅ Proxy dodaje klucz API i ścieżka jest publicznie dozwolona przez middleware. | ⚠️ Matrix middleware i backend health tests; brak direct testu proxy/strony. |
/team |
frontend/app/team/page.tsx:116; wymaga sesji |
Brak, strona statyczna | ⚠️ Strona informacyjna jest nieoczekiwanie niepubliczna. | ❌ Brak testu strony. |
/terms |
frontend/app/terms/page.tsx:11; wymaga sesji |
Brak, strona statyczna | ⚠️ Drugi dokument warunków jest nieoczekiwanie niepubliczny. | ❌ Brak testu strony. |
/topic-modeling |
frontend/app/topic-modeling/page.tsx:268; wymaga sesji |
/api/topic-modeling/analyze → /topic-modeling/analyze |
✅ Proxy dodaje klucz API i metody są zgodne. | ⚠️ Klient/helper i proxy unit; backend integration akceptuje też HTTP 500, więc happy path nie jest mocno dowiedziony. |
/topics |
frontend/app/topics/page.tsx:88; wymaga sesji |
/api/search/topics/{meta,trending,my-clicks}, /api/search/topic-click |
⚠️ Ścieżki mają proxy, ale bieżące testy backendu topic-click kończą się 422 dla poprawnych według testów danych. | ❌/⚠️ Direct test tylko topic-click; wiele testów backend topic-click/meta nie przechodzi, brak testu strony i pozostałych proxy. |
/use-cases |
frontend/app/use-cases/page.tsx:8; wymaga sesji |
Brak, strona statyczna | ✅ Endpoint niepotrzebny. | ❌ Brak testu strony. |
/use-cases/uk-judgments |
frontend/app/use-cases/uk-judgments/page.tsx:25; wymaga sesji |
Jeden lokalny mockData, placeholdery wykresów |
❌ Jawne TODO „Replace with actual API call”; brak endpointu i realnych danych. | ❌ Brak realnego testu strony/API/E2E. |
Pokrycie zbiorcze: tylko 2 z 63 stron są bezpośrednio importowane przez testy stron (/search i /documents/[id]); tylko 26 z 99 handlerów Next ma direct test importujący handler. Największe luki testowe dotyczą /judge-fingerprint, /reasoning-lines*, publikacji po stronie frontendu, proxy dashboard/health, settings, publicznego bloga oraz większości stron statycznych. Matrix middleware obejmuje jedynie wybrane trasy, a jego test publicznego API uznaje nawet 404 za dopuszczalny wynik, więc nie potwierdza istnienia endpointu.