data
Pokročilý
supabase
Architektura backendu v Supabase
Pokročilý návrh databázové struktury, zabezpečení a API integrací pro produkční aplikaci.
Prompt text
Délka: Dlouhý
Jsi seniorní backend vývojář a architekt specializující se na ekosystém Supabase a PostgreSQL. Tvým úkolem je navrhnout komplexní a škálovatelné řešení pro nový projekt s názvem **[NÁZEV PROJEKTU]**, který je zaměřen na **[POPIS APLIKACE]**.
Postupuj podle následujících kroků a poskytni detailní technické řešení:
1. **Databázové schéma (SQL):**
Navrhni relační strukturu databáze. Napiš kompletní SQL skript pro vytvoření tabulek (`CREATE TABLE`), které zahrnuje:
* Definici primárních a cizích klíčů.
* Datové typy optimalizované pro výkon.
* Rozšíření Supabase (např. `auth.users`) a propojení s vlastními tabulkami.
* Využití JSONB sloupců pro flexibilní data (pokud je třeba).
2. **Bezpečnost a RLS (Row Level Security):**
Definuj bezpečnostní politiky (Policies) pro přístup k datům. Musíš zajistit, aby:
* Veřejný přístup byl povolen pouze pro čtení specifických dat (např. seznam produktů).
* Autentizovaní uživatelé mohli vytvářet a upravovat pouze svá vlastní data (pomocí `auth.uid()`).
* Admin role měla plná práva.
3. **API a Realtime:**
Navrhni strategii pro využití automaticky generovaného REST API a GraphQL (pokud je relevantní). Dále specifikuj, které tabulky by měly mít zapnuté **Realtime** posílání (např. pro chat nebo live updates) a jak zajistit, aby se klienti automaticky přihlašovali k odběru změn.
4. **Edge Functions a Storage:**
Navrhni případ použití pro Supabase Edge Functions (Deno) pro logiku, která nesmí běžet na klientovi (např. zpracování plateb nebo těžké výpočty). Dále navrhni strukturu **Storage** buckets pro ukládání souborů (např. avatary uživatelů, dokumenty) včetně bezpečnostních pravidel nahrávání.
5. **Vektorové vyhledávání (Volitelné):**
Pokud je pro projekt relevantní full-textové vyhledávání nebo AI, navrhni implementaci pomocí `pgvector` (vector embeddings). Urči, která data se mají vektorizovat a jak nastavit HNSW index pro rychlé vyhledávání.
Závěr poskytni jako strukturovaný technický dokument s kódovými bloky, které lze přímo zkopírovat do Supabase SQL Editoru.
Postupuj podle následujících kroků a poskytni detailní technické řešení:
1. **Databázové schéma (SQL):**
Navrhni relační strukturu databáze. Napiš kompletní SQL skript pro vytvoření tabulek (`CREATE TABLE`), které zahrnuje:
* Definici primárních a cizích klíčů.
* Datové typy optimalizované pro výkon.
* Rozšíření Supabase (např. `auth.users`) a propojení s vlastními tabulkami.
* Využití JSONB sloupců pro flexibilní data (pokud je třeba).
2. **Bezpečnost a RLS (Row Level Security):**
Definuj bezpečnostní politiky (Policies) pro přístup k datům. Musíš zajistit, aby:
* Veřejný přístup byl povolen pouze pro čtení specifických dat (např. seznam produktů).
* Autentizovaní uživatelé mohli vytvářet a upravovat pouze svá vlastní data (pomocí `auth.uid()`).
* Admin role měla plná práva.
3. **API a Realtime:**
Navrhni strategii pro využití automaticky generovaného REST API a GraphQL (pokud je relevantní). Dále specifikuj, které tabulky by měly mít zapnuté **Realtime** posílání (např. pro chat nebo live updates) a jak zajistit, aby se klienti automaticky přihlašovali k odběru změn.
4. **Edge Functions a Storage:**
Navrhni případ použití pro Supabase Edge Functions (Deno) pro logiku, která nesmí běžet na klientovi (např. zpracování plateb nebo těžké výpočty). Dále navrhni strukturu **Storage** buckets pro ukládání souborů (např. avatary uživatelů, dokumenty) včetně bezpečnostních pravidel nahrávání.
5. **Vektorové vyhledávání (Volitelné):**
Pokud je pro projekt relevantní full-textové vyhledávání nebo AI, navrhni implementaci pomocí `pgvector` (vector embeddings). Urči, která data se mají vektorizovat a jak nastavit HNSW index pro rychlé vyhledávání.
Závěr poskytni jako strukturovaný technický dokument s kódovými bloky, které lze přímo zkopírovat do Supabase SQL Editoru.
Příklad použití
Vstup:
NÁZEV PROJEKTU: FreelanceMarket
POPIS APLIKACE: Tržiště pro freelancery a klienty. Uživatelé (freelanceři) vytvářejí profily, nahrávají portfolio (PDF, obrázky) a nabízejí služby. Klienté zadávají poptávky. Aplikace vyžaduje chat v reálném čase a vyhledávání služeb podle klíčových slov.
POPIS APLIKACE: Tržiště pro freelancery a klienty. Uživatelé (freelanceři) vytvářejí profily, nahrávají portfolio (PDF, obrázky) a nabízejí služby. Klienté zadávají poptávky. Aplikace vyžaduje chat v reálném čase a vyhledávání služeb podle klíčových slov.
Výstup:
### 1. Databázové schéma (PostgreSQL)
Zde je SQL skript pro základní strukturu:
```sql
-- Profily freelancerů napojené na auth.users
CREATE TABLE public.profiles (
id UUID REFERENCES auth.users(id) PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
avatar_url TEXT,
bio TEXT,
skills JSONB DEFAULT '[]'::jsonb, -- Flexibilní seznam dovedností
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);
-- Poptávky od klientů
CREATE TABLE public.listings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
client_id UUID REFERENCES public.profiles(id),
title TEXT NOT NULL,
description TEXT,
budget NUMERIC,
status TEXT DEFAULT 'open', -- 'open', 'in_progress', 'closed'
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);
-- Zprávy pro real-time chat
CREATE TABLE public.messages (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
sender_id UUID REFERENCES public.profiles(id),
recipient_id UUID REFERENCES public.profiles(id),
listing_id UUID REFERENCES public.listings(id),
content TEXT NOT NULL,
read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);
-- Povolení realtime pro zprávy
ALTER PUBLICATION supabase_realtime ADD TABLE public.messages;
```
### 2. Bezpečnost (RLS Policies)
```sql
-- Zapnutí RLS
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.listings ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.messages ENABLE ROW LEVEL SECURITY;
-- Pravidlo pro čtení profilů (všichni vidí profily)
CREATE POLICY "Profiles are viewable by everyone"
ON public.profiles FOR SELECT USING (true);
-- Pravidlo pro úpravu vlastního profilu
CREATE POLICY "Users can update own profile"
ON public.profiles FOR UPDATE USING (auth.uid() = id);
-- Pravidlo pro vytváření zpráv (pouze přihlášení)
CREATE POLICY "Users can insert messages"
ON public.messages FOR INSERT WITH CHECK (auth.uid() = sender_id);
-- Pravidlo pro čtení zpráv (pouze účastníci konverzace)
CREATE POLICY "Users can see messages in their conversations"
ON public.messages FOR SELECT USING (
auth.uid() = sender_id OR auth.uid() = recipient_id
);
```
### 3. Storage Strategy
Vytvořte dva buckety v Supabase Storage:
1. **`avatars`**: Veřejný bucket pro profilové obrázky.
2. **`portfolio-files`**: Privátní bucket pro soubory freelancerů (PDF), ke kterým mají přístup pouze konkrétní uživatelé nebo admini.
*Bezpečnostní pravidlo pro Storage (avatars):*
```sql
-- Povolit nahrání pouze vlastnímu uživateli
CREATE POLICY "Users can upload their own avatar"
ON storage.objects FOR INSERT WITH CHECK (
bucket_id = 'avatars' AND auth.uid()::text = (storage.foldername(name))[1]
);
```
### 4. Vector Search (pgvector)
Pro vyhledávání freelancerů podle dovedností doporučuji využít `pgvector`. Sloupec `skills` (JSONB) by bylo vhodné zpracovat do vektorového formátu, nebo využít full-textové vyhledávání PostgreSQL na sloupci `bio` a `skills` pomocí `to_tsvector`. Zde je příklad full-textového vyhledávání bez vektorů, které je pro tento případ jednodušší:
```sql
-- Index pro rychlé full-textové vyhledávání
CREATE INDEX idx_profiles_fts ON public.profiles
USING GIN (to_tsvector('english', bio || ' ' || skills::text));
```
Zde je SQL skript pro základní strukturu:
```sql
-- Profily freelancerů napojené na auth.users
CREATE TABLE public.profiles (
id UUID REFERENCES auth.users(id) PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
avatar_url TEXT,
bio TEXT,
skills JSONB DEFAULT '[]'::jsonb, -- Flexibilní seznam dovedností
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);
-- Poptávky od klientů
CREATE TABLE public.listings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
client_id UUID REFERENCES public.profiles(id),
title TEXT NOT NULL,
description TEXT,
budget NUMERIC,
status TEXT DEFAULT 'open', -- 'open', 'in_progress', 'closed'
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);
-- Zprávy pro real-time chat
CREATE TABLE public.messages (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
sender_id UUID REFERENCES public.profiles(id),
recipient_id UUID REFERENCES public.profiles(id),
listing_id UUID REFERENCES public.listings(id),
content TEXT NOT NULL,
read BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);
-- Povolení realtime pro zprávy
ALTER PUBLICATION supabase_realtime ADD TABLE public.messages;
```
### 2. Bezpečnost (RLS Policies)
```sql
-- Zapnutí RLS
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.listings ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.messages ENABLE ROW LEVEL SECURITY;
-- Pravidlo pro čtení profilů (všichni vidí profily)
CREATE POLICY "Profiles are viewable by everyone"
ON public.profiles FOR SELECT USING (true);
-- Pravidlo pro úpravu vlastního profilu
CREATE POLICY "Users can update own profile"
ON public.profiles FOR UPDATE USING (auth.uid() = id);
-- Pravidlo pro vytváření zpráv (pouze přihlášení)
CREATE POLICY "Users can insert messages"
ON public.messages FOR INSERT WITH CHECK (auth.uid() = sender_id);
-- Pravidlo pro čtení zpráv (pouze účastníci konverzace)
CREATE POLICY "Users can see messages in their conversations"
ON public.messages FOR SELECT USING (
auth.uid() = sender_id OR auth.uid() = recipient_id
);
```
### 3. Storage Strategy
Vytvořte dva buckety v Supabase Storage:
1. **`avatars`**: Veřejný bucket pro profilové obrázky.
2. **`portfolio-files`**: Privátní bucket pro soubory freelancerů (PDF), ke kterým mají přístup pouze konkrétní uživatelé nebo admini.
*Bezpečnostní pravidlo pro Storage (avatars):*
```sql
-- Povolit nahrání pouze vlastnímu uživateli
CREATE POLICY "Users can upload their own avatar"
ON storage.objects FOR INSERT WITH CHECK (
bucket_id = 'avatars' AND auth.uid()::text = (storage.foldername(name))[1]
);
```
### 4. Vector Search (pgvector)
Pro vyhledávání freelancerů podle dovedností doporučuji využít `pgvector`. Sloupec `skills` (JSONB) by bylo vhodné zpracovat do vektorového formátu, nebo využít full-textové vyhledávání PostgreSQL na sloupci `bio` a `skills` pomocí `to_tsvector`. Zde je příklad full-textového vyhledávání bez vektorů, které je pro tento případ jednodušší:
```sql
-- Index pro rychlé full-textové vyhledávání
CREATE INDEX idx_profiles_fts ON public.profiles
USING GIN (to_tsvector('english', bio || ' ' || skills::text));
```
Kde použít tento prompt?
Najděte vhodné AI nástroje pro použití tohoto promptu a maximalizujte jeho efektivitu.
Objevte další AI prompty
Prozkoumejte naši sbírku data promptů a najděte ty, které vám pomohou dosáhnout lepších výsledků.