Aplikacja webowa do planowania wyjazdów na festiwale muzyczne. Pozwala śledzić lineup, organizować wyjazdy grupowe, oceniać wykonawców i budować wspólny plan oglądania koncertów.
- Frontend: React 19 + TypeScript, Vite, Tailwind CSS v4, Framer Motion
- Backend / baza danych: Supabase (PostgreSQL + Row Level Security + Edge Functions)
- Routing: React Router v7
- i18n: i18next (PL, EN, CS)
- PWA: vite-plugin-pwa
- Zarządzanie festiwalami i ich lineupem (sceny, godziny, wykonawcy)
- Widok timetable z podziałem na dni i sceny
- Baza wykonawców z profilami, ocenami i linkami do Spotify
- Tworzenie wyjazdów grupowych, zapraszanie uczestników przez e-mail
- Ocenianie wykonawców w skali interakcji (per wyjazd, opcjonalnie ukryte rankingi)
- Import lineupów z JSON
Komponent src/components/Festivals/LineupImporter.tsx umożliwia masowy import lub aktualizację występów dla danego festiwalu na podstawie danych JSON.
Tablica obiektów JSON:
[
{
"artist_name": "Band Name",
"date": "2026-06-12",
"start_time": "21:30",
"end_time": "23:00",
"stage_name": "Main Stage",
"date_tbd": false,
"origin_country": "US"
}
]| Pole | Typ | Opis |
|---|---|---|
artist_name |
string (wymagane) | Nazwa wykonawcy — używana do dopasowania z bazą |
date |
YYYY-MM-DD |
Dzień festiwalowy (nie kalendarzowy — patrz sekcja Late Night) |
start_time |
HH:MM |
Godzina rozpoczęcia |
end_time |
HH:MM |
Godzina zakończenia (opcjonalne) |
stage_name |
string | Nazwa sceny — jeśli nie istnieje, zostanie utworzona |
date_tbd |
boolean | Jeśli true, data jest nieznana; domyślnie true gdy brak date |
origin_country |
string | Kraj pochodzenia — używany tylko przy tworzeniu nowego wykonawcy |
Przed zapisem importer analizuje JSON i dla każdego wpisu ustala:
- Czy wykonawca istnieje w tabeli
bands(porównanie nazwy case-insensitive). Nowi oznaczeni są badgeNEW. - Czy scena istnieje w tabeli
stagesdla tego festiwalu. Nowe sceny zostaną utworzone przy imporcie. - Czy show już istnieje w tabeli
showsdla tego festiwalu i tego wykonawcy. Istniejące oznaczone są badgeUPDATE— zostaną zaktualizowane, nie zduplikowane.
Na tym etapie żadne dane nie są zapisywane.
Operacje wykonywane kolejno:
- Tworzenie nowych wykonawców — tylko ci z badge
NEW, deduplikacja po nazwie. - Rozwiązanie ID wykonawców — ponowne pobranie tabeli
bandspo ewentualnym dodaniu nowych. - Tworzenie nowych scen — tylko te, które nie istniały w festiwalu.
- Rozwiązanie ID scen — ponowne pobranie tabeli
stagespo ewentualnym dodaniu nowych. - Zapis shows — podział na dwie grupy:
INSERT— nowe shows (wykonawca nie miał jeszcze show w tym festiwalu)UPDATE— aktualizacja istniejącego show po jegoid(dopasowanie:festival_id+band_id)
Festiwale często mają shows po północy, które należą do poprzedniego dnia festiwalowego (np. show o 01:00 w środę jest częścią wtorkowego programu).
- Pole
start_time(iend_time) przechowuje rzeczywisty timestamp UTC — czyli show o 01:00 w środę jest zapisany jako środa 01:00. - Pole
is_late_night = truesygnalizuje, że show należy do poprzedniego dnia festiwalowego. - Przy wyświetlaniu aplikacja odejmuje 1 dzień od
start_timegdyis_late_night = true, dzięki czemu show pojawia się pod właściwym dniem w timetable.
Pole date w JSON oznacza dzień festiwalowy (np. "2026-06-09" = wtorek), a start_time to godzina w tym dniu.
| Scenariusz | date w JSON |
start_time |
is_late_night |
Timestamp w bazie | Wyświetlany pod |
|---|---|---|---|---|---|
| Normalny wieczór | wtorek | 22:00 |
false |
wtorek 22:00 | wtorek |
| Przekroczenie północy | wtorek | 23:00, end_time: 01:30 |
false |
wtorek 23:00 – środa 01:30 | wtorek |
| Late night | wtorek | 01:00 |
true |
środa 01:00 | wtorek |
Reguły:
is_late_night = truegdystart_timemieści się w przedziale00:00–05:59. Importer automatycznie dodaje +1 dzień do timestampa, żeby kompensować odejmowanie przy wyświetlaniu.end_timeprzekraczające północ (gdyend_time<start_timena zegarze) jest automatycznie przesuwane o +1 dzień kalendarzowy — niezależnie odis_late_night.
Projekt korzysta z Supabase Edge Functions do obsługi logiki backendowej (m.in. wysyłanie zaproszeń mailowych przez Resend).
-
Wymagania: Zainstalowane
supabaseCLI lubnpx supabase. -
Zmienne środowiskowe — ustaw sekret w projekcie Supabase:
npx supabase secrets set RESEND_API_KEY=twoj_klucz_api_resend -
Wdrożenie funkcji:
npx supabase functions deploy invite-user --no-verify-jwt
Uruchom ponownie po każdej zmianie w
supabase/functions/invite-user/index.ts.
Zaleca się wykonywanie zrzutu bazy po każdej istotnej migracji.
- Wymagania: PostgreSQL Command Line Tools (
pg_dump). - Uruchomienie (PowerShell):
.\scripts\backup_db.ps1
- Skrypt poprosi o Connection String przy pierwszym uruchomieniu (Supabase Dashboard → Project Settings → Database → Connection string → URI → Mode: Session). Można go zapisać w
scripts/backup_config.json. - Zrzuty
.sqltrafiają do folderudbdumps/(dodany do.gitignore).
Użyj psql lub klienta SQL (DBeaver, pgAdmin) i wykonaj skrypt z dbdumps/.