Currency & Gold Price Monitor

Funkcjonalności

Panel główny i lista obserwowanych

Centrum aplikacji stanowi spersonalizowany panel główny, który wita użytkowników stosownie do pory dnia i wyświetla przegląd bieżącej aktywności rynkowej. Znajdziemy na nim wykres fixingu złota przedstawiający oficjalną cenę NBP złota za gram w PLN z ostatnich dziesięciu dni, wraz ze wskaźnikiem zmiany procentowej i wizualizacją w postaci wykresu warstwowego. Użytkownicy prowadzą własną listę obserwowanych walut. Każda karta na tej liście pokazuje aktualny kurs średni w PLN, uproszczoną linię trendu z ostatniego okresu oraz szybkie odnośniki do strony historii umożliwiające głębszą analizę. Waluty można dodawać i usuwać z listy obserwowanych za pomocą okna modalnego z wyszukiwarką, która filtruje po nazwie lub kodzie spośród wszystkich walut dostępnych w Tabeli A NBP.

Dane historyczne i analityka

Strona historii oferuje dwa tryby analizy. W trybie trendu użytkownik wybiera zakres dat oraz opcjonalnie walutę (lub złoto), po czym pobierane są dane historyczne. Wyniki prezentowane są w postaci interaktywnego wykresu warstwowego oraz tabeli z datą, wartością i numerem tabeli NBP (jeśli dotyczy). Tabela obsługuje rozwijanie w celu wyświetlenia wszystkich wierszy oraz nawigację klawiaturową zapewniającą dostępność. W trybie pojedynczego dnia użytkownik pobiera dokładny oficjalny kurs na wskazany dzień, co jest przydatne przy weryfikacji faktur lub zapewnieniu zgodności z wymogami audytowymi. Dane można eksportować do formatu CSV na potrzeby arkuszy kalkulacyjnych i raportów. API historii wymusza maksymalny zakres 93 dni dla kursów walut i stosuje odpowiednie ograniczenia dat dla złota (od 2013 roku) oraz walut (od 2002 roku).

Konto użytkownika i ustawienia

Uwierzytelnianie jest obsługiwane przez Laravel Fortify i obejmuje rejestrację, logowanie, weryfikację adresu e-mail oraz opcjonalne uwierzytelnianie dwuskładnikowe. Strona ustawień profilu pozwala użytkownikom aktualizować imię i nazwisko, pseudonim, adres e-mail oraz awatar. Zmiana hasła wymaga podania aktualnego hasła i podlega limitowaniu żądań. Sekcja strefy zagrożenia umożliwia usunięcie konta po potwierdzeniu hasłem. Aplikacja obsługuje jasny i ciemny motyw z zachowaniem wyboru między sesjami. Dostępne jest przełączanie języka interfejsu (angielski i polski), zapisywane per użytkownik. W nawigacji po aplikacji pomagają ścieżka okruszkowa oraz responsywny układ z bocznym paskiem nawigacyjnym łączącym panel główny, listę obserwowanych, historię i ustawienia.

Źródło danych i synchronizacja

Wszystkie dane kursów walut i złota pochodzą z oficjalnego API NBP. Aplikacja synchronizuje definicje walut oraz buforuje kursy i ceny złota przy użyciu zaplanowanych poleceń Artisan. Codzienna synchronizacja uruchamia się o godzinie 06:00, a buforowanie o 06:15; mechanizm blokad zapobiega nakładaniu się zadań i wymusza wykonanie na jednym serwerze, co zapewnia bezpieczeństwo w środowiskach wieloinstancyjnych. Serwis NBP normalizuje odpowiedzi API do typowanych obiektów danych oraz obsługuje ponawianie żądań i limity czasu w celu zwiększenia odporności na błędy.

Stos technologiczny

Backend

Backend oparty jest na frameworku Laravel 12 i PHP 8.3. Uwierzytelnianie wraz z obsługą dwuskładnikową zapewnia Laravel Fortify. Inertia.js łączy backend Laravel z frontendem React, dzięki czemu strony są renderowane jako komponenty przypominające aplikację jednostronicową (SPA), z zachowaniem tradycyjnego routingu po stronie serwera i zarządzania sesją. Laravel Wayfinder generuje typebezpieczne adresy URL tras na potrzeby frontendu. Do strukturyzowania obiektów DTO przy przekazywaniu danych między warstwami aplikacji używana jest biblioteka Spatie Laravel Data. Baza danych domyślnie korzysta z MySQL (z możliwością konfiguracji) i zawiera migracje dla tabel: users, currencies, user_currencies, exchange_rates i gold_prices. W trakcie prac deweloperskich dostępny jest Laravel Pail do strumieniowego podglądu logów, a styl kodu PHP wymuszany jest przez Laravel Pint.

Frontend

Frontend zbudowany jest w oparciu o React 19 i TypeScript. Inertia.js z adapterem React zapewnia działanie zbliżone do SPA bez konieczności budowania oddzielnej warstwy API. Zasoby w środowisku deweloperskim obsługuje Vite 7, który odpowiada też za budowanie paczki produkcyjnej. Stylowanie realizowane jest przez Tailwind CSS 4 z wtyczką Vite. Wykresy warstwowe — trend złota na panelu głównym, linie trendów na liście obserwowanych oraz analityka historyczna — renderowane są przez bibliotekę Recharts. Ikony dostarcza Lucide React. Warunkowe stylowanie obsługują Class Variance Authority (CVA) oraz clsx/tailwind-merge. Włączony jest React Compiler (wtyczka Babel) realizujący automatyczne memoizowanie komponentów. Jakość kodu zapewniają ESLint, Prettier oraz rygorystyczna weryfikacja typów TypeScript.

Budowanie i wdrażanie

Konfiguracja Vite obejmuje wtyczkę Laravel do integracji zasobów i odświeżania HMR. Renderowanie po stronie serwera (SSR) obsługiwane jest przez dedykowany punkt wejścia SSR oraz serwerowy adapter Inertia. Wtyczka Wayfinder generuje warianty formularzy i definicje tras dla frontendu. Skrypt deweloperski uruchamia równolegle serwer Laravel, worker kolejki i Vite przy użyciu narzędzia concurrently. Budowanie produkcyjne można uruchomić z SSR lub bez, zależnie od wymagań środowiska docelowego.