Jeden z projektów w moim portfolio pod
michal.ronim.com.pl to portal klubu tenisowego, dostępny
pod portal.raketon.pl. W przeciwieństwie do przykładów
koncepcyjnych na tym blogu (jak "Kwiaciarnia" czy "Szkoła językowa"),
to prawdziwy, rozwijany na bieżąco projekt - ale też nie jest skończony:
część funkcji, w tym rezerwacje kortów, na razie istnieje jako koncepcja
i jest w budowie, nie jako gotowa, używana funkcja.
Problem
Klub prowadził organizację turniejów w arkuszu kalkulacyjnym i przez telefon. Taki model skaluje się źle: każda zmiana terminu wymaga telefonu do organizatora, a rozstrzyganie, kto z kim i kiedy gra w turnieju wielorundowym, robi się szybko nieczytelne bez narzędzia, które samo pilnuje reguł. Docelowo ten sam problem dotyczy rezerwacji kortów - stąd w planach jest system rezerwacji, na razie na etapie koncepcji.
Decyzje architektoniczne
Backend to Django, wystawiający API. Front to osobna aplikacja w Astro, rozdzielona od backendu celowo - dwie różne odpowiedzialności, dwa różne cykle wdrożeń, możliwość podmiany jednej warstwy bez ruszania drugiej.
Rdzeń funkcjonalny to system turniejowy obsługujący pięć różnych formatów rozgrywek - od zwykłej drabinki pucharowej po system szwajcarski - oraz ranking graczy liczony własnym silnikiem rankingu Elo (tym samym mechanizmem, który zna się z szachów: wygrana z wyżej notowanym przeciwnikiem podnosi rating bardziej niż wygrana z kimś słabszym). Silnik jest pokryty testami - ranking to miejsce, gdzie cichy błąd w liczeniu punktów byłby trudny do zauważenia na oko, a jednocześnie bezpośrednio wpływałby na to, kto awansuje w turnieju.
Portal działa jako PWA (Progressive Web App) z powiadomieniami push na telefon - gracz dostaje powiadomienie o nadchodzącym meczu czy zmianie terminu bez konieczności instalowania osobnej aplikacji ze sklepu.
Wdrożenie: Docker na własnym VPS, a nie hosting zarządzany. Deploy idzie przez GitHub Actions, ze skryptem automatycznego rollbacku - jeśli coś pójdzie nie tak po wypchnięciu nowej wersji, infrastruktura sama cofa się do poprzedniej działającej wersji, zamiast zostawiać klub z niedziałającym portalem do czasu ręcznej interwencji.
Ranking bez testów to licznik, któremu się ufa na słowo - dopiero pokrycie testami silnika Elo daje pewność, że każda wygrana i przegrana faktycznie przelicza się tak, jak powinna, niezależnie od tego, ile razy kod był później dotykany.
Stan obecny
Klub sam prowadzi turnieje i wyniki, a ranking przelicza się automatycznie po każdym rozegranym meczu - to już działa na żywo. Rezerwacje kortów są na razie koncepcją, nie wdrożoną funkcją. Projekt jest rozwijany na bieżąco, nie jest zamkniętym "wdrożone i zapomniane" wdrożeniem.