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.
Interaktivní tvůrce

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.

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));
```

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ů.