1 // Copyright 2021-present 650 Industries. All rights reserved. 2 3 import Foundation 4 5 internal class UpdatesDatabaseIntegrityCheck { 6 func run( 7 withDatabase database: UpdatesDatabase, 8 directory: URL, 9 config: UpdatesConfig, 10 embeddedUpdate: Update? 11 ) throws { 12 let assets = try database.allAssets() 13 var missingAssets: [UpdateAsset] = [] 14 FileDownloader.assetFilesQueue.sync { 15 for asset in assets where !assetExists(asset, inDirectory: directory) { 16 missingAssets.append(asset) 17 } 18 } 19 20 if !missingAssets.isEmpty { 21 try database.markMissingAssets(missingAssets) 22 } 23 24 let updatesWithEmbeddedStatus = try database.allUpdates(withStatus: .StatusEmbedded, config: config) 25 let updatesToDelete = updatesWithEmbeddedStatus.filter { update in 26 guard let embeddedUpdate = embeddedUpdate else { 27 return true 28 } 29 return update.updateId != embeddedUpdate.updateId 30 } 31 32 if !updatesToDelete.isEmpty { 33 try database.deleteUpdates(updatesToDelete) 34 } 35 } 36 assetExistsnull37 func assetExists(_ asset: UpdateAsset, inDirectory directory: URL) -> Bool { 38 return FileManager.default.fileExists(atPath: directory.appendingPathComponent(asset.filename).path) 39 } 40 } 41