- Move all ContentItem, ContentClient, ContentResponse types to engine/types.go as single source of truth - Remove duplicate type definitions from content/types.go - Update all imports across codebase to use engine types - Enhance engine to extract existing data-content-id from HTML markup - Simplify frontend to always send html_markup, let server handle ID extraction/generation - Fix contentId reference errors in frontend error handling - Add getAttribute helper method to engine for ID extraction - Add GetAllContent method to engine.DatabaseClient - Update enhancer to use engine.ContentClient interface - All builds and API endpoints verified working This resolves the 400 Bad Request errors and creates a unified architecture where the server is the single source of truth for all ID generation and content type management.
141 lines
4.1 KiB
Go
141 lines
4.1 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",
|
|
Value: "Acme Consulting Solutions",
|
|
Type: "text",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"navbar-logo-2b10ad-a44bad": {
|
|
ID: "navbar-logo-2b10ad-a44bad",
|
|
SiteID: "demo",
|
|
Value: "Acme Business Advisors",
|
|
Type: "text",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Hero Section - index.html (updated with actual IDs)
|
|
"hero-title-7cfeea": {
|
|
ID: "hero-title-7cfeea",
|
|
SiteID: "demo",
|
|
Value: "Transform Your Business with Strategic Expertise",
|
|
Type: "text",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"hero-lead-e47475": {
|
|
ID: "hero-lead-e47475",
|
|
SiteID: "demo",
|
|
Value: "We help **ambitious businesses** grow through strategic planning, process optimization, and digital transformation. Our team brings 20+ years of experience to accelerate your success.",
|
|
Type: "markdown",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"hero-link-76c620": {
|
|
ID: "hero-link-76c620",
|
|
SiteID: "demo",
|
|
Value: "Schedule Free Consultation",
|
|
Type: "link",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Hero Section - about.html
|
|
"hero-title-c70343": {
|
|
ID: "hero-title-c70343",
|
|
SiteID: "demo",
|
|
Value: "About Our Consulting Expertise",
|
|
Type: "text",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"hero-lead-673026": {
|
|
ID: "hero-lead-673026",
|
|
SiteID: "demo",
|
|
Value: "We're a team of **experienced consultants** dedicated to helping small businesses thrive in today's competitive marketplace through proven strategies.",
|
|
Type: "markdown",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Services Section
|
|
"services-subtitle-c8927c": {
|
|
ID: "services-subtitle-c8927c",
|
|
SiteID: "demo",
|
|
Value: "Our Story",
|
|
Type: "text",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
"services-text-0d96da": {
|
|
ID: "services-text-0d96da",
|
|
SiteID: "demo",
|
|
Value: "**Founded in 2020**, 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.",
|
|
Type: "markdown",
|
|
UpdatedAt: time.Now().Format(time.RFC3339),
|
|
},
|
|
|
|
// Default fallback for any missing content
|
|
"default": {
|
|
ID: "default",
|
|
SiteID: "demo",
|
|
Value: "[Enhanced Content]",
|
|
Type: "text",
|
|
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
|
|
}
|