- Replace dual update systems with single markdown-first editor architecture - Add server-side upsert to eliminate 404 errors on PUT operations - Fix content persistence race condition between preview and save operations - Remove legacy updateElementContent system entirely - Add comprehensive authentication with JWT scaffolding and dev mode - Implement EditContext.updateOriginalContent() for proper baseline management - Enable markdown formatting in all text elements (h1-h6, p, div, etc) - Clean terminology: remove 'unified' references from codebase Technical changes: * core/editor.js: Remove legacy update system, unify content types as markdown * ui/Editor.js: Add updateOriginalContent() method to fix save persistence * ui/Previewer.js: Clean live preview system for all content types * api/handlers.go: Implement UpsertContent for idempotent PUT operations * auth/*: Complete authentication service with OAuth scaffolding * db/queries/content.sql: Add upsert query with ON CONFLICT handling * Schema: Remove type constraints, rely on server-side validation Result: Clean content editing with persistent saves, no 404 errors, markdown support in all text elements
42 lines
1.4 KiB
PL/PgSQL
42 lines
1.4 KiB
PL/PgSQL
-- PostgreSQL-specific schema with BIGINT UNIX timestamps
|
|
-- Main content table (current versions only)
|
|
CREATE TABLE content (
|
|
id TEXT NOT NULL,
|
|
site_id TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
created_at BIGINT DEFAULT EXTRACT(EPOCH FROM NOW()) NOT NULL,
|
|
updated_at BIGINT DEFAULT EXTRACT(EPOCH FROM NOW()) NOT NULL,
|
|
last_edited_by TEXT DEFAULT 'system' NOT NULL,
|
|
PRIMARY KEY (id, site_id)
|
|
);
|
|
|
|
-- Version history table for rollback functionality
|
|
CREATE TABLE content_versions (
|
|
version_id SERIAL PRIMARY KEY,
|
|
content_id TEXT NOT NULL,
|
|
site_id TEXT NOT NULL,
|
|
value TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
created_at BIGINT DEFAULT EXTRACT(EPOCH FROM NOW()) NOT NULL,
|
|
created_by TEXT DEFAULT 'system' NOT NULL
|
|
);
|
|
|
|
-- Indexes for performance
|
|
CREATE INDEX IF NOT EXISTS idx_content_site_id ON content(site_id);
|
|
CREATE INDEX IF NOT EXISTS idx_content_updated_at ON content(updated_at);
|
|
CREATE INDEX IF NOT EXISTS idx_content_versions_lookup ON content_versions(content_id, site_id, created_at DESC);
|
|
|
|
-- Function and trigger to automatically update updated_at timestamp
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = EXTRACT(EPOCH FROM NOW());
|
|
RETURN NEW;
|
|
END;
|
|
$$ language 'plpgsql';
|
|
|
|
CREATE TRIGGER update_content_updated_at
|
|
BEFORE UPDATE ON content
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION update_updated_at_column(); |