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