200 lines
8.7 KiB
Go
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"`
|
|
}
|