- 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.
85 lines
2.3 KiB
Go
85 lines
2.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
|
|
"github.com/insertr/insertr/internal/content"
|
|
"github.com/insertr/insertr/internal/db"
|
|
"github.com/insertr/insertr/internal/engine"
|
|
)
|
|
|
|
var enhanceCmd = &cobra.Command{
|
|
Use: "enhance [input-dir]",
|
|
Short: "Enhance HTML files by injecting content from database",
|
|
Long: `Enhance processes HTML files and injects latest content from the database
|
|
while adding editing capabilities. This is the core build-time enhancement
|
|
process that transforms static HTML into an editable CMS.`,
|
|
Args: cobra.ExactArgs(1),
|
|
Run: runEnhance,
|
|
}
|
|
|
|
var (
|
|
outputDir string
|
|
)
|
|
|
|
func init() {
|
|
enhanceCmd.Flags().StringVarP(&outputDir, "output", "o", "./dist", "Output directory for enhanced files")
|
|
|
|
// Bind flags to viper
|
|
viper.BindPFlag("cli.output", enhanceCmd.Flags().Lookup("output"))
|
|
}
|
|
|
|
func runEnhance(cmd *cobra.Command, args []string) {
|
|
inputDir := args[0]
|
|
|
|
// Validate input directory
|
|
if _, err := os.Stat(inputDir); os.IsNotExist(err) {
|
|
log.Fatalf("Input directory does not exist: %s", inputDir)
|
|
}
|
|
|
|
// Get configuration values
|
|
dbPath := viper.GetString("database.path")
|
|
apiURL := viper.GetString("api.url")
|
|
apiKey := viper.GetString("api.key")
|
|
siteID := viper.GetString("cli.site_id")
|
|
outputDir := viper.GetString("cli.output")
|
|
|
|
// Create content client
|
|
var client engine.ContentClient
|
|
if apiURL != "" {
|
|
fmt.Printf("🌐 Using content API: %s\n", apiURL)
|
|
client = content.NewHTTPClient(apiURL, apiKey)
|
|
} else if dbPath != "" {
|
|
fmt.Printf("🗄️ Using database: %s\n", dbPath)
|
|
database, err := db.NewDatabase(dbPath)
|
|
if err != nil {
|
|
log.Fatalf("Failed to initialize database: %v", err)
|
|
}
|
|
defer database.Close()
|
|
client = content.NewDatabaseClient(database)
|
|
} else {
|
|
fmt.Printf("🧪 No database or API configured, using mock content\n")
|
|
client = content.NewMockClient()
|
|
}
|
|
|
|
// Create enhancer
|
|
enhancer := content.NewEnhancer(client, siteID)
|
|
|
|
fmt.Printf("🚀 Starting enhancement process...\n")
|
|
fmt.Printf("📁 Input: %s\n", inputDir)
|
|
fmt.Printf("📁 Output: %s\n", outputDir)
|
|
fmt.Printf("🏷️ Site ID: %s\n\n", siteID)
|
|
|
|
// Enhance directory
|
|
if err := enhancer.EnhanceDirectory(inputDir, outputDir); err != nil {
|
|
log.Fatalf("Enhancement failed: %v", err)
|
|
}
|
|
|
|
fmt.Printf("\n✅ Enhancement complete! Enhanced files available in: %s\n", outputDir)
|
|
}
|