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:
2025-09-22 18:29:58 +02:00
parent b25663f76b
commit 2315ba4750
36 changed files with 4356 additions and 46 deletions

View File

@@ -0,0 +1,217 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
// source: collection_templates.sql
package sqlite
import (
"context"
)
const createCollectionTemplate = `-- name: CreateCollectionTemplate :one
INSERT INTO collection_templates (collection_id, site_id, name, html_template, is_default)
VALUES (?1, ?2, ?3, ?4, ?5)
RETURNING template_id, collection_id, site_id, name, html_template, is_default, created_at
`
type CreateCollectionTemplateParams struct {
CollectionID string `json:"collection_id"`
SiteID string `json:"site_id"`
Name string `json:"name"`
HtmlTemplate string `json:"html_template"`
IsDefault int64 `json:"is_default"`
}
func (q *Queries) CreateCollectionTemplate(ctx context.Context, arg CreateCollectionTemplateParams) (CollectionTemplate, error) {
row := q.db.QueryRowContext(ctx, createCollectionTemplate,
arg.CollectionID,
arg.SiteID,
arg.Name,
arg.HtmlTemplate,
arg.IsDefault,
)
var i CollectionTemplate
err := row.Scan(
&i.TemplateID,
&i.CollectionID,
&i.SiteID,
&i.Name,
&i.HtmlTemplate,
&i.IsDefault,
&i.CreatedAt,
)
return i, err
}
const deleteCollectionTemplate = `-- name: DeleteCollectionTemplate :exec
DELETE FROM collection_templates
WHERE template_id = ?1
`
func (q *Queries) DeleteCollectionTemplate(ctx context.Context, templateID int64) error {
_, err := q.db.ExecContext(ctx, deleteCollectionTemplate, templateID)
return err
}
const deleteCollectionTemplates = `-- name: DeleteCollectionTemplates :exec
DELETE FROM collection_templates
WHERE collection_id = ?1 AND site_id = ?2
`
type DeleteCollectionTemplatesParams struct {
CollectionID string `json:"collection_id"`
SiteID string `json:"site_id"`
}
func (q *Queries) DeleteCollectionTemplates(ctx context.Context, arg DeleteCollectionTemplatesParams) error {
_, err := q.db.ExecContext(ctx, deleteCollectionTemplates, arg.CollectionID, arg.SiteID)
return err
}
const getCollectionTemplate = `-- name: GetCollectionTemplate :one
SELECT template_id, collection_id, site_id, name, html_template, is_default, created_at
FROM collection_templates
WHERE template_id = ?1
`
// Collection templates table queries
func (q *Queries) GetCollectionTemplate(ctx context.Context, templateID int64) (CollectionTemplate, error) {
row := q.db.QueryRowContext(ctx, getCollectionTemplate, templateID)
var i CollectionTemplate
err := row.Scan(
&i.TemplateID,
&i.CollectionID,
&i.SiteID,
&i.Name,
&i.HtmlTemplate,
&i.IsDefault,
&i.CreatedAt,
)
return i, err
}
const getCollectionTemplates = `-- name: GetCollectionTemplates :many
SELECT template_id, collection_id, site_id, name, html_template, is_default, created_at
FROM collection_templates
WHERE collection_id = ?1 AND site_id = ?2
ORDER BY is_default DESC, created_at ASC
`
type GetCollectionTemplatesParams struct {
CollectionID string `json:"collection_id"`
SiteID string `json:"site_id"`
}
func (q *Queries) GetCollectionTemplates(ctx context.Context, arg GetCollectionTemplatesParams) ([]CollectionTemplate, error) {
rows, err := q.db.QueryContext(ctx, getCollectionTemplates, arg.CollectionID, arg.SiteID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []CollectionTemplate
for rows.Next() {
var i CollectionTemplate
if err := rows.Scan(
&i.TemplateID,
&i.CollectionID,
&i.SiteID,
&i.Name,
&i.HtmlTemplate,
&i.IsDefault,
&i.CreatedAt,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getDefaultTemplate = `-- name: GetDefaultTemplate :one
SELECT template_id, collection_id, site_id, name, html_template, is_default, created_at
FROM collection_templates
WHERE collection_id = ?1 AND site_id = ?2 AND is_default = TRUE
LIMIT 1
`
type GetDefaultTemplateParams struct {
CollectionID string `json:"collection_id"`
SiteID string `json:"site_id"`
}
func (q *Queries) GetDefaultTemplate(ctx context.Context, arg GetDefaultTemplateParams) (CollectionTemplate, error) {
row := q.db.QueryRowContext(ctx, getDefaultTemplate, arg.CollectionID, arg.SiteID)
var i CollectionTemplate
err := row.Scan(
&i.TemplateID,
&i.CollectionID,
&i.SiteID,
&i.Name,
&i.HtmlTemplate,
&i.IsDefault,
&i.CreatedAt,
)
return i, err
}
const setTemplateAsDefault = `-- name: SetTemplateAsDefault :exec
UPDATE collection_templates
SET is_default = CASE
WHEN template_id = ?1 THEN TRUE
ELSE FALSE
END
WHERE collection_id = ?2 AND site_id = ?3
`
type SetTemplateAsDefaultParams struct {
TemplateID int64 `json:"template_id"`
CollectionID string `json:"collection_id"`
SiteID string `json:"site_id"`
}
func (q *Queries) SetTemplateAsDefault(ctx context.Context, arg SetTemplateAsDefaultParams) error {
_, err := q.db.ExecContext(ctx, setTemplateAsDefault, arg.TemplateID, arg.CollectionID, arg.SiteID)
return err
}
const updateCollectionTemplate = `-- name: UpdateCollectionTemplate :one
UPDATE collection_templates
SET name = ?1, html_template = ?2, is_default = ?3
WHERE template_id = ?4
RETURNING template_id, collection_id, site_id, name, html_template, is_default, created_at
`
type UpdateCollectionTemplateParams struct {
Name string `json:"name"`
HtmlTemplate string `json:"html_template"`
IsDefault int64 `json:"is_default"`
TemplateID int64 `json:"template_id"`
}
func (q *Queries) UpdateCollectionTemplate(ctx context.Context, arg UpdateCollectionTemplateParams) (CollectionTemplate, error) {
row := q.db.QueryRowContext(ctx, updateCollectionTemplate,
arg.Name,
arg.HtmlTemplate,
arg.IsDefault,
arg.TemplateID,
)
var i CollectionTemplate
err := row.Scan(
&i.TemplateID,
&i.CollectionID,
&i.SiteID,
&i.Name,
&i.HtmlTemplate,
&i.IsDefault,
&i.CreatedAt,
)
return i, err
}