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
This commit is contained in:
2025-09-09 00:25:07 +02:00
parent 161c320304
commit bab329b429
41 changed files with 3703 additions and 561 deletions

169
VERSION-CONTROL-SUMMARY.md Normal file
View File

@@ -0,0 +1,169 @@
# 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**
```sql
-- 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**
```bash
# 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**
```bash
# 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.