Fix site_id isolation for demo sites

- Auto-derive site_id from demo directory paths (demos/demo-site -> 'demo', demos/simple/test-simple -> 'simple')
- Add validation requiring explicit site_id for non-demo paths with helpful error messages
- Remove JavaScript 'demo' fallback and add proper error messaging for missing site_id
- Ensure each demo site uses isolated content namespace to prevent content mixing

Resolves issue where /sites/simple and /sites/demo both used site_id=demo
This commit is contained in:
2025-09-16 22:23:41 +02:00
parent fe00a13780
commit 1fa607c47c
4 changed files with 120 additions and 3 deletions

View File

@@ -194,13 +194,89 @@ func (e *Enhancer) enhanceWithEngine(htmlContent []byte, filePath string) ([]byt
// EnhanceInPlace performs in-place enhancement of static site files
func (e *Enhancer) EnhanceInPlace(sitePath string, siteID string) error {
// Update the enhancer's site ID for this operation
// Use the provided siteID (derivation should happen at CLI level)
e.siteID = siteID
// Use EnhanceDirectory with same input and output (in-place)
return e.EnhanceDirectory(sitePath, sitePath)
}
// DeriveOrValidateSiteID automatically derives site_id for demo paths or validates for production
func DeriveOrValidateSiteID(sitePath string, configSiteID string) string {
// Check if this is a demo path
if strings.Contains(sitePath, "/demos/") {
return deriveDemoSiteID(sitePath)
}
// For non-demo paths, return the configured site_id
// Validation of non-demo site_id will be handled at the CLI level
return configSiteID
}
// deriveDemoSiteID extracts site_id from demo directory structure
func deriveDemoSiteID(sitePath string) string {
// Convert to absolute path and clean it
absPath, err := filepath.Abs(sitePath)
if err != nil {
absPath = sitePath
}
absPath = filepath.Clean(absPath)
// Look for patterns in demo paths:
// demos/demo-site_enhanced -> "demo"
// demos/simple/test-simple_enhanced -> "simple"
// demos/simple/dan-eden-portfolio -> "dan-eden"
parts := strings.Split(absPath, string(filepath.Separator))
// Find the demos directory index
demosIndex := -1
for i, part := range parts {
if part == "demos" {
demosIndex = i
break
}
}
if demosIndex == -1 || demosIndex >= len(parts)-1 {
// Fallback if demos not found in path
return "demo"
}
// Get the segment after demos/
nextSegment := parts[demosIndex+1]
// Handle different demo directory patterns:
if strings.HasPrefix(nextSegment, "demo-site") {
return "demo"
}
if nextSegment == "simple" && len(parts) > demosIndex+2 {
// For demos/simple/something, use the something part
finalSegment := parts[demosIndex+2]
// Extract meaningful name from directory
if strings.HasPrefix(finalSegment, "test-") {
// test-simple_enhanced -> simple
return "simple"
}
if strings.Contains(finalSegment, "dan-eden") {
return "dan-eden"
}
// Generic case: use the directory name as-is
return strings.TrimSuffix(finalSegment, "_enhanced")
}
// Default case: use the immediate subdirectory of demos/
result := strings.TrimSuffix(nextSegment, "_enhanced")
// Clean up common suffixes
result = strings.TrimSuffix(result, "-site")
return result
}
// copyFile copies a file from src to dst
func (e *Enhancer) copyFile(src, dst string) error {
// Create directory for destination