e787961059
- DB: public.comments (thread, parent_id, user_id, author_name/-avatar, body, deleted) - API: GET /api/comments (öffentlich lesen), POST/DELETE (eingeloggt), POST /api/auth/login (Token fürs Widget) - Vanilla-Widget static/dialog.js: Karten mit Name+Bild, flacher Dialog mit optionalem Bezug (↳ Antwort auf), Inline-Login, Löschen (eigene/Admin) - eingebettet in single.html (thread = Beitrags-Pfad), Styling im Theme-Look - Autorname/-bild kommen aus dem Profil (data/authors.json) Realtime (Supabase) folgt als nächster Schritt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
52 lines
2.4 KiB
SQL
52 lines
2.4 KiB
SQL
-- OPENBUREAU CMS — posts-Tabelle. In den Supabase-Stack einspielen
|
|
-- (SQL-Editor oder psql). Spalten bilden das Hugo-Frontmatter ab.
|
|
|
|
create extension if not exists "pgcrypto";
|
|
|
|
create table if not exists public.posts (
|
|
id uuid primary key default gen_random_uuid(),
|
|
section text not null, -- buerofuehrung | software | theorie
|
|
slug text not null, -- a-z0-9- (Dateiname ohne .md)
|
|
title text not null,
|
|
date date not null default current_date,
|
|
weight int,
|
|
tags text[] default '{}',
|
|
summary text,
|
|
cover_image text,
|
|
layout text, -- z.B. "image" | "text"
|
|
external text, -- externer Link (wie RAPPORT)
|
|
color text, -- z.B. "kusa" | "yuyake"
|
|
body text default '', -- Markdown-Inhalt
|
|
status text not null default 'draft', -- draft | published
|
|
author text,
|
|
created_at timestamptz not null default now(),
|
|
updated_at timestamptz not null default now(),
|
|
published_at timestamptz,
|
|
unique (section, slug)
|
|
);
|
|
|
|
create index if not exists posts_status_idx on public.posts (status);
|
|
create index if not exists posts_section_idx on public.posts (section);
|
|
|
|
-- RLS aktivieren; die api nutzt den Service-Key (umgeht RLS). Wenn das
|
|
-- Frontend später direkt liest, hier gezielte Policies ergänzen.
|
|
alter table public.posts enable row level security;
|
|
|
|
-- ── Dialog / Diskussionen ───────────────────────────────────────────────
|
|
-- Thread = Pfad des Beitrags (z.B. /library/software/stack/). Flache Wortmeldungen
|
|
-- mit optionalem Bezug (parent_id). Idempotent — auf bestehende DB anwendbar.
|
|
create table if not exists public.comments (
|
|
id uuid primary key default gen_random_uuid(),
|
|
thread text not null,
|
|
parent_id uuid references public.comments(id) on delete cascade,
|
|
user_id uuid,
|
|
author_name text,
|
|
author_avatar text,
|
|
body text not null,
|
|
created_at timestamptz not null default now(),
|
|
deleted boolean not null default false
|
|
);
|
|
create index if not exists comments_thread_idx on public.comments (thread, created_at);
|
|
alter table public.comments enable row level security;
|
|
grant all on public.comments to anon, authenticated, service_role;
|