sojorn/go-backend/internal/models/backup_models.go
2026-02-15 00:33:24 -06:00

200 lines
8.7 KiB
Go

package models
import (
"time"
"github.com/google/uuid"
)
// SyncCode represents a temporary 6-digit code for device pairing
type SyncCode struct {
ID uuid.UUID `json:"id" db:"id"`
UserID uuid.UUID `json:"user_id" db:"user_id"`
Code string `json:"code" db:"code"`
DeviceFingerprint string `json:"device_fingerprint" db:"device_fingerprint"`
DeviceName string `json:"device_name" db:"device_name"`
ExpiresAt time.Time `json:"expires_at" db:"expires_at"`
UsedAt *time.Time `json:"used_at" db:"used_at"`
Attempts int `json:"attempts" db:"attempts"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// CloudBackup represents an encrypted backup stored in cloud storage
type CloudBackup struct {
ID uuid.UUID `json:"id" db:"id"`
UserID uuid.UUID `json:"user_id" db:"user_id"`
EncryptedBlob []byte `json:"-" db:"encrypted_blob"` // Don't expose in JSON
Salt []byte `json:"-" db:"salt"` // Don't expose in JSON
Nonce []byte `json:"-" db:"nonce"` // Don't expose in JSON
Mac []byte `json:"-" db:"mac"` // Don't expose in JSON
Version int `json:"version" db:"version"`
DeviceName string `json:"device_name" db:"device_name"`
SizeBytes int64 `json:"size_bytes" db:"size_bytes"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// RecoveryGuardian represents a trusted contact for social recovery
type RecoveryGuardian struct {
ID uuid.UUID `json:"id" db:"id"`
UserID uuid.UUID `json:"user_id" db:"user_id"`
GuardianUserID uuid.UUID `json:"guardian_user_id" db:"guardian_user_id"`
ShardEncrypted []byte `json:"-" db:"shard_encrypted"` // Don't expose in JSON
ShardIndex int `json:"shard_index" db:"shard_index"`
Status string `json:"status" db:"status"` // pending, accepted, declined, revoked
InvitedAt time.Time `json:"invited_at" db:"invited_at"`
RespondedAt *time.Time `json:"responded_at" db:"responded_at"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// RecoverySession represents a recovery attempt
type RecoverySession struct {
ID uuid.UUID `json:"id" db:"id"`
UserID uuid.UUID `json:"user_id" db:"user_id"`
Method string `json:"method" db:"method"` // social, email, questions
ShardsReceived int `json:"shards_received" db:"shards_received"`
ShardsNeeded int `json:"shards_needed" db:"shards_needed"`
Status string `json:"status" db:"status"` // pending, in_progress, completed, expired, failed
ExpiresAt time.Time `json:"expires_at" db:"expires_at"`
CompletedAt *time.Time `json:"completed_at" db:"completed_at"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// RecoveryShardSubmission represents an individual shard submission
type RecoveryShardSubmission struct {
ID uuid.UUID `json:"id" db:"id"`
SessionID uuid.UUID `json:"session_id" db:"session_id"`
GuardianUserID uuid.UUID `json:"guardian_user_id" db:"guardian_user_id"`
ShardEncrypted []byte `json:"-" db:"shard_encrypted"` // Don't expose in JSON
SubmittedAt time.Time `json:"submitted_at" db:"submitted_at"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
ShardsReceived int `json:"shards_received,omitempty" db:"-"`
ShardsNeeded int `json:"shards_needed,omitempty" db:"-"`
}
// BackupPreferences represents user backup settings
type BackupPreferences struct {
ID uuid.UUID `json:"id" db:"id"`
UserID uuid.UUID `json:"user_id" db:"user_id"`
CloudBackupEnabled bool `json:"cloud_backup_enabled" db:"cloud_backup_enabled"`
AutoBackupEnabled bool `json:"auto_backup_enabled" db:"auto_backup_enabled"`
BackupFrequencyHours int `json:"backup_frequency_hours" db:"backup_frequency_hours"`
LastBackupAt *time.Time `json:"last_backup_at" db:"last_backup_at"`
BackupPasswordHash string `json:"-" db:"backup_password_hash"` // Don't expose in JSON
BackupSalt []byte `json:"-" db:"backup_salt"` // Don't expose in JSON
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
// UserDevice represents a registered user device
type UserDevice struct {
ID uuid.UUID `json:"id" db:"id"`
UserID uuid.UUID `json:"user_id" db:"user_id"`
DeviceFingerprint string `json:"device_fingerprint" db:"device_fingerprint"`
DeviceName string `json:"device_name" db:"device_name"`
DeviceType string `json:"device_type" db:"device_type"` // android, ios, web, desktop
LastSeenAt *time.Time `json:"last_seen_at" db:"last_seen_at"`
IsActive bool `json:"is_active" db:"is_active"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// Request/Response DTOs
// GenerateSyncCodeRequest represents a request to generate a sync code
type GenerateSyncCodeRequest struct {
DeviceName string `json:"device_name" binding:"required"`
DeviceFingerprint string `json:"device_fingerprint" binding:"required"`
}
// GenerateSyncCodeResponse represents response with sync code
type GenerateSyncCodeResponse struct {
Code string `json:"code"`
ExpiresAt time.Time `json:"expires_at"`
ExpiresIn int `json:"expires_in_seconds"`
}
// VerifySyncCodeRequest represents a request to verify a sync code
type VerifySyncCodeRequest struct {
Code string `json:"code" binding:"required"`
DeviceName string `json:"device_name" binding:"required"`
DeviceFingerprint string `json:"device_fingerprint" binding:"required"`
}
// VerifySyncCodeResponse represents response to sync code verification
type VerifySyncCodeResponse struct {
Valid bool `json:"valid"`
DeviceAID string `json:"device_a_id,omitempty"`
DeviceAName string `json:"device_a_name,omitempty"`
WebRTCOffer string `json:"webrtc_offer,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
}
// UploadBackupRequest represents a request to upload a backup
type UploadBackupRequest struct {
EncryptedBlob string `json:"encrypted_blob" binding:"required"`
Salt string `json:"salt" binding:"required"`
Nonce string `json:"nonce" binding:"required"`
Mac string `json:"mac" binding:"required"`
Version int `json:"version"`
DeviceName string `json:"device_name"`
}
// UploadBackupResponse represents response to backup upload
type UploadBackupResponse struct {
BackupID string `json:"backup_id"`
UploadedAt time.Time `json:"uploaded_at"`
Size int64 `json:"size"`
}
// DownloadBackupResponse represents response to backup download
type DownloadBackupResponse struct {
EncryptedBlob string `json:"encrypted_blob"`
Salt string `json:"salt"`
Nonce string `json:"nonce"`
Mac string `json:"mac"`
Version int `json:"version"`
DeviceName string `json:"device_name"`
CreatedAt time.Time `json:"created_at"`
}
// ListBackupsResponse represents response to list backups request
type ListBackupsResponse struct {
Backups []CloudBackup `json:"backups"`
}
// SetupSocialRecoveryRequest represents a request to setup social recovery
type SetupSocialRecoveryRequest struct {
GuardianUserIDs []string `json:"guardian_user_ids" binding:"required,min=3,max=5"`
}
// InitiateRecoveryRequest represents a request to initiate recovery
type InitiateRecoveryRequest struct {
Method string `json:"method" binding:"required,oneof=social email questions"`
}
// SubmitShardRequest represents a request to submit a recovery shard
type SubmitShardRequest struct {
SessionID string `json:"session_id" binding:"required"`
ShardEncrypted string `json:"shard_encrypted" binding:"required"`
}
// SubmitShardResponse represents response to shard submission
type SubmitShardResponse struct {
ShardsReceived int `json:"shards_received"`
ShardsNeeded int `json:"shards_needed"`
CanComplete bool `json:"can_complete"`
}
// CompleteRecoveryResponse represents response to complete recovery
type CompleteRecoveryResponse struct {
Success bool `json:"success"`
MasterKey string `json:"master_key,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
}
// UpdateBackupPreferencesRequest represents a request to update backup preferences
type UpdateBackupPreferencesRequest struct {
CloudBackupEnabled bool `json:"cloud_backup_enabled"`
AutoBackupEnabled bool `json:"auto_backup_enabled"`
BackupFrequencyHours int `json:"backup_frequency_hours"`
BackupPassword string `json:"backup_password,omitempty"`
}