Consolidate type definitions and fix API contract

- 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.
This commit is contained in:
2025-09-16 16:45:29 +02:00
parent d0ac3088b4
commit d877366be0
15 changed files with 150 additions and 181 deletions

View File

@@ -9,6 +9,7 @@ import (
"github.com/insertr/insertr/internal/db"
"github.com/insertr/insertr/internal/db/postgresql"
"github.com/insertr/insertr/internal/db/sqlite"
"github.com/insertr/insertr/internal/engine"
)
// DatabaseClient implements ContentClient for direct database access
@@ -24,7 +25,7 @@ func NewDatabaseClient(database *db.Database) *DatabaseClient {
}
// GetContent fetches a single content item by ID
func (d *DatabaseClient) GetContent(siteID, contentID string) (*ContentItem, error) {
func (d *DatabaseClient) GetContent(siteID, contentID string) (*engine.ContentItem, error) {
ctx := context.Background()
var content interface{}
var err error
@@ -56,9 +57,9 @@ func (d *DatabaseClient) GetContent(siteID, contentID string) (*ContentItem, err
}
// GetBulkContent fetches multiple content items by IDs
func (d *DatabaseClient) GetBulkContent(siteID string, contentIDs []string) (map[string]ContentItem, error) {
func (d *DatabaseClient) GetBulkContent(siteID string, contentIDs []string) (map[string]engine.ContentItem, error) {
if len(contentIDs) == 0 {
return make(map[string]ContentItem), nil
return make(map[string]engine.ContentItem), nil
}
ctx := context.Background()
@@ -87,7 +88,7 @@ func (d *DatabaseClient) GetBulkContent(siteID string, contentIDs []string) (map
items := d.convertToContentItemList(dbContent)
// Convert slice to map for easy lookup
result := make(map[string]ContentItem)
result := make(map[string]engine.ContentItem)
for _, item := range items {
result[item.ID] = item
}
@@ -96,7 +97,7 @@ func (d *DatabaseClient) GetBulkContent(siteID string, contentIDs []string) (map
}
// GetAllContent fetches all content for a site
func (d *DatabaseClient) GetAllContent(siteID string) (map[string]ContentItem, error) {
func (d *DatabaseClient) GetAllContent(siteID string) (map[string]engine.ContentItem, error) {
ctx := context.Background()
var dbContent interface{}
var err error
@@ -117,7 +118,7 @@ func (d *DatabaseClient) GetAllContent(siteID string) (map[string]ContentItem, e
items := d.convertToContentItemList(dbContent)
// Convert slice to map for easy lookup
result := make(map[string]ContentItem)
result := make(map[string]engine.ContentItem)
for _, item := range items {
result[item.ID] = item
}
@@ -125,12 +126,12 @@ func (d *DatabaseClient) GetAllContent(siteID string) (map[string]ContentItem, e
return result, nil
}
// convertToContentItem converts database models to content.ContentItem
func (d *DatabaseClient) convertToContentItem(content interface{}) ContentItem {
// convertToContentItem converts database models to engine.ContentItem
func (d *DatabaseClient) convertToContentItem(content interface{}) engine.ContentItem {
switch d.db.GetDBType() {
case "sqlite3":
c := content.(sqlite.Content)
return ContentItem{
return engine.ContentItem{
ID: c.ID,
SiteID: c.SiteID,
Value: c.Value,
@@ -139,7 +140,7 @@ func (d *DatabaseClient) convertToContentItem(content interface{}) ContentItem {
}
case "postgresql":
c := content.(postgresql.Content)
return ContentItem{
return engine.ContentItem{
ID: c.ID,
SiteID: c.SiteID,
Value: c.Value,
@@ -147,26 +148,26 @@ func (d *DatabaseClient) convertToContentItem(content interface{}) ContentItem {
UpdatedAt: time.Unix(c.UpdatedAt, 0).Format(time.RFC3339),
}
}
return ContentItem{} // Should never happen
return engine.ContentItem{} // Should never happen
}
// convertToContentItemList converts database model lists to content.ContentItem slice
func (d *DatabaseClient) convertToContentItemList(contentList interface{}) []ContentItem {
// convertToContentItemList converts database model lists to engine.ContentItem slice
func (d *DatabaseClient) convertToContentItemList(contentList interface{}) []engine.ContentItem {
switch d.db.GetDBType() {
case "sqlite3":
list := contentList.([]sqlite.Content)
items := make([]ContentItem, len(list))
items := make([]engine.ContentItem, len(list))
for i, content := range list {
items[i] = d.convertToContentItem(content)
}
return items
case "postgresql":
list := contentList.([]postgresql.Content)
items := make([]ContentItem, len(list))
items := make([]engine.ContentItem, len(list))
for i, content := range list {
items[i] = d.convertToContentItem(content)
}
return items
}
return []ContentItem{} // Should never happen
return []engine.ContentItem{} // Should never happen
}