Major architectural simplification removing content type complexity: Database Schema: - Remove 'type' field from content and content_versions tables - Simplify to pure HTML storage with html_content + original_template - Regenerate all sqlc models for SQLite and PostgreSQL API Simplification: - Remove content type routing and validation - Eliminate type-specific handlers (text/markdown/structured) - Unified HTML-first approach for all content operations - Simplify CreateContent and UpdateContent to HTML-only Backend Enhancements: - Update enhancer to only generate data-content-id (no data-content-type) - Improve container expansion utilities with comprehensive block/inline rules - Add Phase 3 preparation with boundary-respecting traversal logic - Strengthen element classification for viable children detection Documentation: - Update TODO.md to reflect Phase 1-3 completion status - Add WORKING_ON.md documenting the architectural transformation - Mark container expansion and HTML-first architecture as complete This completes the transition to a unified HTML-first content management system with automatic style detection and element-based behavior, eliminating the complex multi-type system in favor of semantic HTML-driven editing.
159 lines
4.6 KiB
Go
159 lines
4.6 KiB
Go
package content
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/insertr/insertr/internal/engine"
|
|
)
|
|
|
|
// MockClient implements ContentClient with mock data for development
|
|
type MockClient struct {
|
|
data map[string]engine.ContentItem
|
|
}
|
|
|
|
// NewMockClient creates a new mock content client with sample data
|
|
func NewMockClient() *MockClient {
|
|
// Generate realistic mock content based on actual generated IDs
|
|
data := map[string]engine.ContentItem{
|
|
// Navigation (index.html has collision suffix)
|
|
"navbar-logo-2b10ad": {
|
|
ID: "navbar-logo-2b10ad",
|
|
SiteID: "demo",
|
|
HTMLContent: "Acme Consulting Solutions",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"navbar-logo-2b10ad-a44bad": {
|
|
ID: "navbar-logo-2b10ad-a44bad",
|
|
SiteID: "demo",
|
|
HTMLContent: "Acme Business Advisors",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Hero Section - index.html (updated with actual IDs)
|
|
"hero-title-7cfeea": {
|
|
ID: "hero-title-7cfeea",
|
|
SiteID: "demo",
|
|
HTMLContent: "Transform Your Business with Strategic Expertise",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"hero-lead-e47475": {
|
|
ID: "hero-lead-e47475",
|
|
SiteID: "demo",
|
|
HTMLContent: "We help <strong>ambitious businesses</strong> grow through strategic planning, process optimization, and digital transformation. Our team brings 20+ years of experience to accelerate your success.",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"hero-link-76c620": {
|
|
ID: "hero-link-76c620",
|
|
SiteID: "demo",
|
|
HTMLContent: "Schedule Free Consultation",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Hero Section - about.html
|
|
"hero-title-c70343": {
|
|
ID: "hero-title-c70343",
|
|
SiteID: "demo",
|
|
HTMLContent: "About Our Consulting Expertise",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"hero-lead-673026": {
|
|
ID: "hero-lead-673026",
|
|
SiteID: "demo",
|
|
HTMLContent: "We're a team of <strong>experienced consultants</strong> dedicated to helping small businesses thrive in today's competitive marketplace through proven strategies.",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Services Section
|
|
"services-subtitle-c8927c": {
|
|
ID: "services-subtitle-c8927c",
|
|
SiteID: "demo",
|
|
HTMLContent: "Our Story",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"services-text-0d96da": {
|
|
ID: "services-text-0d96da",
|
|
SiteID: "demo",
|
|
HTMLContent: "<strong>Founded in 2020</strong>, Acme Consulting emerged from a simple observation: small businesses needed access to the same high-quality strategic advice that large corporations receive, but in a format that was accessible, affordable, and actionable.",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Default fallback for any missing content
|
|
"default": {
|
|
ID: "default",
|
|
SiteID: "demo",
|
|
HTMLContent: "[Enhanced Content]",
|
|
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
}
|
|
|
|
return &MockClient{data: data}
|
|
}
|
|
|
|
// GetContent fetches a single content item by ID
|
|
func (m *MockClient) GetContent(siteID, contentID string) (*engine.ContentItem, error) {
|
|
if item, exists := m.data[contentID]; exists && item.SiteID == siteID {
|
|
return &item, nil
|
|
}
|
|
|
|
// Return nil for missing content - this will preserve original HTML content
|
|
return nil, nil
|
|
}
|
|
|
|
// GetBulkContent fetches multiple content items by IDs
|
|
func (m *MockClient) GetBulkContent(siteID string, contentIDs []string) (map[string]engine.ContentItem, error) {
|
|
result := make(map[string]engine.ContentItem)
|
|
|
|
for _, id := range contentIDs {
|
|
item, err := m.GetContent(siteID, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if item != nil {
|
|
result[id] = *item
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// GetAllContent fetches all content for a site
|
|
func (m *MockClient) GetAllContent(siteID string) (map[string]engine.ContentItem, error) {
|
|
result := make(map[string]engine.ContentItem)
|
|
|
|
for _, item := range m.data {
|
|
if item.SiteID == siteID {
|
|
result[item.ID] = item
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// CreateContent creates a new mock content item
|
|
func (m *MockClient) CreateContent(siteID, contentID, htmlContent, originalTemplate, lastEditedBy string) (*engine.ContentItem, error) {
|
|
// For mock client, just create and store the item
|
|
item := engine.ContentItem{
|
|
ID: contentID,
|
|
SiteID: siteID,
|
|
HTMLContent: htmlContent,
|
|
OriginalTemplate: originalTemplate,
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
LastEditedBy: lastEditedBy,
|
|
}
|
|
|
|
// Store in mock data
|
|
m.data[contentID] = item
|
|
|
|
return &item, nil
|
|
}
|