claw-code/.guardrails/mcp-server/internal/database/DATABASE_REVIEW.md

222 lines
7.3 KiB
Markdown

# Database Layer Review Summary
## Review Date: 2026-02-07
## Reviewer: PostgreSQL Expert Agent
---
## Critical Issues Fixed
### 1. SQL Injection Vulnerabilities (CRITICAL)
**Problem**: Dynamic query building using `fmt.Sprintf` with user input in List methods:
- `documents.go`: List() method
- `rules.go`: List() method
- `failures.go`: List() method
**Solution**: Replaced string concatenation with type-safe query building using explicit parameter positions.
**Files Modified**:
- `/mcp-server/internal/database/documents.go`
- `/mcp-server/internal/database/rules.go`
- `/mcp-server/internal/database/failures.go`
### 2. Missing Transaction Support (HIGH)
**Problem**: Write operations (Create, Update, Delete) were not wrapped in transactions, risking data inconsistency on failures.
**Solution**: Added transaction wrapping for all write operations with proper commit/rollback handling.
**Files Modified**:
- `/mcp-server/internal/database/documents.go`
- `/mcp-server/internal/database/rules.go`
- `/mcp-server/internal/database/projects.go`
- `/mcp-server/internal/database/failures.go`
### 3. Inconsistent Error Handling (MEDIUM)
**Problem**:
- Raw errors returned without wrapping
- Using `err == sql.ErrNoRows` instead of `errors.Is()`
- Missing context in error messages
**Solution**:
- Added `errors` import
- Replaced `err == sql.ErrNoRows` with `errors.Is(err, sql.ErrNoRows)`
- All errors now wrapped with `fmt.Errorf("...: %w", err)`
---
## Schema Improvements
### Migration 003: Automatic Timestamps and Search Vector
**File**: `migrations/003_add_triggers.up.sql`
- Added `update_updated_at_column()` trigger function
- Added `update_document_search_vector()` trigger function
- Triggers automatically maintain:
- `updated_at` timestamp on all tables
- Full-text search vector on documents table
### Migration 004: Index Optimization
**File**: `migrations/004_fix_indexes.up.sql`
- Removed redundant `idx_documents_slug` (slug is UNIQUE)
- Added missing `idx_rules_rule_id` index
- Added composite `idx_rules_enabled_severity` for active rule queries
- Added `idx_documents_created` for time-based queries
- Added `idx_failures_status_severity` for dashboard queries
- Added `idx_rules_pattern_hash` for pattern lookups
### Migration 005: Schema Versioning
**File**: `migrations/005_schema_versioning.up.sql`
- Created `schema_migrations` table for tracking applied migrations
- Supports checksum validation for migration integrity
### Migration 006: Partition Management
**File**: `migrations/006_partition_management.up.sql`
- Added `create_monthly_partition()` function
- Added `ensure_future_partitions()` function
- Automatically creates partitions for upcoming months
- Supports both `failure_registry` and `audit_log` tables
---
## Connection Pool Enhancements
**File**: `/mcp-server/internal/database/postgres.go`
### Changes:
1. **Retry Logic**: Added `pingWithRetry()` with exponential backoff
2. **Health Check Enhancement**: Added pool capacity monitoring
3. **Pool Stats**: Added `PoolStats()` method for metrics
4. **Constants**: Extracted magic numbers to named constants
### New File: Transaction Helper
**File**: `/mcp-server/internal/database/tx.go`
- `WithTransaction()`: Standard transaction wrapper with panic recovery
- `WithTransactionReadOnly()`: Read-only transaction wrapper
- Error type checking functions:
- `IsUniqueViolation()`
- `IsForeignKeyViolation()`
- `IsSerializationFailure()`
- `IsDeadlockDetected()`
---
## Model Validation
### Document Model
**File**: `/mcp-server/internal/models/document.go`
Added `Validate()` method checking:
- Required fields (slug, title, content, category, path)
- Field length limits
- Valid category values
- Version defaults
### Prevention Rule Model
**File**: `/mcp-server/internal/models/rule.go`
Added `Validate()` method checking:
- Required fields (rule_id, name, pattern, message)
- Field length limits
- Valid severity values
### Project Model
**File**: `/mcp-server/internal/models/project.go`
Added `Validate()` method checking:
- Required fields (name, slug)
- Field length limits
- Valid slug format (alphanumeric, hyphens, underscores)
### Failure Entry Model
**File**: `/mcp-server/internal/models/failure.go`
Added `Validate()` method checking:
- Required fields (failure_id, category, severity, error_message)
- Valid severity values (critical, high, medium, low)
- Valid status values
- Field length limits
---
## Security Improvements
### Search Query Sanitization
**File**: `/mcp-server/internal/database/documents.go`
- Added `sanitizeSearchQuery()` function
- Validates query length (max 200 chars)
- Removes dangerous characters
- Prevents FTS operator injection
- Checks for balanced parentheses
---
## Performance Optimizations
1. **Covering Indexes**: Added covering indexes for common queries to avoid table lookups
2. **Partial Indexes**: Added partial indexes on `enabled = true` for active rules
3. **GIN Indexes**: Maintained GIN indexes for JSONB and array columns
4. **Composite Indexes**: Added composite indexes for multi-column filters
---
## Files Created
1. `/mcp-server/internal/database/migrations/003_add_triggers.up.sql`
2. `/mcp-server/internal/database/migrations/003_add_triggers.down.sql`
3. `/mcp-server/internal/database/migrations/004_fix_indexes.up.sql`
4. `/mcp-server/internal/database/migrations/004_fix_indexes.down.sql`
5. `/mcp-server/internal/database/migrations/005_schema_versioning.up.sql`
6. `/mcp-server/internal/database/migrations/005_schema_versioning.down.sql`
7. `/mcp-server/internal/database/migrations/006_partition_management.up.sql`
8. `/mcp-server/internal/database/migrations/006_partition_management.down.sql`
9. `/mcp-server/internal/database/tx.go`
---
## Files Modified
1. `/mcp-server/internal/database/postgres.go` - Connection pool and retry logic
2. `/mcp-server/internal/database/documents.go` - SQL injection fix, transactions, error handling
3. `/mcp-server/internal/database/rules.go` - SQL injection fix, transactions, error handling
4. `/mcp-server/internal/database/projects.go` - Transactions, error handling
5. `/mcp-server/internal/database/failures.go` - SQL injection fix, transactions, error handling
6. `/mcp-server/internal/models/document.go` - Added validation
7. `/mcp-server/internal/models/rule.go` - Added validation
8. `/mcp-server/internal/models/project.go` - Added validation
9. `/mcp-server/internal/models/failure.go` - Added validation
---
## Compliance Status
- [x] SQL injection vulnerabilities fixed
- [x] Transaction support added for all write operations
- [x] Error handling standardized with proper wrapping
- [x] Database indexes optimized
- [x] Automatic timestamp maintenance via triggers
- [x] Full-text search vector auto-updates
- [x] Schema versioning implemented
- [x] Partition management automated
- [x] Model validation added
- [x] Connection pool metrics available
- [x] Transaction helper utilities created
---
## Recommendations for Future Work
1. **Add Database Tests**: Create comprehensive unit tests for all store methods
2. **Query Logging**: Add slow query logging for performance monitoring
3. **Connection Pool Tuning**: Monitor pool metrics and adjust based on load
4. **Migration Tooling**: Consider using a migration framework like golang-migrate
5. **Prepared Statements**: Consider using prepared statements for frequently executed queries
6. **Read Replicas**: If scaling requires, add support for read replica connections