- 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
39 lines
1.5 KiB
SQL
39 lines
1.5 KiB
SQL
-- name: GetContent :one
|
|
SELECT id, site_id, value, type, created_at, updated_at, last_edited_by
|
|
FROM content
|
|
WHERE id = sqlc.arg(id) AND site_id = sqlc.arg(site_id);
|
|
|
|
-- name: GetAllContent :many
|
|
SELECT id, site_id, value, type, created_at, updated_at, last_edited_by
|
|
FROM content
|
|
WHERE site_id = sqlc.arg(site_id)
|
|
ORDER BY updated_at DESC;
|
|
|
|
-- name: GetBulkContent :many
|
|
SELECT id, site_id, value, type, created_at, updated_at, last_edited_by
|
|
FROM content
|
|
WHERE site_id = sqlc.arg(site_id) AND id IN (sqlc.slice('ids'));
|
|
|
|
-- name: CreateContent :one
|
|
INSERT INTO content (id, site_id, value, type, last_edited_by)
|
|
VALUES (sqlc.arg(id), sqlc.arg(site_id), sqlc.arg(value), sqlc.arg(type), sqlc.arg(last_edited_by))
|
|
RETURNING id, site_id, value, type, created_at, updated_at, last_edited_by;
|
|
|
|
-- name: UpdateContent :one
|
|
UPDATE content
|
|
SET value = sqlc.arg(value), type = sqlc.arg(type), last_edited_by = sqlc.arg(last_edited_by)
|
|
WHERE id = sqlc.arg(id) AND site_id = sqlc.arg(site_id)
|
|
RETURNING id, site_id, value, type, created_at, updated_at, last_edited_by;
|
|
|
|
-- name: UpsertContent :one
|
|
INSERT INTO content (id, site_id, value, type, last_edited_by)
|
|
VALUES (sqlc.arg(id), sqlc.arg(site_id), sqlc.arg(value), sqlc.arg(type), sqlc.arg(last_edited_by))
|
|
ON CONFLICT(id, site_id) DO UPDATE SET
|
|
value = EXCLUDED.value,
|
|
type = EXCLUDED.type,
|
|
last_edited_by = EXCLUDED.last_edited_by
|
|
RETURNING id, site_id, value, type, created_at, updated_at, last_edited_by;
|
|
|
|
-- name: DeleteContent :exec
|
|
DELETE FROM content
|
|
WHERE id = sqlc.arg(id) AND site_id = sqlc.arg(site_id); |