Implement complete collection persistence with database-backed survival across server restarts
• Add full multi-table schema for collections with normalized design (collections, collection_templates, collection_items, collection_item_versions) • Implement collection detection and processing in enhancement pipeline for .insertr-add elements • Add template extraction and storage from existing HTML children with multi-variant support • Enable collection reconstruction from database on server restart with proper DOM rebuilding • Extend ContentClient interface with collection operations and full database integration • Update enhance command to use engine.DatabaseClient for collection persistence support
This commit is contained in:
31
internal/db/queries/collection_item_versions.sql
Normal file
31
internal/db/queries/collection_item_versions.sql
Normal file
@@ -0,0 +1,31 @@
|
||||
-- Collection item versions table queries
|
||||
|
||||
-- name: CreateCollectionItemVersion :exec
|
||||
INSERT INTO collection_item_versions (item_id, collection_id, site_id, html_content, template_id, position, created_by)
|
||||
VALUES (sqlc.arg(item_id), sqlc.arg(collection_id), sqlc.arg(site_id), sqlc.arg(html_content), sqlc.arg(template_id), sqlc.arg(position), sqlc.arg(created_by));
|
||||
|
||||
-- name: GetCollectionItemVersionHistory :many
|
||||
SELECT version_id, item_id, collection_id, site_id, html_content, template_id, position, created_at, created_by
|
||||
FROM collection_item_versions
|
||||
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
||||
ORDER BY created_at DESC
|
||||
LIMIT sqlc.arg(limit_count);
|
||||
|
||||
-- name: GetCollectionItemVersion :one
|
||||
SELECT version_id, item_id, collection_id, site_id, html_content, template_id, position, created_at, created_by
|
||||
FROM collection_item_versions
|
||||
WHERE version_id = sqlc.arg(version_id);
|
||||
|
||||
-- name: GetAllCollectionItemVersionsForSite :many
|
||||
SELECT
|
||||
civ.version_id, civ.item_id, civ.collection_id, civ.site_id, civ.html_content, civ.template_id, civ.position, civ.created_at, civ.created_by,
|
||||
ci.html_content as current_html_content, ci.position as current_position
|
||||
FROM collection_item_versions civ
|
||||
LEFT JOIN collection_items ci ON civ.item_id = ci.item_id AND civ.collection_id = ci.collection_id AND civ.site_id = ci.site_id
|
||||
WHERE civ.site_id = sqlc.arg(site_id)
|
||||
ORDER BY civ.created_at DESC
|
||||
LIMIT sqlc.arg(limit_count);
|
||||
|
||||
-- name: DeleteOldCollectionItemVersions :exec
|
||||
DELETE FROM collection_item_versions
|
||||
WHERE created_at < sqlc.arg(created_before) AND site_id = sqlc.arg(site_id);
|
||||
57
internal/db/queries/collection_items.sql
Normal file
57
internal/db/queries/collection_items.sql
Normal file
@@ -0,0 +1,57 @@
|
||||
-- Collection items table queries
|
||||
|
||||
-- name: GetCollectionItem :one
|
||||
SELECT item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by
|
||||
FROM collection_items
|
||||
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: GetCollectionItems :many
|
||||
SELECT item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by
|
||||
FROM collection_items
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
||||
ORDER BY position ASC;
|
||||
|
||||
-- name: GetCollectionItemsWithTemplate :many
|
||||
SELECT
|
||||
ci.item_id, ci.collection_id, ci.site_id, ci.template_id, ci.html_content, ci.position, ci.created_at, ci.updated_at, ci.last_edited_by,
|
||||
ct.name as template_name, ct.html_template, ct.is_default
|
||||
FROM collection_items ci
|
||||
JOIN collection_templates ct ON ci.template_id = ct.template_id
|
||||
WHERE ci.collection_id = sqlc.arg(collection_id) AND ci.site_id = sqlc.arg(site_id)
|
||||
ORDER BY ci.position ASC;
|
||||
|
||||
-- name: GetMaxPosition :one
|
||||
SELECT COALESCE(MAX(position), 0) as max_position
|
||||
FROM collection_items
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: CreateCollectionItem :one
|
||||
INSERT INTO collection_items (item_id, collection_id, site_id, template_id, html_content, position, last_edited_by)
|
||||
VALUES (sqlc.arg(item_id), sqlc.arg(collection_id), sqlc.arg(site_id), sqlc.arg(template_id), sqlc.arg(html_content), sqlc.arg(position), sqlc.arg(last_edited_by))
|
||||
RETURNING item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by;
|
||||
|
||||
-- name: UpdateCollectionItem :one
|
||||
UPDATE collection_items
|
||||
SET html_content = sqlc.arg(html_content), last_edited_by = sqlc.arg(last_edited_by)
|
||||
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
||||
RETURNING item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by;
|
||||
|
||||
-- name: UpdateCollectionItemPosition :exec
|
||||
UPDATE collection_items
|
||||
SET position = sqlc.arg(position)
|
||||
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: ReorderCollectionItems :exec
|
||||
UPDATE collection_items
|
||||
SET position = position + sqlc.arg(position_delta)
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
||||
AND position >= sqlc.arg(start_position);
|
||||
|
||||
-- name: DeleteCollectionItem :exec
|
||||
DELETE FROM collection_items
|
||||
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: DeleteCollectionItems :exec
|
||||
DELETE FROM collection_items
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
45
internal/db/queries/collection_templates.sql
Normal file
45
internal/db/queries/collection_templates.sql
Normal file
@@ -0,0 +1,45 @@
|
||||
-- Collection templates table queries
|
||||
|
||||
-- name: GetCollectionTemplate :one
|
||||
SELECT template_id, collection_id, site_id, name, html_template, is_default, created_at
|
||||
FROM collection_templates
|
||||
WHERE template_id = sqlc.arg(template_id);
|
||||
|
||||
-- name: GetCollectionTemplates :many
|
||||
SELECT template_id, collection_id, site_id, name, html_template, is_default, created_at
|
||||
FROM collection_templates
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
||||
ORDER BY is_default DESC, created_at ASC;
|
||||
|
||||
-- name: GetDefaultTemplate :one
|
||||
SELECT template_id, collection_id, site_id, name, html_template, is_default, created_at
|
||||
FROM collection_templates
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id) AND is_default = TRUE
|
||||
LIMIT 1;
|
||||
|
||||
-- name: CreateCollectionTemplate :one
|
||||
INSERT INTO collection_templates (collection_id, site_id, name, html_template, is_default)
|
||||
VALUES (sqlc.arg(collection_id), sqlc.arg(site_id), sqlc.arg(name), sqlc.arg(html_template), sqlc.arg(is_default))
|
||||
RETURNING template_id, collection_id, site_id, name, html_template, is_default, created_at;
|
||||
|
||||
-- name: UpdateCollectionTemplate :one
|
||||
UPDATE collection_templates
|
||||
SET name = sqlc.arg(name), html_template = sqlc.arg(html_template), is_default = sqlc.arg(is_default)
|
||||
WHERE template_id = sqlc.arg(template_id)
|
||||
RETURNING template_id, collection_id, site_id, name, html_template, is_default, created_at;
|
||||
|
||||
-- name: SetTemplateAsDefault :exec
|
||||
UPDATE collection_templates
|
||||
SET is_default = CASE
|
||||
WHEN template_id = sqlc.arg(template_id) THEN TRUE
|
||||
ELSE FALSE
|
||||
END
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: DeleteCollectionTemplate :exec
|
||||
DELETE FROM collection_templates
|
||||
WHERE template_id = sqlc.arg(template_id);
|
||||
|
||||
-- name: DeleteCollectionTemplates :exec
|
||||
DELETE FROM collection_templates
|
||||
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
||||
39
internal/db/queries/collections.sql
Normal file
39
internal/db/queries/collections.sql
Normal file
@@ -0,0 +1,39 @@
|
||||
-- Collections table queries
|
||||
|
||||
-- name: GetCollection :one
|
||||
SELECT id, site_id, container_html, created_at, updated_at, last_edited_by
|
||||
FROM collections
|
||||
WHERE id = sqlc.arg(id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: GetAllCollections :many
|
||||
SELECT id, site_id, container_html, created_at, updated_at, last_edited_by
|
||||
FROM collections
|
||||
WHERE site_id = sqlc.arg(site_id)
|
||||
ORDER BY updated_at DESC;
|
||||
|
||||
-- name: CreateCollection :one
|
||||
INSERT INTO collections (id, site_id, container_html, last_edited_by)
|
||||
VALUES (sqlc.arg(id), sqlc.arg(site_id), sqlc.arg(container_html), sqlc.arg(last_edited_by))
|
||||
RETURNING id, site_id, container_html, created_at, updated_at, last_edited_by;
|
||||
|
||||
-- name: UpdateCollection :one
|
||||
UPDATE collections
|
||||
SET container_html = sqlc.arg(container_html), last_edited_by = sqlc.arg(last_edited_by)
|
||||
WHERE id = sqlc.arg(id) AND site_id = sqlc.arg(site_id)
|
||||
RETURNING id, site_id, container_html, created_at, updated_at, last_edited_by;
|
||||
|
||||
-- name: UpsertCollection :one
|
||||
INSERT INTO collections (id, site_id, container_html, last_edited_by)
|
||||
VALUES (sqlc.arg(id), sqlc.arg(site_id), sqlc.arg(container_html), sqlc.arg(last_edited_by))
|
||||
ON CONFLICT(id, site_id) DO UPDATE SET
|
||||
container_html = EXCLUDED.container_html,
|
||||
last_edited_by = EXCLUDED.last_edited_by
|
||||
RETURNING id, site_id, container_html, created_at, updated_at, last_edited_by;
|
||||
|
||||
-- name: DeleteCollection :exec
|
||||
DELETE FROM collections
|
||||
WHERE id = sqlc.arg(id) AND site_id = sqlc.arg(site_id);
|
||||
|
||||
-- name: DeleteAllSiteCollections :exec
|
||||
DELETE FROM collections
|
||||
WHERE site_id = sqlc.arg(site_id);
|
||||
Reference in New Issue
Block a user