VulCode

ghapi

Własne API statystyk GitHuba, które zasila strony dualfroz.com i vulcode.com oraz README profili: surowy JSON i karty SVG z commitami, językami, frameworkami, testami, seriami i kontrybucjami open source. Kolektor z tokenem GitHuba i API, które czyta tylko gotowe migawki, nigdy nie dzielą sekretów, a aplikacja Discorda odpowiada na te same pytania z dowolnego czatu.

TypAPI statystyk
JęzykPHP 8.2, bez frameworka
ŹródłoGitHub GraphQL i REST
WyjścieJSON, karty SVG
ghapi

Wprowadzenie

ghapi to nasze własne API statystyk GitHuba pod adresem ghapi.dualfroz.com. Zasila strony dualfroz.com i vulcode.com oraz README profili na GitHubie: oddaje surowy JSON i gotowe karty SVG, a do tego aplikację Discorda, która odpowiada na te same pytania z dowolnego czatu.

Napisaliśmy je w czystym PHP 8.2, bez frameworka i bez rozszerzeń spoza domyślnej kompilacji, więc działa na zwykłym PHP-FPM.

Dwie połówki bez wspólnych sekretów

Kolektor

uruchamiany co godzinę przez timer systemd, jako jedyny trzyma token GitHuba i zapisuje gotowe migawki.

API

czyta wyłącznie migawki i nigdy nie woła GitHuba, więc ruch na stronach nie zamienia się w zapytania do GitHuba.

Na dysku nie leży żadne repozytorium. Kolektor rozmawia z API GitHuba: zapytanie GraphQL wypisuje repozytoria skonfigurowanych właścicieli razem z gałęziami, ich głowami, gwiazdkami i językami. Pełne odświeżenie przychodzi raz na dobę, przebiegi pomiędzy dokańczają tylko szczegóły commitów, które nie zmieściły się w limicie zapytań, a po pełnym odświeżeniu podsumowanie trafia na webhook Discorda.

Jak liczy commity

Niezmieniona głowa gałęzi nic nie kosztuje. Przesuniętą porównuje się z poprzednią przez API porównań, a nową gałąź z gałęzią domyślną. Dzięki temu liczą się także commity wypchnięte później albo z cofniętą datą, które zapytanie po dacie by pominęło.

Gdy porównanie pokazuje, że stara głowa jest w tyle, czyli historia została przepisana, kolektor przechodzi repozytorium od nowa i usuwa commity, do których nie da się już dojść. Własne commity rozpoznaje po adresie e-mail autora, pomija merge'e, a każdy nowy commit dostaje listę plików raz, więc liczby dla języków, testów i rodzajów plików to dokładne liczby linii. Przy ruchu gałęzi domyślnej archiwum kodu rozpakowuje się na chwilę do katalogu tymczasowego, gdzie tokei liczy żywy kod, a skaner manifestów rozpoznaje frameworki, po czym katalog znika.

Dane publiczne i prywatne

Wszystko pod ścieżką /v2/public jest otwarte, ma CORS i nigdy nie zawiera nazw prywatnych repozytoriów. Te same ścieżki bez public wymagają klucza i dokładają nazwy oraz dane każdego repozytorium. Każda odpowiedź ma ETag i odpowiada 304 na zapytanie z If-None-Match, a stare ścieżki pierwszej wersji dalej działają.

Co zwraca API

PunktCo zwraca
summarySumy, seria, najczęstsze języki i frameworki, testy, wielkość commitów i open source
commitsCommity w podziale na rok, miesiąc, tydzień, dzień, godzinę i dzień tygodnia
locLinie dodane i usunięte w czasie, żywy kod i rodzaje plików
languages, frameworks, testsJęzyki z udziałem, frameworki z manifestów i linie testów na tle kodu
opensourcePull requesty do publicznych projektów i własne publiczne repozytoria
cardsKarty SVG w motywie ciemnym i jasnym

Karty i Discord

Karty SVG pokazują statystyki, najczęstsze języki, serię, aktywność, mapę ciepła, linie kodu, podział na lata, najważniejsze repozytoria, rozkład godzinowy, osiągnięcia, open source, frameworki i godziny pracy. Karta Discorda czyta profil i obecność zapisywane przez bota serwera VulCode, a aplikacja Discorda odpowiada na pytania o statystyki z dowolnego czatu.

Pytania o ghapi

Więcej projektów

Inne realizacje z tej samej kategorii - zobacz, jak podchodzimy do podobnych wyzwań.

Masz podobny projekt?

Napisz do nas - wycena jest bezpłatna i wraca w godzinę.