Files
insertr/VERSION-CONTROL-SUMMARY.md
Joakim bab329b429 refactor: implement database-specific schema architecture with schema-as-query pattern
🏗️ **Major Database Schema Refactoring**

**Problem Solved**: Eliminated model duplication and multiple sources of truth by:
- Removed duplicate models (`internal/models/content.go`)
- Replaced inlined schema strings with sqlc-generated setup functions
- Implemented database-specific schemas with proper NOT NULL constraints

**Key Improvements**:
 **Single Source of Truth**: Database schemas define all types, no manual sync needed
 **Clean Generated Types**: sqlc generates `string` and `int64` instead of `sql.NullString/sql.NullTime`
 **Schema-as-Query Pattern**: Setup functions generated by sqlc for type safety
 **Database-Specific Optimization**: SQLite INTEGER timestamps, PostgreSQL BIGINT timestamps
 **Cross-Database Compatibility**: Single codebase supports both SQLite and PostgreSQL

**Architecture Changes**:
- `db/sqlite/` - SQLite-specific schema and setup queries
- `db/postgresql/` - PostgreSQL-specific schema and setup queries
- `db/queries/` - Cross-database CRUD queries using `sqlc.arg()` syntax
- `internal/db/database.go` - Database abstraction with runtime selection
- `internal/api/models.go` - Clean API models for requests/responses

**Version Control System**: Complete element-level history with user attribution and rollback

**Verification**:  Full API workflow tested (create → update → rollback → versions)
**Production Ready**: Supports SQLite (development) → PostgreSQL (production) migration
2025-09-09 00:25:07 +02:00

5.8 KiB

Version Control Implementation Summary

🎯 What We Built

A complete version control system for the Insertr CMS with user attribution, rollback functionality, and modern database architecture using sqlc.

🏗️ Architecture Changes

Database Layer (sqlc + Modern Schema)

  • sqlc Integration: Type-safe Go database code generated from SQL
  • Clean Schema: content + content_versions tables with proper indexing
  • User Attribution: Track who made each change with timestamps
  • Version History: Complete edit history preserved automatically

API Enhancements

  • Version Endpoints: GET /{id}/versions, POST /{id}/rollback
  • User Attribution: X-User-ID header support for all operations
  • Automatic Versioning: Current content archived before any update
  • Clean Error Handling: Proper HTTP status codes and error messages

Frontend Version Control UI

  • History Button: Added to all edit forms
  • Version Modal: Professional GitHub-style version history display
  • One-Click Rollback: Restore any previous version instantly
  • User Attribution: Display who made each change and when
  • Version Comparison: Preview content changes before restoring

🔧 Technical Implementation

ID Generation System (Fixed)

  • Deterministic IDs: Same content always generates same ID
  • CLI ↔ JS Consistency: Both systems use identical SHA-1 based algorithm
  • Content-Based Versioning: Content changes create new IDs naturally
  • Developer Override: HTML id attribute takes precedence over generated IDs

Database Schema

-- Current content (latest versions only)
CREATE TABLE content (
    id TEXT NOT NULL,
    site_id TEXT NOT NULL, 
    value TEXT NOT NULL,
    type TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    last_edited_by TEXT,
    PRIMARY KEY (id, site_id)
);

-- Complete version history
CREATE TABLE content_versions (
    version_id INTEGER PRIMARY KEY AUTOINCREMENT,
    content_id TEXT NOT NULL,
    site_id TEXT NOT NULL,
    value TEXT NOT NULL,
    type TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    created_by TEXT
);

API Workflow Example

# 1. Create content
POST /api/content
{"id": "hero-title", "value": "Original", "type": "text"}

# 2. Update (auto-archives current version)
PUT /api/content/hero-title?site_id=demo
{"value": "Updated content"}

# 3. View history
GET /api/content/hero-title/versions?site_id=demo
# Returns: [{"version_id": 1, "value": "Original", "created_by": "user"}]

# 4. Rollback 
POST /api/content/hero-title/rollback?site_id=demo
{"version_id": 1}

🎮 User Experience

Content Editor Workflow

  1. Click Edit on any class="insertr" element
  2. Professional Modal opens with current content
  3. View History button shows version timeline
  4. Version Modal displays all changes with timestamps and authors
  5. One-Click Restore to any previous version
  6. All Changes Tracked automatically with user attribution

Developer Experience

  • Zero Configuration: Still just add class="insertr"
  • Hidden Complexity: Version control happens transparently
  • Full Control: HTML id attribute overrides system-generated IDs
  • Type Safety: sqlc provides compile-time SQL validation
  • Modern Tooling: Professional database migration workflow

📊 Features Delivered

Core Version Control

  • Complete Edit History: Every change preserved permanently
  • User Attribution: Track who made each change
  • One-Click Rollback: Restore any previous version instantly
  • Automatic Versioning: No manual intervention required

Professional UI

  • GitHub-Style History: Familiar version control interface
  • Version Comparison: See what changed between versions
  • User-Friendly Timestamps: "2h ago", "yesterday", etc.
  • Responsive Design: Works on mobile and desktop

Developer Tools

  • sqlc Integration: Type-safe database operations
  • Clean Database Schema: Proper indexing and relationships
  • Development Commands: just server-generate, just server-clean-db
  • API Documentation: Complete endpoint reference

Production Ready

  • SQLite → PostgreSQL: Easy database migration path
  • Proper Error Handling: Informative error messages
  • CORS Configured: Multi-origin support for development
  • Health Checks: Monitoring and debugging endpoints

🚀 What's Different Now

Before: Basic CMS

  • Simple content editing
  • No version history
  • Temporal ID conflicts
  • No user tracking

After: Professional CMS

  • Complete version control with rollback
  • User attribution for all changes
  • Deterministic ID system (CLI ↔ JS consistent)
  • Modern database architecture (sqlc)
  • Professional editing UI with history
  • Production-ready API with proper error handling

📋 Development Workflow Enhanced

New Commands

# Generate database code from SQL
just server-generate

# Clean development database  
just server-clean-db

# Full version control development
just dev  # Now includes version history UI

Updated Files

  • Database: insertr-server/db/ - Complete sqlc setup
  • API: internal/api/handlers.go - Version control endpoints
  • Frontend: lib/src/ui/form-renderer.js - History modal UI
  • Docs: Updated README.md with version control features

🎯 Result

Insertr now provides WordPress-style version control with:

  • Professional editing experience
  • Complete change tracking
  • Easy rollback functionality
  • Modern database architecture
  • Type-safe backend code

All while maintaining the "zero configuration" philosophy - developers still just add class="insertr" and get a complete CMS with version control.