chore:megafix
This commit is contained in:
@ -1,422 +0,0 @@
|
||||
# Restore Implementation Plan
|
||||
|
||||
## Current State
|
||||
|
||||
### Existing Infrastructure
|
||||
- ✅ Database interface with `BuildRestoreCommand()` method
|
||||
- ✅ RestoreOptions struct defined
|
||||
- ✅ Placeholder `restore` command in CLI (preview mode only)
|
||||
- ✅ Archive type detection
|
||||
- ✅ PostgreSQL and MySQL restore command builders
|
||||
- ✅ Config with `RestoreDBName` field
|
||||
|
||||
### Missing Components
|
||||
- ❌ Restore engine implementation
|
||||
- ❌ Progress tracking for restore operations
|
||||
- ❌ TUI integration for restore
|
||||
- ❌ Error handling and rollback strategies
|
||||
- ❌ Pre-restore validation
|
||||
- ❌ Post-restore verification
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Phase 1: Core Restore Engine (Priority: HIGH)
|
||||
|
||||
#### 1.1 Create Restore Engine
|
||||
**File**: `internal/restore/engine.go`
|
||||
|
||||
```go
|
||||
type Engine struct {
|
||||
cfg *config.Config
|
||||
log logger.Logger
|
||||
db database.Database
|
||||
progress progress.Indicator
|
||||
detailedReporter *progress.DetailedReporter
|
||||
}
|
||||
|
||||
// Core methods
|
||||
- New(cfg, log, db) *Engine
|
||||
- RestoreSingle(ctx, archivePath, targetDB) error
|
||||
- RestoreCluster(ctx, archivePath) error
|
||||
- ValidateArchive(archivePath) error
|
||||
```
|
||||
|
||||
**Features**:
|
||||
- Archive format detection (dump, sql, tar.gz)
|
||||
- Decompression handling (gzip, pigz)
|
||||
- Progress tracking integration
|
||||
- Error recovery
|
||||
- Dry-run mode (`--dry-run` flag)
|
||||
|
||||
#### 1.2 Archive Format Handlers
|
||||
**File**: `internal/restore/formats.go`
|
||||
|
||||
```go
|
||||
type ArchiveFormat interface {
|
||||
Detect(path string) bool
|
||||
Extract(ctx, path, tempDir) error
|
||||
GetDatabases() ([]string, error)
|
||||
}
|
||||
|
||||
// Implementations
|
||||
- PostgreSQLDump // .dump files
|
||||
- PostgreSQLSQL // .sql files
|
||||
- MySQLSQL // .sql.gz files
|
||||
- ClusterArchive // .tar.gz files
|
||||
```
|
||||
|
||||
#### 1.3 Safety Features
|
||||
**File**: `internal/restore/safety.go`
|
||||
|
||||
```go
|
||||
// Pre-restore checks
|
||||
- ValidateTargetDatabase()
|
||||
- CheckDiskSpace()
|
||||
- VerifyArchiveIntegrity()
|
||||
- BackupExistingData() // Optional safety backup
|
||||
|
||||
// Confirmation system
|
||||
- RequireConfirmation(archiveInfo, targetDB)
|
||||
- GenerateRestorePreview()
|
||||
```
|
||||
|
||||
### Phase 2: CLI Integration (Priority: HIGH)
|
||||
|
||||
#### 2.1 Update Restore Command
|
||||
**File**: `cmd/restore.go` (new file, move from placeholder.go)
|
||||
|
||||
```bash
|
||||
# Single database restore
|
||||
dbbackup restore single backup.dump --target-db myapp_db
|
||||
|
||||
# Cluster restore
|
||||
dbbackup restore cluster cluster_20251105.tar.gz
|
||||
|
||||
# With confirmation
|
||||
dbbackup restore single backup.dump --target-db myapp_db --confirm
|
||||
|
||||
# Dry run (preview only)
|
||||
dbbackup restore single backup.dump --target-db myapp_db --dry-run
|
||||
|
||||
# Force overwrite (skip confirmation)
|
||||
dbbackup restore single backup.dump --target-db myapp_db --force
|
||||
```
|
||||
|
||||
**Flags**:
|
||||
- `--target-db`: Target database name (for single restore)
|
||||
- `--confirm`: Enable actual restore (default: preview only)
|
||||
- `--dry-run`: Show what would be done without executing
|
||||
- `--force`: Skip confirmation prompts
|
||||
- `--clean`: Drop existing database before restore
|
||||
- `--create`: Create database if it doesn't exist
|
||||
- `--no-owner`: Skip ownership restoration
|
||||
- `--jobs`: Parallel restore jobs (PostgreSQL only)
|
||||
|
||||
#### 2.2 Command Structure
|
||||
```
|
||||
dbbackup restore
|
||||
├── single <archive> --target-db <name>
|
||||
│ ├── --confirm # Actually execute
|
||||
│ ├── --dry-run # Preview only
|
||||
│ ├── --force # Skip prompts
|
||||
│ ├── --clean # Drop existing
|
||||
│ ├── --create # Create if missing
|
||||
│ └── --jobs <n> # Parallel jobs
|
||||
├── cluster <archive>
|
||||
│ ├── --confirm
|
||||
│ ├── --dry-run
|
||||
│ ├── --exclude <db> # Skip specific DBs
|
||||
│ └── --include <db> # Only restore specific DBs
|
||||
└── list <archive> # List archive contents
|
||||
└── --format json # JSON output
|
||||
```
|
||||
|
||||
### Phase 3: Progress & Monitoring (Priority: MEDIUM)
|
||||
|
||||
#### 3.1 Restore Progress Tracking
|
||||
**File**: `internal/restore/progress.go`
|
||||
|
||||
```go
|
||||
type RestoreProgress struct {
|
||||
Phase string // "extraction", "restoration", "verification"
|
||||
Database string
|
||||
TablesTotal int
|
||||
TablesRestored int
|
||||
BytesRestored int64
|
||||
StartTime time.Time
|
||||
EstimatedTime time.Duration
|
||||
}
|
||||
```
|
||||
|
||||
**Output Example**:
|
||||
```
|
||||
🔄 Restoring from: backup_20251105.tar.gz
|
||||
Phase: Extraction
|
||||
[1/3] Extracting archive...
|
||||
✅ Archive extracted (56.6 MB)
|
||||
|
||||
Phase: Restoration
|
||||
[2/3] Restoring databases...
|
||||
[1/13] myapp_db (tables: 45)
|
||||
├─ users (1.2M rows) ✅
|
||||
├─ orders (890K rows) ✅
|
||||
├─ products (12K rows) ✅
|
||||
✅ Database myapp_db restored (2.5 GB)
|
||||
|
||||
Phase: Verification
|
||||
[3/3] Verifying restore...
|
||||
✅ All tables verified
|
||||
|
||||
✅ Restore completed in 4m 23s
|
||||
```
|
||||
|
||||
### Phase 4: TUI Integration (Priority: MEDIUM)
|
||||
|
||||
#### 4.1 TUI Restore Menu
|
||||
**File**: `internal/tui/restore.go`
|
||||
|
||||
```
|
||||
┌─ Restore Menu ────────────────────────────┐
|
||||
│ │
|
||||
│ 1. Restore Single Database │
|
||||
│ 2. Restore Cluster │
|
||||
│ 3. List Archive Contents │
|
||||
│ 4. Back to Main Menu │
|
||||
│ │
|
||||
│ Engine: PostgreSQL ◀─────────────▶ │
|
||||
│ │
|
||||
└────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### 4.2 Archive Browser
|
||||
**File**: `internal/tui/archive_browser.go`
|
||||
|
||||
```
|
||||
┌─ Select Archive ──────────────────────────┐
|
||||
│ │
|
||||
│ 📦 cluster_20251105_132923.tar.gz │
|
||||
│ 56.6 MB | 2025-11-05 13:29 │
|
||||
│ │
|
||||
│ 📦 db_myapp_20251104_151022.dump │
|
||||
│ 807 KB | 2025-11-04 15:10 │
|
||||
│ │
|
||||
│ ⬅ Back ✓ Select │
|
||||
└────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### 4.3 Restore Execution Screen
|
||||
Similar to backup execution but shows:
|
||||
- Archive being restored
|
||||
- Target database
|
||||
- Current phase (extraction/restoration/verification)
|
||||
- Tables being restored
|
||||
- Progress indicators
|
||||
|
||||
### Phase 5: Advanced Features (Priority: LOW)
|
||||
|
||||
#### 5.1 Selective Restore
|
||||
```bash
|
||||
# Restore only specific tables
|
||||
dbbackup restore single backup.dump \
|
||||
--target-db myapp_db \
|
||||
--table users \
|
||||
--table orders \
|
||||
--confirm
|
||||
|
||||
# Restore specific schemas
|
||||
dbbackup restore single backup.dump \
|
||||
--target-db myapp_db \
|
||||
--schema public \
|
||||
--confirm
|
||||
```
|
||||
|
||||
#### 5.2 Point-in-Time Restore
|
||||
```bash
|
||||
# Restore to specific timestamp (requires WAL archives)
|
||||
dbbackup restore cluster archive.tar.gz \
|
||||
--target-time "2025-11-05 12:00:00" \
|
||||
--confirm
|
||||
```
|
||||
|
||||
#### 5.3 Restore with Transformation
|
||||
```bash
|
||||
# Rename database during restore
|
||||
dbbackup restore single prod_backup.dump \
|
||||
--target-db dev_database \
|
||||
--confirm
|
||||
|
||||
# Restore to different server
|
||||
dbbackup restore single backup.dump \
|
||||
--target-db myapp_db \
|
||||
--host newserver.example.com \
|
||||
--confirm
|
||||
```
|
||||
|
||||
#### 5.4 Parallel Cluster Restore
|
||||
```bash
|
||||
# Restore multiple databases in parallel
|
||||
dbbackup restore cluster archive.tar.gz \
|
||||
--jobs 4 \
|
||||
--confirm
|
||||
```
|
||||
|
||||
## Implementation Order
|
||||
|
||||
### Week 1: Core Functionality
|
||||
1. ✅ Create `internal/restore/engine.go`
|
||||
2. ✅ Implement `RestoreSingle()` for PostgreSQL
|
||||
3. ✅ Implement `RestoreSingle()` for MySQL
|
||||
4. ✅ Add archive format detection
|
||||
5. ✅ Basic error handling
|
||||
|
||||
### Week 2: CLI & Safety
|
||||
6. ✅ Move restore command to `cmd/restore.go`
|
||||
7. ✅ Add `--confirm`, `--dry-run`, `--force` flags
|
||||
8. ✅ Implement safety checks (ValidateArchive, CheckDiskSpace)
|
||||
9. ✅ Add confirmation prompts
|
||||
10. ✅ Progress tracking integration
|
||||
|
||||
### Week 3: Cluster Restore
|
||||
11. ✅ Implement `RestoreCluster()` for tar.gz archives
|
||||
12. ✅ Add extraction handling
|
||||
13. ✅ Implement global objects restoration (roles, tablespaces)
|
||||
14. ✅ Add per-database restoration with progress
|
||||
|
||||
### Week 4: TUI Integration
|
||||
15. ✅ Create restore menu in TUI
|
||||
16. ✅ Add archive browser
|
||||
17. ✅ Implement restore execution screen
|
||||
18. ✅ Add real-time progress updates
|
||||
|
||||
### Week 5: Testing & Polish
|
||||
19. ✅ Integration tests
|
||||
20. ✅ Error scenario testing
|
||||
21. ✅ Documentation updates
|
||||
22. ✅ CLI help text refinement
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
dbbackup/
|
||||
├── cmd/
|
||||
│ ├── restore.go # NEW: Restore commands
|
||||
│ └── restore_impl.go # NEW: Restore implementations
|
||||
├── internal/
|
||||
│ ├── restore/ # NEW: Restore engine
|
||||
│ │ ├── engine.go # Core restore engine
|
||||
│ │ ├── formats.go # Archive format handlers
|
||||
│ │ ├── safety.go # Pre/post restore checks
|
||||
│ │ ├── progress.go # Restore progress tracking
|
||||
│ │ └── verify.go # Post-restore verification
|
||||
│ ├── tui/
|
||||
│ │ ├── restore.go # NEW: Restore menu
|
||||
│ │ ├── archive_browser.go # NEW: Archive selection
|
||||
│ │ └── restore_exec.go # NEW: Restore execution screen
|
||||
│ └── database/
|
||||
│ ├── interface.go # (existing - already has BuildRestoreCommand)
|
||||
│ ├── postgresql.go # (existing - already has BuildRestoreCommand)
|
||||
│ └── mysql.go # (existing - already has BuildRestoreCommand)
|
||||
```
|
||||
|
||||
## Key Design Decisions
|
||||
|
||||
### 1. Safety-First Approach
|
||||
- **Default: Preview Mode**: `restore` command shows what would be done
|
||||
- **Explicit Confirmation**: Require `--confirm` flag for actual execution
|
||||
- **Dry-Run Option**: `--dry-run` for testing without side effects
|
||||
- **Pre-restore Validation**: Check archive integrity before starting
|
||||
|
||||
### 2. Progress Transparency
|
||||
- Real-time progress indicators
|
||||
- Phase-based tracking (extraction → restoration → verification)
|
||||
- Per-table progress for detailed visibility
|
||||
- Time estimates and completion ETA
|
||||
|
||||
### 3. Error Handling
|
||||
- Graceful degradation (continue on non-critical errors)
|
||||
- Detailed error messages with troubleshooting hints
|
||||
- Transaction-based restoration where possible
|
||||
- Rollback support (optional safety backup before restore)
|
||||
|
||||
### 4. Performance
|
||||
- Parallel restoration for cluster backups
|
||||
- Streaming decompression (no temporary files for compressed archives)
|
||||
- CPU-aware job counts (reuse existing CPU detection)
|
||||
- Memory-efficient processing (similar to backup streaming)
|
||||
|
||||
### 5. Compatibility
|
||||
- Support all backup formats created by the tool
|
||||
- Handle legacy backups (if format allows)
|
||||
- Cross-database restore (with transformations)
|
||||
- Version compatibility checks
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
### Unit Tests
|
||||
- Archive format detection
|
||||
- Command building (PostgreSQL, MySQL)
|
||||
- Safety validation logic
|
||||
- Error handling paths
|
||||
|
||||
### Integration Tests
|
||||
- Single database restore (PostgreSQL, MySQL)
|
||||
- Cluster restore (PostgreSQL)
|
||||
- Compressed archive handling
|
||||
- Large database restoration (memory usage verification)
|
||||
|
||||
### Manual Testing Scenarios
|
||||
1. Restore to same database (overwrite)
|
||||
2. Restore to different database (rename)
|
||||
3. Restore to different server
|
||||
4. Partial restore (selective tables)
|
||||
5. Cluster restore with exclusions
|
||||
6. Error scenarios (disk full, connection lost, corrupted archive)
|
||||
|
||||
## Documentation Updates
|
||||
|
||||
### README.md
|
||||
```markdown
|
||||
## Restore Operations
|
||||
|
||||
### Single Database
|
||||
dbbackup restore single backup.dump --target-db myapp_db --confirm
|
||||
|
||||
### Cluster Restore
|
||||
dbbackup restore cluster cluster_20251105.tar.gz --confirm
|
||||
|
||||
### Preview Mode (Default)
|
||||
dbbackup restore single backup.dump --target-db myapp_db
|
||||
# Shows what would be done without executing
|
||||
|
||||
### Flags
|
||||
- --confirm: Actually execute the restore
|
||||
- --dry-run: Preview only (explicit)
|
||||
- --force: Skip confirmation prompts
|
||||
- --clean: Drop existing database before restore
|
||||
- --create: Create database if missing
|
||||
```
|
||||
|
||||
### New Documentation Files
|
||||
- `RESTORE_GUIDE.md`: Comprehensive restore guide
|
||||
- `RESTORE_BEST_PRACTICES.md`: Safety and performance tips
|
||||
|
||||
## Migration Path
|
||||
|
||||
Since restore is currently in "preview mode":
|
||||
1. Keep existing `runRestore()` as reference
|
||||
2. Implement new restore engine in parallel
|
||||
3. Add `--legacy` flag to use old preview mode (temporary)
|
||||
4. Test new implementation thoroughly
|
||||
5. Remove legacy code after validation
|
||||
6. Update all documentation
|
||||
|
||||
## Success Metrics
|
||||
|
||||
- ✅ Single database restore works for PostgreSQL and MySQL
|
||||
- ✅ Cluster restore works for PostgreSQL
|
||||
- ✅ All backup formats supported
|
||||
- ✅ Progress tracking provides clear feedback
|
||||
- ✅ Safety checks prevent accidental data loss
|
||||
- ✅ Memory usage remains <1GB for large restores
|
||||
- ✅ TUI integration matches backup experience
|
||||
- ✅ Documentation is comprehensive
|
||||
@ -1,533 +0,0 @@
|
||||
# Restore TUI Integration Plan
|
||||
|
||||
## Overview
|
||||
Integrate restore functionality into the interactive TUI menu, following the same architecture patterns as the existing backup features.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Main Menu Integration
|
||||
|
||||
### 1.1 Add Restore Menu Items
|
||||
**File**: `internal/tui/menu.go`
|
||||
|
||||
Add new menu choices after backup options:
|
||||
```go
|
||||
choices: []string{
|
||||
"Single Database Backup", // 0
|
||||
"Sample Database Backup (with ratio)", // 1
|
||||
"Cluster Backup (all databases)", // 2
|
||||
"─────────────────────────────", // 3 (separator)
|
||||
"Restore Single Database", // 4 - NEW
|
||||
"Restore Cluster", // 5 - NEW
|
||||
"List & Manage Backups", // 6 - NEW
|
||||
"─────────────────────────────", // 7 (separator)
|
||||
"View Active Operations", // 8
|
||||
"Show Operation History", // 9
|
||||
"Database Status & Health Check", // 10
|
||||
"Configuration Settings", // 11
|
||||
"Clear Operation History", // 12
|
||||
"Quit", // 13
|
||||
}
|
||||
```
|
||||
|
||||
### 1.2 Add Menu Handlers
|
||||
Add cases in `Update()` method:
|
||||
```go
|
||||
case 4: // Restore Single Database
|
||||
return m.handleRestoreSingle()
|
||||
case 5: // Restore Cluster
|
||||
return m.handleRestoreCluster()
|
||||
case 6: // List & Manage Backups
|
||||
return m.handleBackupList()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Archive Browser Component
|
||||
|
||||
### 2.1 Create Archive Browser Model
|
||||
**New File**: `internal/tui/archive_browser.go`
|
||||
|
||||
**Purpose**: Browse and select backup archives from the backup directory
|
||||
|
||||
**Structure**:
|
||||
```go
|
||||
type ArchiveBrowserModel struct {
|
||||
config *config.Config
|
||||
logger logger.Logger
|
||||
parent tea.Model
|
||||
archives []ArchiveInfo
|
||||
cursor int
|
||||
loading bool
|
||||
err error
|
||||
title string
|
||||
mode string // "restore-single", "restore-cluster", "manage"
|
||||
searchTerm string
|
||||
filterType string // "all", "postgres", "mysql", "cluster"
|
||||
}
|
||||
|
||||
type ArchiveInfo struct {
|
||||
Name string
|
||||
Path string
|
||||
Format restore.ArchiveFormat
|
||||
Size int64
|
||||
Modified time.Time
|
||||
DatabaseName string
|
||||
Valid bool
|
||||
ValidationMsg string
|
||||
}
|
||||
```
|
||||
|
||||
**Features**:
|
||||
- List all backup archives in backup directory
|
||||
- Display archive details (format, size, date, database name)
|
||||
- Filter by type (PostgreSQL dump, MySQL SQL, cluster)
|
||||
- Search by filename or database name
|
||||
- Sort by date (newest first) or name
|
||||
- Show validation status (valid/corrupted)
|
||||
- Preview archive contents
|
||||
- Multi-column display with color coding
|
||||
|
||||
**Navigation**:
|
||||
- ↑/↓: Navigate archives
|
||||
- Enter: Select archive for restore
|
||||
- p: Preview archive contents
|
||||
- f: Toggle filter (all/postgres/mysql/cluster)
|
||||
- /: Search mode
|
||||
- Esc: Back to main menu
|
||||
- d: Delete archive (with confirmation)
|
||||
- i: Show archive info (detailed)
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Restore Preview Component
|
||||
|
||||
### 3.1 Create Restore Preview Model
|
||||
**New File**: `internal/tui/restore_preview.go`
|
||||
|
||||
**Purpose**: Show what will be restored and safety checks before execution
|
||||
|
||||
**Structure**:
|
||||
```go
|
||||
type RestorePreviewModel struct {
|
||||
config *config.Config
|
||||
logger logger.Logger
|
||||
parent tea.Model
|
||||
archivePath string
|
||||
archiveInfo ArchiveInfo
|
||||
targetDB string
|
||||
options RestoreOptions
|
||||
safetyChecks []SafetyCheck
|
||||
warnings []string
|
||||
executing bool
|
||||
}
|
||||
|
||||
type RestoreOptions struct {
|
||||
CleanFirst bool
|
||||
CreateIfMissing bool
|
||||
TargetDatabase string // if different from original
|
||||
ForceOverwrite bool
|
||||
}
|
||||
|
||||
type SafetyCheck struct {
|
||||
Name string
|
||||
Status string // "pending", "checking", "passed", "failed", "warning"
|
||||
Message string
|
||||
Critical bool
|
||||
}
|
||||
```
|
||||
|
||||
**Safety Checks**:
|
||||
1. Archive integrity validation
|
||||
2. Disk space verification (3x archive size)
|
||||
3. Required tools check (pg_restore/psql/mysql)
|
||||
4. Target database existence check
|
||||
5. Data conflict warnings
|
||||
6. Backup recommendation (backup existing data first)
|
||||
|
||||
**Display Sections**:
|
||||
```
|
||||
╭─ Restore Preview ────────────────────────────╮
|
||||
│ │
|
||||
│ Archive Information: │
|
||||
│ File: mydb_20241107_120000.dump.gz │
|
||||
│ Format: PostgreSQL Dump (gzip) │
|
||||
│ Size: 2.4 GB │
|
||||
│ Created: 2024-11-07 12:00:00 │
|
||||
│ Database: mydb │
|
||||
│ │
|
||||
│ Target Information: │
|
||||
│ Database: mydb_restored │
|
||||
│ Host: localhost:5432 │
|
||||
│ Clean First: ✓ Yes │
|
||||
│ Create If Missing: ✓ Yes │
|
||||
│ │
|
||||
│ Safety Checks: │
|
||||
│ ✓ Archive integrity ... PASSED │
|
||||
│ ✓ Disk space (7.2 GB free) ... PASSED │
|
||||
│ ✓ Required tools ... PASSED │
|
||||
│ ⚠ Target database exists ... WARNING │
|
||||
│ Existing data will be dropped! │
|
||||
│ │
|
||||
│ Warnings: │
|
||||
│ • Restoring will replace all data in │
|
||||
│ database 'mydb_restored' │
|
||||
│ • Recommendation: Create backup first │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────╯
|
||||
|
||||
Options:
|
||||
[t] Toggle clean-first [c] Toggle create
|
||||
[n] Change target name [b] Backup first
|
||||
[Enter] Proceed [Esc] Cancel
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Restore Execution Component
|
||||
|
||||
### 4.1 Create Restore Execution Model
|
||||
**New File**: `internal/tui/restore_exec.go`
|
||||
|
||||
**Purpose**: Execute restore with real-time progress feedback
|
||||
|
||||
**Structure**:
|
||||
```go
|
||||
type RestoreExecutionModel struct {
|
||||
config *config.Config
|
||||
logger logger.Logger
|
||||
parent tea.Model
|
||||
archivePath string
|
||||
targetDB string
|
||||
cleanFirst bool
|
||||
createIfMissing bool
|
||||
restoreType string // "single" or "cluster"
|
||||
|
||||
// Progress tracking
|
||||
status string
|
||||
phase string // "validating", "decompressing", "restoring", "verifying"
|
||||
progress int
|
||||
details []string
|
||||
startTime time.Time
|
||||
|
||||
// Results
|
||||
done bool
|
||||
err error
|
||||
result string
|
||||
elapsed time.Duration
|
||||
}
|
||||
```
|
||||
|
||||
**Progress Phases**:
|
||||
1. **Validating**: Archive validation and safety checks
|
||||
2. **Decompressing**: If compressed archive (.gz)
|
||||
3. **Restoring**: Actual database restore operation
|
||||
4. **Verifying**: Post-restore verification (optional)
|
||||
|
||||
**Display**:
|
||||
```
|
||||
╭─ Restoring Database ─────────────────────────╮
|
||||
│ │
|
||||
│ Phase: Restoring │
|
||||
│ Status: Importing schema objects... │
|
||||
│ │
|
||||
│ ████████████████░░░░░░░░░░░░ 58% │
|
||||
│ │
|
||||
│ Details: │
|
||||
│ • Archive validated successfully │
|
||||
│ • Decompressing with pigz (4 cores) │
|
||||
│ • Restored 2,451 tables │
|
||||
│ • Restored 15,234 sequences │
|
||||
│ • Importing data... │
|
||||
│ │
|
||||
│ Elapsed: 2m 34s │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────╯
|
||||
|
||||
Press Ctrl+C to cancel (with cleanup)
|
||||
```
|
||||
|
||||
**Pattern**: Follow `backup_exec.go` architecture
|
||||
- Use tea.Cmd for background execution
|
||||
- Use tea.Tick for progress updates
|
||||
- Handle cancellation with cleanup
|
||||
- Show detailed progress from restore engine
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Cluster Restore Flow
|
||||
|
||||
### 5.1 Cluster Restore Preview
|
||||
**Enhancement**: Extend `restore_preview.go` for cluster restores
|
||||
|
||||
**Additional Features**:
|
||||
- List all databases in cluster archive
|
||||
- Show extraction preview
|
||||
- Database selection (restore all or subset)
|
||||
- Sequential restore order
|
||||
- Estimated time per database
|
||||
|
||||
**Display**:
|
||||
```
|
||||
╭─ Cluster Restore Preview ────────────────────╮
|
||||
│ │
|
||||
│ Archive: cluster_backup_20241107.tar.gz │
|
||||
│ Type: Full Cluster Backup │
|
||||
│ Size: 15.8 GB │
|
||||
│ │
|
||||
│ Databases to Restore: (Select with Space) │
|
||||
│ [✓] db_production (2.4 GB) │
|
||||
│ [✓] db_analytics (8.1 GB) │
|
||||
│ [✓] db_staging (1.2 GB) │
|
||||
│ [✓] db_dev (0.8 GB) │
|
||||
│ [ ] template_db (0.1 GB) │
|
||||
│ │
|
||||
│ Total Selected: 4 databases (12.5 GB) │
|
||||
│ Estimated Time: 45-60 minutes │
|
||||
│ │
|
||||
│ Safety: All checks passed ✓ │
|
||||
│ │
|
||||
╰──────────────────────────────────────────────╯
|
||||
|
||||
[Space] Select [a] Select all [Enter] Proceed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Backup Management Component
|
||||
|
||||
### 6.1 Backup Management View
|
||||
**New File**: `internal/tui/backup_manager.go`
|
||||
|
||||
**Purpose**: Comprehensive backup archive management
|
||||
|
||||
**Features**:
|
||||
- View all backups with detailed information
|
||||
- Sort by date, size, name, database
|
||||
- Filter by type, database, date range
|
||||
- Show disk usage statistics
|
||||
- Archive operations:
|
||||
- Verify integrity
|
||||
- Delete with confirmation
|
||||
- Rename/move archives
|
||||
- Export metadata
|
||||
- Show detailed info
|
||||
- Bulk operations (select multiple)
|
||||
|
||||
**Display**:
|
||||
```
|
||||
╭─ Backup Archive Manager ─────────────────────────────────────╮
|
||||
│ │
|
||||
│ Total Archives: 23 | Total Size: 87.4 GB | Free: 142 GB │
|
||||
│ │
|
||||
│ Filter: [All Types ▼] Sort: [Date (Newest) ▼] Search: __ │
|
||||
│ │
|
||||
│ DATE DATABASE SIZE TYPE STATUS │
|
||||
│ ────────────────────────────────────────────────────────────│
|
||||
│ 2024-11-07 12:00 mydb 2.4 GB PG Dump ✓ Valid │
|
||||
│ 2024-11-07 08:00 cluster 15.8 GB Cluster ✓ Valid │
|
||||
│ 2024-11-06 23:00 analytics 8.1 GB PG SQL ✓ Valid │
|
||||
│ 2024-11-06 18:00 testdb 0.5 GB MySQL SQL ✓ Valid │
|
||||
│ 2024-11-06 12:00 mydb 2.3 GB PG Dump ⚠ Old │
|
||||
│ │
|
||||
│ Selected: 0 | [v] Verify [d] Delete [i] Info [r] Restore│
|
||||
│ │
|
||||
╰───────────────────────────────────────────────────────────────╯
|
||||
|
||||
Navigation: ↑/↓ Select: Space Action: Enter Back: Esc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 7: Integration Points
|
||||
|
||||
### 7.1 Restore Engine Integration
|
||||
**File**: `internal/restore/engine.go`
|
||||
|
||||
Add TUI-friendly methods:
|
||||
```go
|
||||
// NewSilent creates restore engine without progress callbacks
|
||||
func NewSilent(cfg *config.Config, log logger.Logger, db database.Database) *Engine
|
||||
|
||||
// RestoreSingleWithProgress with progress callback
|
||||
func (e *Engine) RestoreSingleWithProgress(
|
||||
ctx context.Context,
|
||||
archivePath, targetDB string,
|
||||
cleanFirst, createIfMissing bool,
|
||||
progressCallback func(phase, status string, percent int),
|
||||
) error
|
||||
```
|
||||
|
||||
### 7.2 Progress Integration
|
||||
**File**: `internal/progress/progress.go`
|
||||
|
||||
Add restore-specific phases:
|
||||
```go
|
||||
const (
|
||||
PhaseRestoreValidation = "Validation"
|
||||
PhaseRestoreDecompress = "Decompression"
|
||||
PhaseRestoreImport = "Importing"
|
||||
PhaseRestoreVerify = "Verification"
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 8: User Experience Enhancements
|
||||
|
||||
### 8.1 Keyboard Shortcuts
|
||||
Global shortcuts in all restore views:
|
||||
- `?`: Show help overlay
|
||||
- `Esc`: Back/Cancel
|
||||
- `Ctrl+C`: Emergency abort
|
||||
- `Tab`: Switch between panes (if multiple)
|
||||
|
||||
### 8.2 Visual Feedback
|
||||
- Color coding:
|
||||
- 🟢 Green: Successful operations, valid archives
|
||||
- 🟡 Yellow: Warnings, old backups
|
||||
- 🔴 Red: Errors, failed checks, invalid archives
|
||||
- 🔵 Blue: Info, in-progress operations
|
||||
|
||||
- Icons:
|
||||
- ✓: Success/Valid
|
||||
- ✗: Failed/Invalid
|
||||
- ⚠: Warning
|
||||
- 🔍: Validating
|
||||
- 💾: Restoring
|
||||
- 📦: Archive
|
||||
- 🗄️: Database
|
||||
|
||||
### 8.3 Error Handling
|
||||
- Graceful error recovery
|
||||
- Clear error messages
|
||||
- Suggested actions
|
||||
- Automatic retry on transient failures
|
||||
- Cleanup on cancellation
|
||||
|
||||
---
|
||||
|
||||
## Phase 9: Safety Features
|
||||
|
||||
### 9.1 Confirmation Dialogs
|
||||
Use existing `confirmation.go` pattern for:
|
||||
- Restore with data replacement
|
||||
- Delete archives
|
||||
- Cluster restore (all databases)
|
||||
- Force operations (skip safety checks)
|
||||
|
||||
### 9.2 Dry-Run Mode
|
||||
- Show preview by default
|
||||
- Require explicit confirmation
|
||||
- No accidental restores
|
||||
- Show what would happen
|
||||
|
||||
### 9.3 Backup-Before-Restore
|
||||
Optional feature:
|
||||
- Offer to backup existing database before restore
|
||||
- Quick backup with timestamp
|
||||
- Automatic cleanup of temporary backups
|
||||
|
||||
---
|
||||
|
||||
## Phase 10: Testing Strategy
|
||||
|
||||
### 10.1 Unit Tests
|
||||
- Archive detection and validation
|
||||
- Format parsing
|
||||
- Safety check logic
|
||||
- Preview generation
|
||||
|
||||
### 10.2 Integration Tests
|
||||
- Complete restore flow
|
||||
- Cluster restore
|
||||
- Error scenarios
|
||||
- Cancellation handling
|
||||
|
||||
### 10.3 Manual Testing Scenarios
|
||||
1. Restore single PostgreSQL dump
|
||||
2. Restore compressed MySQL SQL
|
||||
3. Restore full cluster
|
||||
4. Cancel mid-restore
|
||||
5. Restore with different target name
|
||||
6. Restore with clean-first option
|
||||
7. Handle corrupted archive
|
||||
8. Handle insufficient disk space
|
||||
9. Handle missing tools
|
||||
|
||||
---
|
||||
|
||||
## Implementation Order
|
||||
|
||||
### Priority 1 (Core Functionality)
|
||||
1. ✅ Phase 1: Main menu integration
|
||||
2. ✅ Phase 2: Archive browser
|
||||
3. ✅ Phase 3: Restore preview
|
||||
4. ✅ Phase 4: Restore execution
|
||||
|
||||
### Priority 2 (Enhanced Features)
|
||||
5. Phase 5: Cluster restore flow
|
||||
6. Phase 6: Backup management
|
||||
7. Phase 7: Engine integration refinements
|
||||
|
||||
### Priority 3 (Polish)
|
||||
8. Phase 8: UX enhancements
|
||||
9. Phase 9: Safety features
|
||||
10. Phase 10: Comprehensive testing
|
||||
|
||||
---
|
||||
|
||||
## File Structure Summary
|
||||
|
||||
```
|
||||
internal/tui/
|
||||
├── menu.go # MODIFY: Add restore menu items
|
||||
├── archive_browser.go # NEW: Browse and select archives
|
||||
├── restore_preview.go # NEW: Preview restore operation
|
||||
├── restore_exec.go # NEW: Execute restore with progress
|
||||
├── backup_manager.go # NEW: Comprehensive backup management
|
||||
├── confirmation.go # REUSE: For dangerous operations
|
||||
├── backup_exec.go # REFERENCE: Pattern for execution
|
||||
└── dbselector.go # REFERENCE: Pattern for selection
|
||||
|
||||
internal/restore/
|
||||
├── engine.go # MODIFY: Add TUI-friendly methods
|
||||
└── progress.go # NEW: Restore progress tracking
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Estimated Implementation Time
|
||||
|
||||
- **Phase 1-4 (Core)**: 2-3 days
|
||||
- **Phase 5-7 (Enhanced)**: 2-3 days
|
||||
- **Phase 8-10 (Polish & Testing)**: 1-2 days
|
||||
- **Total**: 5-8 days for complete implementation
|
||||
|
||||
---
|
||||
|
||||
## Success Criteria
|
||||
|
||||
✓ User can browse and select backup archives visually
|
||||
✓ Restore preview shows all relevant information
|
||||
✓ Safety checks prevent accidental data loss
|
||||
✓ Progress feedback during restore operation
|
||||
✓ Error handling with clear messages
|
||||
✓ Cluster restore supports database selection
|
||||
✓ Backup management provides archive maintenance
|
||||
✓ Consistent UX with existing backup features
|
||||
✓ No console output conflicts (silent operations)
|
||||
✓ Proper cleanup on cancellation
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
- Follow existing TUI patterns from `backup_exec.go` and `dbselector.go`
|
||||
- Use `backup.NewSilent()` pattern for restore engine
|
||||
- No `fmt.Println()` or direct console output
|
||||
- All progress through TUI tea.Msg system
|
||||
- Reuse existing styles and components where possible
|
||||
- Maintain consistent keyboard navigation
|
||||
- Add comprehensive error handling
|
||||
- Support both PostgreSQL and MySQL restore
|
||||
Reference in New Issue
Block a user