Rename category wegetarianskie → salatki — Implementation Plan
Przegląd
Przemianowanie kategorii przepisów z wegetarianskie / Wegetariańskie na salatki / Sałatki.
Zmiana obejmuje: migrację PostgreSQL enum + aktualizację istniejących wierszy + 4 pliki TypeScript.
Analiza stanu obecnego
Kategoria wegetarianskie jest PostgreSQL native enum (recipe_category), nie text ani CHECK constraint.
Zdefiniowana jest w 5 miejscach:
supabase/migrations/20260607000000_recipe_schema.sql:14-23— oryginalna definicja enumsrc/lib/supabase.types.ts:169(union type) +:315(Constants array)src/lib/recipe-categories.ts:11— value + label dla UIsrc/app/components/category-filter.tsx:23— kluczCATEGORY_ICONSsrc/inngest/functions.ts:151— prompt LLM do klasyfikacji
Brak seed pliku — istniejące przepisy z kategorią wegetarianskie to live dane w Supabase.
Pożądany stan końcowy
- Enum PostgreSQL zawiera
salatkizamiastwegetarianskie. - Wszystkie istniejące przepisy z
category = 'wegetarianskie'mającategory = 'salatki'. - UI wyświetla “Sałatki” zamiast “Wegetariańskie” w filtrach i na stronie szczegółów.
- LLM klasyfikuje przepisy do
salatki, niewegetarianskie. npm run typecheckinpm run lintprzechodzą czysto.
Czego NIE robimy
- Nie naprawiamy
recipe-card.tsx, który renderuje raw slug jako badge (dotyczy wszystkich kategorii — osobna zmiana). - Nie zmieniamy ikony (
Saladz lucide pozostaje poprawna). - Nie migrujemy innych kategorii.
Podejście do implementacji
- Nowa migracja SQL:
ALTER TYPE public.recipe_category RENAME VALUE 'wegetarianskie' TO 'salatki'— dostępne od PostgreSQL 10, atomowe, nie wymaga rebuildu enum. NastępnieUPDATEistniejących wierszy (paranojne zabezpieczenie; ALTER TYPE Rename nie rusza danych, ale warto być jawnym). Migracja stosowana przez Supabase CLI. - Aktualizacja TypeScript: 4 pliki, każdy to mechaniczne zastąpienie stringa.
Faza 1: Migracja bazy danych
Przegląd
Zmiana wartości enum w PostgreSQL i aktualizacja istniejących wierszy na produkcyjnym Supabase.
Wymagane zmiany:
1. Nowy plik migracji
Plik: supabase/migrations/20260705000000_rename_category_salatki.sql
Cel: Przemianowanie wartości enum i synchronizacja istniejących wierszy.
Kontrakt:
alter type public.recipe_category rename value 'wegetarianskie' to 'salatki';update public.recipes set category = 'salatki' where category = 'wegetarianskie';Kryteria sukcesu:
Weryfikacja automatyczna:
- Migracja stosuje się bez błędów na zdalnym Supabase:
npx supabase db push
Weryfikacja ręczna:
- W Supabase Dashboard → Table Editor: przepisy z dawną kategorią
wegetarianskiemają terazsalatki - Żadna istniejąca cecha aplikacji nie rzuca błędu 500 (enum constraint naruszony)
Faza 2: Aktualizacja kodu TypeScript
Przegląd
Mechaniczne zastąpienie stringa wegetarianskie na salatki (i etykiety Wegetariańskie na Sałatki) w 4 plikach TypeScript.
Wymagane zmiany:
1. Generated types
Plik: src/lib/supabase.types.ts
Cel: Union type i Constants array muszą odzwierciedlać nową wartość enum.
Kontrakt: Dwa miejsca:
- linia 169:
| "wegetarianskie"→| "salatki" - linia 315:
"wegetarianskie",→"salatki",
2. Kategorie UI
Plik: src/lib/recipe-categories.ts
Cel: Wartość i etykieta wyświetlana w filtrach i na stronie szczegółów przepisu.
Kontrakt: linia 11: { value: 'wegetarianskie', label: 'Wegetariańskie' } → { value: 'salatki', label: 'Sałatki' }
3. Category filter — ikona
Plik: src/app/components/category-filter.tsx
Cel: Klucz CATEGORY_ICONS musi pasować do nowej wartości enum.
Kontrakt: linia 23: klucz wegetarianskie: → salatki:
4. Inngest LLM prompt
Plik: src/inngest/functions.ts
Cel: Prompt wysyłany do LLM musi zawierać aktualną listę kategorii, inaczej LLM będzie klasyfikować do wegetarianskie i dostanie błąd enum constraint.
Kontrakt: linia 151: wegetarianskie → salatki w stringu prompt.
Kryteria sukcesu:
Weryfikacja automatyczna:
- TypeScript nie zgłasza błędów:
npm run typecheck - Lint przechodzi:
npm run lint - Grep nie zwraca wyników:
grep -r "wegetarianskie" src/
Weryfikacja ręczna:
- Strona
/recipespokazuje chip “Sałatki” (nie “Wegetariańskie”) w filtrach - Kliknięcie “Sałatki” filtruje przepisy poprawnie (URL:
?category=salatki) - Strona szczegółów przepisu z tą kategorią wyświetla “Sałatki” w badge
Strategia testowania
Kroki testowania ręcznego:
- Otwórz
/recipes— sprawdź czy chip “Sałatki” pojawia się zamiast “Wegetariańskie” - Kliknij chip “Sałatki” — sprawdź URL
?category=salatkii czy lista przepisów się filtruje - Wejdź w szczegóły przepisu z kategorią sałatki — sprawdź badge i link
Referencje
- Oryginalna definicja enum:
supabase/migrations/20260607000000_recipe_schema.sql:14-23 - Kategorie UI:
src/lib/recipe-categories.ts - Generated types:
src/lib/supabase.types.ts:163-171i:309-318
Postęp
Konwencja:
- [ ]oczekujące,- [x]wykonane. Dodaj— <commit sha>, gdy krok zostanie zrealizowany.
Faza 1: Migracja bazy danych
Automatyczne
- 1.1 Migracja stosuje się bez błędów:
npx supabase db push— 9ba7c92
Ręczne
- 1.2 Istniejące przepisy mają
category = 'salatki'w Dashboard — 9ba7c92 - 1.3 Aplikacja nie rzuca 500 po migracji — 9ba7c92
Faza 2: Aktualizacja kodu TypeScript
Automatyczne
- 2.1
npm run typecheckprzechodzi — 701aba4 - 2.2
npm run lintprzechodzi — 701aba4 - 2.3
grep -r "wegetarianskie" src/— brak wyników — 701aba4
Ręczne
- 2.4 Chip “Sałatki” widoczny w filtrach na
/recipes— 701aba4 - 2.5 Filtrowanie po
?category=salatkidziała poprawnie — 701aba4 - 2.6 Badge na stronie szczegółów pokazuje “Sałatki” — 701aba4