bd85570259
Auth/RLS-Fix (Schreiben gab 400): - supabase.js: eigener supabaseAuth-Client für Login/Token-Check, damit signInWithPassword den Service-Daten-Client nicht prozessweit aufs User-Token umstellt (sonst lief insert als role=authenticated → RLS-Block). Rollen (admin > editor > user): - auth.js: roleOf() aus app_metadata.role + ADMIN_EMAILS, requireModerator. - users.js: Rolle anzeigen/setzen über GoTrue app_metadata; .env-Admins fix. Datenmodell (schema.sql): - forums (Kategorien) + threads; Seed Allgemein/Projekte/Technik/Off-Topic und Sonder-Kategorie Beiträge. Library-Beiträge werden als Threads gespiegelt (dialog-store.syncLibrary). API (routes/dialog.js, dialog-store.js): - öffentlich: /api/forums, /api/forums/:slug, /api/recent, /api/thread - eingeloggt: POST /api/threads (Thread starten, nur in Foren) - Moderation: /api/mod/* (sperren/ausblenden), Admin: /api/admin/forums CRUD - comments: Lock-Prüfung beim Schreiben, Moderation darf jede löschen. Frontend: - static/dialog.js: Router (Übersicht-Split-View | Forum | Thread), neuer Thread, Mod-Leiste, subtiles Login (dezente Zeile statt Formular). - Admin-UI: Tabs Foren + Moderation, Rollen-Dropdown bei Autor:innen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 lines
943 B
JavaScript
22 lines
943 B
JavaScript
import { createClient } from '@supabase/supabase-js';
|
|
|
|
const url = process.env.SUPABASE_URL;
|
|
const key = process.env.SUPABASE_SERVICE_KEY;
|
|
|
|
if (!url || !key) {
|
|
console.error('FEHLT: SUPABASE_URL und/oder SUPABASE_SERVICE_KEY in .env');
|
|
process.exit(1);
|
|
}
|
|
|
|
const opts = { auth: { persistSession: false, autoRefreshToken: false } };
|
|
|
|
// Daten-Client: Service-Role-Key, umgeht RLS. NUR für DB-Zugriffe (from/insert/…).
|
|
// Wichtig: hier niemals signInWithPassword aufrufen — das schaltet den
|
|
// Authorization-Header des Clients prozessweit auf das User-Token um (SIGNED_IN),
|
|
// wodurch anschließende Inserts als role=authenticated laufen und an RLS scheitern.
|
|
export const supabase = createClient(url, key, opts);
|
|
|
|
// Eigener Client nur für Auth (Login, Token-Prüfung). Getrennt, damit ein
|
|
// signInWithPassword den Daten-Client oben nicht „vergiftet". Niemals ins Frontend.
|
|
export const supabaseAuth = createClient(url, key, opts);
|