88 lines
3.1 KiB
Go
88 lines
3.1 KiB
Go
package file
|
|
|
|
import "time"
|
|
|
|
// File represents a file stored locally with sync capabilities.
|
|
// This model combines cloud metadata with local storage tracking.
|
|
type File struct {
|
|
// Identifiers (from cloud)
|
|
ID string `json:"id"`
|
|
CollectionID string `json:"collection_id"`
|
|
OwnerID string `json:"owner_id"` // UserID from cloud
|
|
|
|
// Encryption data (from cloud API response)
|
|
EncryptedFileKey EncryptedFileKeyData `json:"encrypted_file_key"`
|
|
FileKeyNonce string `json:"file_key_nonce"`
|
|
EncryptedMetadata string `json:"encrypted_metadata"`
|
|
MetadataNonce string `json:"metadata_nonce"`
|
|
FileNonce string `json:"file_nonce"`
|
|
|
|
// File sizes (from cloud)
|
|
EncryptedSizeInBytes int64 `json:"encrypted_file_size_in_bytes"`
|
|
DecryptedSizeInBytes int64 `json:"decrypted_size_in_bytes,omitempty"`
|
|
|
|
// Local storage paths (local only)
|
|
EncryptedFilePath string `json:"encrypted_file_path,omitempty"`
|
|
FilePath string `json:"file_path,omitempty"`
|
|
ThumbnailPath string `json:"thumbnail_path,omitempty"`
|
|
|
|
// Decrypted metadata (local only - populated after decryption)
|
|
Name string `json:"name,omitempty"`
|
|
MimeType string `json:"mime_type,omitempty"`
|
|
Metadata *FileMetadata `json:"metadata,omitempty"`
|
|
|
|
// Sync tracking (local only)
|
|
SyncStatus SyncStatus `json:"sync_status"`
|
|
LastSyncedAt time.Time `json:"last_synced_at,omitempty"`
|
|
|
|
// State from cloud
|
|
State string `json:"state"` // pending, active, deleted
|
|
StorageMode string `json:"storage_mode"` // encrypted_only, hybrid, decrypted_only
|
|
Version int `json:"version"` // Cloud version for conflict resolution
|
|
|
|
// Timestamps (from cloud)
|
|
CreatedAt time.Time `json:"created_at"`
|
|
ModifiedAt time.Time `json:"modified_at"`
|
|
|
|
// Thumbnail URL (from cloud, for remote access)
|
|
ThumbnailURL string `json:"thumbnail_url,omitempty"`
|
|
}
|
|
|
|
// EncryptedFileKeyData matches the cloud API structure exactly
|
|
type EncryptedFileKeyData struct {
|
|
Ciphertext string `json:"ciphertext"`
|
|
Nonce string `json:"nonce"`
|
|
}
|
|
|
|
// FileMetadata represents decrypted file metadata (populated after decryption)
|
|
type FileMetadata struct {
|
|
Name string `json:"name"`
|
|
MimeType string `json:"mime_type"`
|
|
Size int64 `json:"size"`
|
|
FileExtension string `json:"file_extension"`
|
|
}
|
|
|
|
// IsCloudOnly returns true if the file only exists in the cloud
|
|
func (f *File) IsCloudOnly() bool {
|
|
return f.SyncStatus == SyncStatusCloudOnly
|
|
}
|
|
|
|
// IsSynced returns true if the file is synchronized between local and cloud
|
|
func (f *File) IsSynced() bool {
|
|
return f.SyncStatus == SyncStatusSynced
|
|
}
|
|
|
|
// IsLocalOnly returns true if the file only exists locally
|
|
func (f *File) IsLocalOnly() bool {
|
|
return f.SyncStatus == SyncStatusLocalOnly
|
|
}
|
|
|
|
// HasLocalContent returns true if the file has local content (not just metadata)
|
|
func (f *File) HasLocalContent() bool {
|
|
return f.FilePath != "" || f.EncryptedFilePath != ""
|
|
}
|
|
|
|
// IsDeleted returns true if the file is marked as deleted
|
|
func (f *File) IsDeleted() bool {
|
|
return f.State == StateDeleted
|
|
}
|