🏗️ **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
5.8 KiB
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_versionstables 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-IDheader 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
idattribute 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
- Click Edit on any
class="insertr"element - Professional Modal opens with current content
- View History button shows version timeline
- Version Modal displays all changes with timestamps and authors
- One-Click Restore to any previous version
- 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
idattribute 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.