Initial commit from template
This commit is contained in:
110
.claude/skills/supabase-db/SKILL.md
Normal file
110
.claude/skills/supabase-db/SKILL.md
Normal file
@@ -0,0 +1,110 @@
|
||||
---
|
||||
name: supabase-db
|
||||
description: Supabase PostgreSQL Datenbank Operationen. Nutze diesen Skill fuer CRUD Operationen, SQL Migrations, Tabellen erstellen, RLS Policies, Queries und TypeScript Types generieren. Aktiviert bei Begriffen wie "Datenbank", "Tabelle erstellen", "SQL", "Query", "Migration", "RLS", "Row Level Security", "select", "insert", "update", "delete".
|
||||
---
|
||||
|
||||
# Supabase PostgreSQL Datenbank Skill
|
||||
|
||||
Dieser Skill hilft bei allen Datenbank-Operationen mit Supabase.
|
||||
|
||||
## Tabellen erstellen
|
||||
|
||||
Verwende immer dieses Pattern:
|
||||
|
||||
```sql
|
||||
CREATE TABLE table_name (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
-- deine Spalten hier
|
||||
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- RLS aktivieren
|
||||
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Updated_at Trigger
|
||||
CREATE TRIGGER table_name_updated_at
|
||||
BEFORE UPDATE ON table_name
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
||||
```
|
||||
|
||||
## CRUD Operationen
|
||||
|
||||
### Select
|
||||
```typescript
|
||||
const { data, error } = await supabase
|
||||
.from('table')
|
||||
.select('*')
|
||||
.eq('column', value)
|
||||
.order('created_at', { ascending: false });
|
||||
```
|
||||
|
||||
### Insert
|
||||
```typescript
|
||||
const { data, error } = await supabase
|
||||
.from('table')
|
||||
.insert({ column: value })
|
||||
.select()
|
||||
.single();
|
||||
```
|
||||
|
||||
### Update
|
||||
```typescript
|
||||
const { data, error } = await supabase
|
||||
.from('table')
|
||||
.update({ column: newValue })
|
||||
.eq('id', id)
|
||||
.select()
|
||||
.single();
|
||||
```
|
||||
|
||||
### Delete
|
||||
```typescript
|
||||
const { error } = await supabase
|
||||
.from('table')
|
||||
.delete()
|
||||
.eq('id', id);
|
||||
```
|
||||
|
||||
## RLS Policies
|
||||
|
||||
```sql
|
||||
-- Lesen: Jeder authentifizierte User
|
||||
CREATE POLICY "Users can read own data"
|
||||
ON table_name FOR SELECT
|
||||
TO authenticated
|
||||
USING (auth.uid() = user_id);
|
||||
|
||||
-- Schreiben: Nur eigene Daten
|
||||
CREATE POLICY "Users can insert own data"
|
||||
ON table_name FOR INSERT
|
||||
TO authenticated
|
||||
WITH CHECK (auth.uid() = user_id);
|
||||
|
||||
-- Update: Nur eigene Daten
|
||||
CREATE POLICY "Users can update own data"
|
||||
ON table_name FOR UPDATE
|
||||
TO authenticated
|
||||
USING (auth.uid() = user_id)
|
||||
WITH CHECK (auth.uid() = user_id);
|
||||
|
||||
-- Delete: Nur eigene Daten
|
||||
CREATE POLICY "Users can delete own data"
|
||||
ON table_name FOR DELETE
|
||||
TO authenticated
|
||||
USING (auth.uid() = user_id);
|
||||
```
|
||||
|
||||
## TypeScript Types generieren
|
||||
|
||||
```bash
|
||||
npx supabase gen types typescript --project-id PROJECT_ID > lib/database.types.ts
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. Immer UUIDs als Primary Key
|
||||
2. Immer created_at/updated_at
|
||||
3. Immer RLS aktivieren
|
||||
4. Soft Deletes mit deleted_at
|
||||
5. Indexes fuer WHERE/ORDER BY Spalten
|
||||
84
.claude/skills/supabase-db/templates/migration.sql
Normal file
84
.claude/skills/supabase-db/templates/migration.sql
Normal file
@@ -0,0 +1,84 @@
|
||||
-- Migration: {{MIGRATION_NAME}}
|
||||
-- Created: {{DATE}}
|
||||
|
||||
-- ===========================================
|
||||
-- Tabelle erstellen
|
||||
-- ===========================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS {{TABLE_NAME}} (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
|
||||
-- Deine Spalten hier
|
||||
name TEXT NOT NULL,
|
||||
description TEXT,
|
||||
|
||||
-- Foreign Keys (optional)
|
||||
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
|
||||
|
||||
-- Timestamps
|
||||
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
||||
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
||||
);
|
||||
|
||||
-- ===========================================
|
||||
-- Row Level Security
|
||||
-- ===========================================
|
||||
|
||||
ALTER TABLE {{TABLE_NAME}} ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Select Policy
|
||||
CREATE POLICY "{{TABLE_NAME}}_select_policy"
|
||||
ON {{TABLE_NAME}} FOR SELECT
|
||||
TO authenticated
|
||||
USING (auth.uid() = user_id);
|
||||
|
||||
-- Insert Policy
|
||||
CREATE POLICY "{{TABLE_NAME}}_insert_policy"
|
||||
ON {{TABLE_NAME}} FOR INSERT
|
||||
TO authenticated
|
||||
WITH CHECK (auth.uid() = user_id);
|
||||
|
||||
-- Update Policy
|
||||
CREATE POLICY "{{TABLE_NAME}}_update_policy"
|
||||
ON {{TABLE_NAME}} FOR UPDATE
|
||||
TO authenticated
|
||||
USING (auth.uid() = user_id)
|
||||
WITH CHECK (auth.uid() = user_id);
|
||||
|
||||
-- Delete Policy
|
||||
CREATE POLICY "{{TABLE_NAME}}_delete_policy"
|
||||
ON {{TABLE_NAME}} FOR DELETE
|
||||
TO authenticated
|
||||
USING (auth.uid() = user_id);
|
||||
|
||||
-- ===========================================
|
||||
-- Indexes
|
||||
-- ===========================================
|
||||
|
||||
CREATE INDEX IF NOT EXISTS {{TABLE_NAME}}_user_id_idx ON {{TABLE_NAME}}(user_id);
|
||||
CREATE INDEX IF NOT EXISTS {{TABLE_NAME}}_created_at_idx ON {{TABLE_NAME}}(created_at DESC);
|
||||
|
||||
-- ===========================================
|
||||
-- Updated_at Trigger
|
||||
-- ===========================================
|
||||
|
||||
-- Funktion (nur einmal pro DB noetig)
|
||||
CREATE OR REPLACE FUNCTION update_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Trigger
|
||||
CREATE TRIGGER {{TABLE_NAME}}_updated_at
|
||||
BEFORE UPDATE ON {{TABLE_NAME}}
|
||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
||||
|
||||
-- ===========================================
|
||||
-- Grants (optional)
|
||||
-- ===========================================
|
||||
|
||||
-- GRANT SELECT, INSERT, UPDATE, DELETE ON {{TABLE_NAME}} TO authenticated;
|
||||
-- GRANT SELECT ON {{TABLE_NAME}} TO anon;
|
||||
Reference in New Issue
Block a user