import SQLiteData extension Notification.Name { static let networkDidConnect = Notification.Name("networkDidConnect") } enum TaskConfig { static let maxActiveDownloads = 3 static let maxPendingDownloads = 50 static let maxPendingUploads = 50 static let maxRetries = 10 static let sessionId = "app.mertalev.immich.upload" static let downloadCheckIntervalNs: UInt64 = 30_000_000_000 // 30 seconds static let downloadTimeoutS = TimeInterval(60) static let transferSpeedAlpha = 0.4 static let originalsDir = FileManager.default.temporaryDirectory.appendingPathComponent( "originals", isDirectory: true ) } enum StoreKey: Int, CaseIterable, QueryBindable { // MARK: - Int case _version = 0 static let version = Typed(rawValue: ._version) case _deviceIdHash = 3 static let deviceIdHash = Typed(rawValue: ._deviceIdHash) case _backupTriggerDelay = 8 static let backupTriggerDelay = Typed(rawValue: ._backupTriggerDelay) case _tilesPerRow = 103 static let tilesPerRow = Typed(rawValue: ._tilesPerRow) case _groupAssetsBy = 105 static let groupAssetsBy = Typed(rawValue: ._groupAssetsBy) case _uploadErrorNotificationGracePeriod = 106 static let uploadErrorNotificationGracePeriod = Typed(rawValue: ._uploadErrorNotificationGracePeriod) case _thumbnailCacheSize = 110 static let thumbnailCacheSize = Typed(rawValue: ._thumbnailCacheSize) case _imageCacheSize = 111 static let imageCacheSize = Typed(rawValue: ._imageCacheSize) case _albumThumbnailCacheSize = 112 static let albumThumbnailCacheSize = Typed(rawValue: ._albumThumbnailCacheSize) case _selectedAlbumSortOrder = 113 static let selectedAlbumSortOrder = Typed(rawValue: ._selectedAlbumSortOrder) case _logLevel = 115 static let logLevel = Typed(rawValue: ._logLevel) case _mapRelativeDate = 119 static let mapRelativeDate = Typed(rawValue: ._mapRelativeDate) case _mapThemeMode = 124 static let mapThemeMode = Typed(rawValue: ._mapThemeMode) // MARK: - String case _assetETag = 1 static let assetETag = Typed(rawValue: ._assetETag) case _currentUser = 2 static let currentUser = Typed(rawValue: ._currentUser) case _deviceId = 4 static let deviceId = Typed(rawValue: ._deviceId) case _accessToken = 11 static let accessToken = Typed(rawValue: ._accessToken) case _sslClientCertData = 15 static let sslClientCertData = Typed(rawValue: ._sslClientCertData) case _sslClientPasswd = 16 static let sslClientPasswd = Typed(rawValue: ._sslClientPasswd) case _themeMode = 102 static let themeMode = Typed(rawValue: ._themeMode) case _customHeaders = 127 static let customHeaders = Typed<[String: String]>(rawValue: ._customHeaders) case _primaryColor = 128 static let primaryColor = Typed(rawValue: ._primaryColor) case _preferredWifiName = 133 static let preferredWifiName = Typed(rawValue: ._preferredWifiName) // MARK: - Endpoint case _externalEndpointList = 135 static let externalEndpointList = Typed<[Endpoint]>(rawValue: ._externalEndpointList) // MARK: - URL case _serverUrl = 10 static let serverUrl = Typed(rawValue: ._serverUrl) case _serverEndpoint = 12 static let serverEndpoint = Typed(rawValue: ._serverEndpoint) case _localEndpoint = 134 static let localEndpoint = Typed(rawValue: ._localEndpoint) // MARK: - Date case _backupFailedSince = 5 static let backupFailedSince = Typed(rawValue: ._backupFailedSince) // MARK: - Bool case _backupRequireWifi = 6 static let backupRequireWifi = Typed(rawValue: ._backupRequireWifi) case _backupRequireCharging = 7 static let backupRequireCharging = Typed(rawValue: ._backupRequireCharging) case _autoBackup = 13 static let autoBackup = Typed(rawValue: ._autoBackup) case _backgroundBackup = 14 static let backgroundBackup = Typed(rawValue: ._backgroundBackup) case _loadPreview = 100 static let loadPreview = Typed(rawValue: ._loadPreview) case _loadOriginal = 101 static let loadOriginal = Typed(rawValue: ._loadOriginal) case _dynamicLayout = 104 static let dynamicLayout = Typed(rawValue: ._dynamicLayout) case _backgroundBackupTotalProgress = 107 static let backgroundBackupTotalProgress = Typed(rawValue: ._backgroundBackupTotalProgress) case _backgroundBackupSingleProgress = 108 static let backgroundBackupSingleProgress = Typed(rawValue: ._backgroundBackupSingleProgress) case _storageIndicator = 109 static let storageIndicator = Typed(rawValue: ._storageIndicator) case _advancedTroubleshooting = 114 static let advancedTroubleshooting = Typed(rawValue: ._advancedTroubleshooting) case _preferRemoteImage = 116 static let preferRemoteImage = Typed(rawValue: ._preferRemoteImage) case _loopVideo = 117 static let loopVideo = Typed(rawValue: ._loopVideo) case _mapShowFavoriteOnly = 118 static let mapShowFavoriteOnly = Typed(rawValue: ._mapShowFavoriteOnly) case _selfSignedCert = 120 static let selfSignedCert = Typed(rawValue: ._selfSignedCert) case _mapIncludeArchived = 121 static let mapIncludeArchived = Typed(rawValue: ._mapIncludeArchived) case _ignoreIcloudAssets = 122 static let ignoreIcloudAssets = Typed(rawValue: ._ignoreIcloudAssets) case _selectedAlbumSortReverse = 123 static let selectedAlbumSortReverse = Typed(rawValue: ._selectedAlbumSortReverse) case _mapwithPartners = 125 static let mapwithPartners = Typed(rawValue: ._mapwithPartners) case _enableHapticFeedback = 126 static let enableHapticFeedback = Typed(rawValue: ._enableHapticFeedback) case _dynamicTheme = 129 static let dynamicTheme = Typed(rawValue: ._dynamicTheme) case _colorfulInterface = 130 static let colorfulInterface = Typed(rawValue: ._colorfulInterface) case _syncAlbums = 131 static let syncAlbums = Typed(rawValue: ._syncAlbums) case _autoEndpointSwitching = 132 static let autoEndpointSwitching = Typed(rawValue: ._autoEndpointSwitching) case _loadOriginalVideo = 136 static let loadOriginalVideo = Typed(rawValue: ._loadOriginalVideo) case _manageLocalMediaAndroid = 137 static let manageLocalMediaAndroid = Typed(rawValue: ._manageLocalMediaAndroid) case _readonlyModeEnabled = 138 static let readonlyModeEnabled = Typed(rawValue: ._readonlyModeEnabled) case _autoPlayVideo = 139 static let autoPlayVideo = Typed(rawValue: ._autoPlayVideo) case _photoManagerCustomFilter = 1000 static let photoManagerCustomFilter = Typed(rawValue: ._photoManagerCustomFilter) case _betaPromptShown = 1001 static let betaPromptShown = Typed(rawValue: ._betaPromptShown) case _betaTimeline = 1002 static let betaTimeline = Typed(rawValue: ._betaTimeline) case _enableBackup = 1003 static let enableBackup = Typed(rawValue: ._enableBackup) case _useWifiForUploadVideos = 1004 static let useWifiForUploadVideos = Typed(rawValue: ._useWifiForUploadVideos) case _useWifiForUploadPhotos = 1005 static let useWifiForUploadPhotos = Typed(rawValue: ._useWifiForUploadPhotos) case _needBetaMigration = 1006 static let needBetaMigration = Typed(rawValue: ._needBetaMigration) case _shouldResetSync = 1007 static let shouldResetSync = Typed(rawValue: ._shouldResetSync) struct Typed: RawRepresentable { let rawValue: StoreKey @_transparent init(rawValue value: StoreKey) { self.rawValue = value } } } enum UploadHeaders: String { case reprDigest = "Repr-Digest" case userToken = "X-Immich-User-Token" case assetData = "X-Immich-Asset-Data" } enum TaskStatus: Int, QueryBindable { case downloadPending, downloadQueued, downloadFailed, uploadPending, uploadQueued, uploadFailed, uploadComplete, uploadSkipped } enum BackupSelection: Int, QueryBindable { case selected, none, excluded } enum AvatarColor: Int, QueryBindable { case primary, pink, red, yellow, blue, green, purple, orange, gray, amber } enum AlbumUserRole: Int, QueryBindable { case editor, viewer } enum MemoryType: Int, QueryBindable { case onThisDay } enum AssetVisibility: Int, QueryBindable { case timeline, hidden, archive, locked } enum SourceType: String, QueryBindable { case machineLearning = "machine-learning" case exif, manual } enum UploadMethod: Int, QueryBindable { case multipart, resumable } enum UploadError: Error { case fileCreationFailed case iCloudError(UploadErrorCode) case photosError(UploadErrorCode) } enum UploadErrorCode: Int, QueryBindable { case unknown case assetNotFound case fileNotFound case resourceNotFound case invalidResource case encodingFailed case writeFailed case notEnoughSpace case networkError case photosInternalError case photosUnknownError case noServerUrl case noDeviceId case noAccessToken case interrupted case cancelled case downloadStalled case forceQuit case outOfResources case backgroundUpdatesDisabled case uploadTimeout case iCloudRateLimit case iCloudThrottled case invalidResponse case badRequest case internalServerError } enum AssetType: Int, QueryBindable { case other, image, video, audio } enum AssetMediaStatus: String, Codable { case created, replaced, duplicate } struct Endpoint: Codable { let url: URL let status: Status enum Status: String, Codable { case loading, valid, error, unknown } } struct UploadSuccessResponse: Codable { let status: AssetMediaStatus let id: String } struct UploadErrorResponse: Codable { let message: String }