mirror of
https://github.com/Awuqing/BackupX.git
synced 2026-05-11 18:10:23 +08:00
Addresses community feedback about 0KB corrupted backup files going undetected after upload. Implementation: - Compute SHA-256 hash of final artifact (after compress/encrypt) before upload - After each storage target upload, download the file back and verify the hash matches the local checksum - If verification fails: mark that target as failed, auto-delete the corrupted remote file, and log detailed mismatch info - Store checksum in BackupRecord model (new `checksum` column) - Display truncated SHA-256 with copy button in backup records UI Verification flow per storage target: local SHA-256 → upload → download → remote SHA-256 → compare - match: mark success - mismatch: mark failed + delete corrupted remote file
35 lines
1.7 KiB
Go
35 lines
1.7 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
const (
|
|
BackupRecordStatusRunning = "running"
|
|
BackupRecordStatusSuccess = "success"
|
|
BackupRecordStatusFailed = "failed"
|
|
)
|
|
|
|
type BackupRecord struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
TaskID uint `gorm:"column:task_id;index;not null" json:"taskId"`
|
|
Task BackupTask `json:"task,omitempty"`
|
|
StorageTargetID uint `gorm:"column:storage_target_id;index;not null" json:"storageTargetId"`
|
|
StorageTarget StorageTarget `json:"storageTarget,omitempty"`
|
|
Status string `gorm:"size:20;index;not null" json:"status"`
|
|
FileName string `gorm:"column:file_name;size:255" json:"fileName"`
|
|
FileSize int64 `gorm:"column:file_size;not null;default:0" json:"fileSize"`
|
|
Checksum string `gorm:"column:checksum;size:64" json:"checksum"`
|
|
StoragePath string `gorm:"column:storage_path;size:500" json:"storagePath"`
|
|
StorageUploadResults string `gorm:"column:storage_upload_results;type:text" json:"-"`
|
|
DurationSeconds int `gorm:"column:duration_seconds;not null;default:0" json:"durationSeconds"`
|
|
ErrorMessage string `gorm:"column:error_message;size:2000" json:"errorMessage"`
|
|
LogContent string `gorm:"column:log_content;type:text" json:"logContent"`
|
|
StartedAt time.Time `gorm:"column:started_at;index;not null" json:"startedAt"`
|
|
CompletedAt *time.Time `gorm:"column:completed_at;index" json:"completedAt,omitempty"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
}
|
|
|
|
func (BackupRecord) TableName() string {
|
|
return "backup_records"
|
|
}
|