- Problem: Element ID collisions between similar elements (logo h1 vs hero h1) causing content to be injected into wrong elements - Root cause: Enhancer used naive tag+class matching instead of parser's sophisticated semantic analysis for element identification Systematic solution: - Enhanced parser architecture with exported utilities (GetClasses, ContainsClass) - Added FindElementInDocument() with content-based semantic matching - Replaced naive findAndInjectNodes() with parser-based element matching - Removed code duplication between parser and enhancer packages Backend improvements: - Moved ID generation to backend for single source of truth - Added ElementContext struct for frontend-backend communication - Updated API handlers to support context-based content ID generation Frontend improvements: - Enhanced getElementMetadata() to extract semantic context - Updated save flow to handle both enhanced and non-enhanced elements - Improved API client to use backend-generated content IDs Result: - Unique content IDs: navbar-logo-200530 vs hero-title-a1de7b - Precise element matching using content validation - Single source of truth for DOM utilities in parser package - Eliminated 40+ lines of duplicate code while fixing core bug
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package api
|
|
|
|
import "time"
|
|
|
|
// API request/response models
|
|
type ContentItem struct {
|
|
ID string `json:"id"`
|
|
SiteID string `json:"site_id"`
|
|
Value string `json:"value"`
|
|
Type string `json:"type"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
LastEditedBy string `json:"last_edited_by"`
|
|
}
|
|
|
|
type ContentVersion struct {
|
|
VersionID int64 `json:"version_id"`
|
|
ContentID string `json:"content_id"`
|
|
SiteID string `json:"site_id"`
|
|
Value string `json:"value"`
|
|
Type string `json:"type"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
CreatedBy string `json:"created_by"`
|
|
}
|
|
|
|
type ContentResponse struct {
|
|
Content []ContentItem `json:"content"`
|
|
}
|
|
|
|
type ContentVersionsResponse struct {
|
|
Versions []ContentVersion `json:"versions"`
|
|
}
|
|
|
|
// Element context for backend ID generation
|
|
type ElementContext struct {
|
|
Tag string `json:"tag"`
|
|
Classes []string `json:"classes"`
|
|
OriginalContent string `json:"original_content"`
|
|
ParentContext string `json:"parent_context"`
|
|
Purpose string `json:"purpose"`
|
|
}
|
|
|
|
// Request models
|
|
type CreateContentRequest struct {
|
|
ID string `json:"id,omitempty"` // For enhanced sites
|
|
ElementContext *ElementContext `json:"element_context,omitempty"` // For non-enhanced sites
|
|
SiteID string `json:"site_id,omitempty"`
|
|
Value string `json:"value"`
|
|
Type string `json:"type"`
|
|
CreatedBy string `json:"created_by,omitempty"`
|
|
}
|
|
|
|
type UpdateContentRequest struct {
|
|
Value string `json:"value"`
|
|
Type string `json:"type,omitempty"`
|
|
UpdatedBy string `json:"updated_by,omitempty"`
|
|
}
|
|
|
|
type RollbackContentRequest struct {
|
|
VersionID int64 `json:"version_id"`
|
|
RolledBackBy string `json:"rolled_back_by,omitempty"`
|
|
}
|